基于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


浙公网安备 33010602011771号