20180920_jeffrey - silenceuncrio/diary GitHub Wiki
先 build 一版有 diff 功能的 image
開機後
root@52XXZ:~# diff
-sh: diff: not found
回頭看看發生甚麼事
試一下 proscend 外層 make distclean
後再 make
有得等囉
等待的同時也把之前 M360P Dual Image 再 review 一次
雖說是自己做的
但現在看來真的覺得相當的不錯
當時的自己靠並不是 聰明 而是 耐心
一步一腳印的突破才能把 dual image 所需要的機制串起來
proscend 外層 終於 build 好了
趕緊進 proscend build image
root@52XXZ:~# md5sum --help
BusyBox v1.17.1 (2018-09-20 02:35:46 UTC) multi-call binary.
Usage: md5sum [OPTIONS] [FILE]...
Print MD5 checksums
root@52XXZ:~# diff --help
BusyBox v1.17.1 (2018-09-20 02:35:46 UTC) multi-call binary.
Usage: diff [-abBdiNqrTstw] [-L LABEL] [-S FILE] [-U LINES] FILE1 FILE2
Compare files line by line and output the differences between them.
This implementation supports unified diffs only.
Options:
-a Treat all files as text
-b Ignore changes in the amount of whitespace
-B Ignore changes whose lines are all blank
-d Try hard to find a smaller set of changes
-i Ignore case differences
-L Use LABEL instead of the filename in the unified header
-N Treat absent files as empty
-q Output only whether files differ
-r Recurse
-S Start with FILE when comparing directories
-T Make tabs line up by prefixing a tab when necessary
-s Report when two files are the same
-t Expand tabs to spaces in output
-U Output LINES lines of context
-w Ignore all whitespace
終於又可以前進了
昨天將用來做 firmware upgrade 的 proscend/prosrc/icos/script/FirmwareUpgrade.sh
修改如下
@@ -26,16 +26,6 @@ INIT_TIME="init_time"
CURR_TIME="curr_time"
-# ignore SIGINT - Crtl-C
-# ignore SIGTSTP - Ctrl-Z
-# ignore SITERM - kill
-function trap_init {
- trap "echo ignore signal: SIGINT" SIGINT
- trap "echo ignore signal: SIGTSTP" SIGTSTP
- trap "echo ignore signal: SIGTERM" SIGTERM
-}
-
-
@@ -148,7 +138,6 @@ function md5_sums_check {
else
log "Error: MD5 sums check failed"
progress_fail "Error: Please offer the firmware"
- main_mutex_unlock
exit 1
fi
else
@@ -271,11 +260,11 @@ function firmware_upgrde {
extract $1
md5_sums_check
- mcsv_check
- write_to_mtd
+# mcsv_check
+# [ write_to_mtd
#replace current primary application
- fw_setenv no_good .xx
+# fw_setenv no_good .xx
log "\nUpgrading the firmware succeeded"
}
搭配 proscend/Makefile
的 firmware_img
@@ -102,7 +102,7 @@ IMAGE_NAME := $(MODEL_NAME)-$(shell date +"%m%d%Y").img
.PHONY: all clean install distclean
#default all: prepare prosrc opensrc install rootfsimage root_squashfs sysupgrade_bin fullimage
-default all: prepare prosrc opensrc install clean_image rootfsimage fullimage
+default all: prepare prosrc opensrc install clean_image rootfsimage fullimage firmware_img
install:
echo "PROSCEND INSTALL"
@@ -250,10 +250,27 @@ image/fullimage.img: image/rootfs.img image/uImage
clean_image:
rm -rf image
mkdir -p image
-
+
rootfsimage: image/rootfs.img
fullimage : image/fullimage.img
+
+
+firmware_img: fullimage
+ rm -f image/firmware.img
+ cp rootfs/etc/mcsv image/mcsv
+ openssl des3 -salt -in image/mcsv -out image/mcsv.enc -k 2wsx#EDC
+ mkdir -p firmware
+ cp image/mcsv.enc firmware
+ cp image/fullimage.img firmware
+ cd firmware; md5sum * > firmware.md5
+ tar -cf image/$(IMAGE_NAME) firmware
+ cp image/$(IMAGE_NAME) image/firmware.img
+ rm -rf firmware
+ @echo MCSV=$(MCSV)
+
+
+
.PHONY: buildenv_check buildenv_gen buildenv_clean penv merge
menuconfig: pconfig pconfig_links pvars_links penv prosrc_clean openwrt-base
目前得到的結果如下
root@52XXZ:/ramdisk/tmp# ./FirmwareUpgrade.sh firmware.img
md5sum: can't open '-c': No such file or directory
那是因為 52XXZ 上的 BusyBox 是 v1.17.1
與 M360 上 v1.22.1 的 BusyBox 不同
52XXZ 上 v1.17.1 BusyBox 的 md5sum 並不具備 -c
這個功能
root@M360-P:/tmp/firmware# md5sum --help
BusyBox v1.22.1 (2018-09-14 04:24:50 UTC) multi-call binary.
Usage: md5sum [-c[sw]] [FILE]...
Print or check MD5 checksums
-c Check sums against list in FILEs
-s Don't output anything, status code shows success
-w Warn about improperly formatted checksum lines
所以我才需要搭配 diff
具體的替代手法如下
root@52XXZ:/ramdisk/tmp# cd firmware/
root@52XXZ:/ramdisk/tmp/firmware# ls
firmware.md5 fullimage.img mcsv.enc
root@52XXZ:/ramdisk/tmp/firmware# md5sum fullimage.img mcsv.enc > firmware.md5.o
n_device
root@52XXZ:/ramdisk/tmp/firmware# diff firmware.md5 firmware.md5.on_device
root@52XXZ:/ramdisk/tmp/firmware# echo $?
0
故意讓 firmware.md5.on_device
出錯的話
root@52XXZ:/ramdisk/tmp/firmware# diff firmware.md5 firmware.md5.on_device
--- firmware.md5
+++ firmware.md5.on_device
@@ -1,2 +1,2 @@
5ad321c4696b434a698a25fa87ff906d fullimage.img
-4182bc382359e084f6bbbd36fb0f321d mcsv.enc
+4182bc382359e084f6bbbd36fb0f321e mcsv.enc
root@52XXZ:/ramdisk/tmp/firmware# echo $?
1
diff
可以順利檢查出來
修正 +++ b/proscend/prosrc/icos/script/FirmwareUpgrade.sh
如下
@@ -26,16 +26,6 @@ INIT_TIME="init_time"
CURR_TIME="curr_time"
-# ignore SIGINT - Crtl-C
-# ignore SIGTSTP - Ctrl-Z
-# ignore SITERM - kill
-function trap_init {
- trap "echo ignore signal: SIGINT" SIGINT
- trap "echo ignore signal: SIGTSTP" SIGTSTP
- trap "echo ignore signal: SIGTERM" SIGTERM
-}
-
-
@@ -140,7 +130,8 @@ function md5_sums_check {
if [ -e "firmware.md5" ]
then
log "firmware.md5 exist, read MD5 sums from it and check them"
- md5sum -c firmware.md5 > /dev/null
+ md5sum fullimage.img mcsv.enc > firmware.md5.on_device
+ diff firmware.md5 firmware.md5.on_device
if [ $? == 0 ]
then
log "MD5 sums check succeeded"
@@ -148,7 +139,6 @@ function md5_sums_check {
else
log "Error: MD5 sums check failed"
progress_fail "Error: Please offer the firmware"
- main_mutex_unlock
exit 1
fi
else
@@ -271,11 +261,11 @@ function firmware_upgrde {
extract $1
md5_sums_check
- mcsv_check
- write_to_mtd
+# mcsv_check
+# write_to_mtd
#replace current primary application
- fw_setenv no_good .xx
+# fw_setenv no_good .xx
log "\nUpgrading the firmware succeeded"
}
看一下結果
root@52XXZ:/ramdisk/tmp# ./FirmwareUpgrade.sh firmware.img
root@52XXZ:/ramdisk/tmp# cat FirmwareUpgrade.log
firmware upgrade shell script start...
Upgrading the firmware ...
Extract the tared firmware ...
tar -C /tmp -xf firmware.img
Extract the tared firmware succeeded
MD5 sums check ...
firmware.md5 exist, read MD5 sums from it and check them
MD5 sums check succeeded
Upgrading the firmware succeeded
firmware upgrade shell script succeeded
finished
很好
繼續前進 - mcsv_check
root@52XXZ:/ramdisk/tmp# ./FirmwareUpgrade.sh firmware.img
root@52XXZ:/ramdisk/tmp# cat FirmwareUpgrade.log
firmware upgrade shell script start...
Upgrading the firmware ...
Extract the tared firmware ...
tar -C /tmp -xf firmware.img
Extract the tared firmware succeeded
MD5 sums check ...
firmware.md5 exist, read MD5 sums from it and check them
MD5 sums check succeeded
MCSV check ...
mcsv.enc exist, decrypt it and check with hardware MCSV
decrypt mcsv.en
software MCSV: 147B00000012C2B8
software MCSV-MMMM: 147B
software MCSV-CCCC: 0000
hardware MCSV: ubi.mtd=system_s
hardware MCSV-MMMM: ubi.
hardware MCSV-CCCC: mtd=
Error: Model ID not match, MCSV check failed
目前讀到的 hardware MCSV 異常
hardware MCSV: ubi.mtd=system_s
hardware MCSV-MMMM: ubi.
hardware MCSV-CCCC: mtd=
Error: Model ID not match, MCSV check failed
直接看一下 /tmp/etc/sysinfo.txt
的內容
root@52XXZ:/ramdisk/tmp# cat /tmp/etc/sysinfo.txt
UBOOT_VER=U-Boot 2018.01-dirty-LANTIQ-v-2.3
MAC=00:03:79:00:00:20
HW_MCSV=ubi.mtd=system_sw
SERIALNO=ubi.mtd=system_sw
ACTIVE_BANK=A
回到源頭 rc.local
看一下
根本沒看到有對 /tmp/etc/sysinfo.txt
做任何處理
那裡頭的內容究竟從何而來
winston 表示該內容是從 uboot 傳進來的東西 parsing 出來的
在 uboot 裡可以利用 version
確認
VR9 # version
U-Boot 2018.01-dirty-LANTIQ-v-2.3.08 (Aug 14 2018 - 15:29:32)
VR268-BootLoader V300.01 Build at Aug 14 2018 15:29:32
MCSV :146700001002279C
SerialNo:BKLM12345678
Mac :00:03:79:00:00:20
而在 linux 裡可以利用 /proc/cmdline
來確認
root@52XXZ:~# cat /proc/cmdline
ubi.mtd=system_sw rootfsname=rootfsA ro rootfstype=squashfs quiet ip=192.168.1.1:192.168.1.113::::eth0:on console=ttyLTQ0,115200 ethaddr=00:03:79:00:00:20 phym=128M mem=127M panic=1 mtdparts=ifx_nand:1024k(uboot),256k(ubootconfigA),256k(ubootconfigB),256k(gphyfirmware),100m(system_sw),1m(calibration),-(res) init=/etc/preinit vpe1_load_addr=0x83f00000 vpe1_mem=1M ethwan= active_bank=A update_chk=0 ubootver=U-Boot 2018.01-dirty-LANTIQ-v-2.3.08 (Aug 14 2018 - 15:29:32)
winston 表示看來的確有些問題
因為我的 uboot 缺乏我需要的 環境變數
就幫我的 板子 更新了 uboot 再確認看看
搞定
root@52XXZ:~# cat /tmp/etc/sysinfo.txt
UBOOT_VER=U-Boot 2018.01-dirty-LANTIQ-v-2.3
MAC=00:03:79:00:00:20
HW_MCSV=146700001002279C
SERIALNO=BKLM12345678
ACTIVE_BANK=A
搭配以下的 proscend/prosrc/icos/script/FirmwareUpgrade.sh
@@ -26,16 +26,6 @@ INIT_TIME="init_time"
CURR_TIME="curr_time"
-# ignore SIGINT - Crtl-C
-# ignore SIGTSTP - Ctrl-Z
-# ignore SITERM - kill
-function trap_init {
- trap "echo ignore signal: SIGINT" SIGINT
- trap "echo ignore signal: SIGTSTP" SIGTSTP
- trap "echo ignore signal: SIGTERM" SIGTERM
-}
-
-
@@ -140,7 +130,8 @@ function md5_sums_check {
if [ -e "firmware.md5" ]
then
log "firmware.md5 exist, read MD5 sums from it and check them"
- md5sum -c firmware.md5 > /dev/null
+ md5sum fullimage.img mcsv.enc > firmware.md5.on_device
+ diff firmware.md5 firmware.md5.on_device
if [ $? == 0 ]
then
log "MD5 sums check succeeded"
@@ -148,7 +139,6 @@ function md5_sums_check {
else
log "Error: MD5 sums check failed"
progress_fail "Error: Please offer the firmware"
- main_mutex_unlock
exit 1
fi
else
@@ -272,10 +262,10 @@ function firmware_upgrde {
extract $1
md5_sums_check
mcsv_check
- write_to_mtd
+# write_to_mtd
#replace current primary application
- fw_setenv no_good .xx
+# fw_setenv no_good .xx
log "\nUpgrading the firmware succeeded"
}
確認一下
root@52XXZ:/ramdisk/tmp# ./FirmwareUpgrade.sh firmware.img
root@52XXZ:/ramdisk/tmp# cat FirmwareUpgrade.log
firmware upgrade shell script start...
Upgrading the firmware ...
Extract the tared firmware ...
tar -C /tmp -xf firmware.img
Extract the tared firmware succeeded
MD5 sums check ...
firmware.md5 exist, read MD5 sums from it and check them
MD5 sums check succeeded
MCSV check ...
mcsv.enc exist, decrypt it and check with hardware MCSV
decrypt mcsv.en
software MCSV: 147B00000012C2B8
software MCSV-MMMM: 147B
software MCSV-CCCC: 0000
hardware MCSV: 146700001002279C
hardware MCSV-MMMM: 1467
hardware MCSV-CCCC: 0000
Error: Model ID not match, MCSV check failed
MCSV 不 match
hardware MCSV-MMMM: 1467
但 software MCSV-MMMM: 147B
換成十進位的 modle id
hardware MCSV 紀載的是 5223
不過 software 帶的卻是 5243
跟 Winston 討論了一下
可以參考他日前 mail 給我的
52XXZ Check MCSV and dual image issue
(1)MCSV
Model ID => Model Group ID ( 5213/5223/5243 => 5243)
Custom ID => Custom Group ID ( 012/06 => 012)
User Model/Custom Group ID to check
// *********************************************************************************
// * ParsorMCV()
// *********************************************************************************
int ParsorMCV(char *pMCSV, int *pMid, int *pCid, int *pMig, int *pCig)
{ char szBuf[32];
strcpy(szBuf, pMCSV);
*pMid=(Hex2Dec(pMCSV[0])<<12)+(Hex2Dec(pMCSV[1])<<8)+(Hex2Dec(pMCSV[2])<<4)+(Hex2Dec(pMCSV[3])<<0);
*pCid=(pMCSV[4]&0x0F)*1000+(pMCSV[5]&0x0F)*100+(pMCSV[6]&0x0F)*10+(pMCSV[7]&0x0F)*1;
switch (*pMid) {
case 5213: // 5210Z
case 5223: // 5220Z
case 5243: // 5240Z
*pMig=5243;
break;
default:
*pMig=0;
break;
}
switch (*pCid) {
case 0: // Generic
case 1: // Proscend
*pCig=0;
break;
case 12: // CTCU
case 67: // CTCU_2(_NETXONE)
*pCig=12;
break;
case 53: // Hytec
case 64: // Hytec_2
*pCig=53;
break;
case 66: // PI
*pCig=66;
break;
default:
*pCig=*pCid;
break;
}
return 0;
}
來把這邏輯套到 FirmwareUpgrade.sh
吧
修改 FirmwareUpgrade.sh
的 mcsv_check()
如下
# MCSV check
function mcsv_check {
log "\nMCSV check ..."
progress_status "MCSV check ..."
cd /tmp/firmware
if [ ! -e "mcsv.enc" ]; then
log "mcsv.enc not exit, bypass MCSV check"
progress_status "mcsv.enc not exit, bypass MCSV check"
return 0
fi
openssl des3 -d -salt -in mcsv.enc -out mcsv -k 2wsx#EDC
if [ $? != 0 ]; then
log "Error: decrypt mcsv.enc failed"
progress_fail "Error: decrypt mcsv.enc failed"
exit 1
fi
sw_mcsv=$(cat mcsv)
log "software MCSV: ${sw_mcsv}"
sw_mcsv_mmmm=$(echo ${sw_mcsv} | cut -c 1-4)
log "software MCSV-MMMM: ${sw_mcsv_mmmm}"
sw_mcsv_cccc=$(echo ${sw_mcsv} | cut -c 5-8)
log "software MCSV-CCCC: ${sw_mcsv_cccc}"
hw_mcsv=$(cat /tmp/etc/sysinfo.txt | grep HW_MCSV | cut -c 9-24)
if [ -z "${hw_mcsv}" ]; then
log "Error: hw_mcsv not exit, MCSV check failed"
progress_fail "Error: hw_mcsv not exit, MCSV check failed"
exit 1
fi
log "hardware MCSV: ${hw_mcsv}"
hw_mcsv_mmmm=$(echo ${hw_mcsv} | cut -c 1-4)
log "hardware MCSV-MMMM: ${hw_mcsv_mmmm}"
hw_mcsv_cccc=$(echo ${hw_mcsv} | cut -c 5-8)
log "hardware MCSV-CCCC: ${hw_mcsv_cccc}"
# +---------------------+----------+----------+----------+----------------+
# | Model Name | Model | H/W MCSV | Model | S/W MCSV | Description |
# | | ID | MMMM | Group ID | MMMMM | |
# +------------+--------+----------+----------+----------+----------------+
# | 5210Z | 5213 | 145D | 5243 | 147B | G.Shdsl 1 Pair |
# +------------+--------+----------+----------+----------+----------------+
# | 5220Z | 5223 | 1467 | 5243 | 147B | G.Shdsl 2 Pair |
# +------------+--------+----------+----------+----------+----------------+
# | 5240Z | 5243 | 147B | 5243 | 147B | G.Shdsl 4 Pair |
# +------------+--------+----------+----------+----------+----------------+
mmmm_result=0
if [ "${hw_mcsv_mmmm}" == "145D" ] || [ "${hw_mcsv_mmmm}" == "1467" ] || [ "${hw_mcsv_mmmm}" == "147B" ]
then
# Model 5210Z/5220Z/5240Z can use firmware with S/W MCSV MMMM 147B
if [ "${sw_mcsv_mmmm}" != "147B" ]; then
mmmm_result=1
fi
else
# Default check - Reject if the Upgrade Image with different Model ID with HW MCSV
if [ "${sw_mcsv_mmmm}" != "${hw_mcsv_mmmm}" ]; then
mmmm_result=1
fi
fi
if [ $mmmm_result -eq 1 ]; then
log "Error: Model ID not match, MCSV check failed"
progress_fail "Error: Model ID not match, MCSV check failed"
echo "Error: Model ID not match, MCSV check failed"
return
fi
# +---------------------+----------+----------+----------+
# | Customer | Customer | H/W MCSV | Customer | S/W MCSV |
# | Name | ID | CCCC | Group ID | CCCC |
# +----------+----------+----------+----------+----------+
# | Generic | 0 | 0000 | 0 | 0000 |
# +----------+----------+----------+----------+----------+
# | Proscend | 1 | 0000 | 0 | 0000 |
# +----------+----------+----------+----------+----------+
# | CTCU | 12 | 0012 | 12 | 0012 |
# +----------+----------+----------+----------+----------+
# | CTCU_2 | 67 | 0067 | 12 | 0012 |
# +----------+----------+----------+----------+----------+
# | Hytec | 53 | 0053 | 53 | 0053 |
# +----------+----------+----------+----------+----------+
# | Hytec_2 | 64 | 0064 | 53 | 0053 |
# +----------+----------+----------+----------+----------+
cccc_result=0
if [ "${hw_mcsv_cccc}" == "0000" ] || [ "${hw_mcsv_cccc}" == "0001" ]
then
# Cutomer ID 0/1 can use firmware with S/W MCSV CCCC 0000
if [ "${sw_mcsv_cccc}" != "0000" ]; then
cccc_result=1
fi
elif [ "${hw_mcsv_cccc}" == "0012" ] || [ "${hw_mcsv_cccc}" == "0067" ]
then
# Cutomer ID 12/67 can use firmware with S/W MCSV CCCC 0012
if [ "${sw_mcsv_cccc}" != "0012" ]; then
cccc_result=1
fi
elif [ "${hw_mcsv_cccc}" == "0053" ] || [ "${hw_mcsv_cccc}" == "0064" ]
then
# Cutomer ID 53/64 can use firmware with S/W MCSV CCCC 0053
if [ "${sw_mcsv_cccc}" != "0053" ]; then
cccc_result=1
fi
else
# Default check - Reject if the Upgrade Image with different Customer ID with HW MCSV
if [ "${hw_mcsv_cccc}" != "${sw_mcsv_cccc}" ]; then
cccc_result=1
fi
fi
if [ $cccc_result -eq 1 ]; then
log "Error: Customer ID not match, MCSV check failed"
progress_fail "Error: Customer ID not match, MCSV check failed"
echo "Error: Customer ID not match, MCSV check failed"
return
fi
log "MCSV check succeeded"
progress_status "MCSV check succeeded"
cd - > /dev/null
}
再來就剩 write_to_mtd()
function write_to_mtd {
log "\nWrite the firmware image to MTD device ..."
mtd write "$UPGRADE_BIN" "$UPGRADE_DEV"
log "Write the firmware image to MTD device succeeded"
progress_status "Write the firmware image to MTD device succeeded"
}
write_to_mtd
這名字跟 52XXZ 應該不搭
m360 用的是 mtd write
但 52XXZ 用的卻是 upgrade
- upgrade /tmp/fullimage.img full 0 0 1
改成下面這樣好了
function upgrade_fullimage {
log "\nUpgrade fullimage ..."
progress_status "Upgrade fullimage ..."
upgrade /tmp/firmware/fullimage.img full 0 0 1`
log "Upgrade fullimage succeeded"
progress_status "Upgrade fullimage succeeded"
}
實際 upgrade 看看
root@52XXZ:/ramdisk/tmp# ./FirmwareUpgrade.sh firmware.img
Image Header --> Data Size = 17092680
Image Name = XRX200 Fullimage
Image Header --> Data Size = 15257600
Image Name = LTQCPE RootFS
Image contains header with name [LTQCPE RootFS]
Volume ID 4, size 119 LEBs (15353856 bytes, 14.6 MiB), LEB size 129024 bytes (126.0 KiB), dynamic, name "rootfsB", alignment 1
Image Header --> Data Size = 1834944
Image Name = MIPS LTQCPE Linux-3.10.12
Image contains header with name [MIPS LTQCPE Linux-3.10.12]
Volume ID 3, size 15 LEBs (1935360 bytes, 1.8 MiB), LEB size 129024 bytes (126.0 KiB), dynamic, name "kernelB", alignment 1
parameter f_kernel_sizeB is not existed
Erasing 128 Kibyte @ 20000 -- 100 % complete
parameter active_bank value changed from rootfs_id=1 to B
Erasing 128 Kibyte @ 20000 -- 100 % complete
parameter update_chk value changed from c=316DA752 to 1
Upgrade : successfully upgraded full
check log - FirmwareUpgrade.log
firmware upgrade shell script start...
Upgrading the firmware ...
Extract the tared firmware ...
tar -C /tmp -xf firmware.img
Extract the tared firmware succeeded
MD5 sums check ...
firmware.md5 exist, read MD5 sums from it and check them
MD5 sums check succeeded
MCSV check ...
software MCSV: 147B00000012C2B8
software MCSV-MMMM: 147B
software MCSV-CCCC: 0000
hardware MCSV: 146700001002279C
hardware MCSV-MMMM: 1467
hardware MCSV-CCCC: 0000
MCSV check succeeded
Upgrade fullimage ...
Upgrade fullimage succeeded
Upgrading the firmware succeeded
firmware upgrade shell script succeeded
finished
參考 winston 的建議再改一下 mcsv_check()
# MCSV check
function mcsv_check {
log "\nMCSV check ..."
progress_status "MCSV check ..."
cd /tmp/firmware
if [ ! -e "mcsv.enc" ]; then
log "mcsv.enc not exit, bypass MCSV check"
progress_status "mcsv.enc not exit, bypass MCSV check"
return 0
fi
openssl des3 -d -salt -in mcsv.enc -out mcsv -k 2wsx#EDC
if [ $? != 0 ]; then
log "Error: decrypt mcsv.enc failed"
progress_fail "Error: decrypt mcsv.enc failed"
exit 1
fi
sw_mcsv=$(cat mcsv)
log "software MCSV: ${sw_mcsv}"
sw_mcsv_mmmm=$(echo ${sw_mcsv} | cut -c 1-4)
log "software MCSV-MMMM: ${sw_mcsv_mmmm}"
sw_mcsv_cccc=$(echo ${sw_mcsv} | cut -c 5-8)
log "software MCSV-CCCC: ${sw_mcsv_cccc}"
hw_mcsv=$(cat /tmp/etc/sysinfo.txt | grep HW_MCSV | cut -c 9-24)
if [ -z "${hw_mcsv}" ]; then
log "Error: hw_mcsv not exit, MCSV check failed"
progress_fail "Error: hw_mcsv not exit, MCSV check failed"
exit 1
fi
log "hardware MCSV: ${hw_mcsv}"
hw_mcsv_mmmm=$(echo ${hw_mcsv} | cut -c 1-4)
log "hardware MCSV-MMMM: ${hw_mcsv_mmmm}"
hw_mcsv_cccc=$(echo ${hw_mcsv} | cut -c 5-8)
log "hardware MCSV-CCCC: ${hw_mcsv_cccc}"
# Decide Model Group ID then compare with H/W MCSV MMMM
#
# +---------------------+----------+----------+----------+----------------+
# | Model Name | Model | H/W MCSV | Model | S/W MCSV | Description |
# | | ID | MMMM | Group ID | MMMMM | |
# +------------+--------+----------+----------+----------+----------------+
# | 5210Z | 5213 | 145D | 5243 | 147B | G.Shdsl 1 Pair |
# +------------+--------+----------+----------+----------+----------------+
# | 5220Z | 5223 | 1467 | 5243 | 147B | G.Shdsl 2 Pair |
# +------------+--------+----------+----------+----------+----------------+
# | 5240Z | 5243 | 147B | 5243 | 147B | G.Shdsl 4 Pair |
# +------------+--------+----------+----------+----------+----------------+
if [ "${hw_mcsv_mmmm}" == "145D" ] || [ "${hw_mcsv_mmmm}" == "1467" ] || [ "${hw_mcsv_mmmm}" == "147B" ]
then
group_mcsv_mmmm="147B"
else
group_mcsv_mmmm=${hw_mcsv_mmmm}
fi
if [ "${group_mcsv_mmmm}" != "${sw_mcsv_mmmm}" ]; then
log "Error: Model ID not match, MCSV check failed"
progress_fail "Error: Model ID not match, MCSV check failed"
exit 1
fi
# Decide Customer Group ID then compare with H/W MCSV CCCC
#
# +---------------------+----------+----------+----------+
# | Customer | Customer | H/W MCSV | Customer | S/W MCSV |
# | Name | ID | CCCC | Group ID | CCCC |
# +----------+----------+----------+----------+----------+
# | Generic | 0 | 0000 | 0 | 0000 |
# +----------+----------+----------+----------+----------+
# | Proscend | 1 | 0000 | 0 | 0000 |
# +----------+----------+----------+----------+----------+
# | CTCU | 12 | 0012 | 12 | 0012 |
# +----------+----------+----------+----------+----------+
# | CTCU_2 | 67 | 0067 | 12 | 0012 |
# +----------+----------+----------+----------+----------+
# | Hytec | 53 | 0053 | 53 | 0053 |
# +----------+----------+----------+----------+----------+
# | Hytec_2 | 64 | 0064 | 53 | 0053 |
# +----------+----------+----------+----------+----------+
if [ "${hw_mcsv_cccc}" == "0000" ] || [ "${hw_mcsv_cccc}" == "0001" ]
then
group_mcsv_cccc="0000"
elif [ "${hw_mcsv_cccc}" == "0012" ] || [ "${hw_mcsv_cccc}" == "0067" ]
then
group_mcsv_cccc="0012"
elif [ "${hw_mcsv_cccc}" == "0053" ] || [ "${hw_mcsv_cccc}" == "0064" ]
then
group_mcsv_cccc="0053"
else
group_mcsv_cccc=${hw_mcsv_cccc}
fi
if [ "${group_mcsv_cccc}" != "${sw_mcsv_cccc}" ]; then
log "Error: Customer ID not match, MCSV check failed"
progress_fail "Error: Customer ID not match, MCSV check failed"
exit 1
fi
log "MCSV check succeeded"
progress_status "MCSV check succeeded"
cd - > /dev/null
}
測試的結果很棒
root@52XXZ:/ramdisk/tmp# ./FirmwareUpgrade.sh firmware.img
Image Header --> Data Size = 17092680
Image Name = XRX200 Fullimage
Image Header --> Data Size = 15257600
Image Name = LTQCPE RootFS
Image contains header with name [LTQCPE RootFS]
Volume ID 4, size 119 LEBs (15353856 bytes, 14.6 MiB), LEB size 129024 bytes (126.0 KiB), dynamic, name "rootfsB", alignment 1
Image Header --> Data Size = 1834944
Image Name = MIPS LTQCPE Linux-3.10.12
Image contains header with name [MIPS LTQCPE Linux-3.10.12]
Volume ID 3, size 15 LEBs (1935360 bytes, 1.8 MiB), LEB size 129024 bytes (126.0 KiB), dynamic, name "kernelB", alignment 1
parameter f_kernel_sizeB is not existed
Erasing 128 Kibyte @ 20000 -- 100 % complete
parameter active_bank value changed from rootfs_id=4 to B
Erasing 128 Kibyte @ 20000 -- 100 % complete
parameter update_chk value changed from =B to 1
Upgrade : successfully upgraded full
root@52XXZ:/ramdisk/tmp# cat FirmwareUpgrade.log
firmware upgrade shell script start...
Upgrading the firmware ...
Extract the tared firmware ...
tar -C /tmp -xf firmware.img
Extract the tared firmware succeeded
MD5 sums check ...
firmware.md5 exist, read MD5 sums from it and check them
MD5 sums check succeeded
MCSV check ...
software MCSV: 147B00000012C2B8
software MCSV-MMMM: 147B
software MCSV-CCCC: 0000
hardware MCSV: 146700001002279C
hardware MCSV-MMMM: 1467
hardware MCSV-CCCC: 0000
MCSV check succeeded
Upgrade fullimage ...
Upgrade fullimage succeeded
Upgrading the firmware succeeded
firmware upgrade shell script succeeded
finished
再來就是一個創舉了
跟 winston 聊完之後
因為隨著時間
customer 會再增加
假設目前的版本是 V1.3
那新增的 CID 或 model id 所需要更動的 firmware upgrade 邏輯要怎麼套呢
我們會先給一版 V1.4 套這新的邏輯
然後才是真正為了這新 CID release 的 V1.5
因為只有更新過 firmware upgrade 邏輯的 V1.4 才有能力 upgrade 成 這新客戶的 V1.5
那如我們把 firmware upgrade 的邏輯直接跟 firmware 打包再一起呢?
那 V1.4 這一包 firmware 就可以帶著新的 firmware upgrade 邏輯直接 upgrade
就不用一個中介版本了
所以我要把目前 FirmwareUpgrade.sh
裡的 upgrade 邏輯拉出來
透過 web ui 已經可以 upgrade 了
commit 4f8a60fc98dd864c7eafe332dda2d842a0384019
Refs: [develop], {origin/develop}, {origin/HEAD}
Author: jeffrey <[email protected]>
Date: Thu Sep 20 18:16:33 2018 +0800
now we can use 52XXZ-<data-code>.img for upgrade via web ui:
- we need 'md5sum' and 'diff' offered by BusyBox
- FirmwareUpgrade.sh is a entry point of firmware upgrade process
- main process for firmware upgrade are all in FirmwareUpgrader.sh
- FirmwareUpgrader.sh will be encrypted into 52XXZ-<data-code>.img
52xxz_defconfig | 4 +-
proscend/Makefile | 24 ++-
proscend/prosrc/icos/script/FirmwareUpgrade.sh | 128 +++-------------
proscend/prosrc/icos/script/FirmwareUpgrader.sh | 188 ++++++++++++++++++++++++
4 files changed, 236 insertions(+), 108 deletions(-)