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.3. 环境搭建

首先下载mfgtool工具,详细可参考 烧写环境的搭建 章节搭建环境

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 目录将相应文件替换即可

未找到图片ubootf

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即可。

未找到图片cfg

4.1.6.2. 设置为USB启动模式

将USB OTG与电脑连接

OTG与电脑连接

使用USB更新时不能插入SD卡,将拨码开关设置为USB启动。 配置拨码开关:

emmc版本:将1/4/5/7打到ON档,其他拨码开关打到OFF档。

nand版本:将1/3/6打到ON档,其他拨码开关打到OFF档。

提示

也可以选择通过按键方式进入烧录模式,按键法可以不用拨码,拨码状态在之前的 EMMC 或者 NAND 都可以。

  1. 上电

  2. 按下MODE按键

  3. 按下复位(RESET)按键

  4. 松开复位(RESET)按键

  5. 松开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卡数据备份后再执行以下步骤。

  1. 将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
    
  2. 将sd卡通过读卡器连接到电脑上,并选择连接到虚拟机上。

    未找到图片02|
  3. 再次使用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卡所对应的磁盘设备,以免破坏其他磁盘的数据!

  4. 执行以下烧录命令,将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:~$
    
  5. 将sd卡插到开发板上将拨码开关设置sd卡启动打开电源即可启动uboot。