https://wiki.st.com/stm32mpu/wiki/Boot_chain_overview
根據提供的知識庫內容,以下是STM32 MPU啟動鏈的詳細解析:
1. 通用啟動流程
STM32 MPU啟動分為多階段,逐步初始化外設和內存,并建立信任鏈:
1.1 ROM代碼(BootROM)
作用:首個執行的代碼,選擇啟動設備(串口/閃存),加載FSBL到內部RAM。
安全:驗證FSBL的完整性,建立信任鏈的起點。
存儲:固化在芯片ROM中,體積小(幾十KB)。
1.2 第一級引導程序(FSBL)
功能:初始化時鐘樹、DDR控制器,加載SSBL到外部RAM。
實現:STM32MP13/15使用TF-A BL2(Trusted Firmware-A)作為FSBL。
安全:可選認證,支持解密和驗證后續組件。
1.3 第二級引導程序(SSBL)
功能:復雜外設驅動(USB/以太網/顯示),加載內核到內存。
常用工具:U-Boot(支持靈活啟動方式,如網絡/USB)。
安全:可選認證下一階段組件(如內核)。
1.4 內核空間
功能:初始化外設驅動,啟動用戶空間。
安全:內核運行在非安全上下文(Nonsecure)。
1.5 用戶空間
啟動:內核啟動init進程,執行根文件系統(rootfs)中的初始化腳本。
應用:最終暴露用戶界面(如GUI)。
2. 安全與協處理器管理
2.1 安全監控器(Secure Monitor)
作用:管理安全與非安全上下文切換,支持用戶認證、密鑰存儲。
實現:基于Arm TrustZone技術,運行在Cortex-A安全模式(EL3)。
2.2 協處理器(Cortex-M)
啟動時機:
早期啟動:由SSBL(如U-Boot的rproc命令)加載。
運行時啟動:由Linux remoteproc框架管理。
安全認證:
STM32MP2系列:通過OP-TEE可信應用(TA)驗證協處理器固件,確保完整性。
STM32MP15:可選通過TF-A或U-Boot認證。
3. 各系列差異
3.1 STM32MP13/15系列
FSBL:TF-A BL2。
SSBL:U-Boot。
協處理器:Cortex-M4(MP15)支持實時/低功耗任務。
安全啟動:可選認證,支持信任鏈擴展。
3.2 STM32MP2系列
主核:Cortex-A35,啟動時協處理器(Cortex-M33)保持復位。
安全架構:
OP-TEE:管理安全服務,隔離內存區域。
協處理器固件:可包含安全(TF-M)和非安全(STM32Cube)部分。
認證流程:通過OP-TEE TA驗證Cortex-M33固件,確保運行時完整性。
4. 工具與配置
STM32CubeMX:配置啟動組件(如時鐘樹、外設初始化)。
TF-A/U-Boot:開源引導程序,支持定制啟動流程。
OP-TEE:提供安全執行環境(TEE),支持可信應用開發。
5. 典型問題解答
Q1: 如何選擇啟動設備?
A1: BootROM根據引腳狀態(如BOOT0/1)或OTP配置選擇啟動源(eMMC、SD卡、UART等)。
Q2: 安全啟動如何實現?
A2: BootROM驗證FSBL簽名,FSBL驗證SSBL,逐級建立信任鏈。STM32MP2還可通過OP-TEE TA認證協處理器固件。
Q3: 協處理器何時啟動?
A3: 可在SSBL階段(快速啟動)或Linux運行時(動態加載),通過remoteproc管理。
Q4: 如何優化啟動時間?
A4: 減少SSBL功能(如禁用網絡/USB)、提前啟動協處理器、使用壓縮內核鏡像。
如需進一步探討具體配置或安全實現細節,可提供更具體的問題方向。
https://wiki.st.com/stm32mpu/wiki/TF-A_overview
根據您提供的知識庫內容,以下是關鍵信息整理及常見問題解答方向:
一、TF-A 引導流程要點
STM32MPU專用調整:
移除了BL1階段(因STM32自帶ROM Bootloader)
直接從BL2啟動,負責加載安全/非安全鏡像
AArch32架構下:BL2 → BL32(OP-TEE)→ BL33(U-Boot)
AArch64架構下:BL2 → BL31(EL3運行時)→ BL32/BL33
安全服務:
Armv7使用OP-TEE作為BL32,替代舊版SP_MIN
提供安全監控調用(SMC)和PSCI電源管理接口
設備樹配置:
BL2/BL31階段使用精簡設備樹
可通過STM32CubeMX工具配置
二、開發任務指南方向
1. 存儲設備擴展
Yocto添加NAND閃存:
# 示例:修改Yocto層配置文件
MACHINE_FEATURES += "nand"
IMAGE_INSTALL_append = " mtd-utils"
需調整內核設備樹,添加NAND控制器及分區表。
2. 顯示驅動開發
低分辨率慢速接口驅動:
使用Linux DRM框架
實現struct drm_panel_funcs中的enable/disable時序控制
注意配置pixel-clock和display-timings節點
3. 性能優化
TensorFlow Lite硬件加速:
// 啟用STM32 NPU Delegation
std::unique_ptr<tflite::TfLiteDelegate, decltype(&free)>?
? delegate(TfLiteNpuDelegateCreate(&options), free);
interpreter->ModifyGraphWithDelegate(delegate.get());
需在編譯時啟用--define tflite_with_stm32_npu=true
4. 系統配置
256MB DDR映射配置:
// 修改TF-A設備樹內存節點
memory@c0000000 {
? ? device_type = "memory";
? ? reg = <0xc0000000 0x10000000>; // 起始地址0xC000_0000,大小256MB
};
三、調試技巧
STM32CubeIDE調試Cortex-M33:
創建STM32MP25xx_CM33目標配置
在Debug Configurations中啟用Secure Debug模式
使用Semihosting輸出調試日志
四、數據一致性管理
Cache與MMU協同:
// 使用MPU API維護緩存一致性
SCB_EnableICache();
SCB_EnableDCache();
HAL_MMU_ConfigRegion(DEVICE_nGnRnE); // 配置外設內存屬性
如需具體某個問題的分步指南,請告知具體應用場景(如正在調試哪類外設或遇到何種報錯),我將結合知識庫給出詳細方案。
基于兩個STM32MPU知識庫鏈接(Boot Chain Overview 和 TF-A Overview),以下是關鍵知識整合及常見問題解答方向:
1. STM32MPU啟動流程核心階段
階段?? ?組件?? ?功能?? ?安全角色
BootROM?? ?ROM代碼?? ?初始化基礎硬件,選擇啟動設備(eMMC/SD/UART),加載FSBL到SRAM。?? ?驗證FSBL簽名,信任鏈起點。
FSBL?? ?TF-A BL2?? ?初始化DDR、時鐘樹,加載SSBL(U-Boot)到DDR。?? ?可選驗證SSBL,支持加密鏡像。
SSBL?? ?U-Boot?? ?初始化復雜外設(USB/以太網),加載內核和設備樹。?? ?可選驗證內核/設備樹,傳遞安全狀態。
OS Kernel?? ?Linux/RTOS?? ?啟動用戶空間,管理硬件資源。?? ?非安全上下文運行。
協處理器?? ?Cortex-M4/M33?? ?實時任務處理(如電機控制),通過remoteproc或U-Boot bootaux啟動。?? ?STM32MP2需通過OP-TEE驗證固件。
2. TF-A在STM32MPU中的關鍵作用
(1) 架構差異
STM32MP15(AArch32):
BL2 → BL32(OP-TEE) → BL33(U-Boot)
OP-TEE提供安全服務(如密鑰存儲)。
STM32MP2(AArch64):
BL2 → BL31(EL3運行時) → BL32/BL33
BL31管理安全監控(Secure Monitor)。
(2) 安全啟動流程
BootROM 驗證FSBL(BL2)的RSA簽名。
BL2 驗證BL32/BL33的哈希或簽名。
BL32(OP-TEE) 驗證協處理器固件(如STM32MP2的Cortex-M33固件)。
(3) 關鍵配置
# 啟用加密鏡像支持
STM32MP_USE_ENCRYPTED_BOOT = 1
# 選擇BL32實現(OP-TEE或SP_MIN)
BL32 = optee
3. 常見問題解答
(1) 如何配置STM32MP15從UART啟動?
硬件配置:設置BOOT引腳(BOOT0=1, BOOT1=0)。
TF-A修改:
// 修改plat/st/stm32mp1/stm32mp1_def.h
#define STM32MP_BOOT_DEVICE_UART 1
**使用STM32CubeProgrammer通過UART加載FSBL。
(2) 如何在U-Boot中啟動協處理器?
加載固件到內存:
=> load mmc 0:1 0x48000000 m4_fw.elf
啟動協處理器:
=> bootaux 0x48000000
驗證狀態:
=> rproc list
(3) 如何啟用安全啟動?
生成密鑰:
openssl genrsa -out private.pem 2048
簽名鏡像:
tools/cert_create/cert_create -n --key private.pek --tb-fw BL2.bin
燒寫密鑰哈希到OTP:
stm32key -k public_key.bin -a write
4. 調試技巧
(1) TF-A日志調試
啟用串口輸出:
# 修改TF-A編譯選項
DEBUG = 1
LOG_LEVEL = 40 ?# 最高詳細級別
查看BL2日志:UART輸出BL2初始化過程。
(2) 協處理器故障排查
檢查內存映射:確保協處理器固件加載地址不沖突(如SRAM區域)。
驗證固件格式:使用readelf -h m4_fw.elf檢查ELF頭是否有效。
5. 性能優化
(1) 縮短啟動時間
禁用非必要功能:
# U-Boot配置中禁用網絡/USB
# CONFIG_CMD_NET=n
# CONFIG_USB=n
啟用壓縮內核:
make zImage ?# 生成壓縮內核鏡像
總結
以上內容整合了STM32MPU啟動鏈和TF-A的核心知識點,涵蓋安全配置、協處理器管理及調試技巧。如需針對具體開發場景(如自定義BL2、優化啟動流程)的逐步指南,請提供更詳細的需求。