20180920_jeffrey - silenceuncrio/diary GitHub Wiki

0915

先 build 一版有 diff 功能的 image

開機後

root@52XXZ:~# diff
-sh: diff: not found

回頭看看發生甚麼事

1005

試一下 proscend 外層 make distclean 後再 make

有得等囉

1045

等待的同時也把之前 M360P Dual Image 再 review 一次

雖說是自己做的

但現在看來真的覺得相當的不錯

當時的自己靠並不是 聰明 而是 耐心

一步一腳印的突破才能把 dual image 所需要的機制串起來

1105

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

終於又可以前進了

1130

昨天將用來做 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/Makefilefirmware_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 做任何處理

那裡頭的內容究竟從何而來

1310

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 再確認看看

1315

搞定

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: 1467software 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

1440

修改 FirmwareUpgrade.shmcsv_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

1755

參考 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 邏輯拉出來

1810

透過 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(-)
⚠️ **GitHub.com Fallback** ⚠️