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