Zephyr 中 framework_ledmatrix 板卡详解:Framework Laptop 16 LED Matrix 的硬件构成、外设使能与 UF2 烧录实战

发布时间:2026/9/17 4:39:58
Zephyr 中 framework_ledmatrix 板卡详解:Framework Laptop 16 LED Matrix 的硬件构成、外设使能与 UF2 烧录实战 Zephyr 中 framework_ledmatrix 板卡详解Framework Laptop 16 LED Matrix 的硬件构成、外设使能与 UF2 烧录实战【免费下载链接】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 仓库中的framework_ledmatrix板卡定义文档展开完整梳理这块基于 RP2040 的 LED 矩阵模块的硬件规格、I2C/GPIO/USB 等外设的设备树使能方式、默认 Kconfig 配置以及通过 DIP 开关进入 UF2 引导模式并用west flash烧录固件的完整操作流程。读完后你可以直接在 Zephyr 中编译任意示例如 USB 控制台到该板卡、独立完成从构建到刷机的全流程并理解设备树中闪存分区、I2C 引脚复用等关键配置的来源。板卡概述framework_ledmatrix是 Zephyr 对 Framework Laptop 16 配套 LED Matrix 输入模块的支持板卡标识符HWMv2 名称为framework_ledmatrix厂商字段为frameworkSoC 为 Raspberry Pi 的 RP2040。该模块的核心是一块9x36 白色 PWM LED 阵列由 Lumissil IS31FL3741A 驱动芯片控制挂接在 RP2040 的 I2C 总线上。板卡的基本元信息定义在 board.yml 中board: name: framework_ledmatrix full_name: Framework LED Matrix vendor: framework socs: - name: rp2040而 Kconfig.framework_ledmatrix 则将其与 SoC 绑定config BOARD_FRAMEWORK_LEDMATRIX select SOC_RP2040这意味着选择该板卡后Zephyr 构建系统会自动选中 RP2040 的 SoC 定义见 soc/raspberrypi 目录包括其中对 QSPI 闪存、SRAM 和 USB 设备控制器的支持。硬件规格根据板卡文档该模块的硬件资源如下资源规格CPU双核 Arm Cortex-M0最高 133 MHzSRAM264 KB 片上 SRAM闪存1 MB 板载 QSPI 闪存支持 XIP执行在位LED内置 9x36 白色 LED 矩阵开关2 路 DIP 开关——一路供用户控制一路用于停留 BOOTLOADERUSBUSB 1.1 控制器主机/设备模式PIO8 个可编程 I/OPIO可用于自定义外设看门狗1 个看门狗定时器外设这些规格与仓库中板卡硬件描述 framework_ledmatrix.yaml 保持一致flash: 1024KB、ram: 264KB、架构为arm工具链为zephyr工具链。该文件同时声明了板卡的支持特性supported字段i2c—— IS31FL3741A LED 驱动芯片与 GPIO 键信号均依赖它gpio—— DIP 开关与笔记本盖板开合检测引脚usb_device—— USB 1.1 设备模式用于 CDC 控制台、J-Link 调试等watchdog、hwinfo、dma、counter、clock对于 RP2040 这类双核 Cortex-M0 SoCZephyr 默认以单核方式运行另一核可作为协处理器或被挂起双核规格更多体现为 RP2040 系列在 PIO 与外设带宽上的能力板卡文档列出的 8 个 PIO 可编程引脚即为 RP2040 的标志性特性。设备树外设使能与引脚复用板卡设备树主文件为 framework_ledmatrix.dts它以 rp2040.dtsi 为基础按需点亮各外设节点。以下按功能拆解。内存与分区配置chosen节点将 Zephyr 的运行时资源锚定到 RP2040 的硬件上chosen { zephyr,sram sram0; zephyr,flash flash0; zephyr,flash-controller ssi; zephyr,code-partition code_partition; };其中zephyr,flash-controller ssi表明闪存通过 RP2040 的 SSIQSPI接口访问zephyr,code-partition指向自定义的code_partition分区——这是本板卡设备树中最值得注意的细节。闪存分区布局RP2040 的 1 MB 闪存映射在地址0x10000000处设备树将其划分为两个分区flash0 { reg 0x10000000 DT_SIZE_M(1); ranges 0x0 0x10000000 DT_SIZE_M(1); partitions { /* Reserved memory for the second stage bootloader */ second_stage_bootloader: partition0 { compatible zephyr,mapped-partition; reg 0x00000000 0x100; read-only; }; /* * Usable flash. Starts at 0x100, after the bootloader. The partition * size is 1MB minus the 0x100 bytes taken by the bootloader. */ code_partition: partition100 { compatible zephyr,mapped-partition; reg 0x100 (DT_SIZE_M(1) - 0x100); read-only; }; }; };second_stage_bootloader保留前0x100256 字节给二阶段引导加载器标记为只读code_partition从0x100开始、大小为1MB - 0x100的可用应用分区。配合板卡默认配置中的CONFIG_USE_DT_CODE_PARTITIONy见下文Zephyr 链接器会依据该分区定义把固件镜像布置到正确的闪存偏移处。从分区定义看该模块固件启动链路中RP2040 的 ROM 引导程序maskrom即 BOOTSEL 模式之后还会加载一段二阶段 bootloader应用镜像必须避开最前面的 256 字节这正是手动拖拽 UF2 文件刷机时仍然能正常运行的原因——UF2 格式本身携带目标偏移量。I2C1 与 LED 驱动芯片LED 矩阵由 I2C1 总线驱动引脚复用定义在 framework_ledmatrix-pinctrl.dtsi 中pinctrl { i2c1_default: i2c1_default { group1 { pinmux RP2XXX_PINMUX(26, RP2_PINCTRL_GPIO_FUNC_I2C), RP2XXX_PINMUX(27, RP2_PINCTRL_GPIO_FUNC_I2C); input-enable; input-schmitt-enable; }; }; };主设备树中则使能 I2C1 并在其下挂载 LED 驱动芯片节点i2c1 { status okay; pinctrl-0 i2c1_default; pinctrl-names default; clock-frequency I2C_BITRATE_STANDARD; is31fl374130 { status okay; reg 0x30; }; };要点I2C1 复用 GPIO 26/27RP2040 的默认 I2C1 引脚并启用施密特触发输入以提高信号质量LED 驱动芯片 IS31FL3741A 的 I2C 地址为0x30仓库中已提供同系列 ISSI/Lumissil 产品的 LED 驱动实现 is31fl3733.c采用 ISSI IS31FL37xx 家族通用的寄存器协议命令页选择寄存器0xFD、页内 LED/PWM 配置页、命令锁定值0xC5等。虽然文档标注的芯片型号为 IS31FL3741A但从源码结构看该驱动家族寄存器机制一致可作为理解此芯片通信协议与 I2C LED API 用法的参考。其他外设节点设备树还使能了以下节点均与硬件清单一一对应timer { status okay; }; /* RP2040 硬件定时器用于 system timer */ wdt0 { status okay; }; /* 看门狗定时器 */ rtc { clocks clocks RPI_PICO_CLKID_CLK_RTC; status okay; }; zephyr_udc0: usbd { status okay; }; /* USB 设备控制器 */ gpio0 { status okay; }; vreg { status okay; }; /* RP2040 内部稳压器 */aliases节点提供了 C 代码层面的便捷访问入口aliases { /* Alias to easily get the device in C */ led-blank-switch lid_closed; rtc rtc; watchdog0 wdt0; };GPIO 按键DIP 开关与盖板检测设备树把两个按键信号注册为gpio-keys映射到 Zephyr 输入子系统gpio_keys { compatible gpio-keys; /* Dip switch on the back - not normally accessible during usage */ dip1: dip1 { gpios gpio0 25 (GPIO_PULL_UP | GPIO_ACTIVE_LOW); zephyr,code INPUT_KEY_0; label DIP1; }; /* Pin from the EC on the mainboard - low indicating lid of the laptop is closed */ lid_closed: lid-closed { gpios gpio0 0 (GPIO_PULL_UP | GPIO_ACTIVE_LOW); zephyr,code INPUT_KEY_1; label Lid closed; }; };DIP1GPIO 25上拉、低有效模块背面的用户 DIP 开关之一应用层可通过输入事件或 GPIO API 读取lid_closedGPIO 0上拉、低有效来自主板 EC嵌入式控制器的信号低电平表示笔记本盖板已合上。该信号经led-blank-switch别名暴露典型用途是在合盖时熄灭 LED 矩阵以节省功耗——这与led_blank场景语义相符。默认配置与 Kconfig板卡 defconfigframework_ledmatrix_defconfig 提供板级默认配置CONFIG_SERIALy CONFIG_CONSOLEy # Enable reset by default CONFIG_RESETy CONFIG_CLOCK_CONTROLy # Code partition needed to target the correct flash range CONFIG_USE_DT_CODE_PARTITIONy # Output UF2 by default, maskrom bootloader supports it. CONFIG_BUILD_OUTPUT_UF2y CONFIG_BUILD_OUTPUT_HEXy逐项说明SERIALCONSOLE开启串口与内核控制台配合 USB CDC ACM 可获得 USB 控制台RESETCLOCK_CONTROL开启复位与时钟控制驱动USE_DT_CODE_PARTITION让构建系统依据设备树中的code_partition决定链接地址确保镜像避开 bootloader 保留区对应上文分区布局BUILD_OUTPUT_UF2默认生成 UF2 镜像。设备树注释明确说明原因——RP2040 的 maskrom bootloaderBOOTSEL 模式原生支持 UF2因此可直接拖拽刷机同时保留 HEX 输出。Kconfig.defconfig 中的默认值Kconfig.defconfig 在选中该板卡时附加如下默认值if BOARD_FRAMEWORK_LEDMATRIX config RP2_FLASH_W25Q080 default y if I2C_DW config I2C_DW_CLOCK_SPEED default 125 endif # I2C_DW config USB_SELF_POWERED default n endif # BOARD_FRAMEWORK_LEDMATRIXRP2_FLASH_W25Q080把板载 QSPI 闪存识别为 W25Q0801 MB SPI NAND/NOR 系列保证闪存驱动的擦除/写入参数正确I2C_DW_CLOCK_SPEED当使用设计中心 I2C 控制器时默认位速率降为 125 kbit/s标准模式下偏低保守的取值利于与 I2C 外设通信稳定USB_SELF_POWERED默认n即 USB 设备枚举时声明为总线供电——该模块直接由 Framework 主板经接口板取电符合实际供电形态。烧录流程UF2 模式与 west flash该模块没有板载调试探针烧录依赖 RP2040 的BOOTSELmaskrom UF2机制。官方文档给出的完整流程如下。1. 构建示例应用以启用 USB 控制台的官方示例 samples/subsys/usb/console 为例使用以下命令构建:board: framework_ledmatrixwest build -b framework_ledmatrix samples/subsys/usb/console由于板级 defconfig 已开启CONFIG_BUILD_OUTPUT_UF2构建产物中会生成build/zephyr/zephyr.uf2文件。2. 进入 UF2 刷机模式文档描述的硬件操作是取下模块拨动 2 号 DIP 开关再装回模块。此时 RP2040 停留在 ROM bootloaderBOOTSEL状态模块在主机侧枚举为一个 USB 大容量存储设备通常挂载为RP-FLOPPY之类的可写卷。3. 写回固件方式一使用 West 元工具自动完成west flash方式二手动将生成的build/zephyr/zephyr.uf2文件拖拽到模块的 USB 存储卷上即可UF2 拖拽刷写是 RP2040 的标准流程。烧录完成后把 DIP 开关拨回原位模块即从闪存中启动新固件。烧录器背后的实现west flash能直接选中 uf2 烧录器依赖 board.cmake 中的两处配置board_runner_args(uf2 --board-idRPI-RP2) include(${ZEPHYR_BASE}/boards/common/uf2.board.cmake)board_runner_args(uf2 --board-idRPI-RP2)向west flash的 uf2 runner 传入--board-idRPI-RP2使生成的 UF2 文件携带 RP2040 官方 board ID0x0000000000000000 系列的 RPI-RP2 标识保证被 maskrom 识别并写入到 QSPI 闪存对应的目标地址uf2.board.cmake 则把 uf2 注册为该板卡的默认烧录器board_set_flasher_ifnset(uf2) board_finalize_runner_args(uf2) # No default arguments to provide.也就是说west flash无需额外参数即可工作板卡级 runner 参数已经内置。调试与运行器板卡文档中的 Programming and Debugging 章节由zephyr:board-supported-runners指令自动生成列出的调试/烧录通道即上文所述的 UF2 烧录器。RP2040 支持经 USB 的 CMSIS-DAP 与 SWD若主机侧连接了调试探针也可使用west flash --runner指定其他 runner就本仓库的板卡定义而言默认路径就是 UF2。小结与关键文件索引板卡定义board.yml、Kconfig、Kconfig.defconfig、board.cmake设备树framework_ledmatrix.dts闪存分区、I2C1、LED 芯片节点、DIP 开关与盖板按键、外设使能、framework_ledmatrix-pinctrl.dtsiI2C1 引脚复用硬件描述framework_ledmatrix.yamlflash/ram 规格与支持特性、framework_ledmatrix_defconfigUF2 输出与 code partition 默认值LED 驱动参考is31fl3733.cISSI IS31FL37xx 系列的寄存器协议与 I2C LED 实现示例应用samples/subsys/usb/consoleUSB 控制台文档烧录章节的构建示例掌握以上内容后你可以把framework_ledmatrix作为目标板卡直接构建、烧录任意 Zephyr 应用并在应用层通过 LED/I2C、输入gpio-keys与 USB 子系统分别控制 LED 矩阵、读取 DIP 开关与盖板状态、提供 USB 控制台或自定义 USB 设备。【免费下载链接】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),仅供参考