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: 1 qC.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上电观察启动信息。