본문 바로가기
Xilinx SoC/Zynqberry

[NEW] Vitis 2019.2 u-boot Flash-Rom에서 부팅

by 코딩스미스 2023. 5. 14.

타겟보드 : ZynqBerry SoC Module with Xilinx Z-7010 TE0726-03-41C64-A

Vivado/Vitis : 2019.2

OS : Ubuntu 20.04.6 LTS

사용중인 호스트 PC 쉘 : zsh

PC Spec. : Intel® Core™ i7-8750H CPU

Vivado/Vitis Install Root Path : /tools/Xilinx

 

 

1. 다운로드 BIT, XSA 생성

보드 제작사가 제공하는 샘플파일을 다운로드 받는다.

wget 명령어로 다운로드 할 수 있다.

>wget <download URL address>

https://shop.trenz-electronic.de/trenzdownloads/Trenz_Electronic/Modules_and_Module_Carriers/special/TE0726/Reference_Design/2019.2/zynqberrydemo4/TE0726-zynqberrydemo4-vivado_2019.2-build_12_20200528081042.zip

Size 118,34 MB / Modified 28.05.2020 - 08:10:50

 

2. 프로젝트 열기

다운로드 파일을 압축을 풀고, _create_linux_setup.sh를 실행시킨다.

chmod +x <sh 파일>로 실행권한을 주고 쉘을 직접 실행시키면 syntax error가 발생한다. 

내 호스트 PC에서 쉘 zsh를 사용하고 있다. 때문에 명시적으로 bash로 실행한다.

bash _create_linux_setup.sh

bash로 명시적으로 실행할 때 chmod로 실행 권한을 설정할 필요는 없다.

정상적으로 실행하면 아래 파일이 생성된다.

design_basic_settins.sh

vivado_create_project_guimode.sh

vivado_open_existing_project_guimode.sh

 

design_basic_settins.sh에서 아래 부분을 수정한다.

export XILDIR=/opt/Xilinx   ==> export XILDIR=/tools/Xilinx

export PARTNUMBER=LAST_ID ==> export PARTNUMBER=3

 

XILDIR는 xilinx 설치 루트 디렉토리 경로를 설정한다.

PARTNUMBER는 타겟 보드에 맞춰서 수정할 필요가 있다.

board_files/TE0726_board_files.csv의 내용을 첨부한다.(아래)

LAST_ID이면 ID 4번의 파트에 해당되기 때문에 사용할 수 없다.

CSV_VERSION=1.4^M
#Comment:-do not change matrix position or remove CSV_VERSION:^M
ID  ,PRODID             ,PARTNAME           ,BOARDNAME                      ,SHORTNAME      ,ZYNQFLASHTYP     ,FPGAFLASHTYP                           ,PCB_REV      ,DDR_SIZE ,FLASH_SIZE ,EMMC_SIZE ,OTHERS      ,NOTES    ,DESIGN^M
1   ,TE0726-01          ,xc7z010clg225-1   ,trenz.biz:te0726_01:part0:1.0   ,01_64MB        ,qspi-x4-single   ,s25fl128s-3.3v-qspi-x4-single|SPIx4|16 ,REV01        ,64MB     ,16MB       ,NA        ,NA          ,NA       ,TE0726^M
2   ,TE0726-03R         ,xc7z010clg225-1   ,trenz.biz:te0726_r:part0:2.1    ,r_128MB        ,qspi-x4-single   ,s25fl128s-3.3v-qspi-x4-single|SPIx4|16 ,REV03|REV02  ,128MB    ,16MB       ,NA        ,NA          ,LPDDR3   ,TE0726^M
3   ,TE0726-03M         ,xc7z010clg225-1   ,trenz.biz:te0726_m:part0:3.1    ,m_512MB        ,qspi-x4-single   ,s25fl128s-3.3v-qspi-x4-single|SPIx4|16 ,REV03|REV02  ,512MB    ,16MB       ,NA        ,NA          ,LPDDR3   ,TE0726^M
4   ,TE0726-03-07S-1C   ,xc7z007sclg225-1  ,trenz.biz:te0726_7s:part0:3.1   ,7s_512MB       ,qspi-x4-single   ,s25fl128s-3.3v-qspi-x4-single|SPIx4|16 ,REV03|REV02  ,512MB    ,16MB       ,NA        ,NA          ,LPDDR3   ,TE0726

design_basic_settins.sh 수정 후, 아래를 실행한다.

> bash vivado_create_project_guimode.sh

vivado가 자동으로 실행되면서 프로젝트가 자동 생성된다.

프로젝트를 수정하지 않고 Generate BitStream를 실행한다.

이후 Vivado를 실행할 때는 vivado_open_existing_project_guimode.sh를 실행한다.

 

비트 파일 생성 후, Export >> Export Hardware를 실행하여 XSA 파일을 저장한다.

 

2. Vitis 실행 후, FSBL & boot.bin 파일 만들기 개요

Zynqberry는 전원을 넣으면 보드의 ROM에서 FSBL(First Stage BootLoader)를 RAM에 로딩하여 소프트웨어를 실행하게 된다.

zynqberry에는 SD 슬롯이 있지만 Vitis에서 기본적으로 만들어 주는 FSBL은 ROM에서 로딩하는 역할밖에 할 수 없다.

u-boot를 실행하면 SD 카드에 있는 파일을 로딩하여 리눅스 커널, 파일시스템을 이용할 수 있다.

FSBL과 u-boot를 ROM에 넣어서, 보드에 전원을 넣어 부팅하여 u-boot까지 실행하는 것을 목표로 한다.

ROM에 넣는 FSBL은 QSPI 인터페이스로 동작해야 하며, 이것까지는 Vitis에서 자동 생성해준다.

Zynqberry는 micro-USB 인터페이스를 가지고 있으며 PC에서 zynqberry에 Flash ROM에 프로그램을 넣어주기 위해서는 JTAG 모드로 동작하는 FSBL을 만들어야 한다.

 

3. Vitis를 실행하여 Platform Project를 만든다.

Vitis를 실행한다.

File>>New>>Platform Project 실행

Project Name은 임의로 설정한다. 나는 "zynqberry"로 하였다.

Create from Hardware Specification (XSA) 선택하고 Next

XSA File로 Vivado에서 저장한 XSA 파일을 선택.

Operating System: Standalone

Processor : Ps7_cortexa9_0

Generate boot components : 체크 (<-- 반드시 체크한다)

Finish 를 선택하여 프로젝트 생성

 

Vitis의 Explorer zynqberry 프로젝트가 생성된다.

zynqberry >> platform.spr을 더블클릭한다.

StandAlone on ps7_cortexa9_0의 Board Support Package를 선택하고 Modify BSP Settings... 를 선택한다. Xilffx 를 선택한다.

zynqberry 를 build project 한다

 

두 개의 Application 프로젝트를 생성한다.

File>>New >> Application Project를 실행

두개의 프로젝트 이름은 "fsbl", "fsbl_flash" 로 한다.

"fsbl" 프로젝트의 소스코드는 수정하지 않아도 된다.

"fsbl_flash" 프로젝트의 소스코드를 수정한다.

main.c

(수정 1)

/*
 * Read bootmode register
 */
BootModeRegister = Xil_In32(BOOT_MODE_REG);
BootModeRegister &= BOOT_MODES_MASK;
BootModeRegister = JTAG_MODE; // <-- 이 부분을 새로 추가한다.

 

(수정 2)

아래 부분을 코멘트하여 실행 못하도록 한다.

 /*
     * DDR Read/write test 
     */
// Status = DDRInitCheck();
// if (Status == XST_FAILURE) {
// fsbl_printf(DEBUG_GENERAL,"DDR_INIT_FAIL \r\n");
// /* Error Handling here */
// OutputStatus(DDR_INIT_FAIL);
// /*
//  * Calling FsblHookFallback instead of Fallback
//  * since, devcfg driver is not yet initialized
//  */
// FsblHookFallback();
// }

 

(옵션)

fsbl 실행 과정을 모니터링하기 위해서 아래의 소스보드를 수정한다.

fsbl_debug.h

#define DEBUG_GENERAL 0x00000001    /* general debug  messages */
#define DEBUG_INFO 0x00000002    /* More debug information */
#define FSBL_DEBUG_INFO // <-- 이 부분을 추가한다.

 

프로젝트를 빌드한다.

 

4. u-boot 만들기

u-boot가 zynqberry 보드에서 실행되도록 빌드하기 위해 디바이스 트리를 수정해야 한다.

xilinx github에서 u-boot-xlnx, device-tree-xlnx를 다운로드 받는다.

cd device-tree-xlnx

git checkout xilinx-v2019.2

2019.2 버전에 맞춰서 tag 버전을 체크아웃한다.

cd u-boot-xlnx

git checkout xilinx-v2022.2

2022.2에 맞춰서 체크아웃한다. u-boot-xlnx는 2019.2가 아닌 2022.2에 한 이유는 다음과 같다.

*u-boot-xlnx를 2022.2 버전을 사용하는 이유

configs/ 에는 이미 여러개의 make configuration가 있지만 zynqberry 전용 config 파일은 없다. 가장 비슷한 config 파일을 참고하여 zinqberry 전용 config 파일을 만들 필요가 있다. zynqberry config 파일의 원본으로 xilinx_zynq_virt_defconfig를 사용하는 예가 있었다. 2019.2 u-boot의 configs/ 에는 xilinx_zynq_virt_defconfig가 없었기 때문에 2019.2를 사용하지 않았을 뿐이다.

2019.2에서 zynqberry config 파일과 가장 비슷한 config 파일을 이용하며 적절하게 수정하면 문제없을 수 있다. 추후에 2019.2 u-boot-xlnx로 빌드하는 것을 확인해 보겠다.

 

5. 내 보드에 맞춰서 u-boot용 defconfig 만들기

cd u-boot-xlnx

cp configs/xilinx_zynq_virt_defconfig configs/zynqberry_defconfig

 

zynqberry_defconfig에서 아래와 같이 수정한다.

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

추가로 아래의 내용을 추가한다.

CONFIG_IDENT_STRING=" for TE0726"
CONFIG_SYS_PROMPT="Berry> "

아래의 패키지를 설치한다.

sudo apt install build-essectial libssl-dev bison flex

sudo apt install gcc-arm-linux-gnueabihf

 

사전에 아래와 같이 설정한다.

export CROSS_COMPILE=arm-linux-gnueabihf-

export ARCH=arm

source /tools/Xilinx/Vitis/2019.2/settings64.sh

 

6. device tree 파일 만들기(dts 만들기)

dts 파일은 텍스트파일로 하드웨어에 대한 이해가 충분하다면 텍스트 에디터로 작성할 수 있다. 본인은 아직 하드웨어의 이해가 부족하기 때문에 vitis에서 디바이스 트리 생성 기능을 이용한다. 디바이스 트리 생성을 위해 device-tree-xlnx가 준비되어야 한다. xsa 파일로 준비되어 있어야 한다.

Vitis 실행

Xilinx >> Repositories 실행

Software Local Repositories에 device-tree-xlnx를 추가한다. Apply and Close 버튼을 선택한다.

Xilinx >> Generate Device Tree 실행

XSA 파일과 디바이스 트리가 저장된 경로를 설정하고 실행한다.

아래의 파일이 생성된다. 

├── Makefile
├── pcw.dtsi
├── pl.dtsi
├── skeleton.dtsi
├── system-top.dts
├── system.mss
├── system_0.mss
├── zynq-7000.dtsi
└── zynq-zynqberry.dts

 

여러개의 dts와 dtsi 파일이 있는데, 이것을 하나로 합쳐서 zynq-zynqberry.dts를 생성한다. 이 dts 파일은 /u-boot-xlnx/arch/arm/dts/ 에 넣는다.

 

 gcc -I my_dts -E -nostdinc -undef -D__DTS__ -x assembler-with-cpp -o zynq-zynqberry.dts system-top.dts

 

dts --> dtb 변환

dtc -I dts -O dtb -o zynqberry-hdmi.dtb system.dts

 

/arch/arm/dts/Makefile을 수정한다. 

 

        zynq-zybo.dtb \
        zynq-zybo-z7.dtb \  <--- 마지막에 "\"을 붙힌다.
        zynq-zynqberry.dtb  <--- 이 줄을 추가한다.
dtb-$(CONFIG_ARCH_ZYNQMP) += \

 

u-boot을 빌드하여 u-boot.elf을 만든다.

make zynqberry_defconfig

make

 

7. boot.bin 만들기

fsbl.elf, u-boot.elf가 준비된 상태에서 boot.bin을 만든다.

Vitis에서 fsbl_system 프로젝트를 선택하여 우클릭하여 Create Boot Image를 선택한다.

Boot Image Partitions에 3개의 파일을 추가한다.

(bootloader).../fsbl/Debug/fsbl.elf <--- 프로젝트에서 생성한 파일

zsys_wrapper.bit <-- Vivado에서 생성한 파일

.../u-boot-xlnx/u-boot.elf <--- u-boot-xlnx에서 생성한 파일

 

8. Program Flash Memory로 boot.bin 파일을 ROM에 로딩하기

Flash Type : qspi-x4-single

Image File : boot.bin

FSBL File : .../fsbl_flash/Debug/fsbl_flash.elf

설정하고 Program 버튼을 누른다.

 

프로그램이 정상 처리되면 Vitis의 콘솔 화면에 아래의 상태가 표기되는 것을 확인할 수 있다.

Flash Operation Successful

 

zynqberry 보드를 PC와 시리얼 포트 연결한 상태에서 Program Flash 하면, JTAG 부트 모드로 FSBL이 동작하는 것을 콘솔 표시창에서 확인할 수 있다. u-boot 는 실행되지 않는다.

 

9. Zynqberry u-boot 부팅하기

micro-USB를 연결한 상태에서 PC시리얼 포트를 연결하면 콘솔 표시와 사용자 입력이 가능하다.

본인은 gtkterm을 설치/사용한다. 시리얼 프로그램을 임의로 사용 가능하다.

시리얼 포트 설정은 아래와 같이 한다.

Baud Rate : 115200

Parity : none

Bits: 8

Stopbits: 1

Flow Control: none

부팅이 진행되고, 아래와 같이 u-boot 입력창이 표시된다.

Berry>