imx6ull的程序烧录官方推荐的是MfgTool ,MfgTool 工具是 NXP 提供的专门用于给 I.MX 系列 CPU 烧写系统的软件。今天捣鼓一下从SD来启动系统。
1.制作烧录SD卡
我们常用的SD卡一个扇区的大小是512字节。前面两个扇区是不可以写入用户数据的,一般存的是SD卡相关的信息。imx6ull数据手册也写到SD/EMMC启动是从地址偏移0x400字节的地方开始,
0x400=1024=521*2刚好是两个偏移两个扇区。
首先对SD进行分区,第一个分区100M(从2048扇区开始,前面2~2047扇区用于存储u-boot固件),格式化为fat32文件系统,分区命名为boot,用于存储linux内核和设备树文件;第二个分区1G,格式化为ext4文件系统,用于存储根文件系统,分区命名为rootfs。 关于SD卡的分区方法附上参考链接Linux系统下对SD卡分区步骤_爱喝纯牛奶的柠檬的博客-CSDN博客_linux sd卡分区
2.烧录
- 命令行烧录uboot到SD卡
sudo dd if=u-boot.imx of=/dev/sdb bs=1k seek=1 conv=fsync
- 将设备树和linux内核拷贝到SD卡的第一个分区boot
sudo cp ~/linux/tftpboot/zImage /media/hyq/boot/ -rf
sudo cp ~/linux/tftpboot/imx6ull-hyq-emmc.dtb /media/hyq/boot/ -rf
- 将根文件系统拷贝到SD卡的第二个分区rootfs,rootfs.ext4需要挂载到某个节点下才能才可以查看和拷贝
sudo mount -o loop -t ext4 ~/linux/tool/buildroot-2019.02.6/output/images/rootfs.ext4 /mnt/myd/
sudo cp /mnt/myd/* -a /media/hyq/rootfs/
3.SD卡启动
fatload mmc 0:1 80800000 zImage
fatload mmc 0:1 83000000 imx6ull-hyq-emmc.dtb
setenv bootargs 'console=ttymxc0,115200 root=/dev/mmcblk0p2 rootwait rw'
saveenv
bootz 80800000 - 83000000
解决内核启动网络不可用的问题
ifconfig eth0 up
ifconfig eth0 192.168.0.50 netmask 255.255.255.0
route add default gw 192.168.0.1
4.将程序固化到内部emmc
在程序固化之前首先是要将内部emmc进行分区,和SD卡的分区是一模一样的,imx6ull是通过MfgTool 工具从USB口下载到内部emmc的,当然分区操作也是该MfgTool来完成了。因此我们在imx6ull的uboot中找不到fdisk命令,但是以前在玩三星4412的时候确实是有fdisk命令的,也许是NXP强烈建议使用MfgTool工具来烧录程序,所以给去掉了该分区命令。虽然如此,在uboot中我们仍然可以通过命令升级SD中的内核固件和设备树到内部emmc。
fatload mmc 0:1 80800000 zImage
fatwrite mmc 1:1 80800000 zimage 552f78
fatload mmc 0:1 83000000 imx6ull-hyq-emmc.dtb
fatwrite mmc 1:1 83000000 imx6ull-hyq-emmc.dtb 3c88
注意fatload命令默认是没有的,需要在mx6ull_hyq_emmc.h添加
#define CONFIG_FAT_WRITE /* 使能 fatwrite 命令 */
fatwrite 写的字节数是十六进制的,比如552f78对应的是5582712 bytes
由于使用fatloat和fatwrite命令拷贝文件比较繁琐,需要知道文件的名字和文件大小,还需要将文件逐个加载到内存中才能进行拷贝,对于文件系统的拷贝更加麻烦。
因此我们一般是从SD卡引导启动linux内核,然后在内核程序中将内部的emmc进行分区格式化,再将相对应的文件从过linu命令进行批量的文件拷贝。