概要
Xilinx社の管理しているリポジトリのu-bootとlinuxをzyboで動くようにしました。
環境
- ホストPC: lubuntu 18.04
- コンパイラ: arm-linux-gnueabihf-gcc 7.3.0
u-boot
ソースのダウンロード
u-boot公式のソースをgitでダウンロードしてくる。
$ git clone https://github.com/Xilinx/u-boot-xlnx.git
$ cd u-boot-xlnx
$ git checkout -b xilinx-v2018.2_zybo refs/tags/xilinx-v2018.2
u-bootソースを修正
uEnv.txtを使うように./include/configs/zynq-common.hを修正します。
CONFIG_BOOTCOMMAND、CONFIG_EXTRA_ENV_SETTING、CONFIG_CMD_BOOTZの3つのマクロを修正します。ここを参考にしています。
$ cd xilinx-v2018.2_zybo
$ vi ./include/configs/zynq-common.h
#define CONFIG_BOOTCOMMAND \
"if mmc rescan; then " \
"echo SD/MMC found on device...;" \
"if run loadbootenv; then " \
"echo Loaded environment from ${bootenv};" \
"run importbootenv;" \
"fi;" \
"if test -n $uenvcmd; then " \
"echo Running uenvcmd ...;" \
"run uenvcmd;" \
"fi;" \
"if run loadbootscript; then " \
"run bootscript; " \
"fi; " \
"fi;" \
"run $modeboot"
/* Default environment */
#ifndef CONFIG_EXTRA_ENV_SETTINGS
#define CONFIG_EXTRA_ENV_SETTINGS \
"fit_image=fit.itb\0" \
"load_addr=0x2000000\0" \
"fit_size=0x800000\0" \
"flash_off=0x100000\0" \
"nor_flash_off=0xE2100000\0" \
"fdt_high=0x20000000\0" \
"initrd_high=0x20000000\0" \
"norboot=echo Copying FIT from NOR flash to RAM... && " \
"cp.b ${nor_flash_off} ${load_addr} ${fit_size} && " \
"bootm ${load_addr}\0" \
"sdboot=echo Copying FIT from SD to RAM... && " \
"load mmc 0 ${load_addr} ${fit_image} && " \
"bootm ${load_addr}\0" \
"jtagboot=echo TFTPing FIT to RAM... && " \
"tftpboot ${load_addr} ${fit_image} && " \
"bootm ${load_addr}\0" \
"usbboot=if usb start; then " \
"echo Copying FIT from USB to RAM... && " \
"load usb 0 ${load_addr} ${fit_image} && " \
"bootm ${load_addr}\0" \
"fi\0" \
"bootenv=uEnv.txt\0" \
"loadbootenv=load mmc 0 ${load_addr} ${bootenv}\0" \
"importbootenv=echo Importing environment from mmc ...;" \
"env import -t $load_addr $filesize\0" \
"loadbootscript=load mmc 0 ${load_addr} boot.scr\0" \
"bootscript=echo Running bootscript from mmc ...;" \
"source ${load_addr}\0" \
DFU_ALT_INFO
#endif
#define CONFIG_CMD_BOOTZ
コンパイル
make ARCH=arm zynq_zybo_defconfig
make -j8 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
ワークディレクトリ直下にu-boot.imgが、splフォルダの中にboot.binが生成されます。
linux
ソースのダウンロード
$ git clone https://github.com/Xilinx/linux-xlnx.git
$ cd linux-xlnx
$ git checkout -b xilinx-v2018.2_zybo refs/tags/xilinx-v2018.2
$ make ARCH=arm xilinx_zynq_defconfig
$ make -j8 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
./arch/arm/boot/にzImageと./arch/arm/boot/dtsにzynq-zybo.dtbが生成されます。
uEnv.txt
u-bootの設定でuEnv.txtの内容でブートするように修正したので次のようなuEnv.txtを用意します。
bootargs=console=ttyPS0,115200 root=/dev/mmcblk0p2 rw earlyprintk rootfstype=ext4 rootwait devtmpfs.mount=1
uenvcmd=fatload mmc 0 0x03000000 design.bit && fpga loadb 0 0x03000000 $filesize && fatload mmc 0 0x03000000 zImage && fatload mmc 0 0x02A00000 zynq-zybo.dtb && bootz 0x03000000 - 0x02A00000
SDカードの用意
ここを参考にして第2パーティションにubuntuのルートファイルシステムが存在して、sudoグループに所属しているユーザyoshiが存在するとします。
第1パーティションに今まで作成したファイルと、FPGAのコンフィグレーションデータdesign.bitをコピーします。コピーした後のSDカードの中身はこのようになっています。
$ ls /media/yoshi/ZYBO_BOOT/
boot.bin design.bit u-boot.img uEnv.txt zImage zynq-zybo.dtb
ZYBOの起動
SDカードをZYBOに挿して起動します。シリアル接続はscreenコマンドなどで接続します。zyboの電源を入れないと接続出来ないが、電源を入れてから接続するとメッセージが途中からしか出力されないので、接続できたら一旦ボタンスイッチPS-SRSTでリセットすると最初からメッセージが出力されます。
起動メッセージが出力された後ログインできるので、作成したユーザとパスワードでログインします。無事ログインでることが確認できました。
$ sudo screen /dev/ttyUSB1 115200
# 起動メッセージ省略
Ubuntu 18.04 LTS airi ttyPS0
airi login: yoshi
Password:
Last login: Sun Jan 28 16:36:02 UTC 2018 on ttyPS0
Welcome to Ubuntu 18.04 LTS (GNU/Linux 4.14.0-xilinx armv7l)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
yoshi@airi:~$ pwd
/home/yoshi
yoshi@airi:~$ uname -a
Linux airi 4.14.0-xilinx #4 SMP PREEMPT Mon Aug 13 07:13:30 JST 2018 armv7l armv7l armv7l GNU/Linux