ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Zephyr 下 nRF9160 DK 开发指南:TrustZone 安全分区、双芯片协同与信号路由配置

Zephyr 下 nRF9160 DK 开发指南:TrustZone 安全分区、双芯片协同与信号路由配置 Zephyr 下 nRF9160 DK 开发指南TrustZone 安全分区、双芯片协同与信号路由配置【免费下载链接】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 RTOS 仓库中 nRF9160 DK 板级文档 为核心骨架系统讲解在 Zephyr 中为 nRF9160 DKPCA10090开发固件的完整流程包括基于 Armv8-M Security ExtensionsTrustZone的 Secure/Non-Secure 双镜像构建方案、nRF9160 与板载 nRF52840 两颗芯片的协同开发以及通过 devicetree 控制板载模拟开关实现引脚信号路由的具体方法。读完本文你将能够独立完成 nRF9160 DK 的 Zephyr 应用构建、烧录、调试与板级外设路由配置。nRF9160 DK图片来源Nordic Semiconductor板卡概览一颗 SiP、两颗芯片、三套板级配置nRF9160 DKPCA10090是面向 LTE-M 与 NB-IoT 蜂窝物联网场景的单板开发套件。Zephyr 仓库中boards/nordic/nrf9160dk目录下同时提供三套板级配置覆盖板上的两颗芯片nrf9160dk/nrf9160基于 Nordic nRF9160 SiP核心为 ARM Cortex-M33F CPU支持 ARMv8-M Security Extensions安全扩展是 LTE-M/NB-IoT 应用的主控。nrf9160dk/nrf9160/ns同一颗 nRF9160 的 Non-Secure非安全变体配置用于构建运行在 TrustZone 非安全世界中的 Zephyr 固件。nrf9160dk/nrf52840板载的 nRF52840 SoCARM Cortex-M4F承担低功耗蓝牙BLE、802.15.4、USB 等接口 MCUinterface MCU职责。板卡型号与 SoC 变体关系定义在 board.yml 中其中明确声明了 nrf9160 的ns变体以及板卡硬件版本revision体系major.minor.patch默认版本为0.14.0同时支持0.7.0与0.14.0两个版本。板级硬件要点板载两颗外部晶振慢时钟 32.768 kHz主时钟 32 MHz。从 v0.14.0 版本开始DK 新增两块额外硬件外部 Flash 存储器 MX25R6435F64 MbI/O 扩展器 PCAL6408A可用于扩展 LED、拨动开关slide switch与按键的接口能力。这些额外硬件默认未启用。要使用它们需要在构建时显式指定板卡硬件版本例如构建 nRF9160 DK v1.0.0 目标west build -b nrf9160dk/nrf91601.0.0同时还需要在 nRF52840 的固件中启用对应信号的路由详见下文板控制器固件与模拟开关路由一节否则额外硬件不会真正接入 nRF9160 SiP。连接与 IO 映射nRF9160 DK 板上 LED、按键与开关的引脚连接关系如下对应 devicetree 实现见 nrf9160dk_nrf9160_common.dtsi外设引脚LED1绿色P0.2LED2绿色P0.3LED3绿色P0.4LED4绿色P0.5BUTTON1P0.6BUTTON2P0.7SWITCH1P0.8SWITCH2P0.9BOOT SW5启动/复位值得留意的是nRF9160 DK 与大多数 Nordic DK 不同它只有 2 个按键和 2 个开关。为了遵循 Zephyr 社区每个 DK 板 4 个按钮的惯例nrf9160dk_nrf9160_common.dtsi 将两个开关也以gpio-keys节点暴露为button2/button3SWITCH1→INPUT_KEY_2SWITCH2→INPUT_KEY_3这样依赖标准按钮语义的示例与上层软件可以无缝工作。所有按钮节点均配置为GPIO_PULL_UP | GPIO_ACTIVE_LOW并提供了sw0~sw3、led0~led3等兼容别名。安全组件IDAU 与安全启动nRF9160 DK 在安全方面的两个关键组件IDAUImplementation Defined Attribution UnitnRF9160 使用 System Protection UnitSPU实现 IDAU用于划分安全Secure与非安全Non-Secure内存映射。默认情况下全部内存空间Flash、SRAM 与外设地址空间均被定义为仅安全访问。安全启动Secure boot板卡支持从安全状态引导系统。因此nrf9160dk/nrf9160 配置默认在 Secure 状态下启动这一点是理解下文所有构建流程的前提。使用 Arm TrustZone 构建 Secure/Non-Secure 应用nRF9160 上的应用可能同时包含一个 Secure 固件镜像和一个 Non-Secure 固件镜像Secure 镜像可以由 Zephyr 构建也可以使用 Trusted Firmware-MTF-M构建Non-Secure 固件镜像总是由 Zephyr 构建。默认情况下nRF9160 的 Secure 镜像使用 TF-M 构建。方式一Secure 固件由 Zephyr 构建整个流程分为三步使用-DBOARDnrf9160dk/nrf9160构建 Secure Zephyr 应用并在应用的项目配置文件中启用CONFIG_TRUSTED_EXECUTION_SECUREy使用-DBOARDnrf9160dk/nrf9160/ns构建 Non-Secure Zephyr 应用将两个二进制镜像合并。Secure 侧相关的板级配置可以在 nrf9160dk_nrf9160_defconfig 中看到它启用了CONFIG_ARM_MPU、CONFIG_ARM_TRUSTZONE_M、GPIO、UART 驱动与控制台Non-Secure 侧的默认配置见 nrf9160dk_nrf9160_ns_defconfig额外启用CONFIG_TRUSTED_EXECUTION_NONSECUREy表明该配置用于构建非安全固件。Secure 与 Non-Secure 镜像的内存划分由各自的 devicetree 决定Secure 配置 nrf9160dk_nrf9160.dts 选择sram0_s作为安全 SRAM 分区、slot0_partition作为代码分区并同时声明sram-secure-partition与sram-non-secure-partitionNon-Secure 配置 nrf9160dk_nrf9160_ns.dts 使用sram0_ns_app作为运行 SRAM、slot0_ns_partition作为代码分区并默认禁用uart1——因为该串口被 TF-M 占用。方式二Secure 固件使用 TF-M 构建此方式只需构建 Non-Secure Zephyr 应用构建系统会自动完成其余工作使用-DBOARDnrf9160dk/nrf9160/ns构建 Non-Secure Zephyr 应用命令中的板名写为nrf9160dk_nrf9160_ns亦可Zephyr 构建系统会因 Kconfig 选项BUILD_WITH_TFM构建 Non-Secure 应用时默认启用自动执行将 Non-Secure 固件镜像作为常规 Zephyr 应用构建构建 TF-MSecure固件镜像合并输出二进制文件可选地构建引导加载程序镜像MCUboot。注意根据 TF-M 的具体配置可能需要为应用提供 DTS overlay以调整 Non-Secure 镜像在 Flash 与 SRAM 中的起始地址及大小。无论采用哪种方式构建 Secure/Non-Secure 应用时Secure 应用都必须提前配置 IDAUSPU允许 Non-Secure 访问 Non-Secure 固件所使用的全部 CPU 资源SPU 配置必须在跳转到 Non-Secure 应用之前完成。构建纯 Secure 应用如果不需要 Non-Secure 世界只需按常规方式构建 Zephyr 应用使用-DBOARDnrf9160dk/nrf9160即可。烧录与调试烧录前需要按照 Nordic 板卡的 Segger 工具链流程安装并配置必要的软件J-Link 软件与驱动。完成环境准备后即可按常规流程构建并烧录应用。以hello_world示例为例先在终端中监听串口输出$ minicom -D tty_device -b 115200将tty_device替换为 nRF9160 DK 对应的端口在 Linux 下通常是/dev/ttyACM0。然后构建并烧录$ west build -b nrf9160dk/nrf9160 samples/hello_world $ west flash调试方面参考 Nordic 板卡的 Segger IC 调试说明nordic_segger文档即可nRF9160 DK 板载调试器支持 J-Link 全功能调试。验证板载 LED 与按键blinky 与 button 示例Zephyr 为验证 nRF9160 DK 的按键开关与 LED 是否工作正常提供了两个现成示例samples/basic/blinky让 LED 周期性闪烁验证 GPIO 输出通路samples/basic/button读取按键/开关输入验证 GPIO 输入通路。构建并烧录这两个示例可以快速确认 Zephyr 在板卡上运行正常。LED 与按键的完整 devicetree 定义位于 nrf9160dk_nrf9160_common.dtsi。nRF52840 板级配置nRF9160 DK 上的 nRF52840 SoC 提供以下外设支持CLOCK时钟FLASHGPIOMPU内存保护单元NVIC嵌套向量中断控制器PWMRADIO低功耗蓝牙与 802.15.4RTCnRF RTC 系统时钟Segger RTTRTT 控制台UARTWDT看门狗定时器需要特别强调的是nRF52840 SoC 与板上的 LED、按键、开关以及 Arduino 排针没有任何物理连接。不过nRF52840 的部分引脚可以通过模拟开关路由到 nRF9160 SiP实现两颗芯片之间的互联这正是下文板控制器固件的用武之地。nRF52840 配置的 devicetree 见 nrf9160dk_nrf52840.dts其中chosen节点将zephyr,bt-mon-uart与zephyr,ieee802154指向 nRF52840 的 UART0 与 802.15.4 无线电ieee802154节点默认启用。构建、烧录与调试 nRF52840 应用为nrf9160dk/nrf52840配置构建和烧录应用的方式与常规 Zephyr 应用相同但有一个关键前提必须将 DK 上的 PROG/DEBUG 开关拨到 nRF52 位置。以hello_world为例$ minicom -D tty_device -b 115200Linux 下 nRF52840 通常对应/dev/ttyACM1——注意/dev/ttyACM0连接的是板上的 nRF9160 SiP。随后构建并烧录$ west build -b nrf9160dk/nrf52840 samples/hello_world $ west flash调试方式同前Segger J-Link并记得再次确认 PROG/DEBUG 开关位于 nRF52 位置。板控制器固件与模拟开关路由板控制器固件的作用板控制器固件是一小段运行在 nRF52840 上的代码负责将 nRF9160 SiP 的特定引脚路由到 DK 上的不同组件包括 LED、按键、接口 MCU 的 UART 接口VCOMx以及 nRF52840 的特定引脚。当为nrf9160dk/nrf52840编译工程时板控制器固件会在内核初始化完成后自动编译并运行在早于 v0.14.0 的 DK 版本上被路由到其他组件的 nRF9160 信号无法同时在 DK 连接器上使用即信号被独占路由。默认路由表板控制器固件默认执行的路由如下nRF9160 引脚路由到P0.26、P0.27、P0.28、P0.29VCOM0P0.01、P0.00、P0.15、P0.14VCOM2P0.02LED1P0.03LED2P0.04LED3P0.05LED4P0.08Switch 1P0.09Switch 2P0.06Button 1P0.07Button 2P0.17、P0.18、P0.19Arduino 排针P0.21、P0.22、P0.23Trace 接口COEX0、COEX1、COEX2COEX 接口通过 devicetree 节点控制路由如果希望改变上述路由或启用其他可用路由只需启用或禁用代表对应模拟开关的 devicetree 节点即可。板控制器固件的实现见 board.c它在board_late_init_hook()中遍历所有routing_switches根据每个节点在 devicetree 中的statusokay/disabled将对应control-gpios配置为输出有效或无效电平从而闭合或断开模拟开关当外部 Flash 路由节点存在时还会在board_early_init_hook()中尽早闭合对应开关保证 Flash 的 HOLD 引脚被正确上拉。模拟开关节点的 devicetree 绑定定义在 nordic,nrf9160dk-optional-routing.yaml核心属性为control-gpios控制模拟开关的 GPIO。DK 上定义的模拟开关节点与物理开关对应关系如下Devicetree 节点标签模拟开关名称vcom0_pins_routingnRF91_UART1 (nRF91_APP1)vcom2_pins_routingnRF91_UART2 (nRF91_APP2)led1_pin_routingnRF91_LED1led2_pin_routingnRF91_LED2led3_pin_routingnRF91_LED3led4_pin_routingnRF91_LED4switch1_pin_routingnRF91_SWITCH1switch2_pin_routingnRF91_SWITCH2button1_pin_routingnRF91_BUTTON1button2_pin_routingnRF91_BUTTON2nrf_interface_pins_0_2_routingnRF_IF0-2_CTRL (nRF91_GPIO)nrf_interface_pins_3_5_routingnRF_IF3-5_CTRL (nRF91_TRACE)nrf_interface_pins_6_8_routingnRF_IF6-8_CTRL (nRF91_COEX)当构建 DK 0.14.0 或更新版本时还可以使用以下额外节点通过-DBOARDnrf9160dk/nrf9160版本指定板卡版本Devicetree 节点标签模拟开关名称nrf_interface_pin_9_routingnRF_IF9_CTRLio_expander_pins_routingIO_EXP_ENexternal_flash_pins_routingEXT_MEM_CTRL路由配置实战示例示例 1启用可选路由将 nRF9160 的 P0.17、P0.18、P0.19 分别路由到 nRF52840 的 P0.17、P0.20、P0.15。在应用的 devicetree overlay 中添加nrf_interface_pins_0_2_routing { status okay; };示例 2禁用 VCOM2 引脚的路由vcom2_pins_routing { status disabled; };从 nrf9160dk_nrf52840.dts 的board-control节点可以看到这些开关的实际control-gpios定义例如vcom0_pins_routing由 P1.14低电平有效控制vcom2_pins_routing需要同时驱动 P1.12 与 P0.12 两个引脚而nrf_interface_pins_0_2_routing、nrf_interface_pins_3_5_routing、nrf_interface_pins_6_8_routing默认均为disabled。双芯片 UART 通信的快捷配置在boards/nordic/nrf9160dk/dts/nrf52840与boards/nordic/nrf9160dk/dts/nrf9160两个目录下提供了若干辅助.dtsi文件它们既可作为配置路由的参考示例也可以直接从应用 overlay 中 include快速实现 nRF9160 与 nRF52840 之间的信号路由。例如要让两颗芯片通过各自的uart1互连通信nRF52840 侧的 overlay#include nrf52840/nrf9160dk_uart1_on_if0_3.dtsinRF9160 侧的 overlay#include nrf9160/nrf9160dk_uart1_on_if0_3.dtsi以 nrf9160dk_uart1_on_if0_3.dtsi 为例它定义了uart1_default_alt备用引脚组合TXP0.18、RXP0.17、RTSP0.21、CTSP0.19并将uart1的状态置为okay同时挂载default/sleep两组 pinctrl 状态。结合nrf_interface_pins_0_2_routing等模拟开关节点即可在硬件层面打通 nRF9160 与 nRF52840 之间的 UART 通路。小结围绕 nRF9160 DKZephyr 提供了从安全启动、TrustZone 双镜像构建到双芯片路由控制的完整支撑nrf9160dk/nrf9160与nrf9160dk/nrf9160/ns配置分别对应 Secure/Non-Secure 世界配合CONFIG_TRUSTED_EXECUTION_*与 TF-M 可灵活组织安全固件nrf9160dk/nrf52840配置配合板控制器固件通过 16 个模拟开关节点实现了 nRF9160 SiP 与板载外设、nRF52840 之间的可编程信号路由。开发者只需在 devicetree overlay 中设置对应节点的status即可按需打通 VCOM、LED、按键、Arduino 排针乃至双芯片 UART 通信链路为 LTE-M/NB-IoT BLE 组合场景提供便捷的硬件基础。【免费下载链接】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),仅供参考
返回列表