目录
制作工程
vivado上构建工程,添加Zynq和三个16550串口,串口的中断通过concat连接Zynq。
Zynq中配置SD卡和以太网。SD卡接口在硬件上连接EMMC,存放BOOT.bin和image.ub。以太网用来传输文件。
综合实现后,找到{prj_name}\{prj_name}.srcs\sources_1\bd\{bd_name}\ {bd_name}.bd和{prj_name}\{prj_name}.srcs\sources_1\bd\{bd_name}\ip\{bd_name}_processing_system7_0_0\{bd_name}_processing_system7_0_0.xci,导入Procise。
如果成功导入Procise,会自动弹出iar生成选项,选择FSBL和DeviceTree。FSBL用于生成第一阶段引导程序,DeviceTree用于制作Linux所需设备树。
制作启动文件
开启虚拟机,配置SDK环境。将vivado生成的{prj_name}\{prj_name}.sdk\{prj_name_wrapper}.hdf和iar生成的DeviceTree放入虚拟机。hdf用于生成设备树的PL部分,DeviceTree用于生成设备树的PS部分。
sudo su
cd FMQL-Linux-SDK
source env.sh
/*制作dtb*/
./build.sh --hw /home/{user_name}/DeviceTree/ --hdf home/{user_name}/{prj_name_wrapper}.hdf dtb
/*制作u-boot*/
cd u-boot
make fmql_common_defconfig
make EXT_DTB=../images/system-top.dtb -j4
/*制作zImage*/
cd linux
make fmsh_fmql_defconfig
make -j4
/*制作image.ub*/
./build.sh image
将生成的u-boot增加后缀elf。再与iar生成的FSBL.out、vivado生成的bit文件通过Procise整合成为BOOT.bin。
在制作zImage时,Linux内核中添加16550串口驱动,增加串口挂载点数量。
烧写程序
第一次烧写要通过仿真器,后续可以通过网络的方式。仿真器烧写较为简单,在此介绍网络烧写。将BOOT.bin和image.ub放入tftp文件夹。首先将BOOT.bin通过网络放入内存,然后探测EMMC,擦除EMMC,最后将内存中存放的BOOT.bin写入EMMC。注意此时会重置启动参数。
tftp 0x2000000 BOOT.bin
sf probe
sf erase 0x0 0x7f0000
sf write 0x2000000 0x0
烧写完成后要启动Linux,第一次通过网络启动,为EMMC进行分区。FAT分区存放image.ub,EXT分区存放rootfs。
更新镜像
更新image.ub时,首先通过网络启动备用image,备用image中的linux内核包含网口等驱动。通过网络挂载的方式将虚拟机中image.ub放入FAT分区。网络挂载前,要保证虚拟机与芯片通信正常。如果ping不通,虚拟机设置桥接,虚拟网络编辑器选出vmnet0,选中主机网卡。
tftp 0x2000000 image.ub
bootm 0x2000000
ifconfig eth0 192.168.0.50 up
mkdir -p /mnt/nfs /mnt/fat
mount -t nfs -o nolock 192.168.0.200:/mnt/nfs /mnt/nfs
mount -t vfat /dev/mmcblk0p1 /mnt/fat/
cd /mnt/fat/
cp /mnt/nfs/image.ub .
更新文件系统
更新rootfs时,同样要通过网络启动备用image,然后将EXT分区内容全部删除。通过网络挂载的方式将虚拟机中rootfs.cpio放入EXT分区。解压后放入备份文件。
tftp 0x2000000 image.ub
bootm 0x2000000
ifconfig eth0 192.168.0.50 up
mkdir -p /mnt/nfs /mnt/ext
mount -t nfs -o nolock 192.168.0.200:/mnt/nfs /mnt/nfs
mount /dev/mmcblk0p2 /mnt/ext/
cd /mnt/ext/
/*注意备份*/
rm -rf *
cp /mnt/nfs/backup_014/rootfs.cpio .
cpio -idmv < rootfs.cpio
测试串口
设置串口,默认不校验,需要校验要开启parenb。奇校验开启parodd,偶校验禁用奇校验-parodd。
stty -F /dev/ttyPS2 ispeed 115200 ospeed 115200 cs8
stty -F /dev/ttyPS2 ispeed 500000 ospeed 500000 cs8 parenb parodd