1.在構建好嵌入式開發環境的基礎上進行下一步開發移植工作。
2.編譯U-Boot
首先在線獲取U-Boot源碼,在源碼include/configs/zynq_zed.h中,修改IP地址(CONFIG_IPADDR)、網關地址(CONFIG_SERVERIP)、MAC地址(CONFIG_EXTRA_ENV_SETTINGS-ethaddr)等宏定義參數,避免設備間通信沖突。
修改完成后,使用交叉編譯工具編譯U-Boot文件,編譯完成后,在生成的u-boot文件后加.elf后綴以便Xilinx SDK工具對其進行識別,該文件和 .bit文件, fsbl.elf文件被用來生成Linux啟動文件BOOT.BIN。下載
# git clone https://github.com/Digilent/u-boot-digilent
修改U-Boot
# vim u-boot-digilent/include/configs/zynq_zed.h
# make zynq_zed_config
編譯
# make
# cp u-boot u-boot.elf
3.生成BOOT.BIN
在XPS中選擇將硬件設計輸出到Xilinx軟件設計平台(SDK),建立第一階段引導程序(First Stage Bootloader,FSBL)工程,該工程使用邏輯配置文件system.bit對PL進行配置並載入操作系統鏡像,通過Xilinx工具使用上兩步u-boot.elf、system.bit以及FSBL.elf生成Zynq的BOOT鏡像,將生成文件u-boot.bin改名為BOOT.BIN以識別。(可后續再做,先專心Ubuntu環境下文件的生成)
4.編譯Linux內核
下載Linux內核源碼,這里使用linux-digilent-master。解壓后進入源碼目錄,
make ARCH=arm digilent_zed_defconfig
進行初步配置工作。
//使用menuconfig工具對內核進行配置。(按需求)
進行編譯工作,
make ARCH=arm
編譯成功后,在arch/arm/boot下生成了zImage文件。
5.編譯設備文件樹
設備文件樹源碼位於arch/arm/boot/dts/digilent-zed.dts,修改設備串口連接時的波特率信息,
vi digilent-zed.dts,在chosen項進行修改。
通過如下指令編譯修改好的設備文件樹源碼(devicetree.dts),可執行程序dtc為設備樹編譯器,(devicetree.dtb)是由源碼生成的二進制文件。
./linux-digilent/scripts/dtc/dtc -I dts -O dtb –o devicetree.dtb digilent-zed.dts
6.制作根文件系統(參考http://blog.csdn.net/xzyiverson/article/details/12704737)
Linux啟動文件包括BOOT.BIN、zImage、devicetree.dtb以及文件系統ramdisk鏡像文件,前幾項已經完成制備,現在進行最后一項ramdisk制備。
6.1編譯BusyBox
下載busybox-1.19.3.tar,解壓進入文件目錄后,
make ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- defconfig
進行初步配置工作,然后輸入如下指令:
make (ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi-) menuconfig
在BusyBox Settings中,Installation…中選擇第二項,輸入想要存放文件目錄的地址,
/opt/zed/_roofs
輸入make install 安裝。
這里出現問題如下:/usr/include/mtd/ubi-user.h:412:3: error: conflicting types for ‘__packed’
/usr/include/mtd/ubi-user.h:313:3: note: previous declaration of ‘__packed’ was here
make[1]: *** [miscutils/ubi_tools.o] Error 1
make: *** [miscutils] Error 2
需要重新配置 make menuconfig
Miscellaneous Utilities —>刪掉所有和ubi相關選項
linux-2.6.27后,內核加入了一種新型的Flash文件系統UBI(Unsorted Block Images)。
刪掉后,成功安裝。(參考http://blog.sciencenet.cn/blog-623402-483960.html)
6.2編譯Dropbear
下載dropbear-2012.55.tar,解壓並進入源碼目錄,進行配置。
./configure –prefix=/opt/zedboard/devel/_rootfs –host=arm-xilinx-linux-gnueabi –disable-zlib CC=arm-xilinx-linux-gnueabi-gcc LDFLAGS=”-Wl,–gc-sections” CFLAGS=”-ffunction-sections -fdata-sections -Os”
編譯安裝:
make PROGRAMS=”dropbear dbclient dropbearkey dropbearconvert scp”MULTI=1 strip
make install
建立軟連接
cd /opt/zed/_rootfs/usr/bin/
ln -s ../../sbin/dropbear ./scp
工具鏈動態庫與應用設置
1.建立目錄
cd /opt/zedboard/devel/_rootfs/
mkdir lib
將交叉編譯環境庫拷貝到這個目錄下cp /root/CodeSourcery/Sourcery_CodeBench_Lite_for_Xilinx_GNU_Linux/arm-xilinx-linux-gnueabi/libc/lib/* lib -r
cp /root/CodeSourcery/Sourcery_CodeBench_Lite_for_Xilinx_GNU_Linux/arm-xilinx-linux-gnueabi/libc/sbin/* sbin/ -r
cp /root/CodeSourcery/Sourcery_CodeBench_Lite_for_Xilinx_GNU_Linux/arm-xilinx-linux-gnueabi/libc/usr/bin/* usr/
2.創建目錄結構與配置
在/opt/zedboard/devel/_rootfs/下:
mkdir dev etc etc/dropbear etc/init.d mnt opt proc root sys tmp var var/log var/www
然后進入etc目錄,創建許多的配置文件
vi fstab
LABEL=/ / tmpfs defaults 0 0
none /dev/pts devpts gid=5,mode=620 0 0
none /proc proc defaults 0 0
none /sys sysfs defaults 0 0
none /tmp tmpfs defaults 0 0
vi inittab::sysinit:/etc/init.d/rcS
# /bin/ash
#
# Start an askfirst shell on the serial ports
ttyPS0::respawn:-/bin/ash
# What to do when restarting the init process
::restart:/sbin/init
# What to do before rebooting
::shutdown:/bin/umount -a -r
vi passwd
root:1qC.CEbjC$SVJyqm.IG.gkElhaeM.FD0:0:0:root:/root:/bin/sh
vi init.d/rcS#!/bin/sh
echo "Starting rcS..."
echo "++ Mounting filesystem"
mount -t proc none /proc
mount -t sysfs none /sys
mount -t tmpfs none /tmp
echo "++ Setting up mdev"
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
mkdir -p /dev/pts
mkdir -p /dev/i2c
mount -t devpts devpts /dev/pts
echo "++ Starting telnet daemon"
telnetd -l /bin/sh
echo "++ Starting http daemon"
httpd -h /var/www
echo "++ Starting ftp daemon"
tcpsvd 0:21 ftpd ftpd -w /&
echo "++ Starting dropbear (ssh) daemon"
dropbear
echo "rcS Complete"
設置用戶權限:chmod 755 etc/init.d/rcS
chown root:root etc/init.d/rcS
3.制作ramdisk鏡像文件
制作鏡像文件cd ~
dd if=/dev/zero of=ramdisk8M.image bs=1024 count=8192
mke2fs -F ramdisk8M.image -L "ramdisk" -b 1024 -m 0
tune2fs ramdisk8M.image -i 0
chmod 777 ramdisk8M.image
掛載,將_rootfs的所有內容復制到該鏡像中mkdir ramdisk
mount -o loop ramdisk8M.image ramdisk/
cp -R /home/devel/_rootfs/* ramdisk
umount ramdisk/
gzip -9 ramdisk8M.image
最后一步;將zImage,BOOT.BIN,devicetree_ramdisk.dtb(devicetree.dtb改名),ramdisk8M.image.gz拷貝到sd卡中,zedboard上電觀察啟動信息。