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 |