本文介紹 E3 PAC 打包,編譯器生成 bin 文件需要通過打包生成 PAC 包,再通過 SDToolBox 工具將 PAC 包燒寫到晶片,PAC 包的物理載體分為 Flash、eMMC、SD,一個 PAC包最多支持 3 個BootPackage;本文主要描述打包方式、打包注意事項、PAC 包下載的物理地址,打包方式分為手動打包(命令行打包)和自動打包(Python 腳本自動打包)。
硬體平台:E3640官方開發板(SD103_E3_GATEWAY_ePOWERTRAIN_A03_019);
軟體環境:SDToolBox、IAR Embedded Workbench for ARM 8.50.6。
二、 打包說明
晶片復位後,當啟動核從復位狀態退出時,集成於晶片內部的 ROM 程序在啟動核中開始運行,以完成晶片的啟動過程,因此為了能夠啟動 E3 晶片,需要完成以下步驟:
- 將編譯得到的各個 core 的可執行程序(bin文件)合併並簽名,得到 Boot Package 文件,如下圖打包過程 1;
- 如啟動設備為 Flash,則需要加載 SFS 文件,同時如果需要在 Flash 中加密啟動,則需要再加載 RFD 文件,如果不需要加密啟動,則 RFD 文件可以不存在;如果啟動設備為 eMMC、SD 卡,則不需要 SFS 文件、 RFD 文件;如下圖打包過程 2;
- 將上述文件打包在一個 PAC 文件中,使用 SDToolBox 下載工具完成燒寫。
1.1 Boot Package
1.1.1 Boot Package 組成
由編譯器生成的 bin 文件,需要簽名生成 Boot Package 才能生成 PAC 包,燒寫進晶片,其中 Boot Package 組成部分如下:
BPT(Boot Package Table):位於 Boot Package 最前端,共占用 4096(0x1000)個字節。BPT 包括以下信息:
- Boot Package 的簽名信息
- 各個鏡像在 Image 組合中的相對位置(DLP)
- 鏡像加載地址(Load Address)
- 鏡像運行時的入口地址(Entry)
- HASH 校驗信息
- PSN 信息
程序鏡像組合(Images):多個 core 的用戶程序鏡像組合,包含:
- CPU cluster0 鏡像
- CPU cluster1 程序鏡像(可配置為 Split 或者 Lockstep)
- CPU cluster2 程序鏡像(可配置為 Split 或者 Lockstep)
- Bootloader 鏡像
- SCB 系統控制塊(System Configuration Block)
註:圖中 Image download 地址為相對於 BPT 相對偏移地址
1.1.2 Boot Package 類型與存儲方式
一個 PAC 包中支持三種 Boot Package ,分別為:Normal Boot Package、Backup Boot Package、Third Boot Package,三個 Boot Package 互為冗餘。
晶片從不同介質啟動,設備能支持的 Boot Package 類型和存儲地址見下表:
Boot Package 類型與存儲地址分配表
啟動設備 |
Normal Boot Package存儲地址 |
Backup Boot Package存儲地址 |
Third Try Boot Package存儲地址 |
備註 |
HyperFalsh |
0xC0000 |
0x4C0000 |
0x8C0000 |
表中標註為默認地址,具體存儲地址參見SFS文件,地址劃分需要與Flash晶片扇區對齊 |
NorFlash |
0x7000 |
0x407000 |
0x807000 | |
eMMC |
BOOT1分區 offset=0 |
BOOT2分區 offset=0 |
User Areas分區 offset=20KB |
|
SD 卡 |
offset=20KB |
|
|
|
1.2 download 文件
1.2.1 Dloader
如果使用 USB 下載,需形成可用的 Dloader;目前在 ssdk\devices\$(PART)\-
dloader 路徑下提供預編譯好的 binary 文件,此 Dloader 需要進行簽名形成 Boot Package 才能用於下載。以 e3_gateway 板卡的 HyperFlash 版本的 Dloader 為例,將 e3_gateway_hyperFlash.bin 拷貝到 ssdk\tools\sdtools\temp\src\-e3_gateway_hyperFlash.bin ,使用命令進行簽名。
註:Dloader命令行打包時加載地址與入口地址必須是 0x404000,與 Dloader 軟體保持一致,設置其他參數有誤。
1.2.2 Flashloader
如果使用 JTAG 下載,需形成可用的Flashloader。目前 ssdk\devices\$(PART)\Flashloader 路徑下提供預編譯好的 binary 文件,此 Flashloader 供工具使用,無需進行簽名。以 e3_gateway 板卡的 HyperFlash 版本的 Flashloader 為例,直接將 Flashloader_hyperFlash.out 拷貝到 ssdk\tools\sdtools\temp\ 路徑下重命名為downloader_e3_gateway_signed.bin 即可。
1.3 SFS 文件
SFS 是 Flash 的配置文件,在撥碼到 Flash 啟動模式前,需要先在 Flash 的起始位置預先燒寫 SFS 供 ROM 解析,否則從 Flash 啟動會失敗。可以使用 CMD 命令根據配置文件來生成 SFS 文件,示例配置文件路徑為: ssdk\tools\sdtools\sfs\xxx.json 可以使用如下命令將配置文件轉換為 sfs.img 用於下載。
1.3.1 命令行方式
其中 0x7000,0x407000, 0x807000 是指定 3 個 Boot Package 的地址,is25-1-1-4.json 是 SFS 配置文件示例,sfs_is25-1-1-4.img 為輸出文件。
1.3.2 JSON 文件方式
根據 pac_config.json 中 sfs 欄位查找SFS的配置文件進行打包,例如: ssdk\devices\E3640\pacconfig\pac_config_5_core.json 中 sfs 的配置信息為:
該打包配置文件中使用了 sfs 的配置文件為 s26h-hyperFlash.json ,Boot Package 配置地址為 0xC0000,0x4C0000,0x8C0000。在執行打包的過程中, sfs.img 將會被生成並打包到 PAC 包中。
1.4 RFD 文件
關於 RFD 相關部分參加芯馳官方文檔《AppNote_E3_Boot_and_OTA》第 11 章節。
1.5 命令行打包
1.5.1 打包過程一:bin 文件簽名 Boot Package
- 先把編譯產物拷貝到指定路徑下,以 ssdk\tools\sdtools\temp_boot_core 路徑為例(如果沒有temp_boot_core文件夾可新建一個);
- 在 SSDK 根目錄打開 cmd 命令行,再進入 ssdk\tools\sdtools 路徑;或者可以在 sdtool 根目錄下打開命令行;
- 使用如下指令將各個 core 的編譯產物(binary文件)打包成 Boot Package 文件:
上述命令行的參數信息如下表;
參數 |
數據 |
--v |
固定寫 2,表示當前 atb_signer 版本為 v2 |
--sec_ver |
表示安全啟動的版本,ROM 會與 FUSE_PKG_VER[0:127] 中燒寫的版本信息進行比較,如果低於fuse中燒寫的版本號,則無法用於啟動,該 功能用於防回滾到某個較低版本。 |
--dgst |
指定校驗算法的類型(sha256/sha512) |
--rcp |
表示使用的簽名的私鑰路徑。例:key=sign_tool\keys\TestRSA2048_ossl.pem |
--iib |
每一個 image 都通過一個 --iib 表示,iib之後的參數為: * " flag ": 值為 0x80 時 ROM 不 kick sp0/sp1/sx0/sx1;值為 0xc0 時 ROM 不 load sp0/sp1/sx0/sx1; * " core ":對應鏡像屬於哪個核,0 表示為 SF core,2 表示為 SP core0,3 表示為 SP core1,4 表示為 SX core0,5 表示為 SX core1,6 表示為 SX in lockstep mode,7 表示 SP in lockstep mode; * " type ":鏡像的類型,0 表示普通鏡像,0xf 表示 SF core 的 Bootloader 程序; * " image ":鏡像文件的路徑; * "dlp" :表示鏡像在 Boot Package 中存儲的相對位置,以 512 字節為單位,比如 0x8,表示存儲的位置相對於 Boot Package 起始位置的偏移為 8*512=4096 字節; * " to ":鏡像的加載地址,此處指定的均為 IRAM 地址; * " entry ":程序的入口地址,通常和"to"參數是一樣的,ROM 會在鏡像加載到"to"參數指定的地址後,跳轉到"entry"指定的地址開始執行; * " noHASH ":表示該 iib 對應的程序不做 HASH 校驗 |
--psn |
指定 PSN 版本號 |
--of |
指定輸出文件的路徑和格式 |
按照上述命令我們可以依次打包得到: Backup Boot Package、Third Try Boot Package。
1.5.2 打包過程二:生成 PAC 包
該過程會把 Boot Package文件、Downloader 程序、SFS 等文件打包成 PAC 文件,用於 USB 或 JTAG/SWD 下載。
- Flash 打包形成 PAC 文件的命令為:
- eMMC/SD 卡形成 PAC 包文件的命令為(無需SFS與RFD):
- 將現有的 bin 文件加到 PAC 包中,命令行如下:
具體打包命令的參數解析如下表所示:
參數 |
解析 |
make_pac_image_no_gpt |
使用無分區表的打包方式 |
--output |
輸出的pac包路徑 |
--allow_empty_partitions |
運行分區表為空(不使用分區表無效果) |
--da |
Downloader(Dloader/Flashloader)所在的路徑Dloader在USB下載過程中被ROM下載到IRAM中運行,Dloader完成與PC機的通訊,下載Normal/Backup/Third Try BootPackage 與SFS等。 Flashloader在JTAG/SWD下載過程中被工具加載到IRAM中,工具調用其中的函數下載Normal/Backup/Third Try Boot Package與SFS等 |
--preload |
為所需下載的BootPackage以及SFS、RFD對應的固件路徑。SFS用於Flash啟動,RFD文件用於加密啟動。 |
--image 0x140000 |
將現有的bin文件打包到PAC包,0x140000為用戶自行設置的bin文件下載到的地址(切記不能與SFS文件分配地址重疊)。 |
1.5.3 命令行打包舉例
1.5.3.1 ssdk\boards\e3_gateway\app_demo\boot_core 打包
由於 SSDK 採用 AMP 軟體架構提供的 Demo 工程,故使用命令行打包時,可以將多個核的 bin 文件根據運行內核的不同簽名到一個 BootPackage 中。
bin 文件簽名形成 Boot Package
給 Dloader bin 文件進行簽名
生成 PAC 包
運行結果
Memory 內存數據
RAM 空間的數據由 ROM 搬運至不同的加載地址至,數據如下圖:
SDToolBox 下載 PAC 包時,按照 BootPackage 打包時不同的 DLC 參數,將不同核的鏡像下載到不同的Flash 地址,具體計算方式見 1.1.1 章節,Flash 內部存儲數據如下圖。
根據該命令行打包參數,內存映射圖如下
1.5.3.2 ssdk\boards\e3_gateway\app_demo\multicore-xip 打包
multicore-xip Demo 採用 XIP 模式,分為 Bootloader 與 APP 應用,上電 ROM 需要驗簽 Bootloader,故將 Bootloader bin 文件進行簽名,將 APP 應用追加至 PAC 包內。
bin 文件簽名形成 Boot Package
生成 PAC 包
運行結果:
1.5.3.3 ssdk\boards\e3_gateway\driver_demo\gpio 分別打包成 3 個 Boot Package
bin 文件簽名形成 Boot Package
SFS 文件生成
Dloader 文件簽名
打包成 PAC 包
memory 內存數據如下圖:
Normal BootPackage Flash 存儲地址
Backup Bootloader Flash 存儲地址
Third Boot Package Flash 存儲地址
1.6 Python 文件自動打包
Python 腳本打包,SemiDrive 提供的 SSDK 中包含自動打包腳本 tools/genpac.py , genpac.py 可以解析項目的打包配置文件 pac_config.json 進行打包,可以一鍵完成:
- 將編譯產物 binary 合成 BootPackage;
- 選擇 SFS 的配置文件,將配置文件轉換為 img 用於打包,同時能夠指定 Boot Package 的地址;
- 選擇打包 Dloader 或 Flashloader,對 Dloader 進行簽名,Flashloader 不簽名;
- 可以進行加密配置;
- 形成 SDFactoryTool 軟體燒錄所需的 PAC 文件;Python腳本自動打包有兩種方式,區別如下表所示。
方式 |
特點 |
傳入多個參數指定 SSDK demo 進行打包 |
根據參數自動匹配 demo 的 binary、Downloader 的默認路徑。僅適用於非 XIP 類的 demo。 |
傳入打包配置文件的路徑名作為參數進行打包 |
Demo 的 binary 的路徑在打包配置文件中指定。Downloader的路徑在打包配置文件中指定。可適用於所有demo。 注意:XIP類demo必須使用此種方式進行打包 |
1.6.1 指定 SSDK Demo 打包
在 SSDK 根目錄執行 CMD 指令,輸入以下指令:
1.6.2 指定打包配置文件打包
SSDK可以直接指定某個 pac_config.json進行打包,前提是該pac_config.json配置文件直接指定了打包所需文件的路徑。這種 pac_config.json 文件的示例存放在 ssdk\tools\genpac\pac_config.json 路徑下,該文件中指定了打包所需的文件的路徑:
用戶可以修改為自己的編譯產物以及所使用的 Downloader的絕對路徑;在 SSDK 目錄下執行 CMD ,並輸入如下所示的指令,打包配置文件解析參見《AppNote_E3_Boot_and_OTA_Rev01.06》9.1.2 章節。
三、 參考文檔
《AppNote_E3_Boot_and_OTA_Rev01.06》
《AppNote_E3_燒錄流程_Rev2.0》
歡迎在博文下方留言評論,我們會及時回復您的問題。如有更多需求,歡迎聯繫大聯大世平集團 ATU 部門:atu.sh@wpi-group.com
作者:Linna Wang / 王麗娜
評論