U盘方式升级ARM64 EMMC
2020-12-08 23:57 Gierwu 阅读(1125) 评论(0) 收藏 举报0 问题描述
在一款国产ARM64硬件平台上,开发纯Linux的固件。因为该设备没有引出OTG接口,而原厂的Linux方案不支持OTA,仅支持SD卡和/或OTG接口升级。导致升级基础平台时,要拆开外盒,非常麻烦,导致现场测试工程师非常恼火。因此花了点时间,弄清楚EMMC上固件的存储位置后,可实现通过外挂U盘方式直接升级EMMC。
1 具体操作
S1 首先利用hexdump,找到boot0,boot1,boot-resource的起始位置,分别记录为A,B,C。不同的硬件方案,这3个区域的起始地址可能不同。具体找法是 hexdump -C /dev/mmcblk0 |grep "特征值“ , 其中特征值就是boot0和boot1文件的首行信息。如针对boot0,其特征值为GON.BT0。
S2 利用dd指令,将boot0,boot1 从手中的板子上导出来,具体操作为 dd if=/dev/mmcblk0 of=/tmp/boot0.bin bs=512 count=(B-A)/512 skip=A/512; dd if=/dev/mmcblk0 of=/tmp/boot1.bin bs=512 count=(C-B)/512 skip=B/512 。按理,boot0导出8M,boot1导出16M就足够了;但现实中却是,将导出的boot1.bin 复制到目标板后,断电重启提示uboot的magic错误,设备进入刷机模式。但完整地复制/拷贝B-C区域,则一切正常,所以boot1区域干脆就占满整个B-C区域即可。
S3 将boot0.bin,boot1.bin,以及pack出来的文件,如boot-resource.fex和boot.fex,以及rootfs的补丁文件rootfs_pack.tar 全拷贝到u盘上,然后将U盘插入目标设备。
S4 目标设备上启动一个脚本,检测到/mnt/sda1/下存在upuprade.sh文件时,直接执行该升级脚本。
S5 升级脚本中,将boot0.bin拷贝到mmcblk0的正确位置dd if=/mnt/sda1/boot0.bin of=/dev/mmcblk0 bs=512 count=(B-A)/512 seek=A/512。注意,boot0一般都无需升级。将boot1.bin替换正确区域的内容dd of=/dev/mmcblk0 if=/mnt/sda1/boot1.bin bs=512 count=(C-B)/512 seek=B/512。
若要升级bootloader资源文件,直接执行cat boot-resource.fex >/dev/mmcblk0p1即可;若要升级kernel,则执行cat boot.fex >/dev/mmcblk0p3即可。
在升级rootfs前,要将待升级的应用先停掉,如果涉及到ko文件升级,则要先将该驱动卸载,然后再执行tar -xf /mnt/sda1/rootfs_pack.tar -C / 即可。
利用tar指令可以替换整个文件系统,但需要将所有应用都停止,并将/etc/init.d下的所有S开头的脚本,都带stop参数执行一遍后,再执行tar指令。
操作了rootfs后,最好执行一遍e2fsck -n /dev/mmcblk0p4。
2 其它
如果只是环境变量更改,建议不要替换env分区,直接用fw_printenv和fw_setenv来完成。该指令在uboot的tools/env目录下。缺省可能没有编译这个工具,因为它需要更换HOSTCC才能成功编译,同时要配置正确的fw_env.conf文件后,才能正常工作。按我们代理商的说法,这个工具因为原厂不支持,所以只有有能力的客户才能搞定,原厂和代理均不提供支持。其实这个工具在固件版本演化中非常有用,修改起来也特别简单。请参考https://blog.csdn.net/chasing_chasing/article/details/79642521。
早期的EMMC快速升级方法,可以参考https://blog.csdn.net/weixin_43094346/article/details/82563873 (注意:本文中2处引用了csdn网站的内容,但不保证这2个引用链接均为原创者的BLOG)。
浙公网安备 33010602011771号