1. 概述 (1)Boot Package 格式 Boot Package 中包含用戶程序, 由以下兩部分組成: ① BPT(Boot Package Table) • 位於 Boot Package 最前端,包括 Boot Package 的簽名信息,各個鏡像在 Image 組合中的相對位置,鏡像 load 地址,entry 地址,hash 校驗信息,PSN 信息; • ROM 讀取上述信息對各個 core 鏡像進行驗證後啟動; • BPT 占用 4096 個 Byte(0x1000) ② 程序鏡像組合 • 包含多個 core 的用戶程序鏡像組合,即 SF core 程序鏡像、SP core 程序鏡像、SX core 程序鏡像、SF core Bootloader 程序鏡像,以及 SCB 系統控制塊 (System Configuration Block) 的組合; • 啟動設備中的存儲方式 在啟動設備中,最多允許存在 3 個 Boot Package:Normal Boot Package,Backup Boot Package,Third Try Boot Package,互為冗餘。上電後 ROM 選擇 PSN(Package Serial Number) 較大並且能夠校驗通過的 package 啟動。注意,並不是所有的啟動設備都支持 3 個 Boot Package,具體情況見下表:
(2)安全啟動 上電後固化在晶片中的 ROM 程序會根據 boot pin 的設置從 XSPI/eMMC/SD/UART/USB 等介質中獲取下級啟動鏡像。啟動鏡像的格式必須滿足前述 Boot Package 格式。 (3)BootROM 控制⽅式: (4)Flsah layout 上圖為 HyperFlash 和 NorFlash 的典型的 Flash storage layout,其中 HyperFlash 的 sector size(sector 指 Flash 最小擦除單位)為 256kByte(典型值),NorFlash 的 sector size 為 4kByte(典型值)。為使擦寫方便,對 flash 空間時做如下分配:
2. 環境準備 需準備如下軟硬體: • Lauterbach Trace32 調試器 for arm • E3 參考板(其上的 E3 芯⽚位於開發模式)。 • 芯馳 SDToolBox,各個⼯具的使⽤⼿冊集成在⼯具包中,雙擊⼯具包中的 Help 圖標可以查看相關應⽤的使⽤說明,fuse 相關操作在⼿冊第七章:SDFuseTool 使⽤說明。 • atb_signer:safety/securityimage 簽名⼯具。 簽名命令(注意 未簽名的 bin 文件命名和拷貝到相同路徑下,以及用戶私鑰的路徑,此簽名未涉及到 uuid & ctl ,詳細看下文介紹 ) sign_tool_e3\atb_signer_win\atb_signer.exe sign --v 2 --sec_ver 0x1234 --dgst sha256 --rcp key=sign_tool_e3\atb_signer\keys\TestRSA2048_ossl.pem --iib core=0 type=0x0 image=E3_ref_gateway_E3430.bin to=0x006A0000 entry=0x006A0000 --psn 0x04 --of E3_ref_gateway_E3430.signed key=sign_tool_e3\atb_signer\keys\TestRSA2048_ossl.pem • ⼀個⽤⼾私鑰(例如⼀個 rsa2048 的私鑰,可使⽤ Openssl ⽣成)。 • ⼀個 8 字節的數做為芯⽚的 DID (在簽名⼯具中叫 UUID,在芯⽚ fuse 中叫 DID) : 0x12345678abcdef88 (由客⼾⾃⾏燒寫) • ⼀個 8 字節的數做為芯⽚的 UID : 0x12345678abcdef88 (芯⽚出⼚應該已經燒寫完成,這裡這是舉個例子) • ⼀個 8 字節的數做為芯⽚的 debugkey : 0x746573746b657930 (ascii:’testkey0’) (由客⼾⾃⾏燒寫) 3. 安全啟動 完成以上的準備條件後,啟用這一步驟,實現 BootROM 對 image 進行驗簽,也就是 BootROM 安全啟動。 (1) 燒寫 eFuse ,使能 PROD (2) 對 image 進行打包(詳細看 https://www.wpgdadatong.com.cn/blog/detail/72667) 打包用戶的 image 可以通過以上博文的鏈接進行替換 gpio 的例程進行打包,也可以使用之前的打包的 PAC 作為 USB 下載的底包,在下載時替換 boot0~boot2 為用戶簽過名的 bin 文件即可。 例如下圖:將用戶簽過名的 bin 替換下載底包的 boot0~boot1 即可(這裡打包只設置了兩個 boot) 4. Secure Dubug原理: Debugger 發出請求--->芯⽚回復出 UID--->⽤⼾根據 UID 找到對應的 key 並將 key ⽤ Debugger 回復給芯 ⽚--->芯⽚匹配 key 成功後開啟 debug 接⼝。 (1)第一種情況,只使能 efuse PROD 經過上述步驟芯⽚已⽆法連接調試器,以 E3_ref_gateway_E3640、⾮ xip 為例,下⾯構建包含 DID 和Debug 控制碼的 image 來使 ROM 開啟 Debug 接⼝ 。 ① 直接打包用戶程序到 USB 下載底包 此時需要調試,在打包時需要加入 uuid & ctl (efuse 燒寫了 DID 需要在打包加入 uuid, 保持一致); ② 簽名用戶 bin 文件替換 USB 底包 boot0~boot2 修改簽名工具所用的命令(添加 uuid & ctl ctl=ffffffffffffffff uuid=7856341288efcdab): sign_tool_e3\atb_signer_win\atb_signer.exe sign --v 2 --sec_ver 0x1234 --dgst sha256 --rcp key=sign_tool_e3\atb_signer\keys\TestRSA2048_ossl.pem --iib core=0 type=0x0 image=E3_ref_gateway_E3430.bin to=0x006A0000 entry=0x006A0000 ctl=ffffffffffffffff uuid=7856341288efcdab --psn 0x04 --of E3_ref_gateway_E3430.signed ③ 根據以上步驟可以實現調試功能 (2)第二種情況,在第一種基礎的基礎上,efuse 使能 SDBG_MODE 使能 SDBG_MODE 後,勞德巴赫無法直接 attach 上去,需要更改 secure debug attach 腳本, 在此之前確認好,secure debug 秘鑰已經燒錄在 efuse 上,簽名也按照上面操作步驟實現了,接下來需要用以下腳本實現 attach:
Secure Debug 需要在 JTAG 模式下進行調試,先使用 e3_attach.cmm attach 之後,再使用上面的 secure debug 腳本進行安全調試。 注意: JTAG 引腳在 EB 裡面不要配置,配置後連接不上,無法調試。 5. 參考資料6. 後續博文系列 (1)【Semidriver E3】efuse 數據生成 (2)【Semidriver E3】efuse 數據燒寫 等等 |