타겟보드 : 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>
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>
'Xilinx SoC > Zynqberry' 카테고리의 다른 글
Boot-up Linux Kernel (u-boot, sd card) (0) | 2023.05.20 |
---|---|
6.리눅스 디바이스 트리 파일 만들기 (0) | 2022.05.07 |
2-1. Vitis 프로젝트 소스 수정하기 (0) | 2022.05.07 |
4. BOOT.BIN 만들고, Program Flash 하기 (1) | 2022.05.07 |
3. U-BOOT 빌드하기 (0) | 2022.05.07 |