1. tftp刷机
SM5的内核启动方式是u-boot去加载/boot目录下的boot.scr.emmc脚本,解析里面的命令,找到内核去启动。所以我们可以通过把tftp升级用的命令替换进这个脚本,让SM5一开机就自动进入tftp升级。只有当tftp升级成功完成时,才会把这个脚本刷回正常的启动脚本;如果升级失败,重启SM5就可以再次进行tftp升级。
1.1 准备工作
- 在build代码时,使用gradle tftp会产生 output/tftp.tgz 文件
- 准备一台 tftp 服务器
- windows下可以使用tftpd64
- linux下参照相关文档搭建tftp服务
- 路由器,保证升级的设备和tftp服务器在一个局域网内。并且设备通过WAN口连接网络。
- 将 tftp.tgz解压至 tftp 根目录下
1.2 脚本执行
echo "set serverip 10.0.0.3; dhcp 0x310000000 \$serverip:boot.scr; set reset_after 1; source 0x310000000" > boot.txt
# 这里serverip要设置成tftp server的IP,SM5需要与这个server在同一个网关下
mkimage -A arm64 -O linux -T script -C none -a 0 -e 0 -n "Distro Boot Script" -d boot.txt boot.scr.emmc
sudo cp ./boot.scr.emmc /boot
sudo reboot
2. /data刷机
注意:该方法要求刷机包的分区与盒子sd卡刷机的分区没有变化,且该刷机方法/data分区并不会被清除,里面的文件都会保存下来。
(1) 因为该方法不会自动清理/data,所以为了新刷环境比较干净,刷机前自行清空/data:rm -fr /data/*
(2) 把SD卡刷机包里的全部文件丢到SM5的/data目录下,效果如下:
/data
├── BOOT
├── boot.1-of-2.gz
├── boot.2-of-2.gz
├── boot.cmd
├── boot_emmc-boot.cmd
├── boot_emmc-boot.scr
├── boot_emmc.cmd
├── boot_emmc-data.cmd
├── boot_emmc-data.scr
├── 此处省略n行
(3) 记录刷机包文件,以便刷机后清理:进入/data目录执行ls > filelist.txt
为了能自动清理刷机包,在制作刷机包时应修改开机自动运行脚本/etc/rc.local,写入cd /data && rm -fr $(cat filelist.txt)
(4) 设置恢复模式
sudo -i
echo -e "boot-recovery\n/DATA/" > /dev/mmcblk0p3
#读取一下看是否符合预期
cat /dev/mmcblk0p3
#预期要能看到:
#boot-recovery
#/DATA/
#按ctrl+c结束
(5)重启系统,请注意不要直接拔电源,以免文件损坏:
sync
sudo reboot