基于 nRF9160 SiP 的蜂窝物联网开发板:Zephyr 中 innblue21 / innblue22 板级支持与 TrustZone-M 安全启动实战指南
【免费下载链接】zephyrPrimary Git Repository for the Zephyr Project. Zephyr is a new generation, scalable, optimized, secure RTOS for multiple hardware architectures.项目地址: https://gitcode.com/GitHub_Trending/ze/zephyr
本文围绕 Zephyr 仓库中 boards/innblue 板卡目录所承载的 innblue21 与 innblue22 两块开发板展开,系统讲解其硬件资源、引脚连接、安全特性(IDAU/SPU 与 Secure boot),以及最重要的——在 Zephyr 中为基于 nRF9160 的蜂窝物联网板构建 Secure / Non-Secure 双固件并合并烧录的完整流程。读完本文,你将掌握 nRF9160 系列板卡的设备树组织结构、TrustZone-M 分区启动原理,以及可复制的构建与烧录命令。
板卡概览:专为 NB-IoT / LTE-M 设计的传感开发平台
innblue21 与 innblue22 是两块结构高度一致、均以 Nordic nRF9160 SiP(System in Package)为核心的蜂窝物联网传感器开发板,板载 NB-IoT 与 LTE-M 蜂窝连接能力。官方板卡文档 innblue21 文档 与 innblue22 文档 均以 "cellular IoT sensor development board" 定位,二者在 Zephyr 中的板级实现几乎镜像,区别仅在于板卡命名(V2.1 / V2.2)与对应的 Kconfig 符号。
从 board.yml 可以看到两块板卡的正式标识:
- innblue21:全名
nRF9160 INNBLUE21,SoC 为nrf9160,并声明了ns(Non-Secure)变体; - innblue22:全名
nRF9160 INNBLUE22,SoC 同样为nrf9160,同样提供ns变体。
其中ns变体的存在直接对应下文即将展开的 Secure/Non-Secure 双区启动架构,这也是 nRF9160 板卡在 Zephyr 中最具代表性的使用场景之一。
板载硬件资源
根据板卡文档的 Hardware 章节,两块板卡内置了以下主要元器件:
| 功能 | 器件 |
|---|---|
| 加速度计(Accelerometer) | ST LIS2DH12 |
| 安全加密元件(CryptoElement) | Atmel ATECC608a |
| 湿度传感器(Humidity Sensor) | ST HTS221 |
| Qi 无线充电(Qi charger) | TI BQ51013 |
| 电池电量计(Battery fuel gauge) | TI BQ27421 |
这些声明并非仅停留在文档层面,在 innblue21_common.dtsi 中可以看到它们在 I2C 总线上的真实挂载情况:i2c2被配置为nordic,nrf-twim快速模式(I2C_BITRATE_FAST),其上依次挂载了st,lis2dh加速度计(地址0x19)、st,hts221湿度传感器(地址0x5f)、st,lps22hb-press气压计(地址0x5c)、ams,ccs811空气质量传感器(地址0x5a)以及bosch,bme680环境传感器(地址0x76)。也就是说,文档中列举的传感器只是板载传感能力的一部分,设备树中还预留了更多 I2C 器件节点,方便开发者直接通过devicetreeAPI 访问。
支持的 Zephyr 特性
从板卡的 innblue21_nrf9160.yaml 与 innblue22_nrf9160.yaml 可以精确得知官方声明的资源与特性:
- 标识:
innblue21/nrf9160、innblue22/nrf9160 - 架构:
arm(Armv8-M,支持 TrustZone-M) - 工具链:
gnuarmemb、zephyr - RAM:64 KB;Flash:256 KB
- 支持的驱动类别:
i2c、pwm、watchdog
对应的 Kconfig 配置位于 Kconfig.innblue21,其中config BOARD_INNBLUE21通过select SOC_NRF9160_SICA关联到 Nordic nRF9160 SiP 的 SoC 定义。
连接与 IO:LED 与按键引脚
LED 引脚分配
根据文档 Connections and IOs 章节,两块板卡各提供 4 颗 LED,引脚完全一致:
| LED | 颜色 | 引脚 |
|---|---|---|
| LED1 | 红(RGB 红色通道) | P0.7 |
| LED2 | 绿(RGB 绿色通道) | P0.6 |
| LED3 | 蓝(RGB 蓝色通道) | P0.5 |
| LED4 | 红(模式指示灯) | P0.4 |
设备树 innblue21_common.dtsi 中将这些 LED 定义为gpio-leds节点,前三颗构成 RGB 灯、第四颗为模式指示,并通过aliases暴露为led0/led1/led2/led3,与 Zephyr 各类 sample 中led0的惯用别名保持一致,开箱即可点亮。
按键
板卡仅提供 1 个按键 BUTTON1,位于 P0.31。设备树中对应gpio-keys节点 button_0,使能了内部上拉(GPIO_PULL_UP)并绑定输入事件码INPUT_KEY_0,别名sw0,可直接用于zephyr,code驱动的事件输入子系统。
安全组件:IDAU、SPU 与安全启动
nRF9160 板卡文档专门列出了两大安全组件,这是理解后续 Secure/Non-Secure 构建流程的基础:
- IDAU(Implementation Defined Attribution Unit):由 SPU(System Protection Unit)实现,用于划分安全(Secure)与非安全(Non-Secure)内存映射。默认情况下,全部内存空间(Flash、SRAM 以及外设地址空间)均被定义为仅安全可访问——这意味着任何未显式配置的非安全固件默认无法触碰这些资源。
- Secure boot(安全启动):保证固件从安全状态启动、校验并进入受信任的执行环境。
在 innblue21_common.dtsi 末尾,板卡通过#include <nordic/nrf91xx_partition.dtsi>引入默认的内存分区配置,为安全/非安全固件划分独立的 Flash 与 SRAM 分区,这是双区固件得以共存与跳转的前提。
构建 Secure / Non-Secure 双区应用
innblue21 与 innblue22 均支持 Armv8-M Security Extension,且默认从 Secure 状态启动。当需要同时运行可信(Secure)与不可信(Non-Secure)两部分固件时,官方文档给出了明确的三步流程:
- 构建 Secure 应用:使用
-DBOARD=innblue21(或innblue22),并在应用的项目配置文件中启用CONFIG_TRUSTED_EXECUTION_SECURE=y; - 构建 Non-Secure 应用:使用
-DBOARD=innblue21/nrf9160/ns(或innblue22/nrf9160/ns); - 合并两个二进制文件:将 Secure 与 Non-Secure 固件合并为最终可烧录镜像。
其中ns板型变体在仓库中有完整的实体支撑:
- 设备树变体 innblue21_nrf9160_ns.dts 与 YAML 声明 innblue21_nrf9160_ns.yaml;
- 默认配置 innblue21_nrf9160_ns_defconfig 中显式启用了
CONFIG_TRUSTED_EXECUTION_NONSECURE=y,并注释说明 "This Board implies building Non-Secure firmware"。
对照 innblue21_nrf9160_defconfig,两个变体都启用了CONFIG_ARM_MPU=y与CONFIG_ARM_TRUSTZONE_M=y(MPU 与 TrustZone-M 是 nRF9160 分区内存保护的基础),同时开启 GPIO、UART 驱动与控制台(CONFIG_CONSOLE=y、CONFIG_UART_CONSOLE=y),保证双区固件都能输出日志。
关键前提:SPU 配置必须在跳转前完成
文档特别强调:在构建 Secure/Non-Secure 双区应用时,Secure 应用必须配置 IDAU(即 SPU),以允许 Non-Secure 固件访问其所使用的全部 CPU 资源(Flash、SRAM、外设);且SPU 的配置必须在跳转到 Non-Secure 应用之前完成。否则 Non-Secure 固件一旦运行便会因触碰安全专属资源而触发安全异常(SecureFault)。这也是CONFIG_TRUSTED_EXECUTION_SECURE构建的 Secure 固件在main()之前、启动早期完成 SPU 初始化的原因。
构建 Secure-only 应用
如果不需要拆分信任边界,只需按常规方式构建单区 Secure 应用:直接使用-DBOARD=innblue21(或innblue22),无需任何 TrustZone 相关特殊配置。由于板卡默认从 Secure 状态启动,单固件会以完整安全权限运行,可访问全部资源,适用于功能简单、无第三方不可信代码的物联网传感节点场景。
烧录与运行
前置软件
按照 Nordic 官方烧录工具(Segger J-Link 相关软件)的安装与配置说明准备好环境后,即可按常规流程构建与烧录。nRF9160 板卡通过板载 J-Link OB 调试器提供 USB 串口与烧录通道。
监听串口输出
以hello_world示例为例,首先用终端程序监听串口输出:
$ minicom -D <tty_device> -b 115200将<tty_device>替换为 nRF9160 innblue21/innblue22 对应的串口设备,Linux 下通常为/dev/ttyACM0。115200 波特率与设备树中uart0的current-speed = <115200>配置一致。
构建并烧录
在 Zephyr 环境中执行(以 innblue21 为例,innblue22 同理):
$ west build -b innblue21 samples/hello_world $ west flash其中west build -b innblue21完成构建,west flash通过板载调试器烧录。设备树 innblue21_common.dtsi 中已将uart0同时指定为 Zephyr 控制台(zephyr,console)、shell UART(zephyr,shell-uart)与 mcumgr UART(zephyr,uart-mcumgr),因此烧录后串口即可看到Hello World!输出。
调试
如需对板卡进行断点调试与单步跟踪,可参考 Nordic 官方关于 Segger 调试器的说明,通过 J-Link / Ozone 等工具连接板载调试器进行。nRF9160 属于 Armv8-M 架构,调试时同样遵循 Secure/Non-Secure 两个世界各自的地址空间与权限边界。
小结
innblue21 与 innblue22 是 Zephyr 中 nRF9160 蜂窝物联网开发板的典型实现:板载加速度计、湿度、气压、空气质量等多路 I2C 传感器,配合 LED、按键、无线充电与电量计,构成完整的传感节点硬件平台;在软件层面,其核心价值在于完整示范了 Zephyr 对 Arm TrustZone-M 的支持——通过-DBOARD=<board>与-DBOARD=<board>/nrf9160/ns分别产出 Secure / Non-Secure 固件,再合并烧录,使开发者能够在同一颗 nRF9160 上落地可信执行环境与不可信应用并存的蜂窝物联网方案。如需深入,可直接阅读 innblue21 板级源码 与 innblue22 板级源码 中的设备树与 Kconfig 定义。
【免费下载链接】zephyrPrimary Git Repository for the Zephyr Project. Zephyr is a new generation, scalable, optimized, secure RTOS for multiple hardware architectures.项目地址: https://gitcode.com/GitHub_Trending/ze/zephyr
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考