본문 바로가기
Xilinx SoC/Zynqberry

3. U-BOOT 빌드하기

by 코딩스미스 2022. 5. 7.

1. u-boot-xlnx 를 다운로드

~/trenz_demo$ git clone https://github.com/Xilinx/u-boot-xlnx.git

2. arch/arm/dts/zynq-zynqberry.dts 만들기

u-boot에 주변 하드웨어를 알려 줄 수 있는 디바이스 트리를 설계해야 한다.

 

/*
 * TrenzElectronic TE0720 board DTS
 *
 *  Copyright (C) 2011 - 2015 Xilinx
 *
 * SPDX-License-Identifier:	GPL-2.0+
 */
/dts-v1/;
#include "zynq-7000.dtsi"

/ {
	model = "TrenzElectronic TE0726-03M ZynqBerry";
	compatible = "xlnx,zynq-te0726", "xlnx,zynq-7000";

	aliases {
		serial0 = &uart1;
		serial1 = &uart0;
		spi0 = &qspi;
	};

	memory@0 {
		device_type = "memory";
		reg = <0x0 0x1F700000>;
	};

	chosen {
		bootargs = "";
		stdout-path = "serial0:115200n8";
	};
};

&sdhci1 {
	u-boot,dm-pre-reloc;
	status = "okay";
};

&qspi {
    #address-cells = <1>;
    #size-cells = <0>;
    status = "okay";
    flash0: flash@0 {
        compatible = "spansion,s25fl128s";
        reg = <0x0>;
        #address-cells = <1>;
        #size-cells = <1>;
        spi-max-frequency = <50000000>;
        partition@0x00000000 {
            label = "boot";
            reg = <0x00000000 0x00500000>;
        };
        partition@0x00500000 {
            label = "bootenv";
            reg = <0x00500000 0x00020000>;
        };
        partition@0x00520000 {
            label = "kernel";
            reg = <0x00520000 0x00a80000>;
        };
        partition@0x00fa0000 {
            label = "spare";
            reg = <0x00fa0000 0x00000000>;
        };
    };
};

/* USB PHY */

/{
    usb_phy0: usb_phy@0 {
		compatible = "ulpi-phy";
		#phy-cells = <0>;
		reg = <0xe0002000 0x1000>;
		view-port = <0x0170>;
		drv-vbus;
    };
};

&usb0 {
	status = "okay";
    dr_mode = "host";
    usb-phy = <&usb_phy0>;
	pinctrl-names = "default";
};

&gpio0 {
    interrupt-controller;
    #interrupt-cells = <2>;
};

&i2c1 {
    #address-cells = <1>;
    #size-cells = <0>;

    i2cmux0: i2cmux@70  {
        compatible = "nxp,pca9544";
        #address-cells = <1>;
        #size-cells = <0>;
        reg = <0x70>;


        i2c1@0 {
            #address-cells = <1>;
            #size-cells = <0>;
            reg = <0>;

            id_eeprom@50 {
                compatible = "atmel,24c32";
                reg = <0x50>;
            };

        };
        i2c1@1 {    // Display Interface Connector
            #address-cells = <1>;
            #size-cells = <0>;
            reg = <1>;
        };
        i2c1@2 {    // HDMI Interface Connector
            #address-cells = <1>;
            #size-cells = <0>;
            reg = <2>;
        };
        i2c1@3 {    // Camera Interface Connector
            #address-cells = <1>;
            #size-cells = <0>;
            reg = <3>;
        };
    };

};

3. Makefile을 수정한다.

"dtb-$(CONFIG_ARCH_ZYNQ) +=   " 에 zynq-zynqberry.dtb를 추가한다.

 

zynq-zybo.dtb \
zynq-zybo-z7.dtb \
zynq-zynqberry.dtb  <<---- 추가한 부분

 

4. board/xilinx/zynq/board.c 수정하기

u-boot가 QSPI에서 부팅되었기 때문에 리눅스 커널과 디바이스 트리를 Flash에서 찾으려 한다.

리눅스 커널과 디바이스 트리를 SD카드에 저장하였고 SD에 접근해서 사용하기 위해 board.c를 수정한다.

case ZYNQ_BM_QSPI:
        mode = "mmc0";
		env_set("modeboot", "sdboot");
//		mode = "qspi";
//		env_set("modeboot", "qspiboot");
		break;

5. zynqberry config 를 준비하기

configs에 있는 xilinx_zynq_virt_defconfig를 인용하여 zynqberry용 config 파일을 준비한다.

<수정 전>

CONFIG_DEFAULT_DEVICE_TREE="zynq-zc706"
CONFIG_OF_LIST="zynq-zc702 zynq-zc706 zynq-zc770-xm010 zynq-zc770-xm011 zynq-zc770-xm011-x16 zynq-zc770-xm012 zynq-zc770-xm013 zynq-cc108 zynq-microzed zynq-minized zynq-picozed zynq-zed zynq-zturn zynq-zturn-v5 zynq-zybo zynq-zybo-z7 zynq-dlc20-rev1.0"
CONFIG_ZYNQ_GEM=y

<수정 후>

CONFIG_DEFAULT_DEVICE_TREE="zynq-zynqberry"
CONFIG_OF_LIST="zynq-zynqberry"
CONFIG_ZYNQ_GEM=n

<추가>

CONFIG_IDENT_STRING=" for TE0726"
CONFIG_SYS_PROMPT="ZynqBerry> "

 

6. /include/configs/zynq-common.h 수정하기

u-boot 각종 설정과 명령(리눅스 부팅)을 작성한 스크립트를 텍스트 파일(uEnv.txt)로 만들어서 SD에 저장하여 사용하면 편하다.

u-boot가 스트립트 파일을 읽을 수 있도록 u-boot 소스를 수정한다.

/* Default environment */
#ifndef CONFIG_EXTRA_ENV_SETTINGS
#define CONFIG_EXTRA_ENV_SETTINGS   \
	"ethaddr=00:0a:35:00:01:22\0"\
	"kernel_image=uImage\0" \
	"kernel_load_address=0x2080000\0" \
	"ramdisk_image=uramdisk.image.gz\0"\
	"ramdisk_load_address=0x4000000\0"\
	"devicetree_image=system.dtb\0"\
	"devicetree_load_address=0x2000000\0"\
	"bitstream_image=system.bit.bin\0"\
	"boot_image=BOOT.bin\0" \
	"loadbit_addr=0x100000\0"\
	"loadbootenv_addr=0x2000000\0" \
	"kernel_size=0x500000\0" \
	"devicetree_size=0x20000\0" \
	"ramdisk_size=0x5E0000\0" \
	"boot_size=0xF00000\0"\
	"fdt_high=0x20000000\0" \
	"initrd_high=0x20000000\0"\
	"bootenv=uEnv.txt\0" \
	"loadbootenv=load mmc 0 ${loadbootenv_addr} ${bootenv}\0" \
	"importbootenv=echo Importing environment from SD ...; " \
	"env import -t ${loadbootenv_addr} $filesize\0" \
	"sd_uEnvtxt_existence_test=test -e mmc 0 /uEnv.txt\0" \
	"preboot=if test $modeboot = sdboot && env run sd_uEnvtxt_existence_test;" \
	"then if env run loadbootenv; " \
	"then env run importbootenv; " \
	"fi; " \
	"fi; \0" \
	BOOTENV
#endif

7. uEnv.txt 작성

uenvcmd를 작성하여, u-boot 부팅 시, 이를 실행하면 리눅스 커널을 부팅할 수 있다.

uenvcmd=fatload mmc 0 0x03000000 uImage && fatload mmc 0 0x02A00000 system.dtb && bootm 0x03000000 - 0x02A00000

8. u-boot 빌드하기

arm 크로스 컴파일 경로 설정과 환경변수 설정, 빌드를 실행한다.

u-boot.elf 가 만들어진다.

~/trenz_demo/u-boot-xlnx$ source /tools/Xilinx/Vitis/2020.2/settings64.sh
~/trenz_demo/u-boot-xlnx$ export CROSS_COMPILE=arm-linux-gnueabihf-
~/trenz_demo/u-boot-xlnx$ export ARCH=arm
~/trenz_demo/u-boot-xlnx$ make zynqberry_defconfig
~/trenz_demo/u-boot-xlnx$ make -j4

 

'Xilinx SoC > Zynqberry' 카테고리의 다른 글

2-1. Vitis 프로젝트 소스 수정하기  (0) 2022.05.07
4. BOOT.BIN 만들고, Program Flash 하기  (1) 2022.05.07
2. Vitis 프로젝트 만들기  (0) 2022.05.07
1. FPGA 디자인  (1) 2022.05.07
0. 준비  (0) 2022.05.07