Note: Somethings for ARM

TrustZone 已經是Cortex A系列的標準配備了,目前各種環境應用對於Security/Isolations 的需求已經很明確浮現在台面上了,所以了解TrustZone變成當下研究ARM 平台的基本功課

TrustZone 除了 Note: ARM Trust Zone basic 裡面所提的還會有TrustZone Address Spaces Controller, 目前ARM 有對應DRAM 的 TZC-380 跟 TZC-400 目前看到NXP 新的i.MX8M 透過Source code 看來選用的是TZC-380, 它本身是替記憶體加上權限管理的控制器

加上 ARMv8 開始ARM  的執行模式區分的方式也從舊有的 USER/SVC/HYP (Processor Mode) 模型改成分離簡化的 Exception Levels變成 EL0~EL3, EL3 是專門規劃給Secure Monitor 如TEE 環境執行的, 而 EL2 則是設計給Hypervisor 執行的, EL1 則是OS環境執行, EL0 則是一般Application 不過實際上這四個模式還有區分在 Secure World 或是Normal World, EL3只存在 Secure World, 而EL2則只存在Normal World, 詳見此圖

ARM Trusted Firmware 提供了一個ARMv8 的 Secure Monitor (EL3) 實作參考, 它將開機分層下面各種步驟

  • Boot Loader stage 1 (BL1) AP Trusted ROM
  • Boot Loader stage 2 (BL2) Trusted Boot Firmware
  • Boot Loader stage 3-1 (BL31) EL3 Runtime Software
  • Boot Loader stage 3-2 (BL32) Secure-EL1 Payload (optional)
  • Boot Loader stage 3-3 (BL33) Non-trusted Firmware

BL1 就是SoC內的Secure Boot ROM, 當系統開機Cold Boot會進入EL3 執行該BootRom, 然後透過系統上的OTP Fuse 的hash code  去校驗將載入BL2的 Second Bootloader到SoC上面, 並且切換到 Secure-EL1模式然後程式跳到BL2中執行

BL2 在Qualcomm 現在的平台就是SBL/XBL了, 而NXP i.MX 6/8 就是 SPL U-Boot了,BL2 要做的主要就是初始化系統上的SDRAM,打開Console Port, 接著一樣載入下一階段的BL3

BL3, 在Qualcomm 上面就是Little Kernel了, i.MX6/8則還是U-Boot 實際上i.MX設計了一個plugin 的架構所以你會發現一些系統是直接一個上百K大小的U-BOOT image 直接可以執行不用區分成SPL/UBoot 這樣, 這要去研究i.MX 的U-boot image 格式, 它會在make image 時產生一個Plugin or DCD (Device Configuration Data)Table 讓BL1 直接載入該Plugin或按照DCD初始化 (最大4KB, 但是需要offset 1K, 所以實際只有3K大) 的code 到SRAM 去執行SDRAM configure 就是做BL2的事情,  然後再返回讓它載入整各U-Boot 到SDRAM 跳到這個BL3的階段

BL3 又被分為三個階段, 看實際需求執行, Qualcomm 應該不是按照這個方案設計,因為它會在BL2就載入 BL3-2的payload, 而iMX系列走的是自有的HAB架構所以也有自己的變化,所以這個ARM Trusted Firmware就真的是參考設計 實際上方案要看實際情況到底走哪些方式
TI自己也有一個 M-Shield 架構

Ref.
Firmware Design – ARM Trusted Firmware
ARMv8 與 Linux的新手筆記
U-Boot V2012.10生成i.MX image的过程分析

廣告

Note: How to use STM32F07x USB Device library

目前測試跟FreeRTOS v10.0.1 一起,
開啟HAL support 在 stm32f0xx_hal_conf.h 把下面這行 uncomment, 去enabled  USB low level driver
#define HAL_PCD_MODULE_ENABLED

接下來需要加上USB IRQ handler, 按照STM的範例 加在 stm32f0xx_it.c 裡面,
/* Private variables ———————————————————*/
extern PCD_HandleTypeDef hpcd;

void USB_IRQHandler(void)
{
HAL_PCD_IRQHandler(&hpcd);
}
在 main.c 裡面加上 下面三行, 這裡測試HID class device,
/* Init USB Device Library */
USBD_Init(&USBD_Device, &HID_Desc, 0);
/* Register the USB HID class */
USBD_RegisterClass(&USBD_Device, &USBD_HID);
/* Start Device Process */
USBD_Start(&USBD_Device);

然後複製一份 usbd_desc.h/usbd_conf.h 改成你要的
還有引入STM32F0xx USB Library 的USB Core/Class code 這樣就可以

Tips, 實際上還要注意USB Device 用的RAM (endpoint buffer)空間, 要避免RTOS override 不過還沒看這邊只是簡單測試
Update: STM32F0xx 的USB Endpoint buffer 是獨立於系統之外例如 測試的STM32F072RB 是指向 (0x40006000) 在 CMSIS 下的 stm32f072xb.h 內可以找到 #define USB_PMAADDR (APBPERIPH_BASE + 0x00006000)

Note: ARM Trust Zone basic

 

Hardward: 基本上有TrustZone 支援的ARM SOC 會有下列基本的硬體

  • OTP (One Time Programming) Fuse 用來存 Key (HASH)
  • Cryptographic engine, 加密硬體加速器用來幫助運算Image的 Hash code
  • Exceptions: Trust Zone 還是利用 Exception 切換 Secure/No-Secure World, 或是透過SMC( Secure Monitor Call) 實際上還是一個Exceptions
  • Secure Boot ROM
  • OnChip RAM

Ref.

 

 

Note: XBL for Qualcomm

Qualcomm 的平台從原本的 自家的SBL (Second Boot Loader) 改成走 UEFI 的 XBL (eXtensible Boot loader)

而且Toolchain 從以前的ARM DS-5 改成自家的Snapdragon LLVM, 最新的LLVM 是4.0.2(Oct. 2017), 但是平台上用的 XBL toolchain 可能是舊的

要看ReleaseNote 裡面用的版本, 因為他基於llvm.org 的版本不同, 跟改進的週期因素, 常常Compiler optional 關鍵字會起變化 需要特別的版本才能正確的re-build XBL (最近遇到必須是 SD LLVM 3.5.x, 但是官方支援管道, 極有可能會遇到不熟的跟你扯半天也沒正確結果)

今天找了一下 https://github.com/sudosurootdev/prebuilts_clang_linux-x86_host_msm-3.5/tree/pointers 這有一個 For Android NDK 用的版本 但是可以順利Rebuild XBL

 

 

Note: Kontron SMARC-sAMX6i

from https://lists.yoctoproject.org/pipermail/meta-freescale/2014-December/011841.html download device tree files

The board always boot from ECSPI4, use W25Q16DW (16MBits/2MBytes)
ECSPI4 memory space layout

Partition 0, from 0 ~ 0xbffff (768KB), for bootloader
Partition 1, from 0xc0000 ~ 0xcffff (64KB), for U-Boot Environment use 32KB
Partition 2, others space, for user

LCD Brightness control through the below pins

MX6QDL_PAD_SD1_DAT0__GPIO1_IO16, Backlight Enabled
MX6QDL_PAD_SD1_DAT1__GPIO1_IO17, LCD Power Enabled
MX6QDL_PAD_SD1_CMD__PWM4_OUT, Brightness PWM ouput

I2C ports

I2C1, for SMARC General Purpose

MX6QDL_PAD_CSI0_DAT8__I2C1_SDA
MX6QDL_PAD_CSI0_DAT9__I2C1_SCL

I2C2, for HDMI

MX6QDL_PAD_KEY_COL3__I2C2_SCL
MX6QDL_PAD_KEY_ROW3__I2C2_SDA

I2C3, for Power Managmenet
I2C-GPIO0, for System management (PMIC:PFUZE100 on the bus)

MX6QDL_PAD_ENET_TXD0__GPIO1_IO30, SCL   MX6QDL_PAD_ENET_TX_EN__GPIO1_IO28, SDA

I2C-GPIO1, for SMARC CAMERA

MX6QDL_PAD_GPIO_6__GPIO1_IO06, SCL
MX6QDL_PAD_KEY_COL2__GPIO4_IO10, SDA

I2C-GPIO2, for SMARC LCD

MX6QDL_PAD_SD1_DAT2__GPIO1_IO19, SCL
MX6QDL_PAD_SD1_DAT3__GPIO1_IO21, SDA