20190109_jeffrey - silenceuncrio/diary GitHub Wiki

0905

繼續 M360 - web ui for upgrade uboot (uboot need version information: 1.0)

參考 firmware upgrade 的作法

  • uboot.img 要打包
  • 要有 shell script 可以執行 upgrade 的動作
  • 要有 CGI
  • 要有秘密的 web ui 入口

一關一關過

參考 firmware 打包的部分

參考 M360 source code - proscend/Makefile

firmware_img: sysupgrade_bin
	rm -f image/firmware.img
	rm -rf image/firmware
	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/sysupgrade.bin 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)

這要搭配 proscend/prosrc/icos/script/FirmwareUpgrade.sh

function firmware_upgrde {
    log "\nUpgrading the firmware ..."

    extract $1
    md5_sums_check
    mcsv_check
    write_to_mtd

    #replace current primary application
    fw_setenv no_good .xx

    log "\nUpgrading the firmware succeeded"
}

Makefile 一層一層包

FirmwareUpgrade.sh 一層一層撥開

FirmwareUpgrade.sh 每撥開一層都有相對應的檢查

最後才會呼叫 write_to_mtd

MakefileFirmwareUpgrade.sh 之間的關係可以整理成以下的表格

Makefile FirmwareUpgrade.sh
(11) write_to_mtd
(01) cp rootfs/etc/mcsv image/mcsv
(02) openssl des3 -salt -in image/mcsv -out image/mcsv.enc -k 2wsx#EDC (10) mcsv_check
(03) mkdir -p firmware
(04) cp image/mcsv.enc firmware (10) mcsv_check
(05) cp image/sysupgrade.bin firmware
(06) cd firmware; md5sum * > firmware.md5 (09) md5_sums_check
(07) tar -cf image/$(IMAGE_NAME) firmware (08) extract $1

(1), (2), ... (11) 表示執行的順序

1040

試著盤一下 uboot 的 Makefile 要怎麼改

1110

參考 M360P - Management > Identification > U-Boot Version

image

覺得 U-Boot Version 這個 U-Boot 字眼實在不太適合

參考 https://github.com/silenceuncrio/diary/wiki/20181218_jeffrey

當初是使用 mtd wirte /tmp/uboot.img Bootloader 來 write uboot.img 這個 image 到 Bootloader 這個 mtd device 去

為什麼 uboot 所在的 mtd device 叫做 Bootloader 可以參考 M360P 一開機時的訊息

[    2.636000] Creating 8 MTD partitions on "MT7621-NAND":
[    2.648000] 0x000000000000-0x000007f80000 : "ALL"
[    2.660000] 0x000000000000-0x000000080000 : "Bootloader"
[    2.672000] 0x000000080000-0x000000100000 : "Config"
[    2.680000] 0x000000100000-0x000000140000 : "Factory"
[    2.692000] 0x000000140000-0x000002140000 : "firmware"
[    2.704000] 0x0000002ecd97-0x000002140000 : "rootfs"
[    2.716000] mtd: partition "rootfs" must either start or end on erase block boundary or be smaller than an erase block -- forcing read-only
[    2.752000] mtd: partition "rootfs_data" created automatically, ofs=0xec0000, len=0x1280000
[    2.772000] 0x000000ec0000-0x000002140000 : "rootfs_data"
[    2.780000] 0x000002140000-0x000004140000 : "reserve"
[    2.792000] 0x000005000000-0x000006000000 : "Proscend-config"
[    2.804000] 0x000006000000-0x000007000000 : "Proscend-misc"
[    2.816000] [mtk_nand] probe successfully!

Bootloader 這個 MTD partition 佔據了 nandflash 從 0x0000000000000x000000080000 的範圍

[    2.660000] 0x000000000000-0x000000080000 : "Bootloader"

從 linux 的來看 u-boot 畢竟只是 bootloader 的一種

更不要說使用者看到 U-Boot Version 一定會和真正的 U-Boot 搞混

真正的 U-Boot version 是 1.1.3 才對

可以從開機訊息得知

U-Boot 1.1.3 (Sep 26 2018 - 01:50:54)

Board: Ralink APSoC DRAM:  256 MB
relocate_code Pointer at: 8ffac000

...

說改就改吧

先改 uboot

1300

uboot 作以下修改

diff --git a/common/env_common.c b/common/env_common.c
index 4479448..8171392 100644
--- a/common/env_common.c
+++ b/common/env_common.c
@@ -142,8 +142,8 @@ uchar default_environment[] = {
 #ifdef CONFIG_PRODUCTION
     "production=" CONFIG_PRODUCTION "\0"
 #endif
-#ifdef CONFIG_PROSCEND_UBOOT_VER
-        "uboot_ver=" CONFIG_PROSCEND_UBOOT_VER "\0"
+#ifdef CONFIG_BOOTLOADER_VER
+    "bootloader_ver=" CONFIG_BOOTLOADER_VER "\0"
 #endif
        "\0"
 };
diff --git a/include/configs/rt2880.h b/include/configs/rt2880.h
index 03b445f..63525b4 100644
--- a/include/configs/rt2880.h
+++ b/include/configs/rt2880.h
@@ -136,10 +136,10 @@ extern unsigned int  CFG_BLOCKSIZE;


 /*
-** Proscend U-Boot version
+** Proscend Bootloader version
 */

-#define CONFIG_PROSCEND_UBOOT_VER "1.0"
+#define CONFIG_BOOTLOADER_VER "1.0"



diff --git a/lib_mips/board.c b/lib_mips/board.c
index 3013c16..bf51aa4 100644
--- a/lib_mips/board.c
+++ b/lib_mips/board.c
@@ -2229,7 +2229,7 @@ __attribute__((nomips16)) void board_init_r (gd_t *id, ulong dest_addr)
         }

         // use the current value to over-wirte the previous saved one
-        setenv("uboot_ver", CONFIG_PROSCEND_UBOOT_VER);
+        setenv("bootloader_ver", CONFIG_BOOTLOADER_VER);

         saveenv();

(END)

linux 也順便改一改

diff --git a/proscend/base_fs/default/rootfs/etc/rc.local b/proscend/base_fs/default/rootfs/etc/rc.local
index 711a8fb..006a6bb 100755
--- a/proscend/base_fs/default/rootfs/etc/rc.local
+++ b/proscend/base_fs/default/rootfs/etc/rc.local
@@ -54,12 +54,12 @@ sysinfo_path="$sysinfo_dir"/"$sysinfo_file"



-# get uboot_ver from uboot env
-UBOOT_VER=$(fw_printenv uboot_ver 2>/dev/null | awk -F"=" '{ print $2 }')
-if [ "$UBOOT_VER" = "" ]
+# get bootloader_ver from uboot env
+BOOTLOADER_VER=$(fw_printenv bootloader_ver 2>/dev/null | awk -F"=" '{ print $2 }')
+if [ "$BOOTLOADER_VER" = "" ]
 then
-    echo "WARNING: uboot env uboot_ver loose"
-    UBOOT_VER="NA"
+    echo "WARNING: uboot env bootloader_ver loose"
+    BOOTLOADER_VER="NA"
 fi


@@ -122,7 +122,7 @@ DUAL_IMAGE_ACTIVE=$(fw_printenv dual_image_active 2>/dev/null | awk -F"=" '{ pri


 mkdir -p "$sysinfo_dir"
-echo "UBOOT_VER"=$UBOOT_VER                 >  "$sysinfo_path"
+echo "BOOTLOADER_VER"=$BOOTLOADER_VER        >  "$sysinfo_path"
 echo "MAC"=$MAC                             >> "$sysinfo_path"
 echo "HW_MCSV"=$HW_MCSV                     >> "$sysinfo_path"
 echo "SERIALNO"=$SERIALNO                   >> "$sysinfo_path"
diff --git a/proscend/prosrc/icos/icoslib/system/systemcfg.c b/proscend/prosrc/icos/icoslib/system/systemcfg.c
index 3bc265f..17ad42e 100644
--- a/proscend/prosrc/icos/icoslib/system/systemcfg.c
+++ b/proscend/prosrc/icos/icoslib/system/systemcfg.c
@@ -546,9 +546,9 @@ static int UpdateSystemInformation(void)
             {
                 strnzcpy(pInfo->dual_image_active, &szLine[18], sizeof(pInfo->dual_image_active) );
             }
-            else if (strncmp(szLine, "UBOOT_VER=", 10)==0)
+            else if (strncmp(szLine, "BOOTLOADER_VER=", 15)==0)
             {
-                strnzcpy(pInfo->szUbootVersion, &szLine[10], sizeof(pInfo->szUbootVersion) );
+                strnzcpy(pInfo->szBootloaderVersion, &szLine[15], sizeof(pInfo->szBootloaderVersion) );
             }
         }
         fclose(fp);
diff --git a/proscend/prosrc/icos/include/module_system.h b/proscend/prosrc/icos/include/module_system.h
index af05677..b2a388e 100644
--- a/proscend/prosrc/icos/include/module_system.h
+++ b/proscend/prosrc/icos/include/module_system.h
@@ -214,7 +214,7 @@ typedef struct
     U32              szCPU_Usage;                 // CPU Usage
     U32       szMemory_Usage;              // Memory Usage
     char      dual_image_active[4];         // Dual Image Active: a or b
-    char      szUbootVersion[16];           // u-boot version
+    char      szBootloaderVersion[16];      // Bootloader version
 } sSystemInformation;

 // *********************************************************************************
diff --git a/proscend/prosrc/webcgi/system.c b/proscend/prosrc/webcgi/system.c
index 93744ba..c6ff9ba 100644
--- a/proscend/prosrc/webcgi/system.c
+++ b/proscend/prosrc/webcgi/system.c
@@ -108,7 +108,7 @@ static json_object * _get_status()
     json_object_object_add(system_status, "szSwMobileRouterVersion", json_object_new_string(_status.szSwMobileRouterVersion));
     json_object_object_add(system_status, "szKernelVersion", json_object_new_string(_status.szKernelVersion));
     json_object_object_add(system_status, "dual_image_active", json_object_new_string(_status.dual_image_active));
-    json_object_object_add(system_status, "szUbootVersion", json_object_new_string(_status.szUbootVersion));
+    json_object_object_add(system_status, "szBootloaderVersion", json_object_new_string(_status.szBootloaderVersion));

     return system_status;
 }
diff --git a/proscend/prosrc/www/app/feature/identification.html b/proscend/prosrc/www/app/feature/identification.html
index e51f3e4..6b55490 100644
--- a/proscend/prosrc/www/app/feature/identification.html
+++ b/proscend/prosrc/www/app/feature/identification.html
@@ -21,7 +21,7 @@
   <tr><td>{{ 'IDENTIFICATION_HOST_NAME' | translate }}</td><td>{{vm.system_config.szHostName}}</td></tr>
   <tr><td>{{ 'IDENTIFICATION_LAN_MAC_ADDRESS' | translate }}</td><td>{{vm.system.szMacLan}}</td></tr>
   <tr><td>{{ 'IDENTIFICATION_WAN_MAC_ADDRESS' | translate }}</td><td>{{vm.system.szMacWan}}</td></tr>
-  <tr><td>{{ 'IDENTIFICATION_UBOOT_VERSION' | translate }}</td><td>{{vm.system.szUbootVersion}}</td></tr>
+  <tr><td>{{ 'IDENTIFICATION_BOOTLOADER_VERSION' | translate }}</td><td>{{vm.system.szBootloaderVersion}}</td></tr>^M
   <tr><td>{{ 'IDENTIFICATION_SOFTWARE_VERSION' | translate }}</td><td>{{vm.system.szKernelVersion}}</td></tr>
   <tr><td>{{ 'IDENTIFICATION_FIRMWARE_VERSION' | translate }}</td><td>{{vm.system.szSwMobileRouterVersion}}</td></tr>
   <tr><td>{{ 'IDENTIFICATION_HARDWARE_VERSION' | translate }}</td><td>{{vm.system.szHwVersion}}</td></tr>
diff --git a/proscend/prosrc/www/app/locale-en.json b/proscend/prosrc/www/app/locale-en.json
index 1a82006..971aa10 100644
--- a/proscend/prosrc/www/app/locale-en.json
+++ b/proscend/prosrc/www/app/locale-en.json
@@ -318,6 +318,7 @@
   "IDENTIFICATION_SERIAL_NUMBER":           "Serial Number",
   "IDENTIFICATION_DUAL_IMAGE_ACTIVE":       "Active Image Partition",
   "IDENTIFICATION_UBOOT_VERSION":           "U-Boot Version",
+  "IDENTIFICATION_BOOTLOADER_VERSION":      "Bootloader Version",^M



diff --git a/proscend/prosrc/www/app/locale-fr.json b/proscend/prosrc/www/app/locale-fr.json
index ff930a9..a3022d0 100644
--- a/proscend/prosrc/www/app/locale-fr.json
+++ b/proscend/prosrc/www/app/locale-fr.json
@@ -318,6 +318,7 @@
   "IDENTIFICATION_SERIAL_NUMBER":           "Serial Number",
   "IDENTIFICATION_DUAL_IMAGE_ACTIVE":       "Active Image Partition",
   "IDENTIFICATION_UBOOT_VERSION":           "U-Boot Version",
+  "IDENTIFICATION_BOOTLOADER_VERSION":      "Bootloader Version",^M



diff --git a/proscend/prosrc/www/app/locale-zh-tw.json b/proscend/prosrc/www/app/locale-zh-tw.json
index 827dd78..3f206da 100644
--- a/proscend/prosrc/www/app/locale-zh-tw.json
+++ b/proscend/prosrc/www/app/locale-zh-tw.json
@@ -318,6 +318,7 @@
   "IDENTIFICATION_SERIAL_NUMBER":           "Serial Number",
   "IDENTIFICATION_DUAL_IMAGE_ACTIVE":       "Active Image Partition",
   "IDENTIFICATION_UBOOT_VERSION":           "U-Boot Version",
+  "IDENTIFICATION_BOOTLOADER_VERSION":      "Bootloader Version",^M

M360P - Management > Identification > Bootloader Version

image

搞定

commit

uboot

commit 0ff035be597ea432d5900e102206fa2fbdfeb077
Refs: [master], {origin/master}, {origin/HEAD}
Author: jeffrey <[email protected]>
Date:   Wed Jan 9 13:52:17 2019 +0800

    rename 'uboot_ver' to 'bootloader_ver'

 common/env_common.c      | 4 ++--
 include/configs/rt2880.h | 4 ++--
 lib_mips/board.c         | 2 +-
 3 files changed, 5 insertions(+), 5 deletions(-)

linux

commit 7c093d4d7b65a4e81191cfbecef03745b649a135
Refs: [develop], {origin/develop}
Author: jeffrey <[email protected]>                                                                                                                                                                             Date:   Wed Jan 9 13:53:27 2019 +0800                                                                                                                                                                              
    rename 'U-Boot Version' field to 'Bootloader Version' at 'Management > Identification' page

 proscend/base_fs/default/rootfs/etc/rc.local        | 12 ++++++------
 proscend/prosrc/icos/icoslib/system/systemcfg.c     |  4 ++--
 proscend/prosrc/icos/include/module_system.h        |  2 +-
 proscend/prosrc/webcgi/system.c                     |  2 +-
 proscend/prosrc/www/app/feature/identification.html |  2 +-
 proscend/prosrc/www/app/locale-en.json              |  1 +
 proscend/prosrc/www/app/locale-fr.json              |  1 +
 proscend/prosrc/www/app/locale-zh-tw.json           |  1 +
 8 files changed, 14 insertions(+), 11 deletions(-)

1510

M360-P 的 uboot 的 Makefile 修改如下

diff --git a/Makefile b/Makefile
index 471ff98..256f0f7 100644
--- a/Makefile
+++ b/Makefile
@@ -227,6 +227,21 @@ ifeq ($(MT7621_MP), y)
 ALL += uboot_a.bin
 endif

+ALL += bootloader.img
+
+
+
+MODEL_ID=500
+BRAND_ID=66
+VERSION=100
+DATECODE=20190109
+MODEL_NAME=M360-P
+
+MCSV :=$(shell printf "%04X%04X%03X%05X"  $(MODEL_ID) 0x$(BRAND_ID) 0x$(VERSION) `expr $(DATECODE) - 20000000`)
+BOOTLOADER_IMAGE_NAME := $(MODEL_NAME)-$(shell date +"%m%d%Y").bootloader.img
+
+
+
 all:           clean $(ALL)

 u-boot.hex:    u-boot
@@ -346,6 +361,22 @@ endif
                @echo "================================================"
                @echo ""

+
+
+bootloader.img: uboot.img
+       @echo "======== bootloader.img ========"
+       @echo $(MCSV) > ./mcsv
+       mkdir -p bootloader
+       openssl des3 -salt -in ./mcsv -out bootloader/mcsv.enc -k 2wsx#EDC
+       cp ./uboot.img bootloader
+       cd bootloader; md5sum * > bootloader.md5
+       tar -cf $(BOOTLOADER_IMAGE_NAME) bootloader
+       rm -rf bootloader
+       @echo MCSV=$(MCSV)
+       @echo "======== bootloader.img ========"
+
+
+
 u-boot.dis:    u-boot
                $(OBJDUMP) -d $< > $@

@@ -1808,6 +1839,7 @@ clean:
        rm -f stage1/stage2.bin stage1/stage1n2.elf stage1/stage1n2.map
        rm -f ./uboot.bin ./uboot.img ./u-boot ./u-boot.* ./uboot_a.bin ./System.map
        rm -f scripts/lxdialog/lxdialog
+       rm -f ./mcsv ./bootloader.img $(BOOTLOADER_IMAGE_NAME)

 clobber:       clean
        find . -type f \( -name .depend \
@@ -1829,4 +1861,17 @@ menuconfig: clean config.in
        $(MAKE) -C scripts/lxdialog all
        $(CONFIG_SHELL) scripts/Menuconfig config.in

+
+
+showenv:
+       @echo 'MODEL_ID              = $(MODEL_ID)'
+       @echo 'BRAND_ID              = $(BRAND_ID)'
+       @echo 'VERSION               = $(VERSION)'
+       @echo 'DATECODE              = $(DATECODE)'
+       @echo 'MODEL_NAME            = $(MODEL_NAME)'
+       @echo 'MCSV                  = $(MCSV)'
+       @echo 'BOOTLOADER_IMAGE_NAME = $(BOOTLOADER_IMAGE_NAME)'
+
+
+
 #########################################################################
(END)

實際執行 make 就會產出 M360-P-01092019.bootloader.img

user@a07386063862:~$ make

...

======== bootloader.img ========
mkdir -p bootloader
openssl des3 -salt -in ./mcsv -out bootloader/mcsv.enc -k 2wsx#EDC
cp ./uboot.img bootloader
cd bootloader; md5sum * > bootloader.md5
tar -cf M360-P-01092019.bootloader.img bootloader
rm -rf bootloader
MCSV=01F400661002E69D
user@a07386063862:~$

有別於原本的 uboot.img

user@a07386063862:~$ ls -al *.img
-rw-r--r-- 1 user user 143360 Jan  9 07:10 M360-P-01092019.bootloader.img
-rw-r--r-- 1 user user 136268 Jan  9 07:10 uboot.img

我們包裝過的叫 M360-P-01092019.bootloader.img

考慮一下會不會不小心跟 M360-P 一般的 firmware 混用了呢

我想可以考慮在加密 mcsv 的時候用不一樣的 密碼

原本的

openssl des3 -salt -in ./mcsv -out bootloader/mcsv.enc -k 2wsx#EDC

改成

openssl des3 -salt -in ./mcsv -out bootloader/mcsv.enc -k CDE#xsw2

整個順序反過來就好了

這樣就不怕混用而導致不可知的災難了

# MCSV check
function mcsv_check {
  log "\nMCSV check ..."
  progress_status "MCSV check ..."
  cd /tmp/firmware

  if [ -e "mcsv.enc" ]
  then
    log "mcsv.enc exist, decrypt it and check with hardware MCSV"
    log "decrypt mcsv.en"
    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

...

}

而且只是利用現有的機制罷了

混用的話就會顯示 Error: decrypt mcsv.enc failed

這樣就能避免客戶做蠢事了

1555

再來便是模仿 FirmwareUpgrade.sh

檔名就叫 BootloaderUpgrade.sh 好了

⚠️ **GitHub.com Fallback** ⚠️