1.概述
空中下載技術(shù)(Over-the-Air Technology, OTA)是通過(guò)移動(dòng)通信的空中接口實(shí)現(xiàn)對(duì)移動(dòng)終端設(shè)備及SIM卡數(shù)據(jù)進(jìn)行遠(yuǎn)程管理的技術(shù)。本文采用了swupdate的方式進(jìn)行ota升級(jí),swupdate是一個(gè)基于嵌入式的Linux平臺(tái)的升級(jí)服務(wù)框架程序,它提供了分區(qū)升級(jí),文件升級(jí),差分升級(jí)(補(bǔ)丁應(yīng)用)功能,并提供了開(kāi)放接口,方便用戶添加自定義升級(jí)處理函數(shù)。本應(yīng)用筆記主要講述如何使用搭建在米爾基于NXP iMX 93核心板系統(tǒng)中的OTA功能,實(shí)現(xiàn)對(duì)米爾基于NXP iMX 93核心板文件系統(tǒng)的遠(yuǎn)程升級(jí)。
2.環(huán)境準(zhǔn)備
2.1.軟件資源
OTA升級(jí)文件制作工具:ota-generate_swu.tar.gz(路徑:03_Tools/ota-tools)。
MYC-LMX9X-Core文件系統(tǒng):myir-image-core-myd-lmx9x.ext4(路徑:02_Images/ 或者通過(guò)Yocto編譯得到,編譯相關(guān)情況查看軟件開(kāi)發(fā)指南內(nèi)容)。
Ubuntu操作系統(tǒng)主機(jī)環(huán)境,虛擬機(jī)或者安裝的Ubuntu PC主機(jī)皆可,沒(méi)有版本要求。
2.2.硬件資源
米爾基于NXP iMX 93開(kāi)發(fā)板(或者M(jìn)YC-LMX9X核心板+自研底板,自研底板要求至少有一個(gè)網(wǎng)口或者存在Wifi芯片)。
網(wǎng)線或者Wifi天線。
開(kāi)發(fā)板電源、串口線及其他能夠確保開(kāi)發(fā)板能夠正常運(yùn)行啟動(dòng)所需求的配件。
2.3.主機(jī)環(huán)境配置
進(jìn)行OTA升級(jí),必須要要在Ubuntu主機(jī)環(huán)境搭建Http服務(wù)器,以下將以Ubuntu18.04的Http服務(wù)器搭建過(guò)程舉例,用戶名將以myir舉例,為了后續(xù)OTA升級(jí)使用,將Http服務(wù)器直接配置為后續(xù)可直接使用的配置。該過(guò)程僅供參考使用,如果使用其他版本的Ubuntu系統(tǒng)在搭建過(guò)程中出現(xiàn)任何以下說(shuō)明中未出現(xiàn)的錯(cuò)誤情況,請(qǐng)咨詢互聯(lián)網(wǎng)尋找解決辦法。
安裝apache2
sudo apt install -y apache2
配置環(huán)境
默認(rèn)是80端口,防止其他情況使用導(dǎo)致沖突,修改為自定義端口:8001,修改 /etc/apache2/ports.conf文件監(jiān)聽(tīng)端口:
$:vi/etc/apache2/ports.confListen8001##其它行不變
修改/etc/apache2/sites-enabled/000-default.conf文件端口與訪問(wèn)目錄,方便后續(xù)使用。
$:vi/etc/apache2/sites-enabled/000-default.conf8001> ## 其他行不變#DocumentRoot /var/www/html ## 默認(rèn)瀏覽器訪問(wèn)目錄,注釋掉DocumentRoot/home/myir/swupdate##修改為此目錄,用戶名請(qǐng)根據(jù)修改做修改
修改apache2的配置文件/etc/apache2/apache2.conf:
$: vi /etc/apache2/apache2.conf##找到如下行,并修改為如下內(nèi)容# ##配置文件默認(rèn)目錄,注釋掉 Options Indexes FollowSymLinks AllowOverride None Require all granted
重啟服務(wù)
$: sudo /etc/init.d/apache2 restart
測(cè)試
如果是虛擬機(jī)請(qǐng)修改Ubuntu網(wǎng)絡(luò)配置為橋接網(wǎng)卡讓虛擬機(jī)和Windows主機(jī)為同一IP下,如果是其他環(huán)境則可以直接打開(kāi)瀏覽器,并在瀏覽器中輸入http://{hostIP}:8001,此處hostIP為配置了http服務(wù)器的Ubuntu的ip地址,例如Ubuntu 的ip地址為192.168.1.20,則在瀏覽器中輸入//192.168.1.20:8001,成功則如下圖所示:
圖2-1. http搭建成功
3.升級(jí)原理
OTA簡(jiǎn)單理解就是在線升級(jí)固件,將固件從服務(wù)器下載之后,相應(yīng)的寫(xiě)入對(duì)應(yīng)的分區(qū),在這個(gè)過(guò)程中可能會(huì)存在燒錄中斷電或者其他原因?qū)е路謪^(qū)損壞了問(wèn)題,所以MYD-LMX9X選擇了AB對(duì)稱分區(qū)的方式來(lái)保存文件系統(tǒng)。
3.1.AB分區(qū)介紹
對(duì)于MYD-LMX9X的AB對(duì)稱文件系統(tǒng),首先做了以下邏輯處理:
首先在Uboot的env變量中添加了boot_limit,mmcbootpart,mmcbootpart_back三個(gè)變量,并且對(duì)它們添加了一定的邏輯判斷,可以通過(guò)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的值每當(dāng)開(kāi)發(fā)板上電進(jìn)入uboot后會(huì)將其減一,可以通過(guò)上述高亮的地方可以查看到,但是當(dāng)文件系統(tǒng)啟動(dòng)成功后會(huì)被設(shè)置為3,所以假如出現(xiàn)了文件系統(tǒng)損壞的問(wèn)題導(dǎo)致無(wú)法啟動(dòng),boot_limit無(wú)法被設(shè)置為3,并且文件系統(tǒng)啟動(dòng)失敗后會(huì)自動(dòng)運(yùn)行看門(mén)狗重啟,看門(mén)狗默認(rèn)時(shí)間為60s,當(dāng)發(fā)現(xiàn)啟動(dòng)失敗后手動(dòng)重啟系統(tǒng)也是一樣的,重啟后再次進(jìn)入uboot,此時(shí)由于boot_limit沒(méi)有被設(shè)置為3,所以此時(shí)boot_limit值為2,并且則會(huì)被再次減一。
mmcbootpart變量是當(dāng)前啟動(dòng)的分區(qū)號(hào),比如上述中值為2,則稍后會(huì)從mmcblk0p2啟動(dòng);mmcbootpart_back是備份啟動(dòng)的分區(qū)號(hào),如上述中值為3,則文件系統(tǒng)mmcblk0p2無(wú)法啟動(dòng)或者啟動(dòng)錯(cuò)誤后,在boot_limit值在重啟多次后為0時(shí),將會(huì)啟動(dòng)mmcblk0p3備份分區(qū)。
具體的運(yùn)行邏輯流程圖如下:
圖3-1. AB分區(qū)流程圖
可以在文件系統(tǒng)中執(zhí)行以下命令查看到eMMC中分區(qū)的情況:
root@myd-lmx9x:~#cat/proc/partitionsmajor minor #blocks name179 0 7634944 mmcblk0179 1 102400 mmcblk0p1 #Image+dtb內(nèi)核和設(shè)備樹(shù)文件存放分區(qū)179 2 3686400 mmcblk0p2 #A文件系統(tǒng)分區(qū)179 3 3686400 mmcblk0p3 #B文件系統(tǒng)分區(qū)179 32 32640 mmcblk0boot01796432640mmcblk0boot1
3.2.Swupdate介紹
本節(jié)將介紹在上章節(jié)中,在進(jìn)入文件系統(tǒng)后會(huì)進(jìn)行swupdate的更新,該更新由systemd的服務(wù)啟動(dòng),是自動(dòng)更新,只需要修改對(duì)應(yīng)的ip地址路徑的配置即可。
首先介紹swupdate更新會(huì)需要到的swu文件,該文件由腳本制作生產(chǎn),該制作工具壓縮包已存放在03_Tools中,名稱為ota-generate_swu.tar.gz,具體制作過(guò)程后續(xù)4.1章節(jié)會(huì)介紹,在這里先介紹其中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,設(shè)備名稱myd-lmx9x,硬件版本hardware-compatibility,stable和之中的main分支,以及images、bootenv、scripts參數(shù)。
系統(tǒng)內(nèi)已經(jīng)安裝了自啟動(dòng)服務(wù),在系統(tǒng)開(kāi)機(jī)后將會(huì)自行執(zhí)行,輸入以下命令查看服務(wù)具體內(nèi)容:
[Unit]Description=SWUpdate daemonAfter=swupdate.service
[Service]ExecStart=/etc/myir-swupdate.shKillMode=mixed
[Install]WantedBy=multi-user.target
該服務(wù)將會(huì)自動(dòng)執(zhí)行/etc/myir-swupdate.sh腳本,查看該腳本內(nèi)容:
#!/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
該腳本中,就會(huì)執(zhí)行上一章節(jié)提到的env變量默認(rèn)設(shè)置,以及會(huì)將修改/etc/fw_env.config文件,配置正確的fw_env工具可以使用的配置文件,fw_env其中包含了fw_printenv和fw_setenv可以再文件系統(tǒng)中修改uboot的env環(huán)境變量。
該腳本最后一部分將會(huì)把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服務(wù)器的具體ip,和swu文件的路徑,已經(jīng)sw-description中的分支選擇。
4.操作步驟
4.1.遠(yuǎn)程升級(jí)
要實(shí)現(xiàn)OTA功能,至少需要兩塊設(shè)備,分別是服務(wù)器與客戶端。服務(wù)器只有一個(gè),就是MYD-LMX9X(本文以下皆用MYD-LMX9X開(kāi)發(fā)板做為示例)。開(kāi)發(fā)板通過(guò)串口與PC機(jī)連接,或者也可以通過(guò)ssh的方式遠(yuǎn)程訪問(wèn)開(kāi)發(fā)板的串口,這個(gè)步驟可以閱讀快速入門(mén)指南和評(píng)估指南了解具體信息。然后將需要OTA需要的swu文件存放于PC主機(jī),然后開(kāi)發(fā)板執(zhí)行對(duì)應(yīng)命令即可完成OTA升級(jí),接下來(lái)詳細(xì)介紹操作步驟和注意事項(xiàng)。
4.1.1.制作swu文件
首先通過(guò)MYD-LMX9X的米爾電子下載中心鏈接或者百度網(wǎng)盤(pán)共享鏈接獲取OTA升級(jí)文件制作工具:ota-generate_swu.tar.gz。
1)解壓工具
在Ubuntu主機(jī)下創(chuàng)建工作目錄并解壓該工具,解壓完成后進(jìn)入目錄:
$: mkdir ~/swupdate$: cp /ota-generate_swu.tar.gz ~/swupdate/ota-generate_swu.tar.gz# 此處的請(qǐng)根據(jù)實(shí)際情況填寫(xiě)文件所在路徑$: 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說(shuō)明
swupdate 采用cpio的方式進(jìn)行歸檔,該文件是描述文件,默認(rèn)名稱為sw-description。該文件描述了升級(jí)包歸檔文件中的文件信息和升級(jí)信息。sw-description內(nèi)容如下:
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"; } ); }; }; };}
該文件中的內(nèi)容中,部分關(guān)鍵字將會(huì)在后續(xù)的開(kāi)發(fā)板中進(jìn)行update時(shí)使用到,這里可以先打開(kāi)MYD-LMX9X開(kāi)發(fā)板的串口查看下稍后會(huì)使用到的腳本,開(kāi)發(fā)板e(cuò)MMC啟動(dòng)上電并打開(kāi)串口:
root@myd-lmx9x:~# ls /etc/myir-swupdate*/etc/myir-swupdate.cfg /etc/myir-swupdate.sh
可以看到swupdate使用到的腳本和cfg配置文件,打開(kāi)配置文件:
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"
如果沒(méi)有此配置文件,請(qǐng)先執(zhí)行如下腳本,關(guān)于該腳本的具體描述,會(huì)在后續(xù)的3.1.2章節(jié)講述:
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說(shuō)明文件中stable的main分支,可以對(duì)比參考剛才sw-description中的內(nèi)容閱讀理解。
其中選擇main分支下的內(nèi)容則將把myir-image-core-myd-lmx9x.ext4文件系統(tǒng)燒錄到/dev/mmcblk0p3也就是開(kāi)發(fā)板e(cuò)MMC下的第三個(gè)分區(qū),其中mmcblk0p1第一個(gè)分區(qū)為內(nèi)核文件和設(shè)備樹(shù)文件存放分區(qū),mmcblk0p2和mmcblk0p3是文件系統(tǒng)分區(qū)A和文件系統(tǒng)分區(qū)B。
3)構(gòu)建swu文件
從02_Image或者Yocto構(gòu)建編譯獲取到myir-image-core-myd-lmx9x.ext4,并將其放到swupdate-ota目錄下
$: cp /myir-image-core-myd-lmx9x.ext4 ~/swupdate/swupdate-ota# 此處的請(qǐng)根據(jù)實(shí)際情況填寫(xiě)文件所在路徑$: 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
最后執(zhí)行g(shù)enerate_swu.sh腳本文件:
$: ./generate_swu.shsw-descriptionmyir-image-core-myd-lmx9x.ext4update.sh2362324 blocks
可以看到需要的swu文件myd-lmx9x_1.1.swu構(gòu)建完成。
$: lsgenerate_swu.sh myd-lmx9x_1.1.swu myir-image-core-myd-lmx9x.ext4 readme.txt sw-description update.sh
在執(zhí)行接下來(lái)的步驟之前,要確保http服務(wù)器上可以正常訪問(wèn)到myd-lmx9x_1.1.swu文件,如下圖所示:
圖4-1. http服務(wù)器
保證開(kāi)發(fā)板和搭建了http服務(wù)器ubuntu主機(jī)系統(tǒng)處于同一個(gè)網(wǎng)段下,如本文示例,開(kāi)發(fā)板的ip為192.168.1.56,ubuntu主機(jī)ip為192.168.1.20,并且確保互相能夠ping通。
# 查看ubuntu主機(jī) 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開(kāi)發(fā)板 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主機(jī)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.更新系統(tǒng)
完成上面的步驟后,開(kāi)機(jī)進(jìn)入文件系統(tǒng),修改/etc/swupdate.sh,將網(wǎng)絡(luò)地址修改為實(shí)際情況下的ip以及對(duì)應(yīng)的文件路徑:
echo "SWUPDATE_ARGS="-v -d -uhttp://192.168.1.20/swupdate-ota/myd-lmx9x_1.1.swu -e stable,main"" > /etc/myir-swupdate.cfg
修改完成后保存,重啟開(kāi)發(fā)板后將會(huì)自動(dòng)更新該swu文件。
-
NXP
+關(guān)注
關(guān)注
60文章
1254瀏覽量
182467 -
開(kāi)發(fā)板
+關(guān)注
關(guān)注
25文章
4834瀏覽量
96820 -
米爾電子
+關(guān)注
關(guān)注
0文章
96瀏覽量
429
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論