linux系统中固化和更新uboot、zImage和dtb方法(经典)

简介: linux系统中固化和更新uboot、zImage和dtb方法(经典)

  大家好,今天给大家介绍一下imx6ull固化和更新uboot、zImage和dtb方法总结,希望这篇文章对大家有所帮助。

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

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

imx6ull eMMC分区,如下图:

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。如下图:

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

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

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

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

1.1 mfgtool固化系统到 SD 卡

准备一张 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,启动系统即可。

1.2 mfgtool固化系统到 eMMC

双击 Mfgtool2-eMMC-ddr512-eMMC.vbs这个 vbs 脚本文件进行固化,步骤参考1.1 mfgtool固化系统到 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 图标(可能图案不一样)) 。

输入如下指令查看 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,启动系统即可。

2.2 脚本固化系统到 eMMC

这里使用脚本固化系统到 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,启动系统即可。

2.3 脚本固化系统到 NAND FLASH

这里使用脚本固化系统到 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内核或者根文件系统,这个时候不可能每次修改后都采用上面固化的方式,这样太耗时,此时就需要用到简单且很方便的方法救把新的镜像更换掉旧的,下面救给大家介绍一些常用的更新方法。

1. u-boot下更新

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

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

  1. 更新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下载数据即可恢复。

  1. 更新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
  1. 更新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 字节。

   2. 更新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 这两个环境变量进行设置。

  1. 从网络启动 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
  1. 从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
  1. 从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
  1. 更新SD卡中的u-boot:
dd if=u-boot.imx of=/dev/mmcblk0 bs=1024 seek=1 conv=fsync
  1. 更新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
  1. 更新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即可。
  1. 更新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即可。

今天的内容到此就完了,感谢大家的收看

目录
相关文章
|
1天前
|
Web App开发 监控 Unix
Linux 常用命令汇总(七):进程管理 & 系统权限 & 用户授权
Linux 常用命令汇总(七):进程管理 & 系统权限 & 用户授权
|
1天前
|
存储 Unix Linux
【Linux系统编程】基础指令(三)
【Linux系统编程】基础指令(三)
|
1天前
|
Linux
【Linux系统编程】基础指令(二)(下)
【Linux系统编程】基础指令(二)
|
1天前
|
Linux C语言
【Linux系统编程】基础指令(二)(上)
【Linux系统编程】基础指令(二)
|
1天前
|
Linux
【Linux系统编程】基础指令(一)(下)
【Linux系统编程】基础指令(一)
|
1天前
|
人工智能 Unix Linux
【Linux系统编程】基础指令(一)(上)
【Linux系统编程】基础指令(一)
|
1天前
|
弹性计算 Shell Linux
|
21天前
|
缓存 Linux 测试技术
安装【银河麒麟V10】linux系统--并挂载镜像
安装【银河麒麟V10】linux系统--并挂载镜像
112 0
|
8月前
|
缓存 Ubuntu Linux
Vim编辑器入门指南:安装、基本操作和高级技巧详解 | 适用于Linux系统
Vim编辑器入门指南:安装、基本操作和高级技巧详解 | 适用于Linux系统
298 0
|
8天前
|
Linux 开发工具 Android开发
Docker系列(1)安装Linux系统编译Android源码
Docker系列(1)安装Linux系统编译Android源码
14 0