1.概述
空中下載技術(Over-the-Air Technology, OTA)是通過移動通信的空中接口實現對移動終端設備及SIM卡數據進行遠程管理的技術。本文采用了swupdate的方式進行ota升級,swupdate是一個基于嵌入式的Linux平臺的升級服務框架程序,它提供了分區升級,文件升級,差分升級(補丁應用)功能,并提供了開放接口,方便用戶添加自定義升級處理函數。本應用筆記主要講述如何使用搭建在米爾基于NXP iMX 93核心板系統中的OTA功能,實現對米爾基于NXP iMX 93核心板文件系統的遠程升級。
2.環境準備
2.1.軟件資源
OTA升級文件制作工具:ota-generate_swu.tar.gz(路徑:03_Tools/ota-tools)。
MYC-LMX9X-Core文件系統:myir-image-core-myd-lmx9x.ext4(路徑:02_Images/ 或者通過Yocto編譯得到,編譯相關情況查看軟件開發指南內容)。
Ubuntu操作系統主機環境,虛擬機或者安裝的Ubuntu PC主機皆可,沒有版本要求。
2.2.硬件資源
米爾基于NXP iMX 93開發板(或者MYC-LMX9X核心板+自研底板,自研底板要求至少有一個網口或者存在Wifi芯片)。
網線或者Wifi天線。
開發板電源、串口線及其他能夠確保開發板能夠正常運行啟動所需求的配件。
2.3.主機環境配置
進行OTA升級,必須要要在Ubuntu主機環境搭建Http服務器,以下將以Ubuntu18.04的Http服務器搭建過程舉例,用戶名將以myir舉例,為了后續OTA升級使用,將Http服務器直接配置為后續可直接使用的配置。該過程僅供參考使用,如果使用其他版本的Ubuntu系統在搭建過程中出現任何以下說明中未出現的錯誤情況,請咨詢互聯網尋找解決辦法。
安裝apache2
sudo apt install -y apache2
配置環境
默認是80端口,防止其他情況使用導致沖突,修改為自定義端口:8001,修改 /etc/apache2/ports.conf文件監聽端口:
$:vi/etc/apache2/ports.confListen8001##其它行不變
修改/etc/apache2/sites-enabled/000-default.conf文件端口與訪問目錄,方便后續使用。
$:vi/etc/apache2/sites-enabled/000-default.conf8001> ## 其他行不變#DocumentRoot /var/www/html ## 默認瀏覽器訪問目錄,注釋掉DocumentRoot/home/myir/swupdate##修改為此目錄,用戶名請根據修改做修改
修改apache2的配置文件/etc/apache2/apache2.conf:
$: vi /etc/apache2/apache2.conf##找到如下行,并修改為如下內容# ##配置文件默認目錄,注釋掉 Options Indexes FollowSymLinks AllowOverride None Require all granted
重啟服務
$: sudo /etc/init.d/apache2 restart
測試
如果是虛擬機請修改Ubuntu網絡配置為橋接網卡讓虛擬機和Windows主機為同一IP下,如果是其他環境則可以直接打開瀏覽器,并在瀏覽器中輸入http://{hostIP}:8001,此處hostIP為配置了http服務器的Ubuntu的ip地址,例如Ubuntu 的ip地址為192.168.1.20,則在瀏覽器中輸入//192.168.1.20:8001,成功則如下圖所示:
圖2-1. http搭建成功
3.升級原理
OTA簡單理解就是在線升級固件,將固件從服務器下載之后,相應的寫入對應的分區,在這個過程中可能會存在燒錄中斷電或者其他原因導致分區損壞了問題,所以MYD-LMX9X選擇了AB對稱分區的方式來保存文件系統。
3.1.AB分區介紹
對于MYD-LMX9X的AB對稱文件系統,首先做了以下邏輯處理:
首先在Uboot的env變量中添加了boot_limit,mmcbootpart,mmcbootpart_back三個變量,并且對它們添加了一定的邏輯判斷,可以通過uboot命令行看到:
u-boot=>printenvboot_limitboot_limit=3u-boot=> printenv mmcbootpartmmcbootpart=2u-boot=> printenv mmcbootpart_backmmcbootpart_back=3bsp_bootcmd=echoRunningBSPbootcmd...;mmcdev${mmcdev};ifmmcrescan;thenifrunloadbootscript;thenrunbootscript;elseiftest${sec_boot}=yes;thenifrunloadcntr;thenrunmmcboot;elserunnetboot;fi;elseifrunloadimage;theniftest${boot_limit}-gt0;thensetexprboot_limit ${boot_limit}-1;setenvboot_limit${boot_limit};saveenv;setenvmmcroot/dev/mmcblk${mmcdev}p${mmcbootpart}rootwaitrw;elsesetenvmmcroot/dev/mmcblk${mmcdev}p${mmcbootpart_back}rootwaitrw;fi;runmmcboot;elserunnetboot;fi;fi;fi;fi;
boot_limit的值每當開發板上電進入uboot后會將其減一,可以通過上述高亮的地方可以查看到,但是當文件系統啟動成功后會被設置為3,所以假如出現了文件系統損壞的問題導致無法啟動,boot_limit無法被設置為3,并且文件系統啟動失敗后會自動運行看門狗重啟,看門狗默認時間為60s,當發現啟動失敗后手動重啟系統也是一樣的,重啟后再次進入uboot,此時由于boot_limit沒有被設置為3,所以此時boot_limit值為2,并且則會被再次減一。
mmcbootpart變量是當前啟動的分區號,比如上述中值為2,則稍后會從mmcblk0p2啟動;mmcbootpart_back是備份啟動的分區號,如上述中值為3,則文件系統mmcblk0p2無法啟動或者啟動錯誤后,在boot_limit值在重啟多次后為0時,將會啟動mmcblk0p3備份分區。
具體的運行邏輯流程圖如下:
圖3-1. AB分區流程圖
可以在文件系統中執行以下命令查看到eMMC中分區的情況:
root@myd-lmx9x:~#cat/proc/partitionsmajor minor #blocks name179 0 7634944 mmcblk0179 1 102400 mmcblk0p1 #Image+dtb內核和設備樹文件存放分區179 2 3686400 mmcblk0p2 #A文件系統分區179 3 3686400 mmcblk0p3 #B文件系統分區179 32 32640 mmcblk0boot01796432640mmcblk0boot1
3.2.Swupdate介紹
本節將介紹在上章節中,在進入文件系統后會進行swupdate的更新,該更新由systemd的服務啟動,是自動更新,只需要修改對應的ip地址路徑的配置即可。
首先介紹swupdate更新會需要到的swu文件,該文件由腳本制作生產,該制作工具壓縮包已存放在03_Tools中,名稱為ota-generate_swu.tar.gz,具體制作過程后續4.1章節會介紹,在這里先介紹其中swu文件的配置文件sw-description,該文件如下所示:
software ={ version = "1.1"; description = "Firmware update for myd-lmx9x" myd-lmx9x = { hardware-compatibility: [ "1.0", "1.1" ]; stable: { main: { images:( { filename = "myir-image-core-myd-lmx9x.ext4"; device = "/dev/mmcblk0p3"; filesystem = "ext4" ; } ); bootenv:( { name="mmcbootpart"; value="3"; }, { name="mmcbootpart_back"; value="2"; } ); scripts: ( { filename = "update.sh"; type = "shellscript"; } ); };
其中包含了version,設備名稱myd-lmx9x,硬件版本hardware-compatibility,stable和之中的main分支,以及images、bootenv、scripts參數。
系統內已經安裝了自啟動服務,在系統開機后將會自行執行,輸入以下命令查看服務具體內容:
[Unit]Description=SWUpdate daemonAfter=swupdate.service
[Service]ExecStart=/etc/myir-swupdate.shKillMode=mixed
[Install]WantedBy=multi-user.target
該服務將會自動執行/etc/myir-swupdate.sh腳本,查看該腳本內容:
#!/bin/sh. /etc/board_part_info.confecho EMMC_DEV ${EMMC_DEV}echo SD_DEV ${SD_DEV}echo ROOTFS_A_PART=${ROOTFS_A_PART}echo ROOTFS_B_PART=${ROOTFS_B_PART}current_rootfs=""check_root_part_cmdline(){ cmdline=`cat /proc/cmdline` for i in $cmdline do if [[ `echo $i | grep "root="` != "" ]];then current_rootfs=${i##*/} fi done}check_need_repalce_env(){ echo ${current_rootfs} result=$(echo ${current_rootfs} | grep "mmcblk") if [[ ${result} != "" ]];then bootdev=${current_rootfs%p*} #echo bootdev ${bootdev} if [[ `grep ${bootdev} /etc/fw_env.config` == "" ]];then sed -i "s/mmcblk[0-9]*/${bootdev}/g" /etc/fw_env.config fi fi}function_on_different_part(){ case ${current_rootfs:0-1} in ${ROOTFS_A_PART}) echo "rootfs A part" fw_setenv swu_mode 0 fw_setenv boot_limit 3 fw_setenv mmcbootpart ${ROOTFS_A_PART} fw_setenv mmcbootpart_back ${ROOTFS_B_PART} echo "SWUPDATE_ARGS="-v -d -uhttp://192.168.1.20/MYD-LMX9X-IMAGE/myd-lmx9x.swu -e stable,main"" > /etc/myir-swupdate.cfg ;; ${ROOTFS_B_PART}) echo "rootfs B part" fw_setenv swu_mode 0 fw_setenv boot_limit 3 fw_setenv mmcbootpart ${ROOTFS_B_PART} fw_setenv mmcbootpart_back ${ROOTFS_A_PART} echo "SWUPDATE_ARGS="-v -d -uhttp://192.168.1.20/MYD-LMX9X-IMAGE/myd-lmx9x.swu -e stable,alt"" > /etc/myir-swupdate.cfg ;; *) echo "con not distinguish part" exit 1 esac}check_root_part_cmdlinecheck_need_repalce_envfunction_on_different_part
該腳本中,就會執行上一章節提到的env變量默認設置,以及會將修改/etc/fw_env.config文件,配置正確的fw_env工具可以使用的配置文件,fw_env其中包含了fw_printenv和fw_setenv可以再文件系統中修改uboot的env環境變量。
該腳本最后一部分將會把swupdate需要的配置信息添加到/etc/myir-swupdate.cfg中:
root@myd-lmx9x:~# cat /etc/myir-swupdate.cfgSWUPDATE_ARGS="-v -d -uhttp://192.168.1.20/MYD-LMX9X-IMAGE/myd-lmx9x.swu -e stable,main"
其中包含了http服務器的具體ip,和swu文件的路徑,已經sw-description中的分支選擇。
4.操作步驟
4.1.遠程升級
要實現OTA功能,至少需要兩塊設備,分別是服務器與客戶端。服務器只有一個,就是MYD-LMX9X(本文以下皆用MYD-LMX9X開發板做為示例)。開發板通過串口與PC機連接,或者也可以通過ssh的方式遠程訪問開發板的串口,這個步驟可以閱讀快速入門指南和評估指南了解具體信息。然后將需要OTA需要的swu文件存放于PC主機,然后開發板執行對應命令即可完成OTA升級,接下來詳細介紹操作步驟和注意事項。
4.1.1.制作swu文件
首先通過MYD-LMX9X的米爾電子下載中心鏈接或者百度網盤共享鏈接獲取OTA升級文件制作工具:ota-generate_swu.tar.gz。
1)解壓工具
在Ubuntu主機下創建工作目錄并解壓該工具,解壓完成后進入目錄:
$: mkdir ~/swupdate$: cp /ota-generate_swu.tar.gz ~/swupdate/ota-generate_swu.tar.gz# 此處的請根據實際情況填寫文件所在路徑$: cd ~/swupdate$: tar xvf ota-generate_swu.tar.gz$: ls -latotal 24drwxrwxr-x 3 beste beste 4096 4月 9 17:52 .drwxrwx--- 55 beste beste 4096 4月 9 17:52 ..-rw-rw-r-- 1 beste beste 10240 4月 9 17:52 ota-generate_swu.tar.gzdrwxrwxr-x 2 beste beste 4096 4月 9 17:51 swupdate-ota$: cd swupdate-ota$: lsgenerate_swu.sh readme.txt sw-description update.sh
2)sw-description說明
swupdate 采用cpio的方式進行歸檔,該文件是描述文件,默認名稱為sw-description。該文件描述了升級包歸檔文件中的文件信息和升級信息。sw-description內容如下:
software ={ version = "1.1"; description = "Firmware update for myd-lmx9x" myd-lmx9x = { hardware-compatibility: [ "1.0", "1.1" ]; stable: { main: { images:( { filename = "myir-image-core-myd-lmx9x.ext4"; device = "/dev/mmcblk0p3"; filesystem = "ext4" ; } ); bootenv:( { name="mmcbootpart"; value="3"; }, { name="mmcbootpart_back"; value="2"; } ); scripts: ( { filename = "update.sh"; type = "shellscript"; } ); }; alt: { images:( { filename = "myir-image-full-mys-8mmx.ext4.gz"; compressed = "zlib"; device = "/dev/mmcblk0p2"; } ); bootenv:( { name="mmcbootpart"; value="2"; }, { name="mmcbootpart_back"; value="3"; } ); scripts: ( { filename = "update.sh"; type = "shellscript"; } ); }; }; };}
該文件中的內容中,部分關鍵字將會在后續的開發板中進行update時使用到,這里可以先打開MYD-LMX9X開發板的串口查看下稍后會使用到的腳本,開發板eMMC啟動上電并打開串口:
root@myd-lmx9x:~# ls /etc/myir-swupdate*/etc/myir-swupdate.cfg /etc/myir-swupdate.sh
可以看到swupdate使用到的腳本和cfg配置文件,打開配置文件:
root@myd-lmx9x:~# cat /etc/myir-swupdate.cfgSWUPDATE_ARGS="-v -d -uhttp://192.168.1.20/MYD-LMX9X-IMAGE/myd-lmx9x.swu -e stable,main"
如果沒有此配置文件,請先執行如下腳本,關于該腳本的具體描述,會在后續的3.1.2章節講述:
root@myd-lmx9x:~# /etc/myir-swupdate.shEMMC_DEV 2SD_DEV 1ROOTFS_A_PART=2ROOTFS_B_PART=3mmcblk0p2rootfs B part
可以看到配置的swu文件路徑為http://192.168.1.20/MYD-LMX9X-IMAGE/myd-lmx9x.swu,其中選擇sw-description說明文件中stable的main分支,可以對比參考剛才sw-description中的內容閱讀理解。
其中選擇main分支下的內容則將把myir-image-core-myd-lmx9x.ext4文件系統燒錄到/dev/mmcblk0p3也就是開發板eMMC下的第三個分區,其中mmcblk0p1第一個分區為內核文件和設備樹文件存放分區,mmcblk0p2和mmcblk0p3是文件系統分區A和文件系統分區B。
3)構建swu文件
從02_Image或者Yocto構建編譯獲取到myir-image-core-myd-lmx9x.ext4,并將其放到swupdate-ota目錄下
$: cp /myir-image-core-myd-lmx9x.ext4 ~/swupdate/swupdate-ota# 此處的請根據實際情況填寫文件所在路徑$: lsgenerate_swu.sh myir-image-core-myd-lmx9x.ext4 readme.txt sw-description update.sh
然后將新添加的文件加入generate_swu.sh腳本:
#!/bin/bash
CONTAINER_VER="1.1"PRODUCT_NAME="myd-lmx9x"FILES="sw-description myir-image-core-myd-lmx9x.ext4 update.sh"
#openssl dgst -sha256 -sign swupdate-priv.pem sw-description > sw-description.sig
for i in $FILES;do echo $i;done | cpio -ov -H crc > ${PRODUCT_NAME}_${CONTAINER_VER}.swu
最后執行generate_swu.sh腳本文件:
$: ./generate_swu.shsw-descriptionmyir-image-core-myd-lmx9x.ext4update.sh2362324 blocks
可以看到需要的swu文件myd-lmx9x_1.1.swu構建完成。
$: lsgenerate_swu.sh myd-lmx9x_1.1.swu myir-image-core-myd-lmx9x.ext4 readme.txt sw-description update.sh
在執行接下來的步驟之前,要確保http服務器上可以正常訪問到myd-lmx9x_1.1.swu文件,如下圖所示:
圖4-1. http服務器
保證開發板和搭建了http服務器ubuntu主機系統處于同一個網段下,如本文示例,開發板的ip為192.168.1.56,ubuntu主機ip為192.168.1.20,并且確保互相能夠ping通。
# 查看ubuntu主機 ip$ ifconfigenp0s3: flags=4163 mtu 1500 inet 192.168.1.20 netmask 255.255.255.0 broadcast 192.168.1.255 inet6 fe80:d51c270c prefixlen 64 scopeid 0x20 ether 08276a:48 txqueuelen 1000 (Ethernet) RX packets 1132717 bytes 1333243911 (1.3 GB) RX errors 0 dropped 6181 overruns 0 frame 0 TX packets 64347 bytes 19130410 (19.1 MB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0# 查看MYD-LMX9X開發板 iproot@myd-lmx9x:~# ifconfig eth0eth0: flags=4163 mtu 1500 inet 192.168.1.56 netmask 255.255.255.0 broadcast 192.168.1.255 inet6 fe80:54ff88fb prefixlen 64 scopeid 0x20 ether 465488:fb txqueuelen 1000 (Ethernet) RX packets 10516 bytes 989859 (966.6 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 589 bytes 46288 (45.2 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0# 嘗試Ping ubuntu主機root@myd-lmx9x:~# ping 192.168.1.20PING 192.168.1.20 (192.168.1.20) 56(84) bytes of data.64 bytes from 192.168.1.20: icmp_seq=1 ttl=63 time=60.2 ms64 bytes from 192.168.1.20: icmp_seq=2 ttl=63 time=5.73 ms64 bytes from 192.168.1.20: icmp_seq=3 ttl=63 time=4.94 ms64 bytes from 192.168.1.20: icmp_seq=4 ttl=63 time=2.95 ms^C--- 192.168.1.20 ping statistics ---4 packets transmitted, 4 received, 0% packet loss, time 3004msrtt min/avg/max/mdev = 2.948/18.442/60.151/24.101 ms
4.1.2.更新系統
完成上面的步驟后,開機進入文件系統,修改/etc/swupdate.sh,將網絡地址修改為實際情況下的ip以及對應的文件路徑:
echo "SWUPDATE_ARGS="-v -d -uhttp://192.168.1.20/swupdate-ota/myd-lmx9x_1.1.swu -e stable,main"" > /etc/myir-swupdate.cfg
修改完成后保存,重啟開發板后將會自動更新該swu文件。
-
NXP
+關注
關注
60文章
1278瀏覽量
184039 -
開發板
+關注
關注
25文章
5032瀏覽量
97371 -
米爾電子
+關注
關注
0文章
109瀏覽量
449
發布評論請先 登錄
相關推薦
評論