首页 > 系统相关 >linux系统中固化和更新uboot、zImage和dtb方法(经典)

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

时间:2023-10-03 10:01:43浏览次数:43  
标签:uboot eMMC dtb boot dev linux 固化 SD


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

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

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

imx6ull eMMC分区,如下图:

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

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

linux系统中固化和更新uboot、zImage和dtb方法(经典)_数据库_02

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

linux系统中固化和更新uboot、zImage和dtb方法(经典)_数据库_03

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

linux系统中固化和更新uboot、zImage和dtb方法(经典)_启动方式_04

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

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

linux系统中固化和更新uboot、zImage和dtb方法(经典)_数据库_05

1.1 mfgtool固化系统到 SD 卡

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

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

linux系统中固化和更新uboot、zImage和dtb方法(经典)_启动方式_06

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

linux系统中固化和更新uboot、zImage和dtb方法(经典)_启动方式_07

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

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

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

linux系统中固化和更新uboot、zImage和dtb方法(经典)_数据库_09

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

linux系统中固化和更新uboot、zImage和dtb方法(经典)_启动方式_10

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

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

测试从 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 虚拟机,如下图:

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

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

chmod +x imx6mksdboot.sh

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

linux系统中固化和更新uboot、zImage和dtb方法(经典)_启动方式_13

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

sudo fdisk -l

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

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

linux系统中固化和更新uboot、zImage和dtb方法(经典)_数据库_15

用法说明:

用法: 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

linux系统中固化和更新uboot、zImage和dtb方法(经典)_数据库_16

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

linux系统中固化和更新uboot、zImage和dtb方法(经典)_启动方式_17

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

linux系统中固化和更新uboot、zImage和dtb方法(经典)_核心板_18

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

2.2 脚本固化系统到 eMMC

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

linux系统中固化和更新uboot、zImage和dtb方法(经典)_启动方式_19

修改 eMMC 固化脚本的权限

chmod +x im6mkemmcboot.sh

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

linux系统中固化和更新uboot、zImage和dtb方法(经典)_启动方式_20

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

fdisk -l

linux系统中固化和更新uboot、zImage和dtb方法(经典)_核心板_21

用法说明:

用法: 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

linux系统中固化和更新uboot、zImage和dtb方法(经典)_核心板_22

固化系统完成如下图:

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

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

2.3 脚本固化系统到 NAND FLASH

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

linux系统中固化和更新uboot、zImage和dtb方法(经典)_启动方式_24

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

linux系统中固化和更新uboot、zImage和dtb方法(经典)_数据库_25

修改 NandFlash 固化脚本的权限

chmod +x imx6mknandboot.sh

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

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

用法说明:

用法:imx6mknandboot.sh [选项] <(可选)-ddrsize>

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

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

./imx6mknandboot.sh -ddrsize 256

linux系统中固化和更新uboot、zImage和dtb方法(经典)_数据库_27

固化系统完成如下图:

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

固化完成后,将拨码开关拨至 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即可。

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

标签:uboot,eMMC,dtb,boot,dev,linux,固化,SD
From: https://blog.51cto.com/u_11947739/7689674

相关文章

  • linux系统中驱动框架基本分析
    大家好,今天分享一篇Linux驱动软件设计思想的文章。由于文章较长,可以先收藏后再慢慢看。一、Linux驱动的软件架构1.1出发点为适应多种体系架构的硬件,增强系统的可重用和跨平台能力。1.2分离思想为达到一个驱动最好一行都不改就可以适用任何硬件平台的目的,将驱动与设备分离开来,驱动......
  • linux系统中u-boot命令的EMMC和SD卡操作命令分析
    今天给大家详细的介绍一下u-boot命令之EMMC和SD卡操作的mmc命令使用。希望这篇文章对大家有所帮助。uboot支持EMMC和SD卡,因此也要提供EMMC和SD卡的操作命令。一般认为EMMC和SD卡是同一个东西,所以没有特殊说明,统一使用MMC来代指EMMC和SD卡。uboot中常用于操作MM......
  • Linux(CentOS7)定时执行任务Crond详细说明&操作图解
    一、Cron服务1)概念介绍cron是服务名称。crond是后台进程,用来执行脚本,在系统中一直会运行。crontab是一个工具,用来管理定时任务列表,定制好的计划任务,需要启动crond服务(系统默认安装),crond服务是通过crontab命令实现。2)crontab工作运行linux后,开机自启动crond任务,系统会每分钟......
  • 通过linux0.11学习操作系统原理--Apple的学习笔记
    一,前言最近在断断续续的看linux0.11的源码介绍,主要是了解linux操作系统的原理,之前已经了解了进程的切换主要是cpu上下文切换+虚拟内存切换。今天我主要看了下改开始linux启动的进程0,1,2。二,分析先回顾了之前的问题LDT和GDT的区别?   GDT用作内核态的代码和数据段,LDT用作用户进......
  • linux使用glibc版本安装mysql8.0.12
    1、前言使用yum安装虽然很方便,但是如果要是在没有公网的环境下,是没有办法使用yum源的。所以我们可以使用mysql提供的glibc版本的安装包,进行安装。但是在安装之前,一定要将以前的版本删除,包括/etc/my.cnf和/etc/my.cnf.d一类的文件全部删除,否则在启动的时候会导致混乱。从而报错。软......
  • Linux centos 安装 mysql 5.6.43
    一、mysql下载1、方式一(简单粗暴)直接在linux 目录下wget https://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.43-linux-glibc2.12-x86_64.tar.gz2、方式二(官方下载)浏览器打开网址:https://www.mysql.com如下图依次点击1、2、3、4步如下图设置对应版本点击Downloa......
  • Linux中xargs命令学习
    转自:https://zhuanlan.zhihu.com/p/340804463?utm_id=0,提到了许多参数,用到时可以参考1.介绍 cat/etc/passwd|greproot   等同于  echo"helloworld"|echo管道命令|,将左侧命令(cat/etc/passwd)的标准输出转换为标准输入,提供给右侧命令(greproot)作为参数。但有些命......
  • Linux-hsp 7-9章 指令
    开机&重启命令:1)shutdown-hnow     立刻关机2)shutdown-h1        1分钟后关机3)shutdown-rnow现在重启计算机4)halt  关机,同上5)reboot现在重启计算机6)sync 把内存的......
  • LINUX:FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.
     如图,问题表现为linux中可直接通过hive进行数据插入但在通过datagrip却更改不了此时,可能时yarn的运行分配的内存较少,或堆内存溢出。在yarn-site.xml中更改,以及mapred-site.xml中更改,完成。yarn的<property><name>yarn.scheduler.minimum-allocation-mb</name>......
  • linux shell脚本判断当前登录用户是否为root
    脚本实现1(root-1.sh):#!/bin/bashROOT_UID=0if["$UID"-eq"$ROOT_UID"];thenecho"Youareroot."elseecho"Youarejustanordinaryuser(butmonlovesyoujustthesame)."fiexit0脚本实现2(root-2.sh):#!/bin/ba......