imx6ull固化和更新uboot、zImage和dtb方法---超详细总结

目录

一、固化系统

1. 使用mfgtool上位机固化系统

1.1 mfgtool固化系统到 SD 卡

1.2 mfgtool固化系统到 eMMC

1.3 mfgtool固化系统到 NAND FLASH

2.使用脚本固化系统

2.1脚本固化系统到 SD 卡

2.2 脚本固化系统到 eMMC

2.3 脚本固化系统到 NAND FLASH

二、更新系统

1. u-boot下更新

1.1 u-boot下更新u-boot镜像

1.2 uboot下更新kernel和dtb

1.3 u-boot启动linux内核方式

2. Linux系统中更新

2.1 Linux系统中更新u-boot

2.2 Linux系统中更新kernel和dtb


往期精彩文章推荐:

1. u-boot移植:详细讲解移植u-boot.2022.10版本到imx6ull开发板

2.详细讲解u-boot之网络移植与调试

3.u-boot启动流程分析-史上最全最详细

4.u-boot命令之EMMC和SD卡操作命令详解

5.移植Linux 6.3.5系统到imx6ull开发板

6.rootfs根文件系统制作及挂载方法-详解

7.Linux中磁盘管理之格式化、分区、挂载-详解
 

        进行固化和更新的前提,uboot.imxzImageimx6ull.dtbrootfs已经编译好,并且能成功启动和挂载。

        在讲解imx6ull固化和更新uboot、zImage和dtb方法之前,先带大家了解一些imx6ull的分区情况以及各自的作用。

        imx6ull eMMC分区,如下图:

imx6ull固化和更新uboot、zImage和dtb方法---超详细总结_第1张图片

EMMC有三个分区:

  • 0分区(/dev/mmcblk1boot0):EMMC的0分区前两个块 (扇区 ),里面保存着分区表,从第三块开始存放uboot;

  • 1分区(/dev/mmcblk1p1):存放Linux内核kernel和dtb设备树;

  • 2分区(/dev/mmcblk1p2):存放rootfs根文件系统。

一、固化系统

1. 使用mfgtool上位机固化系统

        把MFG_TOOL出厂固件烧录工具mfgtool文件拷贝到PC机。

        imx6ull启动方式的拨码开关,对应关系如下表:

启动方式 拨码开关
USB OTG 烧写 0100 0000
SD 卡启动 1000 0010
EMMC 启动 1010 0110
NAND FLASH 启动 1000 1001
  • 注: OFF 为 0, ON 为 1;【D0-D1-D2-D3-D4-D5-D6-D7-D8】

        底板拨码开关(BOOT_CFG)设置如下,参考 BOOT_CFG,设置为 USB 连接方式,“1”代码 ON,“0”代表“OFF”。将拨码数字 2 处拨到 ON,其他的为 OFF。如下图:

imx6ull固化和更新uboot、zImage和dtb方法---超详细总结_第2张图片

        使用 USB 连接线连接底板的 USB_OTG 接口与 PC 机(电脑)。

imx6ull固化和更新uboot、zImage和dtb方法---超详细总结_第3张图片

        进入 mfgtool 文件夹,查看 vbs 脚本信息,如下图:

imx6ull固化和更新uboot、zImage和dtb方法---超详细总结_第4张图片

        之所以有那么多不同的 vbs 脚本,是根据固化的需求提供不同固化的方式。我们根据个人的核心板类型不同选择不同的 vbs 脚本固化系统就可以了。 (注意,最好不要将mfgtool 放在中文路径下运行! )。

        这里简单介绍这些 vbs 脚本文件的作用, vbs 脚本所命名的解释如下图:

imx6ull固化和更新uboot、zImage和dtb方法---超详细总结_第5张图片

1.1 mfgtool固化系统到 SD 卡

        准备一张 SD 卡(这里用的 TF 小卡),(注意将会格式化 SD 卡,注意备份好重要数据)。按前面的 vbs 脚本命名解释,比如我们需要从 SD 卡启动,确认核心板存储介质为 eMMC,DDR 容量为 512MB。

        那么我们就选择双击 Mfgtool2-eMMC-ddr512-SDCard.vbs 进行烧写,界面如下:

imx6ull固化和更新uboot、zImage和dtb方法---超详细总结_第6张图片

        按上面 mfgtool 使用前准备说明步骤操作后,打上底板电源开关。如果是第一次使用开发板 OTG 连接PC机(电脑),需要等待 PC 机自动安装驱动。(点击右下角正在安装驱动的小图标, 不要让 winodws 去从 windows update 里去找驱动,点击跳过, 驱动自然会装上。否则用了 windows update 里的驱动,可能在烧写过程中会卡住,不往下跑。)等待安装驱动完成后,mfgtool 上位机界面会提示已经连接到设备 HID-compliant device,(注意请不要打开虚拟机,如果虚拟机正在开启, otg 会连接到虚拟机上去。 在烧写时,如果遇到杀毒报错,建议关闭杀毒软件! ) 如下图:

imx6ull固化和更新uboot、zImage和dtb方法---超详细总结_第7张图片

        此时将 SD 卡插入卡槽(如果您的 SD 卡原先已经有系统,需开发板先上电后再将 SD 卡插进卡槽,否则上电时会从 SD 卡启动您的系统, 这样 mfgtool 会连接不到开发板设备),如下图插上 SD 卡 :

imx6ull固化和更新uboot、zImage和dtb方法---超详细总结_第8张图片

        直接点击 mfgtool 的 Start 按钮进行固化系统到 SD 卡。下图为点击 Start 按钮后的截图。固化系统到 SD 卡需要几分钟时间,请耐心等待。

imx6ull固化和更新uboot、zImage和dtb方法---超详细总结_第9张图片

        固化过程如下, 正在写入文件系统:

imx6ull固化和更新uboot、zImage和dtb方法---超详细总结_第10张图片

        固化完成如下图,点击 Stop 后再点 Exit 退出 mfgtool 上位机软件即可。

imx6ull固化和更新uboot、zImage和dtb方法---超详细总结_第11张图片

        测试从 SD 卡启动系统,拨码开关拨至 SD 卡启动方式 10000010,启动系统即可。

1.2 mfgtool固化系统到 eMMC

        双击 Mfgtool2-eMMC-ddr512-eMMC.vbs这个 vbs 脚本文件进行固化,步骤参考1.1mfgtool固化系统到 SD 卡的步骤,固化完成后,将拨码开关拨至 eMMC 启动方式 10100110,启动系统即可。

        使用前提:用户核心板类型带 eMMC存储介质。请确认您的 ddr 大小为 512MB或者 256MB,目前本人的开发板为 eMMC 核心板 ddr 大小是 512MB。

1.3 mfgtool固化系统到 NAND FLASH

        双击 Mfgtool2-NAND-ddr256-NAND.vbs 这个 vbs 脚本文件进行固化,步骤参考1.1mfgtool固化系统到 SD 卡的步骤,固化完成后,将拨码开关拨至 NANDFLASH 启动方式 10001001,启动系统即可。

        使用前提:用户核心板类型带 NAND FLASH 存储介质。 请确认您的 ddr 大小为 512MB 或者 256MB。

2.使用脚本固化系统

        脚本固化系统一般可用于批量固化与升级系统。不像 mfgtool 上位机那样还需要 PC 机和USB 数据线,用户可以自行修改好固化系统脚本,进行自动化固化测试,那么可以无需专业人员参与,即可批量固化系统。

2.1脚本固化系统到 SD 卡

        将MFG_TOOL 烧写工具mfgtool的files 整个文件夹到 Ubuntu 虚拟机,如下图:

        使用 chmod 指令修改固化 SD 卡系统脚本 imx6mksdboot.sh 的权限

chmod +x imx6mksdboot.sh

        将 SD 卡用读卡器插到 Ubuntu 虚拟机,等待 Ubuntu 主机识别后,如下图。(因作者已经制作过 SD 卡,所以 Ubuntu 主机会识别出两个分区,如果您的 SD 卡是空白的,只有一个分区时就识别出一个分区,就会看到只有一个 USB 图标(可能图案不一样)) 。

imx6ull固化和更新uboot、zImage和dtb方法---超详细总结_第12张图片

        输入如下指令查看 SD 卡挂载节点,如下图,作者的 SD 卡容量是 8GB 的(7984MB≈8GB),可以看到挂载的节点为/dev/sdb

sudo fdisk -l

imx6ull固化和更新uboot、zImage和dtb方法---超详细总结_第13张图片

        直接执行./imx6mksdboot.sh --help 查看脚本的使用方法

imx6ull固化和更新uboot、zImage和dtb方法---超详细总结_第14张图片

用法说明:

用法: imx6mksdboot.sh [选项] <(必选)-device> <(可选)-flash> <(可选)-ddrsize>
  • -device:指明设备节点(SD 卡挂载的节点如/dev/sdx),执行脚本时必需要加这个参数

  • -flash:指明核心板上的媒体存储介质,可选为(emmc|nand)

  • -ddrsize:指明核心板上的 ddr 容量大小,可选为(512|256)MB

        当前 ddr 容量大小是 512MB,媒体存储介质是 eMMC。 SD 卡挂载节点为/dev/sdb。那么固化 SD 卡的指令如下,执行指令后脚本会有中文再次询问 SD 卡所挂载的节点是否对应,将会清空 SD 卡上的所有数据,请注意备份重要的数据。按 Enter 键确认后继续,固化 SD 卡需要大约需要几分钟时间,这里根据个人电脑不同和所用 SD 卡不同,可能花费的时间差异比较大。

sudo ./imx6mksdboot.sh -device /dev/sdb -flash emmc -ddrsize 512

imx6ull固化和更新uboot、zImage和dtb方法---超详细总结_第15张图片

        固化时有中英文结合,提示固化的过程,固化完成如下图:

imx6ull固化和更新uboot、zImage和dtb方法---超详细总结_第16张图片

        完成固化后,将 SD 卡卸载后再取出,单击 USB 图标,点击“2”处小三角卸载退出后直接拔出读卡器。

imx6ull固化和更新uboot、zImage和dtb方法---超详细总结_第17张图片

        测试从 SD 卡启动系统,拨码开关拨至 SD 卡启动方式 10000010,启动系统即可。

2.2 脚本固化系统到 eMMC

        这里使用脚本固化系统到 eMMC 需要使用 2.1 制作好的 SD 系统启动卡。将MFG_TOOL 烧写工具mfgtool的files 整个文件夹到制作好的 SD 系统启动卡里面的/home/root 目录(本文拷贝到/home/root 目录,读者可任意目录)。如下图:

        修改 eMMC 固化脚本的权限

chmod +x im6mkemmcboot.sh

        执行./imx6mkemmcboot.sh --help 查看脚本的使用说明

imx6ull固化和更新uboot、zImage和dtb方法---超详细总结_第18张图片

        使用 fdisk 指令查看 eMMC 挂载节点,一般挂载节点为/dev/mmcblk1,本文测试的 eMMC为 8GB 存储容量的。可以看到下图/dev/mmcblk1 就是 eMMC 的挂载节点。

fdisk -l

imx6ull固化和更新uboot、zImage和dtb方法---超详细总结_第19张图片

用法说明:

用法: imx6mkemmcboot.sh [选项] <(必选)-device> <(可选)-ddrsize>
  • -device:指明设备节点(eMMC 挂载的节点如/dev/mmcblk1),执行脚本时必需要加这个参数

  • -ddrsize:指明核心板上的 ddr 容量大小,可选为(512|256)MB

        当前的 ddr 容量大小是 512MB, eMMC 挂载节点为/dev/mmcblk1。那么固化的指令如下,执行指令后脚本会有中文再次询问 eMMC 所挂载的节点是否对应,将会清空eMMC 上的所有数据,请注意备份重要的数据。按 Enter 键确认后继续,固化系统到 eMMC 需要大约需要几分钟时间。

./imx6mkemmcboot.sh -device /dev/mmcblk1 -ddrsize 512

imx6ull固化和更新uboot、zImage和dtb方法---超详细总结_第20张图片

固化系统完成如下图:

imx6ull固化和更新uboot、zImage和dtb方法---超详细总结_第21张图片

        固化完成后,将拨码开关拨至 eMMC 启动方式 10100110,启动系统即可。

2.3 脚本固化系统到 NAND FLASH

        这里使用脚本固化系统到 eMMC 需要使用 2.1 制作好的 SD 系统启动卡。将MFG_TOOL 烧写工具mfgtool的files 整个文件夹到制作好的 SD 系统启动卡里面的/home/root 目录(本文拷贝到/home/root 目录,读者可任意目录)。如下图:

        使用 cat 指令查看 MTD 分区表,打印结果如下图表示存在 Nand Flash。

imx6ull固化和更新uboot、zImage和dtb方法---超详细总结_第22张图片

        修改 NandFlash 固化脚本的权限

chmod +x imx6mknandboot.sh

        执行./imx6mknandboot.sh --help 查看脚本的使用说明

imx6ull固化和更新uboot、zImage和dtb方法---超详细总结_第23张图片

用法说明:

用法:imx6mknandboot.sh [选项] <(可选)-ddrsize>
  • -ddrsize:指明核心板上的 ddr 容量大小,可选为(512|256) MB。

        当前 ddr 容量大小是 256MB,那么固化的指令如下。这将会清空 NandFlash上的所有数据,请注意备份重要的数据。按 Enter 键确认后继续,固化系统到 NandFlash 需要大约需要几分钟时间。

./imx6mknandboot.sh -ddrsize 256

imx6ull固化和更新uboot、zImage和dtb方法---超详细总结_第24张图片

固化系统完成如下图:

imx6ull固化和更新uboot、zImage和dtb方法---超详细总结_第25张图片

        固化完成后,将拨码开关拨至 Nand Flash 启动方式 10001001,启动系统即可。

二、更新系统

        当我们在开发过程中,可能随时会更具需求或功能修改编译u-boot和Linux内核或者根文件系统,这个时候不可能每次修改后都采用上面固化的方式,这样太耗时,此时就需要用到简单且很方便的方法救把新的镜像更换掉旧的,下面救给大家介绍一些常用的更新方法。

1. u-boot下更新

1.1 u-boot下更新u-boot镜像

        uboot下更新eMMC、SD卡中的u-boot镜像需要使用tftp+mmc命令,具体如下: 搭建tftp服务器:PC:tftpd32服务器;u-boot下自带tftp功能。

  • 更新eMMC中的u-boot
1.tftp 0x80800000 u-boot.imx   ------通过tftp将u-boot.imx下载到内存中
2.mmc dev 1 0                  ------切换操作emmc的分区0
3.mmc write 80800000 2 33e     ------将内存中u-boot.imx烧写到emmc的分区0的第3个存储块(424960/512(块大小) = 0x33E)
4.mmc partconf 1 1 0 0         ------分区配置,EMMC 需要这一步!
5.reset                        ------复位,启动更新后的uboot

        注意:eMMC的分区1的前2个块存放的是MBR(分区表),不要向这两个块写数据。如果不小心写了,可以使用mfgtool工具重新给emmc使用USB下载数据即可恢复。

  • 更新SD卡中的u-boot:
1.tftp 0x80800000 u-boot.imx    ------通过tftp将u-boot.imx下载到内存中
2.mmc dev 0 0                   ------切换操作SD的分区0
3.mmc write 80800000 2 33e      ------将内存中u-boot.imx烧写到SD的分区1的第3个存储块(424960/512(块大小) = 0x33E)
4.reset                         ------复位,启动更新后的uboot

1.2 uboot下更新kernel和dtb

  • 更新eMMC中的kernel和dtb:

tftp 0x80800000 zImage;           ------通过TFTP从网络下载zImage文件到内存地址0x80800000
fatwrite mmc 1:1 80800000 zImage 0x552f30(实际文件大小)

tftp 0x83000000 imx6ull-toto.dtb  ------通过TFTP从网络下载imx6ull-toto.dtb文件到内存地址0x83000000
fatwrite mmc 1:1 83000000 imx6ull-toto.dtb 0x8d6a(实际文件大小)

fatwrite命令参数解释如下:

  • fatwrite:这是 U-Boot 命令,用于将文件写入 FAT 文件系统分区。

  • mmc 0:1:指定要写入的存储设备和分区,mmc 表示使用 MMC 存储设备(例如 SD 卡或 eMMC),

  • 1:1 表示使用设备编号 1 的第1个分区。

  • 83000000:指定数据文件在内存中的地址。0x83000000 表示数据将从内存地址 0x83000000 开始。

  • imx6ull-toto.dtb:这是要写入的文件名。

  • 0x8d6a:这是要写入的文件大小(以字节为单位)。0x8d6a 表示文件的大小为 0x8d6a 字节。

  • 更新SD卡中的kernel和dtb:

tftp 0x80800000 zImage;
fatwrite mmc 0:1 80800000 zImage 0x552f30(实际文件大小)

tftp 0x83000000 imx6ull-toto.dtb
fatwrite mmc 0:1 83000000 imx6ull-toto.dtb 0x8d6a(实际文件大小)

1.3 u-boot启动linux内核方式

u-boot下不同方式启动linux内核和rotofs挂载方式需要bootcmd 和 bootargs 这两个环境变量进行设置。

  • 从网络启动 Linux 系统和NFS挂载rootfs

setenv bootcmd 'tftp 80800000 zImage; tftp 83000000 imx6ull-toto.dtb; bootz 80800000 - 83000000'
setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs rw 
nfsroot=192.168.0.105:/home/ubuntu/My_WorkSpace/Linux/nfs/rootfs 
ip=192.168.0.123:192.168.0.105:192.168.0.1:255.255.255.0::eth0:off'
saveenv
  • 从sd启动 Linux 系统和挂载rootfs

setenv bootargs 'console=ttymxc0,115200 root=/dev/mmcblk0p2 rootwait rw'
setenv bootcmd 'mmc dev 0; fatload mmc 0:1 80800000 zImage; fatload mmc 0:1 83000000 imx6ull-toto.dtb; bootz 80800000 - 83000000;'
saveenv
  • 从EMMC启动 Linux 系统和挂载rootfs

setenv bootargs 'console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw'
setenv bootcmd 'mmc dev 1; fatload mmc 1:1 80800000 zImage; fatload mmc 1:1 83000000 imx6ull-toto.dtb; bootz 80800000 - 83000000;'
saveenv

2. Linux系统中更新

2.1 Linux系统中更新u-boot

  • 更新SD卡中的u-boot:

dd if=u-boot.imx of=/dev/mmcblk0 bs=1024 seek=1 conv=fsync
  • 更新eMMC中的u-boot:

echo 0 > /sys/block/mmcblk1boot0/force_ro                        ------Enable writes to /dev/mmcblk1boot0
dd if=/dev/zero of=/dev/mmcblk1boot0                             ------Precaution: Erase entire eMMC boot region.
dd if=u-boot.imx of=/dev/mmcblk1boot0 bs=1024 seek=1 conv=fsync  ------Copy U-Boot to eMMC boot region.
echo 1 >/sys/block/mmcblk1boot0/force_ro                         ------Disable writes to /dev/mmcblk1boot0

2.2 Linux系统中更新kernel和dtb

  • 更新SD卡中的kernel和dtb:

/ # mount /dev/mmcblk0p1 /mnt/boot/
/ # ls /mnt/boot/
imx6ull-toto.dtb  zImage

用最新的zImage和imx6ull-toto.dtb替换到/mnt/boot/文件中的zImage和imx6ull-toto.dtb即可。
  • 更新eMMC中的kernel和dtb:

/ # mount /dev/mmcblk1p1 /mnt/boot/
/ # ls /mnt/boot/
imx6ull-toto.dtb  zImage

用最新的zImage和imx6ull-toto.dtb替换到/mnt/boot/文件中的zImage和imx6ull-toto.dtb即可。

        今天的内容到此就完了,感谢大家的收看,如有不正之处,欢迎批评指正,下期再见!

        今天的内容到这就结束了,感谢大家的收看,如果觉得文章写的还不错,可以点击“赞赏”,来鼓励一下老王哦,当然,也可以点赞,收藏加关注哦!我们下期再见!


        关于更多嵌入式C语言、FreeRTOS、RT-Thread、Linux应用编程、linux驱动等相关知识,关注公众号【嵌入式Linux知识共享】,后续精彩内容及时收看了解。

你可能感兴趣的:(linux,uboot,Linux系统固化,Linux系统更新,u-boot更新,内核kernel更新,mfgtool)