基于emmc的uboot升级设计

基于emmc的uboot升级设计

前言

本文介绍一种基于 EMMC 设备通过 uboot 升级固件的方法,下面所述设备为混合供电项目主控板。

uboot 基于nxp官方 uboot-imx-rel_imx_4.1.15_2.1.0_ga 已进行基础移植可正常启动内核,移植在此不在进行赘述。

1.uboot系统更新设计

1.1 系统分区

对EMMC进行磁盘分区,分区如下所示:

opt_unit="-uM"
unit_mb=""

sfdisk --force ${opt_unit} ${node} << EOF
${BOOT_ROM_SIZE}${unit_mb},500${unit_mb},0c
600${unit_mb},500${unit_mb},83
1100${unit_mb},,83
EOF

用户分区配置如下:

其中
mmcblk1p1:fat格式,500MB,存放 zimage和dtb;
mmcblk1p2:ext4格式,500MB,存放 rootfs;
mmcblk1p3:ext4格式,6.2GB,存放 homefs;

配置 CONFIG_BOOTCOMMAND

#define CONFIG_BOOTCOMMAND \
		"mmc dev ${mmcdev};" \
		"fatload mmc 1:1 0x80800000 zImage;" \
		"setenv bootargs console=ttymxc0,115200 root=/dev/ram0 rdinit=/sbin/init " \
		"fatload mmc 1:1 0x83000000 hd-imx6ull-core-emmc.dtb;" \
		"bootz 0x80800000 - 0x83000000;"

1.2 uboot升级uboot、内核、设备树

/* 升级uboot */
#define CONFIG_CMD_UPUBOOT \
	"upuboot=mmc dev 1 1; " \
	"tftp 80800000 u-boot.imx; " \
	"mmc write 80800000 2 ${filesize}; " \
	"mmc partconf 1 1 1 1; " \
	"boot;\0" \

/* 升级内核 */
#define CONFIG_CMD_UPKERNEL \
	"upkernel=tftp 80800000 zImage; " \
	"fatwrite mmc 1:1 80800000 zImage ${filesize}; " \
	"boot;\0" \

/* 升级设备树 */
#define CONFIG_CMD_UPDTB \
	"updtb=tftp 83000000 hd-imx6ull-core-emmc.dtb; " \
	"fatwrite mmc 1:1 83000000 hd-imx6ull-core-emmc.dtb ${filesize}; " \
	"boot;\0" \

1.3 uboot升级ext4文件系统

混合供电主控板设计的文件系统分别挂载在 mmcblk1p2 和 mmcblk1p3,更新文件系统需要对对应分区进行格式化、挂载和复制等复杂操作,uboot不好实现,因此设计成uboot进行下载,然后借助内核进行升级操作。

  • 通过uboot下载文件系统压缩包到 mmcblk1p1 分区;
  • 启动内核,通过内核的 ramfs 通过格式化、挂载、复制等操作实现文件系统更新。

具体实现如下,uboot下载指令:

/* 下载文件系统到 mmcblk1p1 */
#define CONFIG_CMD_UPFS \
	"upfs=tftp 80800000 root_imx6ul.tar.gz; " \
	"fatwrite mmc 1:1 80800000 root_imx6ul.tar.gz ${filesize}; " \
	"tftp 80800000 home_imx6ul.tar.gz; " \
	"fatwrite mmc 1:1 80800000 home_imx6ul.tar.gz ${filesize}; " \
	"boot;\0" \

内核其他脚本添加:

# 挂载 mmcblk1p1
mount /dev/mmcblk1p1 /mnt/
# update rootfs
if [ -f "/mnt/root_imx6ul.tar.gz" ] ; then
	# 格式化 mmcblk1p2
    mkfs.ext4 -F -E nodiscard /dev/mmcblk1p2
    mkdir -p /mnt/mmcblk1p2
    mount -t ext4 /dev/mmcblk1p2 /mnt/mmcblk1p2
    tar -xzvf /mnt/root_imx6ul.tar.gz -C /mnt/mmcblk1p2
    umount /mnt/mmcblk1p2
    rm -rf /mnt/root_imx6ul.tar.gz
    rm -rf /mnt/mmcblk1p2
fi
# update homefs
if [ -f "/mnt/home_imx6ul.tar.gz" ] ; then
    mkfs.ext4 -F -E nodiscard /dev/mmcblk1p3
    mkdir -p /mnt/mmcblk1p3
    mount -t ext4 /dev/mmcblk1p3 /mnt/mmcblk1p3
    tar -xzvf /mnt/home_imx6ul.tar.gz -C /mnt/mmcblk1p3
    umount /mnt/mmcblk1p3
    rm -rf /mnt/home_imx6ul.tar.gz
    rm -rf /mnt/mmcblk1p3
fi
umount /mnt

mount -t ext4  /dev/mmcblk1p2 /root
mount -t ext4  /dev/mmcblk1p3 /home

1.4 uboot升级示例

1)tftpd32.exe打开,uboot ping服务器网络 OK。

2)升级文件以拷贝到 tftpd32 传输目录。

3)升级 uboot

posted @ 2025-06-20 11:11  silencehuan  阅读(64)  评论(0)    收藏  举报