最近这几天想固件升级的问题,开始考虑双u-boot,然后在fsbl里面增加一个多镜像的操作,增加一段代码驱动网络,和升级软件对码成功后,跳转到第一个u-boot,自动运行cmd从tftp上下载BOOT.bin,deivcetree.dtb,uImage和一个装有格式化emmc的小软件uramfs.image.gz,用于启动运行格式化后重启,串口全程输出文字信息,必要点灯提示。如果对码不成功跳转另一个u-boot,全程串口无任何输出,点灯提示开机进度。感觉还是很麻烦,要是u-boot能格式化,emmc就好了,文件系统统统放到这个上面,都不用uramfs.image.gz了,网上看到三星的u-boot实现了类似的fdisk的功能,手里的4412开发板的u-boot是13年的,和现在的u-boot都一些变化,并不能简单的移植,留到以后就是了,感觉很好的功能。目前没必要做得那么麻烦直接做成一个uboot三个命令
一个是升级内核+挂载nfs文件系统+升级nfs设备树,目的是调试。
一个是升级qspi里面的升级三个设备树(只有bootargs不同而已分别是,nfs文件系统:ramfs文件系统:emmc
对应得文件系统)+升级内核+升级文件系统+更新emmc里面的文件系统,只是单纯升级。
最后一个是启动从qspi内核里面加载设备树和内核,默认直接挂载emmc上面的文件系统,进入系统并运行相机的程序。
emmc目前分区还没有想,留到以后32Mqspi的分区规划就是
(FSBL+u-boot)1M:(ramdiskfsboottree)0x2000:(emmcfsboottree)0x2000:(kernel)6M:(ramfs)6M
加在一起不过16M剩余16M用于存储FPGA的bit足够用了。
编译内核不用做更改直接
make distclean
make xilinx_zynq_defconfig
make UIMAGE_LOADADDR=0x8000 uImage -j8
生成镜像即为可用镜像uImage
设备树还是在通过SDK里面拷贝文件到内核的cripts/dtc vim system-top.dts 直接更改bootargs参数
准备三套bootargs mmc留以后添加
挂载nfs文件系统的bootargs=console=ttyPS0,115200 earlyprintk root=/dev/nfs nfsroot=192.168.0.50:/tftpboot/rootfs,tcp ip=192.168.0.10:192.168.0.50 rw
挂载ramdiskfs文件系统的bootargs=console=ttyPS0,115200 earlyprintk root=/dev/ram0 rw
分别对应devicetreenfs.dtb、devicetreeramfs.dtb和devicetreestup.dtb
之前在网上搜索到一个
它这个里面调试的时候bootargs=console=ttyPS0,115200 root=/dev/nfs rw nfsroot=192.168.0.50:/tftpboot/rootfs ip=192.168.0.10:192.168.0.50:192.168.0.1:255.255.255.0::ens33:off earlyprintk rootwait
看上去挺对的,但是就是会挂载失败,然后内核hang()
准备好设备树后准备u-boot
内核和u-boot的配置都对应着一个.config,一个.h文件。
u-boot-xlnx-master/configs/zynq_zed_defconfig
里面CONFIG_SYS_PROMPT="Zynq> "更改"Vision> " 其实这里面没什么要更改的
注意CONFIG_SYS_TEXT_BASE=0x4000000,内存的便宜地址 链接脚本会用到
u-boot-xlnx-master/arch/arm/dts/zynq-zed.dts 这里面有需要更改的就是串口和内存大小
老版本的u-bootu-boot-xlnx-master/include/configs/zynq_zed.h里面修改,17板的就不用更改这个头文件了,已经不存在了,我也找一阵子,我的板子用的是uart0不是uart1,然后就是内存的大小。其余的几乎都不用更改,
aliases {
ethernet0 = &gem0;
serial0 = &uart0;
spi0 = &qspi;
mmc0 = &sdhci0;
};
memory@0 {
device_type = "memory";
reg = <0x0 0x40000000>;
};
u-bootu-boot-xlnx-master/include/configs/zynq-common.h文件里面需要修改的是增加启动命令,我只增加两个
"bootnfs=echo boot from tftpsever mount nfs ...&& "\
“tftpboot 0x2080000 uImage && ”\
"tftpboot 0x2000000 devicetreenfs.dtb &&"\
“bootm 0x2080000 - 0x2000000 \0”\
"updata= echo uodata qspi format emmc...&&"\
"sf probe 0 0 0 && " \
"sf erase 0x0 0x100000 && " \
"tftpboot ${kernel_load_address} BOOT.bin && " \
"sf write ${kernel_load_address} 0x0 ${filesize}&&" \
"sf erase 0x100000 0x20000 && " \
"tftpboot ${kernel_load_address} devicetreeramfs.dtb && " \
"sf write ${kernel_load_address} 0x100000 ${filesize}&&" \
"sf erase 0x120000 0x20000 && " \
"tftpboot ${kernel_load_address} devicetreemmc.dtb&& " \
"sf write ${kernel_load_address} 0x120000 ${filesize}&&" \
"sf erase 0x140000 0x500000 && " \
"tftpboot ${kernel_load_address} uImage && " \
"sf write ${kernel_load_address} 0x140000 ${filesize}&&" \
"sf erase 0x640000 0x5E0000 && " \
"tftpboot ${kernel_load_address} uramdisk.image.gz && " \
"sf write ${kernel_load_address} 0x640000 ${filesize}&&" \
“echo Use new framework to boot && run bootstart \0\”
"bootstart = echo Copying Linux form qspi flash to ram ... &&"\
"sf probe 0 0 0 && " \
"sf read 0x2080000 0x140000 0x500000 && " \
"sf read 0x200000 0x100000 0x20000 && " \
"echo Copying ramdisk... && " \
"sf read 0x4000000 0x640000 0x5E0000 && " \
"bootm 0x2080000 0x4000000 0x2000000 \0"\
"bootmmc = \0"\
然后在默认的autoboot命令改成bootmmc 正常启动命令,当前调试暂时不用
#if defined(CONFIG_CMD_ZYNQ_RSA)
#define CONFIG_BOOTCOMMAND "run rsa_$modeboot"
#else
#define CONFIG_BOOTCOMMAND "run bootmmc"
IP信息也要添加,可以在win7下ping 192.168.0.50 ping通虚拟机里的Ubuntu 16.04
虚拟机里面安装nfs环境 路径是/tftpboot/rootfs 文件夹 tftpsever可以指定到tftpsever文件夹
我是放到了win7的tftp32的sever上,放在虚拟机上更方便一些。
虚拟机里面ping 一下192.168.0.100 验证链接正常
进入u-boot ping 192.168.0.100 alive ping 192.168.0.50 alive 三网互通
修改完u-boot的设置编译u-boot
make zynq_zed_defconfig
make -j8
cp u-boot u-boot.elf
打开SDK建立FSBL不用修改默认,和u-boot.elf生成BOOT.bin
虚拟机网络文件系统拷贝来自petalinux 17.4生成的,暂时先使用这个,后期再考虑修改。
SDK烧写bin文件,上电启动,链接secureCRT提前按回车,run bootnfs
启动,开始练习驱动,编译好后放到nfs上验证