20190109_jeffrey - silenceuncrio/diary GitHub Wiki
繼續 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
Makefile
與 FirmwareUpgrade.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) 表示執行的順序
試著盤一下 uboot 的 Makefile 要怎麼改
參考 M360P - Management > Identification > U-Boot Version
覺得 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 從 0x000000000000 到 0x000000080000 的範圍
[ 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
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
搞定
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(-)
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
這樣就能避免客戶做蠢事了
再來便是模仿 FirmwareUpgrade.sh
檔名就叫 BootloaderUpgrade.sh
好了