본문 바로가기
Xilinx SoC/Zynqberry

Boot-up Linux Kernel (u-boot, sd card)

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

1. root file-system

buildroot를 이용하여 루트 파일시스템을 만든다.

git clone https://github.com/buildroot/buildroot.git

make zynq_zc706_defconfig

make

 

<path-to-buildroot>/output/target 의 내용을 sd-card에 복사할 것이다.

 

2. busybox

busybox로 파일시스템 만든다.

 

git clone https://github.com/mirror/busybox.git
cd busybox
export ARCH=arm64
export CROSS_COMPILE=arm-linux-gnueabihf-
make defconfig

 

config까지 완료되면 make menuconfig로 추가해야 할 설정이 있다.
Settins-->Build Static binary(no share libs)를 설정해야 라이브러리를 배치하는 수고를 덜 수 있다.

make

make install

<path-to-busybox>/_install/ 이 생성된다.

_install/etc/init.d/rcS를 작성한다.

 

cd _install

mkdir proc sys dev run etc dev/pts etc/init.d
sudo mknod -m 666 dev/null c 1 3
sudo mknod -m 600 dev/console c 5 1

 

리눅스 init process로 sbin/init를 실행하기 위해서 _install/etc/init.d/rcS 파일을 작성해야 한다. 또한 터미널 tty를 이용하기 위한 디바이스 노드도 작성한다.

#!/bin/sh
#/etc/init.d/rcS
mount -v --bind /dev /dev
mount -v --bind /dev/pts /dev/pts
mount -vt proc proc /proc
mount -vt sysfs sysfs /sys
mount -vt tmpfs tmpfs /run
/sbin/mdev -s

rcS파일은 chmod +x로 실행 가능하도록 만들어 준다.

 

cpio로 디렉터리를 아카이브 파일로 변환해야 한다.
make install로 생성된 _install 디렉터리로 이동하여 new ASCII포맷으로 아카이브 생성한다.

find . | cpio -H newc -ov --owner root:root -F ../initramfs.cpio

gzip으로 압축한다.

cd ../
gzip initramfs.cpio

initramfs.cpio.gz를 u-boot에서 인식할 수 있도록 u-boot-xlnx/tools/mkimage 툴을 이용하여 파일을 변환한다. u-boot대응 이미지파일의 이름은 uRamdisk로 한다.

 ./u-boot-xlnx/tools/mkimage -A arm64 -O linux -T ramdisk -d initramfs.cpio.gz uRamdisk

 

3. Linux-xlnx

git checkout xilinx-v2019.2.01

make distclean //설정제거

make clean

export CROSS_COMPILE=arm-linux-gnueabihf-

export ARCH=arm

make xilinx_zynq_defconfig

make menuconfig // 상세 설정 필요

make UIMAGE_LOADADDR=0x8000 uImage // 빌드하고, U-boot 헤더를 붙힌다

 

make menuconfig에서 여러가지 드라이버를 추가한다.

(1) SPI ROM driver

Top >> Device Drivers >> Memory Technology Device(MTD) support >> Self-contained MTD device drivers

check-in : Support most SPI Flash chips(AT26DF, M25P...)  

 

(2) RTC driver

Top >> Device Drivers >> Real Time Clock >> I2C RTC drivers

GigaZee 보드의 경우,

check-in : intersil ISL12022

Zynqberry는 RTC가 없기 때문에 RTC 설정은 생략한다.

 

(3) USB Host driver

Device Driver >> USB support check-in : USB announce new device                 OTG support                 USB ULPI PHY interface support(4) USB Lanzynqberry에는 USB-LAN 칩이 연결되어 있다.Device Drivers >> Network Device Supportcheck-in : USB Network Adapterscheck-in : Multi-purpose USB Networking Frameworkcheck-in : SMSC LAN95XX based USB 2.0 10/100 ethernet devices

 

(5) USB-Wifi

Networking support >> Wireless >> cfg80211(check) >> 하부항목 모두 체크(Generic IEEE802.11은 반드시 체크)

Device Drivers >> Network Device Support >>WirelessLAN 에 항목이 새로 추가되었다.Ralink 칩은 모두 선택.

 

(6) Frame-BufferHDMI 출력용.Device Drivers >> Graphics support >> Framebuffer Devices >> Simple Framebuffer support(check)Vivado 프로젝트 수정, Device Tree 수정, Virits FSBL 초기화코드 수정이 필요하다.

 

4. SD Card 파티션/준비

sudo fdisk /dev/mmcblk0/dev/mmcblk0p1          2048   206847   204800        100M  c W95 FAT32 (LBA)
/dev/mmcblk0p2        206848 59406335 59199488  28.2G 83 Linux

 

# FAT32 for boot partition
$ sudo mkfs.vfat -F 32 -n boot /dev/mmcblk0p1
# ext4 for root partition
$ sudo mkfs.ext4 -L root /dev/mmcblk0p2

 

mkdir -pv /mnt/sd-boot

mkdir -pv /mnt/sd-root

mount /dev/mmcblk0p1 /mnt/sd-boot

mount /dev/mmcblk0p2 /mnt/sd-root

linux-xlnx에서 만든 uImage(linux-xlnx/arch/arm/boot/), busybox에서 만든 uRamdisk를 /mnt/sd-boot/에 복사한다.

buildroot에서 만든 target/ 을 /mnt/sd-root/ 에 복사한다.u-boot-xlnx에서 만든 zynq-zynqberry.dtb(u-boot-xlnx/arch/arm/dts/)를 /mnt/sd-boot/ 에 복사한다.

umount /mnt/{sd-boot,sd-root}

 

참고로 zynq-zynqberry.dtb는 직접 만들 수 있다.

vivado에서 만든 xsa을 Vitis를 통해 Device Tree를 생성한 후, dtc로 빌드하면 된다.

 

5. Boot

sdcard를 zynqberry 보드에 넣는다.zynqberry에 USB 연결하여 전원 공급한다. u-boot 부팅을 확인한다.u-boot 스크립트를 입력한다. (스크립트 파일을 만들어 자동 부팅할 수 있다)

 

fatload mmc 0:1 ${kernel_addr_r} uImage
fatload mmc 0:1 ${ramdisk_addr_r} uRamdisk
fatload mmc 0:1 ${fdt_addr_r} zynq-zynqberry.dtb
setenv bootargs "console=ttyPS0,115200 root=/dev/mmcblk0p2 rw earlyprintk
rootfstype=ext4 rootwait devtmpfs.mount=1"
bootm ${kernel_addr_r} ${ramdisk_addr_r} ${fdt_addr_r}

 

u-boot 스크립트를 boot.scr로 생성, sd card의 boot 파티션에 넣어서, flash ROM에서 u-boot을 불러와 실행할 때 실행하기 위해서는 make menuconfig에서 Boot Options >> Boot media >> Support for booting from SD/EMMC 체크 하면 된다.