目录
一、固化系统
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.imx、zImage、imx6ull.dtb和rootfs已经编译好,并且能成功启动和挂载。
在讲解imx6ull固化和更新uboot、zImage和dtb方法之前,先带大家了解一些imx6ull的分区情况以及各自的作用。
imx6ull eMMC分区,如下图:
EMMC有三个分区:
0分区(/dev/mmcblk1boot0):EMMC的0分区前两个块 (扇区 ),里面保存着分区表,从第三块开始存放uboot;
1分区(/dev/mmcblk1p1):存放Linux内核kernel和dtb设备树;
2分区(/dev/mmcblk1p2):存放rootfs根文件系统。
把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。如下图:
使用 USB 连接线连接底板的 USB_OTG 接口与 PC 机(电脑)。
进入 mfgtool 文件夹,查看 vbs 脚本信息,如下图:
之所以有那么多不同的 vbs 脚本,是根据固化的需求提供不同固化的方式。我们根据个人的核心板类型不同选择不同的 vbs 脚本固化系统就可以了。 (注意,最好不要将mfgtool 放在中文路径下运行! )。
这里简单介绍这些 vbs 脚本文件的作用, vbs 脚本所命名的解释如下图:
准备一张 SD 卡(这里用的 TF 小卡),(注意将会格式化 SD 卡,注意备份好重要数据)。按前面的 vbs 脚本命名解释,比如我们需要从 SD 卡启动,确认核心板存储介质为 eMMC,DDR 容量为 512MB。
那么我们就选择双击 Mfgtool2-eMMC-ddr512-SDCard.vbs 进行烧写,界面如下:
按上面 mfgtool 使用前准备说明步骤操作后,打上底板电源开关。如果是第一次使用开发板 OTG 连接PC机(电脑),需要等待 PC 机自动安装驱动。(点击右下角正在安装驱动的小图标, 不要让 winodws 去从 windows update 里去找驱动,点击跳过, 驱动自然会装上。否则用了 windows update 里的驱动,可能在烧写过程中会卡住,不往下跑。)等待安装驱动完成后,mfgtool 上位机界面会提示已经连接到设备 HID-compliant device,(注意请不要打开虚拟机,如果虚拟机正在开启, otg 会连接到虚拟机上去。 在烧写时,如果遇到杀毒报错,建议关闭杀毒软件! ) 如下图:
此时将 SD 卡插入卡槽(如果您的 SD 卡原先已经有系统,需开发板先上电后再将 SD 卡插进卡槽,否则上电时会从 SD 卡启动您的系统, 这样 mfgtool 会连接不到开发板设备),如下图插上 SD 卡 :
直接点击 mfgtool 的 Start 按钮进行固化系统到 SD 卡。下图为点击 Start 按钮后的截图。固化系统到 SD 卡需要几分钟时间,请耐心等待。
固化过程如下, 正在写入文件系统:
固化完成如下图,点击 Stop 后再点 Exit 退出 mfgtool 上位机软件即可。
测试从 SD 卡启动系统,拨码开关拨至 SD 卡启动方式 10000010,启动系统即可。
双击 Mfgtool2-eMMC-ddr512-eMMC.vbs这个 vbs 脚本文件进行固化,步骤参考1.1mfgtool固化系统到 SD 卡的步骤,固化完成后,将拨码开关拨至 eMMC 启动方式 10100110,启动系统即可。
使用前提:用户核心板类型带 eMMC存储介质。请确认您的 ddr 大小为 512MB或者 256MB,目前本人的开发板为 eMMC 核心板 ddr 大小是 512MB。
双击 Mfgtool2-NAND-ddr256-NAND.vbs 这个 vbs 脚本文件进行固化,步骤参考1.1mfgtool固化系统到 SD 卡的步骤,固化完成后,将拨码开关拨至 NANDFLASH 启动方式 10001001,启动系统即可。
使用前提:用户核心板类型带 NAND FLASH 存储介质。 请确认您的 ddr 大小为 512MB 或者 256MB。
脚本固化系统一般可用于批量固化与升级系统。不像 mfgtool 上位机那样还需要 PC 机和USB 数据线,用户可以自行修改好固化系统脚本,进行自动化固化测试,那么可以无需专业人员参与,即可批量固化系统。
将MFG_TOOL 烧写工具mfgtool的files 整个文件夹到 Ubuntu 虚拟机,如下图:
使用 chmod 指令修改固化 SD 卡系统脚本 imx6mksdboot.sh 的权限
chmod +x imx6mksdboot.sh
将 SD 卡用读卡器插到 Ubuntu 虚拟机,等待 Ubuntu 主机识别后,如下图。(因作者已经制作过 SD 卡,所以 Ubuntu 主机会识别出两个分区,如果您的 SD 卡是空白的,只有一个分区时就识别出一个分区,就会看到只有一个 USB 图标(可能图案不一样)) 。
输入如下指令查看 SD 卡挂载节点,如下图,作者的 SD 卡容量是 8GB 的(7984MB≈8GB),可以看到挂载的节点为/dev/sdb。
sudo fdisk -l
直接执行./imx6mksdboot.sh --help 查看脚本的使用方法
用法说明:
用法: 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
固化时有中英文结合,提示固化的过程,固化完成如下图:
完成固化后,将 SD 卡卸载后再取出,单击 USB 图标,点击“2”处小三角卸载退出后直接拔出读卡器。
测试从 SD 卡启动系统,拨码开关拨至 SD 卡启动方式 10000010,启动系统即可。
这里使用脚本固化系统到 eMMC 需要使用 2.1 制作好的 SD 系统启动卡。将MFG_TOOL 烧写工具mfgtool的files 整个文件夹到制作好的 SD 系统启动卡里面的/home/root 目录(本文拷贝到/home/root 目录,读者可任意目录)。如下图:
修改 eMMC 固化脚本的权限
chmod +x im6mkemmcboot.sh
执行./imx6mkemmcboot.sh --help 查看脚本的使用说明
使用 fdisk 指令查看 eMMC 挂载节点,一般挂载节点为/dev/mmcblk1,本文测试的 eMMC为 8GB 存储容量的。可以看到下图/dev/mmcblk1 就是 eMMC 的挂载节点。
fdisk -l
用法说明:
用法: 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
固化系统完成如下图:
固化完成后,将拨码开关拨至 eMMC 启动方式 10100110,启动系统即可。
这里使用脚本固化系统到 eMMC 需要使用 2.1 制作好的 SD 系统启动卡。将MFG_TOOL 烧写工具mfgtool的files 整个文件夹到制作好的 SD 系统启动卡里面的/home/root 目录(本文拷贝到/home/root 目录,读者可任意目录)。如下图:
使用 cat 指令查看 MTD 分区表,打印结果如下图表示存在 Nand Flash。
修改 NandFlash 固化脚本的权限
chmod +x imx6mknandboot.sh
执行./imx6mknandboot.sh --help 查看脚本的使用说明
用法说明:
用法:imx6mknandboot.sh [选项] <(可选)-ddrsize>
-ddrsize:指明核心板上的 ddr 容量大小,可选为(512|256) MB。
当前 ddr 容量大小是 256MB,那么固化的指令如下。这将会清空 NandFlash上的所有数据,请注意备份重要的数据。按 Enter 键确认后继续,固化系统到 NandFlash 需要大约需要几分钟时间。
./imx6mknandboot.sh -ddrsize 256
固化系统完成如下图:
固化完成后,将拨码开关拨至 Nand Flash 启动方式 10001001,启动系统即可。
当我们在开发过程中,可能随时会更具需求或功能修改编译u-boot和Linux内核或者根文件系统,这个时候不可能每次修改后都采用上面固化的方式,这样太耗时,此时就需要用到简单且很方便的方法救把新的镜像更换掉旧的,下面救给大家介绍一些常用的更新方法。
uboot下更新eMMC、SD卡中的u-boot镜像需要使用tftp+mmc命令,具体如下: 搭建tftp服务器:PC:tftpd32服务器;u-boot下自带tftp功能。
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下载数据即可恢复。
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
更新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(实际文件大小)
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
更新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
更新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知识共享】,后续精彩内容及时收看了解。