4. Uboot的烧录¶
4.1. Mfgtool烧写Uboot到内部存储(EMMC/NAND通用)¶
4.1.1. 简介¶
MFGTool工具是NXP官方推荐的一个使用USB OTG来升级镜像的软 件工具,它是NXP针对i.MX系列处理器专门使用的烧 录工具,可以用来升级linux,单独烧录某一系统分区,独立 地烧录spi flash、 nor flash、sd card、nand flash,emmc等,只需简单的配置,就可以使用该工具将编译好 的文件系统和镜像文件烧录到开发板上,使用起来非常方便。而 且MFGtool工具作为一个可量产性的工具,它支持多通道的烧录,在实 际量产中,可以直接使用MFGtool工具同时将文件系统与镜像文件烧录 到多个开发板上。
4.1.2. MFGtool工具的工作原理¶
简单来说MFGtool工具的烧录步骤分为两个阶段:BurnStarp和Updater。第一阶段是 烧录前的准备工作,配置设备USB的vid和pid,来选择烧录的设备。第二阶段是MFGtools开 始烧录到结束烧录的过程,这个阶段的烧录过程是严格根据ucl2.xml文件来处理的,实际上是将bootloader加载到ram,然后在运行时将编译好的文件系统和镜像文件烧录到开发板上,烧录的 位置由用户指定,可以是sd card、nand flash,emmc等。
4.1.4. 替换uboot文件¶
将编译出的uboot-dtb.imx 更名
emmc 版本的重命名为 u-boot-mmc.imx
nand 版本的重命名为 u-boot-nand.imx
然后进入到mfgtool目录中的 mfgtools-release\Profiles\Linux\OS Firmware\release 目录将相应文件替换即可
4.1.5. 修改ucl2.xml文件¶
将mfgtools-release\Profiles\Linux\OS Firmware目录下的ucl2.xml替换为如下内容
也可以下载直接替换 ucl2.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 <UCL> <CFG> <STATE name="BootStrap" dev="MX6ULL" vid="15A2" pid="0080"/> <STATE name="Updater" dev="MSC" vid="066F" pid="37FF"/> </CFG> <LIST name="eMMC" desc="Choose eMMC as media"> <CMD state="BootStrap" type="boot" body="BootStrap" file ="firmware/u-boot-imx6ul%lite%%6uluboot%_emmc.imx" ifdev="MX6ULL">Loading U-boot</CMD> <CMD state="BootStrap" type="load" file="firmware/zImage" address="0x80800000" loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6SL MX6SX MX7D MX6UL MX6ULL">Loading Kernel.</CMD> <CMD state="BootStrap" type="load" file="firmware/%initramfs%" address="0x83800000" loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6SL MX6SX MX7D MX6UL MX6ULL">Loading Initramfs.</CMD> <CMD state="BootStrap" type="load" file="firmware/zImage-imx6ul%lite%-%6uldtb%-emmc.dtb" address="0x83000000" loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6ULL">Loading device tree.</CMD> <CMD state="BootStrap" type="jump" > Jumping to OS image. </CMD> <!-- create partition --> <CMD state="Updater" type="push" body="send" file="mksdcard.sh.tar">Sending partition shell</CMD> <CMD state="Updater" type="push" body="$ tar xf $FILE "> Partitioning...</CMD> <CMD state="Updater" type="push" body="$ sh mksdcard.sh /dev/mmcblk%mmc%"> Partitioning...</CMD> <!-- 烧录uboot 选择uboot的路径--> <CMD state="Updater" type="push" body="$ dd if=/dev/zero of=/dev/mmcblk%mmc% bs=1k seek=768 conv=fsync count=8">clear u-boot arg</CMD> <!-- access boot partition --> <CMD state="Updater" type="push" body="$ echo 0 > /sys/block/mmcblk%mmc%boot0/force_ro">access boot partition 1</CMD> <CMD state="Updater" type="push" body="send" file="%files_dir%/%my_uboot%" ifdev="MX6ULL">Sending u-boot.bin</CMD> <CMD state="Updater" type="push" body="$ dd if=$FILE of=/dev/mmcblk%mmc%boot0 bs=512 seek=2">write U-Boot to sd card</CMD> <CMD state="Updater" type="push" body="$ echo Update Complete!">Uboot Finishing</CMD> </LIST> <LIST name="NAND Flash" desc="Choose NAND as media"> <CMD state="BootStrap" type="boot" body="BootStrap" file ="firmware/u-boot.imx" ifdev="MX6ULL">Loading U-boot</CMD> <CMD state="BootStrap" type="load" file="firmware/zImage" address="0x80800000" loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6SL MX6SX MX7D MX6UL MX6ULL">Loading Kernel.</CMD> <CMD state="BootStrap" type="load" file="firmware/%initramfs%" address="0x83800000" loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6SL MX6SX MX7D MX6UL MX6ULL">Loading Initramfs.</CMD> <CMD state="BootStrap" type="load" file="firmware/imx6ull-seeed-npi.dtb" address="0x83000000" loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6ULL">Loading device tree.</CMD> <CMD state="BootStrap" type="jump" > Jumping to OS image. </CMD> <!--burn the uboot to NAND: --> <CMD state="Updater" type="push" body="$ mount -t debugfs debugfs /sys/kernel/debug">Mounting debugfs</CMD> <CMD state="Updater" type="push" body="$ flash_erase /dev/mtd%part_uboot% 0 0">Erasing Boot partition</CMD> <CMD state="Updater" type="push" body="send" file="%files_dir%/%my_uboot%" ifdev="MX6ULL">Sending u-boot.bin</CMD> <CMD state="Updater" type="push" body="$ kobs-ng init -x -v --chip_0_device_path=/dev/mtd%part_uboot% $FILE">Flashing Bootloader</CMD> <CMD state="Updater" type="push" body="$ echo Update Complete!">Uboot Finishing</CMD> </LIST> </UCL>
4.1.6. 烧录¶
4.1.6.1. 烧录配置¶
解压后的“cfg.ini”文件默认为EMMC的烧写配置文件, 若想要烧写NAND版本镜像,将cfg.ini重命名为cfg-emmc.ini,并将cfg-nand.ini文件重命名为cfg.ini即可。
4.1.6.2. 设置为USB启动模式¶
将USB OTG与电脑连接
使用USB更新时不能插入SD卡,将拨码开关设置为USB启动。 配置拨码开关:
emmc版本:将1/4/5/7打到ON档,其他拨码开关打到OFF档。
nand版本:将1/3/6打到ON档,其他拨码开关打到OFF档。
提示
也可以选择通过按键方式进入烧录模式,按键法可以不用拨码,拨码状态在之前的 EMMC 或者 NAND 都可以。
上电
按下MODE按键
按下复位(RESET)按键
松开复位(RESET)按键
松开MODE按键
此时软件就可以识别到USB了,然后烧录完毕后重启即可。
4.2. Uboot烧写到SD卡镜像(常用于做uboot测试)¶
4.2.1. 环境搭建¶
参考本章节进行环境搭建 在PC上安装Ubuntu系统
4.2.2. 使用dd命令将uboot烧写到SD中¶
将u-boot-dtb.imx拷贝到虚拟机内。
编译emmc版本和nand版本默认输出都是u-boot-dtb.imx,无需更改。
重要
需要确定挂载到虚拟机的的SD卡在/dev/sd中的哪个,一般为sdb,如果烧错设备可能导致虚拟机损坏,无法启动。
将以上的编译得到的mmc版本uboot烧录到SD卡中。uboot烧录sd卡会破坏原有数据,请做好sd卡数据备份后再执行以下步骤。
将sd卡通过读卡器连接到虚拟机前,使用lsblk命令查看当前磁盘设备。
1 2 3 4 5 6 7 8 9 10 11 12
embedfire@embedfire-VirtualBox:~$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT loop0 7:0 0 91M 1 loop /snap/core/6350 loop1 7:1 0 2.3M 1 loop /snap/gnome-calculator/260 loop2 7:2 0 13M 1 loop /snap/gnome-characters/139 loop3 7:3 0 140.7M 1 loop /snap/gnome-3-26-1604/74 loop4 7:4 0 3.7M 1 loop /snap/gnome-system-monitor/57 loop5 7:5 0 34.6M 1 loop /snap/gtk-common-themes/818 loop6 7:6 0 14.5M 1 loop /snap/gnome-logs/45 sda 8:0 0 100G 0 disk └─sda1 8:1 0 100G 0 part / sr0 11:0 1 58.3M 0 rom /media/embedfire/VBox_GAs_6.1.18
将sd卡通过读卡器连接到电脑上,并选择连接到虚拟机上。
再次使用lsblk命令插件磁盘设备,如下所示
1 2 3 4 5 6 7 8 9 10 11 12 13
embedfire@embedfire-VirtualBox:~$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT loop0 7:0 0 91M 1 loop /snap/core/6350 loop1 7:1 0 2.3M 1 loop /snap/gnome-calculator/260 loop2 7:2 0 13M 1 loop /snap/gnome-characters/139 loop3 7:3 0 140.7M 1 loop /snap/gnome-3-26-1604/74 loop4 7:4 0 3.7M 1 loop /snap/gnome-system-monitor/57 loop5 7:5 0 34.6M 1 loop /snap/gtk-common-themes/818 loop6 7:6 0 14.5M 1 loop /snap/gnome-logs/45 sda 8:0 0 100G 0 disk └─sda1 8:1 0 100G 0 part / sdb 8:16 1 14.9G 0 disk sr0 11:0 1 58.3M 0 rom /media/embedfire/VBox_GAs_6.1.18
可看到新增加了sdb设备,此处请务必检查好sd卡所对应的磁盘设备,以免破坏其他磁盘的数据!
执行以下烧录命令,将u-boot-dtb.imx烧写到/dev/sdb中
1
sudo dd iflag=dsync oflag=dsync if=u-boot-dtb.imx of=/dev/sdb seek=2
烧录成功提示如下信息。
1 2 3 4 5 6
embedfire@embedfire-VirtualBox:~$ sudo dd iflag=dsync oflag=dsync if=u-boot-dtb.imx of=/dev/sdb seek=2 [sudo] embedfire 的密码: 记录了782+0 的读入 记录了782+0 的写出 400384 bytes (400 kB, 391 KiB) copied, 15.0757 s, 26.6 kB/s embedfire@embedfire-VirtualBox:~$
将sd卡插到开发板上将拨码开关设置sd卡启动打开电源即可启动uboot。