【SemeDrive】【X9HP】【PTG4.0】【PTG4.3】Hands-on X9HP udisk_update U 盤升級 pac 包指南

前言:以下為  U 盤升級 pac 包的具體流程和代碼解析(不是 OTA U 盤升級)。如過不需要了解太多,只需要操作流程,可直接拉到文末“六、實操流程”

一、U 盤升級 pac 包功能概述

升級固件範圍:bpt 分區表及分區表中包含的分區。不包含:FDA/OSPIDA/DLOADER/SPL

其作用流程為

  1. 檢測 U 盤->
  2. 加載運行 U 盤中的帶有 U 盤燒錄功能的最小系統 sdrv_update.img->
  3. 執行 udisk_update.sh 檢測 U 盤根目錄下是否存在 update 目錄->
  4. 運行 udisk_update 命令開始升級->
  5. 升級完成(PTG4.3 會執行重啟命令,PTG4.0 需要手動上電重啟)

二、代碼目錄說明

路徑說明
buildsystem/yocto/meta-semidrive/recipes-bsp/udisk-update/升級的執行過程代碼
buildsystem/yocto/build-x9_sdrv_update/tmp/deploy/images/x9_sdrv_update/編譯生成物,下面存放著帶有 U 盤升級功能的文件系統
buildsystem/prebuilts/sdrv_update/根據 sdrv_update.sh 的規則編譯並打包 sdrv_update.img
buildsystem/image_xxx_xxxxx目標 sdrv_update.img 的存放路徑

 

三、如何編譯 sdrv_update.img

 PTG4.0 的 udisk_update 代碼還存在著一些問題,PTG4.3 的 udisk_update 比較完善,以下分開描述。

1. PTG4.3

(1) 工程已經編譯過,binary 目錄下存在 kernel 和 dtb 文件

(2) 修改 yocto/meta-semidrive/conf/machine/x9_sdrv_update.conf

  IMAGE_FSTYPES_append = " cpio"  改為 IMAGE_FSTYPES_append = " cpio cpio.gz"

(3) 編譯 rootfs(即 core-image-base.cpio.gz), 執行以下命令:

   cd yocto
DISTRO=sdrv_update MACHINE=x9_sdrv_update source sd_setup.sh -b build-x9_sdrv_update
bitbake core-image-base
cp buildsystem/yocto/build-x9_sdrv_update/tmp/deploy/images/x9_sdrv_update/core-image-base-x9_sdrv_update-*.cpio.gz buildsystem/prebuilts/sdrv_update/core-image-base.cpio.gz
cd buildsystem/
make gen_sdrv_update

(4) 拷貝 image_xxx_xxxxx/sdrv_update.img 到 U 盤 update 目錄下。

2. PTG4.0

(1) 工程已經編譯過,binary 目錄下存在 kernel 和 dtb 文件

(2) 按如下 diff 修改 yocto/meta-semidrive/conf/distro/sdrv_update.conf

diff --git a/conf/distro/sdrv_update.conf b/conf/distro/sdrv_update.conf
index 50b6696..0ccf40b 100644
--- a/conf/distro/sdrv_update.conf
+++ b/conf/distro/sdrv_update.conf
@@ -11,6 +11,7 @@ DISTRO_FEATURES_append = " opengl"

IMAGE_INSTALL_append = " libdrm pvr-lib \
sdrvinit lib-slots-update \
+ e2fsprogs \
udisk-update"
#IMAGE_FEATURES += "ssh-server-openssh"

@@ -46,3 +47,4 @@ EXTRA_USERS_PARAMS = "useradd -P 000000 user1;"
## RDEPENDS_kernel-base = ""
# Avoid warnings with above variable change
RDEPENDS_${KERNEL_PACKAGE_NAME}-base = ""
+GPU_VZ_CTRL = "nonvz"

(3) 按如下 diff 修改 yocto/meta-semidrive/conf/machine/x9_sdrv_update.conf

diff --git a/conf/machine/x9_sdrv_update.conf b/conf/machine/x9_sdrv_update.conf
index 152c6a8..1450efe 100644
--- a/conf/machine/x9_sdrv_update.conf
+++ b/conf/machine/x9_sdrv_update.conf
@@ -22,7 +22,7 @@ MACHINE_FEATURES = ""

require conf/machine/include/verified-boot.inc
KERNEL_IMAGETYPE = "Image"
-IMAGE_FSTYPES_append = " cpio"
+IMAGE_FSTYPES_append = " cpio cpio.gz"
IMAGE_FSTYPES_remove = "tar.gz"
# use 256 MB according to bpt
IMAGE_ROOTFS_SIZE = "262144"
@@ -43,30 +43,30 @@ MACHINE_GPU_REV_${MACHAINE_NAME} = "gm9446"
# Configuration for ARM Trusted Firmware
#EXTRA_IMAGEDEPENDS += " arm-trusted-firmware"
# Configuration for bootloaders
-#EXTRA_IMAGEDEPENDS += "lk"
-#MACHINE_SPL_${MACHAINE_NAME} = "spl_${LK_PROJ_NAME}"
-#MACHINE_SPLARG_${MACHAINE_NAME} = ""
-#MACHINE_SSYSTEM_${MACHAINE_NAME} = "ssystem_${LK_PROJ_NAME}"
-#MACHINE_SSYSTEMARG_${MACHAINE_NAME} = "ENABLE_BT=false"
-#MACHINE_DLOADER_${MACHAINE_NAME} = "dloader_${LK_PROJ_NAME}"
-#MACHINE_PRELOADER_${MACHAINE_NAME} = "preloader_${LK_PROJ_NAME}"
-#MACHINE_BOOTLOADER_${MACHAINE_NAME} = "ivi_bootloader_${LK_PROJ_NAME}"
-#MACHINE_BOOTLOADERARG_${MACHAINE_NAME} = "DDR_SIZE=8GB"
-#MACHINE_MP_${MACHAINE_NAME} = ""
-#MACHINE_BOOT_EXTRA_OPTION_${MACHAINE_NAME} = "BOOTDEVICE=EMMC"
+# EXTRA_IMAGEDEPENDS += "lk"
+MACHINE_SPL_${MACHAINE_NAME} = "spl_${LK_PROJ_NAME}"
+MACHINE_SPLARG_${MACHAINE_NAME} = ""
+MACHINE_SSYSTEM_${MACHAINE_NAME} = "ssystem_${LK_PROJ_NAME}"
+MACHINE_SSYSTEMARG_${MACHAINE_NAME} = "ENABLE_BT=false"
+MACHINE_DLOADER_${MACHAINE_NAME} = "dloader_${LK_PROJ_NAME}"
+MACHINE_PRELOADER_${MACHAINE_NAME} = "preloader_${LK_PROJ_NAME}"
+MACHINE_BOOTLOADER_${MACHAINE_NAME} = "ivi_bootloader_${LK_PROJ_NAME}"
+MACHINE_BOOTLOADERARG_${MACHAINE_NAME} = "DDR_SIZE=8GB"
+MACHINE_MP_${MACHAINE_NAME} = ""
+MACHINE_BOOT_EXTRA_OPTION_${MACHAINE_NAME} = "BOOTDEVICE=EMMC"

# safety
-#EXTRA_IMAGEDEPENDS += "safety"
-#MACHINE_SAFETY_${MACHAINE_NAME} = "safety-${SAFETY_PROJ_NAME}"
-#MACHINE_SAFETYARG_${MACHAINE_NAME} = "ENABLE_BOOT_ANIMATION=true ENABLE_FASTAVM=false"
-#MACHINE_OSPIHANDOVER_${MACHAINE_NAME} = "ospi_handover-${SAFETY_PROJ_NAME}"
+# EXTRA_IMAGEDEPENDS += "safety"
+MACHINE_SAFETY_${MACHAINE_NAME} = "safety-${SAFETY_PROJ_NAME}"
+MACHINE_SAFETYARG_${MACHAINE_NAME} = "ENABLE_BOOT_ANIMATION=true ENABLE_FASTAVM=false"
+MACHINE_OSPIHANDOVER_${MACHAINE_NAME} = "ospi_handover-${SAFETY_PROJ_NAME}"
#
# u-boot

# atf
-#EXTRA_IMAGEDEPENDS += "atf"
-#MACHINE_ATF_${MACHAINE_NAME} = ""
-#MACHINE_ATFARG_${MACHAINE_NAME} = "ATF_BOARD=X9_REF CHIPVERSION=x9_high PROJECT=controlpanel"
+# EXTRA_IMAGEDEPENDS += "atf"
+MACHINE_ATF_${MACHAINE_NAME} = ""
+MACHINE_ATFARG_${MACHAINE_NAME} = "ATF_PLAT=x9 CHIPVERSION=x9_high PROJECT=serdes"

# graphics and drm
PREFERRED_PROVIDER_virtual/libgles1 = "pvr-lib"
@@ -86,4 +86,4 @@ HOSTTOOLS += "sync seq"
#BAREMETAL_TGT = "sec"
#PRELOAD_RES_SIZE = "0x1800000"
#MACHINE_DLOADERARG_${MACHAINE_NAME} += "BOOT_TYPE=emmc"
-#MACHINE_BAREMETALARG_${MACHAINE_NAME} = "BOARD=x9_ref"
+MACHINE_BAREMETALARG_${MACHAINE_NAME} = "BOARD=x9_ref"

(4) 按如下 diff 修改 yocto/meta-semidrive/recipes-bsp/udisk-update/udisk-update/include/update.h

diff --git a/recipes-bsp/udisk-update/udisk-update/include/update.h b/recipes-bsp/udisk-update/udisk-update/include/update.h
index 44be7a9..ae628f4 100644
--- a/recipes-bsp/udisk-update/udisk-update/include/update.h
+++ b/recipes-bsp/udisk-update/udisk-update/include/update.h
@@ -64,7 +64,7 @@ enum
UPDATE_EMMC_B_TYPE = 1,
};

-int read_img_file_from(const char*name,int from,int len, uint8_t*data);
+int read_img_file_from(const char*name,unsigned long from,int len, uint8_t*data);^M
int do_update(int type);
int dump_update_progress(int type,int add_size);

(5) 按如下 diff 修改 yocto/meta-semidrive/recipes-bsp/udisk-update/udisk-update/pac_update.c

diff --git a/recipes-bsp/udisk-update/udisk-update/pac_update.c b/recipes-bsp/udisk-update/udisk-update/pac_update.c
index 28ab8f6..226a9cf 100644
--- a/recipes-bsp/udisk-update/udisk-update/pac_update.c
+++ b/recipes-bsp/udisk-update/udisk-update/pac_update.c
@@ -303,7 +303,7 @@ int make_boot_slot(int type){
return 0;
}

-int read_img_file_from(const char*name,int from,int len, uint8_t*data){
+int read_img_file_from(const char*name,unsigned long from,int len, uint8_t*data){
int ret;
FILE *fp;
char path[256];
@@ -607,7 +607,7 @@ int separate_a_b_partition(int type){

if(get_stuff_state((char*)name,"_a")){
pac_dev->slot_a[j] = i;
PRINTF_INFO("separate_a_b_partition slot_a[%d]= %d name = %s\n", j,i,name);
- if(is_sparse_img(type,pac_dev->pack_file_t[pac_dev->partition_start+j].llOffset)){
+ if(is_sparse_img(type,pac_dev->pack_file_t[pac_dev->partition_start+j].llOffset) && ( pac_dev->pack_file_t[pac_dev->partition_start+k].llSize != 0 )){
pac_dev->total_size += get_sparse_img_size(type,pac_dev->pack_file_t[pac_dev->partition_start+j].llOffset);
}else{
pac_dev->total_size += pac_dev->pack_file_t[pac_dev->partition_start+j].llSize;
@@ -622,7 +622,7 @@ int separate_a_b_partition(int type){
pac_dev->slot_a[j] = i;
pac_dev->slot_b[k] = i;
PRINTF_INFO("separate_a_b_partition slot_a[%d]= %d name = %s\n", j,i,name);
- if(is_sparse_img(type,pac_dev->pack_file_t[pac_dev->partition_start+j].llOffset)){
+ if(is_sparse_img(type,pac_dev->pack_file_t[pac_dev->partition_start+j].llOffset) && ( pac_dev->pack_file_t[pac_dev->partition_start+k].llSize != 0 )){
pac_dev->total_size += get_sparse_img_size(type,pac_dev->pack_file_t[pac_dev->partition_start+j].llOffset);
}else{
pac_dev->total_size += pac_dev->pack_file_t[pac_dev->partition_start+j].llSize;
@@ -806,8 +806,11 @@ int update_pac_partition(int type,int slot_partition){
uint8_t sdata[4];
read_img_file_from(type == EMMC_TYPE ? GLOBAL_PAC_NAME : OSPI_PAC_NAME,in,4,sdata);
if(sdata[0] == 0x3A && sdata[1] == 0xFF && sdata[2] == 0x26 && sdata[3] == 0xED){//sparse img
+ if(size != 0)
+ {
PRINTF_INFO("update_pac_partition %s is sparse img need transto raw\n", pac_dev->img_info[pac_dev->partition_start+j].img_name);
flash_sparse_img(type,in,out,rsize,pac_dev->img_info[pac_dev->partition_start+j].img_name,storage);
+ }
}else{
cnt = (size / MAX_CALLOC_SIZE);
left = (size % MAX_CALLOC_SIZE);

(6) 編譯 rootfs(即 core-image-base.cpio.gz), 執行以下命令:

   cd yocto
DISTRO=sdrv_update MACHINE=x9_sdrv_update source sd_setup.sh -b build-x9_sdrv_update
bitbake core-image-base
cp buildsystem/yocto/build-x9_sdrv_update/tmp/deploy/images/x9_sdrv_update/core-image-base-x9_sdrv_update-*.cpio.gz buildsystem/prebuilts/sdrv_update/core-image-base.cpio.gz
cd buildsystem/
make gen_sdrv_update

(7) 拷貝 image_xxx_xxxxx/sdrv_update.img 到 U 盤 /update 目錄下。

 

四、升級流程解析

 

1.升級過程:

bootloader 檢測 U 盤->檢測 /update/sdrv_update.img->掛載 sdrv_update.im 中的 recovery 系統->recovery 系統檢測 U 盤->檢測 /update/global.pac->運行 udisk_update 命令升級

2.udisk_update 命令代碼流程:

(圖片來源《SemiDrive_9_Series_Boot與升級指南_Rev01.05.pdf》)

 
3.如何啟動 U 盤升級功能:
 
① Bootloader 在正常啟動時默認不檢測 U 盤或 SD 卡。當用戶需要從 U 盤/SD 卡啟動時,需要將當前的啟動原因設置為 Software Update,之後 Bootloader 會根據配置依次檢測 U 盤與 SD 卡。
 
② 如果在燒錄文件夾下有格式正確的 sdrv_update.img 文件,則進入 recovery 系統。(註:目前 sdrv_update.img 文件的合法性檢測和完整性檢測暫時未納入,後續補充)。
 
③ 用戶應根據自身的板卡情況,使用組合按鍵或者其他方式觸發,將啟動原因設置為 Software Update。
 
④ 在 Android 平台可通過 reboot bootloader 將啟動原因設置為 Software Update
 
⑤ 若用戶想繞開啟動原因判斷,每次啟動都進行 USB 檢測,則可以通過修改 Bootloader 對應的編譯選項來完成此功能。方法:
 
     先在 lk_boot/project/common/bootloader.mk 中把 USB_CHECK_LEVEL 改為 1; 然後在 json 文件定義的 bootloader 對應的工程文件(例如 lk_boot/project/ivi_bootloader_x9_ref.mk)中,開啟宏 SUPPORT_USB_BOOT := true
 

五、如何升級 SLOT_B

 

默認代碼是只升級 slot_a 的,如果想升級 slot_b, 在 ptg4.0/buildsystem/yocto/meta-semidrive/recipes-bsp/udisk-update/udisk-update/pac_update.c 中修改以下兩個函數:

@@ -985,7 +990,7 @@ int do_change_update(int type){
separate_a_b_partition(type);
flash_partition_head(type);
flash_partition_entrys(type);
- update_pac_partition(type,SLOT_A);
+ update_pac_partition(type,SLOT_B);
dump_partition_info(type);
return 0;
}

@@ -607,25 +608,26 @@ int separate_a_b_partition(int type){
if(get_stuff_state((char*)name,"_a")){
pac_dev->slot_a[j] = i;
PRINTF_INFO("separate_a_b_partition slot_a[%d]= %d name = %s\n", j,i,name);
- if(is_sparse_img(type,pac_dev->pack_file_t[pac_dev->partition_start+j].llOffset)){
- pac_dev->total_size += get_sparse_img_size(type,pac_dev->pack_file_t[pac_dev->partition_start+j].llOffset);
- }else{
- pac_dev->total_size += pac_dev->pack_file_t[pac_dev->partition_start+j].llSize;
- }
+
j++;
}
else if(get_stuff_state((char*)name,"_b")){
pac_dev->slot_b[k] = i;
PRINTF_INFO("separate_a_b_partition slot_b[%d]= %d name =

★博文內容均由個人提供,與平台無關,如有違法或侵權,請與網站管理員聯繫。

★文明上網,請理性發言。內容一周內被舉報5次,發文人進小黑屋喔~

評論