资讯动态

OMI 消费版固件完全解析:基于 nRF Connect SDK 2.9.0 的 nRF5340 双核架构、编译流程与模块开发状态

发布时间:2026/9/16 16:39:26 来源:尧图企业网站定制
OMI 消费版固件完全解析基于 nRF Connect SDK 2.9.0 的 nRF5340 双核架构、编译流程与模块开发状态【免费下载链接】FriendAI that sees your screen, listens to your conversations and tells you what to do项目地址: https://gitcode.com/GitHub_Trending/fr/FriendOMI 消费版Consumer Version固件是这款看得见屏幕、听得见对话的 AI 可穿戴设备的硬件大脑本文以 omi/firmware/omi/README.md 为主线结合仓库内的构建配置、源码与板级定义系统讲解其基于 Zephyr RTOS / nRF Connect SDKNCS的编译方法、双核 nRF5340 架构、BLE 音频流链路以及麦克风、蓝牙、按键、LED、SD 卡、触觉马达等模块的生产状态与已知待办。读完本文你将掌握该固件的完整编译配置、各核心模块的实现原理以及当前版本的已知问题与演进方向。一、项目定位与文档概览omi/firmware/omi/目录下存放的是 OMI 消费版与开发者使用的 DevKit 版本相对的固件工程。根目录的 README.md 给出了最核心的三条信息软件栈基于nRF Connect SDK 2.9.0NCSNordic 基于 Zephyr 的发行版应用与目标板应用名为omi目标板为omi/nrf5340/cpuappnRF5340 双核 Cortex-M33 的应用核当前状态WIP——已在生产环境运行running on production但仍缺少部分增强功能missing some enhancement。该 README 是固件开发与烧录的入口文档编译步骤以官方文档为参考而仓库内 CMakePresets.json、omi.conf、Kconfig、sysbuild.conf 等文件则提供了可直接落地的完整配置。注意README 强调了一个对新手非常关键的目录陷阱——必须在代码编辑器中打开firmware文件夹而不是仓库根目录omi文件夹。否则 West 无法识别工程、找不到目标板otherwise West wouldnt recognize the project and wont find your board。二、环境要求与编译方法2.1 版本与工具链要求根据 README 及仓库内 BUILD_AND_OTA_FLASH.md编译该固件需要组件要求nRF Connect SDK2.9.0v2.9.0目标板omi/nrf5340/cpuapp构建工具WestZephyr 元工具、CMake ≥ 3.20.0、Ninja其他Python 3.8、ccache、nrfutil可选用于工具链管理由于固件基于 Zephyr RTOS 且涉及双核、MCUboot、OPUS 编解码等复杂组件README 明确它不是 Arduino IDE 能编译的工程需要完整的 NCS 工具链见 readme.md。2.2 工作区初始化NCS 通过 West 管理多仓库工作区。仓库中的 BUILD_AND_OTA_FLASH.md 给出了完整流程先用nrfutil toolchain-manager install --ncs-version v2.9.0安装 SDK再启动工具链 shell在v2.9.0目录下执行nrfutil toolchain-manager launch --ncs-version v2.9.0 --shell west init -m https://github.com/nrfconnect/sdk-nrf --mr v2.9.0 west updatewest update会下载约 1.5GB 的源码包括 Zephyr RTOS、NCS 模块、MCUboot 引导程序等。2.3 编译命令与 CMake PresetsREADME 推荐使用工程自带的 CMakePresets.json 来编译。该文件定义了OMI预设{ version: 2, cmakeMinimumRequired: { major: 3, minor: 20, patch: 0 }, configurePresets: [ { name: OMI, displayName: OMI, configuration: Debug, generator: Ninja, binaryDir: ${sourceDir}/build/omi, cacheVariables: { CMAKE_EXPORT_COMPILE_COMMANDS: YES, CMAKE_BUILD_TYPE: Debug, BOARD: omi/nrf5340/cpuapp, CACHED_CONF_FILE: ${sourceDir}/omi.conf, CONF_FILE: ${sourceDir}/omi.conf } } ] }从中可以读出三个关键信息Board为omi/nrf5340/cpuapp对应仓库中 boards/omi/ 目录下的板级定义omi_nrf5340_cpuapp_defconfig、omi_nrf5340_cpuapp.dts等配置文件指向 omi.conf而非 Zephyr 默认的prj.conf这也是 BUILD_AND_OTA_FLASH.md 中提示cp omi.conf prj.conf的原因输出目录固定在build/omi采用 Ninja 生成器与 Debug 构建类型。在 NCS 环境内手动编译的等价命令为west build -b omi/nrf5340/cpuapp ../omi --sysbuild -- -DBOARD_ROOT/path/to/omi/firmware--sysbuild会串联构建 MCUboot、网络核固件ipc_radio与网络核引导b0n最终生成经 RSA 签名并打包的 OTA 固件详见下文第六节。三、工程结构与源码组织3.1 目录布局readme.md 说明了firmware/的整体结构omi/消费版主应用工程本文主角devkit/Omi DevKit1 / DevKit2 开发套件工程test/测试工程boards/自定义板级定义nRF5340 双核的分区、引脚、SRAM 共享等scripts/构建与工具脚本。消费版应用内部由 CMakeLists.txt 组织其源码分为两大块应用源码src/顶层main.c、mic.c、battery.c、led.c、haptic.c、sd_card.c、spi_flash.c、settings.c、feedback.c、wdog_facade.c、rtc.c、imu.c以及可选编译的t5838_aad.cT5838 硬件 AAD 底层驱动核心库源码src/lib/core/config.h、codec.c编解码、transport.cBLE 传输、button.c、monitor.c以及可选编译的storage.c离线存储。OPUS 编解码器以源码形式内嵌在src/lib/core/lib/opus-1.2.1/当CONFIG_OMI_CODEC_OPUS开启时通过add_subdirectory链接进固件。3.2 主循环与事件流src/main.c 展示了固件的核心数据流PDM 麦克风数据经mic_handler进入codec_receive_pcm由 OPUS 编码后的音频经codec_handler调用broadcast_audio_packets通过 BLE 推送。此外它还实现了复位原因打印看门狗复位、NFC 唤醒、引脚复位、软件复位、CPU lockup 等以及开机 LED 反馈序列蓝色脉冲 Im alive绿色呼吸 Ready!这些细节对应 README 中 LED 模块的状态反馈需求。四、核心配置逐项解读omi.conf 与 Kconfig4.1 全局配置骨架omi.confomi.conf 是消费版固件的完整 Kconfig 配置按功能域可拆解为外设与内核基础CONFIG_SERIALy / CONFIG_GPIOy / CONFIG_PWMy / CONFIG_INPUTy CONFIG_I2Cy / CONFIG_SPIy / CONFIG_SPI_NORy CONFIG_SETTINGSy / CONFIG_SETTINGS_NVSy / CONFIG_NVSy CONFIG_PM_DEVICEy / CONFIG_ADCy / CONFIG_ADC_ASYNCy CONFIG_AUDIOy / CONFIG_AUDIO_DMICy / CONFIG_FLASHy CONFIG_MAIN_STACK_SIZE4096 / CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE4096 CONFIG_HEAP_MEM_POOL_SIZE40000 CONFIG_WATCHDOGy / CONFIG_WDT_DISABLE_AT_BOOTn音频链路采用 I2S nRFX PDMCONFIG_I2Sy、CONFIG_I2S_NRFXy、CONFIG_AUDIO_DMIC_NRFX_PDMy、CONFIG_NRFX_PDM0y。文件系统选用LittleFSCONFIG_FILE_SYSTEM_LITTLEFSy配置注释说明这是为 SD NAND 选择的掉电安全方案power-loss safe, no FAT dirty-bit issues。此外还挂载了 LSM6DSL 加速度计/陀螺仪CONFIG_LSM6DSLy但生产固件中加速度计功能默认关闭见下。BLE 与音频流关键参数对应 README 中音频字节丢失问题CONFIG_BT_L2CAP_TX_MTU498 CONFIG_BT_CTLR_DATA_LENGTH_MAX251 CONFIG_BT_CTLR_PHY_2My / CONFIG_BT_CTLR_PHY_CODEDy CONFIG_BT_L2CAP_TX_BUF_COUNT20 / CONFIG_BT_BUF_ACL_RX_SIZE1024 CONFIG_BT_BUF_ACL_TX_SIZE2048 / CONFIG_BT_BUF_ACL_TX_COUNT10 CONFIG_BT_ATT_TX_COUNT20 # 首选连接参数7.5ms ~ 15ms CONFIG_BT_PERIPHERAL_PREF_MIN_INT6 CONFIG_BT_PERIPHERAL_PREF_MAX_INT12 CONFIG_BT_PERIPHERAL_PREF_LATENCY0 CONFIG_BT_PERIPHERAL_PREF_TIMEOUT600这些参数直接呼应 README 中关于音频字节丢失约 30%的修复记录Android 端通过把 BLE 连接间隔收紧到7msPREF_MIN_INT6间隔单位 1.25ms解决问题而 iOS 不允许收紧连接间隔可行间隔约为15msPREF_MAX_INT12。README 作者对此的评价是100 rps、每包 50 字节并不是大事暗示 Android 上的间隔调整更像是一个临时方案。设备信息与电池服务CONFIG_BT_BASy / CONFIG_BT_DISy CONFIG_BT_DEVICE_NAMEOmi CONFIG_BT_DIS_MODELOmi CV 1 / CONFIG_BT_DIS_MANUFBased Hardware CONFIG_BT_DIS_FW_REV_STR3.0.21 / CONFIG_BT_DIS_HW_REV_STR5.0OMI 功能开关生产默认值CONFIG_OMI_CODEC_OPUSy # OPUS 编解码 CONFIG_OMI_ENABLE_OFFLINE_STORAGEy # 离线存储SD 卡 CONFIG_OMI_ENABLE_BUTTONy # 按键 CONFIG_OMI_ENABLE_BATTERYy # 电池 CONFIG_OMI_ENABLE_HAPTICy # 触觉马达 CONFIG_OMI_ENABLE_RFSW_CTRLy # 射频开关控制 CONFIG_OMI_ENABLE_T5838_AADy # T5838 硬件 AAD超低功耗麦克风休眠 CONFIG_OMI_ENABLE_ACCELEROMETERn # 加速度计默认关闭 CONFIG_OMI_ENABLE_SPEAKERn # 扬声器默认关闭 CONFIG_OMI_ENABLE_USBn # USB 默认关闭 CONFIG_OMI_ENABLE_MONITORn # 监控/指标系统默认关闭4.2 OMI 功能菜单KconfigKconfig 定义了上述开关的语义与默认值其中较有特色的几项OMI_ENABLE_MONITOR监控/指标系统帮助文档明确建议生产环境关闭以省电、省 RAM 和 FlashDisable in production to save power, RAM, and flash space与 omi.conf 中CONFIG_LOGn、仅保留显式printk()的最小化发布输出策略一致OMI_ENABLE_T5838_AAD硬件 AAD静音一段时间后暂停 PDM 时钟让 T5838 MEMS 麦克风进入内置的声学活动检测模式约 15µA由麦克风硬件监听声音并拉高 WAKE 引脚来唤醒。相关三个调参项OMI_VAD_ABS_THRESHOLD默认 600范围 1~32767判定静音的绝对幅度阈值OMI_VAD_HOLD_MS默认 3000范围 500~30000进入硬件 AAD 休眠前的持续静音时间OMI_AAD_SETTLE_MS默认 800范围 100~3000进入 AAD 后、使能 WAKE 中断前的稳定等待时间用于吞掉入口瞬态防止误唤醒。生产 omi.conf 中这三个值分别被设为250/10000/800。OMI_WATCHDOG_TIMEOUT_MS默认 30000范围 5000~300000看门狗超时注释提示在启动期存在较长操作如 SD/LFS 预热时应调大避免误复位。五、双核架构与安全启动sysbuildnRF5340 是双核双 Cortex-M33SoC本固件通过 sysbuild.conf 组织多镜像构建SB_CONFIG_BOOTLOADER_MCUBOOTy SB_CONFIG_BOOT_SIGNATURE_KEY_FILE${APP_DIR}/../bootloader/mcuboot/root-rsa-2048.pem SB_CONFIG_PM_OVERRIDE_EXTERNAL_DRIVER_CHECKy SB_CONFIG_PM_EXTERNAL_FLASH_MCUBOOT_SECONDARYy SB_CONFIG_SECURE_BOOT_NETCOREy SB_CONFIG_MCUBOOT_UPDATEABLE_IMAGES2 SB_CONFIG_MCUBOOT_NRF53_MULTI_IMAGE_UPDATEy SB_CONFIG_NETCORE_APP_UPDATEy SB_CONFIG_MCUBOOT_MODE_OVERWRITE_ONLYy要点启用MCUboot使用仓库内 bootloader/mcuboot/root-rsa-2048.pem 作为 RSA-2048 签名密钥支持双镜像更新应用核 网络核、网络核安全启动SECURE_BOOT_NETCORE、多镜像联合升级NRF53_MULTI_IMAGE_UPDATE采用overwrite-only升级模式。配合 BUILD_AND_OTA_FLASH.md 中的内存布局说明完整的双核分区为应用核上 MCUboot64KB 应用主分区982KB 应用次分区982KBOTA 暂存 设置/NVS网络核上网络引导34KB 网络主分区222KB 网络次分区222KB。板级定义位于 boards/omi/其中omi_nrf5340_cpuapp_defconfig、omi_nrf5340_cpuapp.dts、omi_nrf5340_cpunet.dts、omi-shared_sram.dtsi、omi-cpuapp_partitioning.dtsi、pm_static.yml共同定义了双核各自的引脚、内存分区与共享 SRAM是每款硬件版本需要独立构建README 与 readme.md 均强调的底层依据。六、构建产物与 OTA 升级6.1 构建产物编译成功后build/目录会产出数据见 BUILD_AND_OTA_FLASH.mddfu_application.zip约 440KB给 nRF Connect 手机 App 用的主 OTA 包dfu_application.zip_manifest.json包元数据merged.hex约 869KB完整固件可直接编程器烧写signed_by_mcuboot_and_b0_ipc_radio.hex签名后的应用固件merged_CPUNET.hex约 533KB网络核固件build_info.yml、partitions.yml构建配置摘要与分区布局各子组件构建目录omi/、mcuboot/、ipc_radio/、b0n/。参考的编译内存占用该文档示例数据FLASH 262908 B / 982528 B26.76%RAM 244556 B / 440KB54.28%。6.2 OTA 流程OTA 升级依赖 omi.conf 中开启的CONFIG_NCS_SAMPLE_MCUMGR_BT_OTA_DFUy与CONFIG_MCUMGR_GRP_IMG_ALLOW_ERASE_PENDINGy。完整流程为将dfu_application.zip传输到手机打开 nRF Connect for Mobile扫描并连接名为 Omi 的设备进入 DFU 标签页选择dfu_application.zip并开始升级固件上传到次分区约 2~3 分钟随后校验、交换分区并自动重启。升级期间设备重启后进入新固件即视为成功。MCUmgr 使用加密的 BLE 传输配合 RSA-2048 签名实现安全升级与回滚保护。七、模块开发状态与已知问题WIP 清单全解README 的 WIP 章节是理解当前固件成熟度的核心逐条解读如下7.1 新模块测试进度7/9 通过模块状态说明麦克风 Mic✅ 完成采集音频字节、激活第二颗麦克风BLE✅ 完成音频流传输按键 Buttons✅ 完成开关机进入 deepsleep、长按与 OMI 对话LEDs✅ 完成充电、BLE 连接/断开状态反馈Wi-Fi⚠️ 部分完成README 标注 partially马达 Motors✅ 完成触觉反馈QSPI Flash✅ 完成片外 SPI NOR 存储IMU❌ 未完成惯性测量单元尚未完成测试SD 卡✅ 完成文件存储 BLE 传输7.2 MCUboot 支持已完成的子项包括基础 MCUboot 集成、与 OMI AppiOS/Android联调、以及纯电池供电不带充电器设备上的启动测试——这对可穿戴设备至关重要因为不带充电器时无法通过外接供电掩盖功耗问题。7.3 流式传输与转写Streaming and Transcribing这是固件的核心业务链路全部子项完成麦克风采集音频字节激活第二颗麦克风双麦降噪/拾音BLE 传输OPUS 编码与发送对应CONFIG_OMI_CODEC_OPUS与内嵌的 opus-1.2.1 源码修复音频字节丢失问题曾约 30% 丢包率Android通过提高 BLE 连接间隔7ms修复但作者坦承这并非理想方案tbh i dont think this is a good solution因为 DevKit 在不调整连接间隔时也能正常工作iOS系统不允许提高连接间隔CI可行的 CI 约为 15ms。7.4 外围反馈LED、按键、触觉LED充电、BLE 连接、BLE 断开三种状态均有反馈已修复充电 关机状态下只有绿灯、反馈不正确的问题充电功能本身正常。按键开关机进入 deepsleep、长按与 OMI 对话deepsleep 模式下的电池耗电已测试。触觉Haptic开关机震动、长按对话震动待办是复查量产版马达the current motor is not good。7.5 存储与电量SD 卡2/3 完成文件存储 ✅、通过 BLE 传输 ✅、通过 Wi-Fi 传输 ❌未完成。电池1/2 完成通过 BLE 上报电量百分比 ✅修复充电时电量不准的问题❌。充电器模块本身无未完成子项。7.6 离线存储机制readme.md 补充说明了离线存储的完整行为只要设备与 App 无 BLE 连接存储即自动激活每次开机都会新建一个文件并开始写入 OPUS 编码数据一旦连接 App存储内容开始向 App 流式传输传输完成后尝试删除设备上的文件。需要留意的是离线存储包的格式与实时流式音频包不同。此外调试文档提示离线存储当前为实验性功能开启日志会占用 BLE 传输或 SD 卡写入性能可设置CONFIG_LOG_PROCESS_THREAD_PRIORITY5与CONFIG_LOG_PROCESS_THREAD_CUSTOM_PRIORITYy缓解。八、调试与开发建议8.1 USB 串口调试readme.md 给出了 DevKit2 上开启 USB 串口调试的方法消费版同样适用在对应.conf中开启CONFIG_CONSOLEy、CONFIG_PRINTKy、CONFIG_LOGy、CONFIG_LOG_PRINTKy、CONFIG_UART_CONSOLEy并用 nRF Serial TerminalVS Code 扩展查看输出完整在线调试需要 J-Link 调试器。注意生产版 omi.conf 默认CONFIG_LOGn只保留显式printk()输出。8.2 常见构建问题排查ModuleNotFoundError: No module named cryptography多半是没在 nrfutil 工具链 shell 内构建No board named omi found检查BOARD_ROOT是否指向firmware目录No prj.conf file found先cp omi.conf prj.conf或使用 CMakePresets它会显式指定CONF_FILEomi.conf看门狗误复位启动期有 SD/LFS 预热等长操作时调大OMI_WATCHDOG_TIMEOUT_MS。九、总结OMI 消费版固件是一个典型的 Zephyr/NCS 双核可穿戴应用nRF5340 应用核负责 OPUS 音频编码、BLE GATT 流式传输、离线 SD 存储与各外设管理网络核承载 BLE 协议栈MCUboot RSA-2048 签名保障安全 OTA。README 中production-ready 但仍有增强空间的定位与其 WIP 清单高度一致核心音频链路双麦采集 → OPUS 编码 → BLE 发送已全部打通Android 丢包问题通过连接间隔调优解决而 iOS 间隔受限、Wi-Fi 传输、IMU、充电电量精度、量产马达手感等仍是后续迭代的重点方向。对想要深入 Zephyr 可穿戴固件开发或参与 OMI 固件改进的开发者建议从 omi.conf 与 Kconfig 的 OMI 功能开关入手配合 src/main.c 的主循环与 src/lib/core/transport.c 的 GATT 音频服务逐步阅读源码。【免费下载链接】FriendAI that sees your screen, listens to your conversations and tells you what to do项目地址: https://gitcode.com/GitHub_Trending/fr/Friend创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价