WiFi 婴儿监护方案 (wifi_bbm)
AC792N SDK(release/AC792N_SDK_V3)中面向 WiFi 婴儿监护器(Baby Monitor,BBM)的完整应用工程。方案以 TX(摄像头端)与 RX(显示端)双端设备为硬件形态,基于 WiFi RAW 直连链路实现实时音视频传输、AVI 录像封装、双向语音、音量同步与 LVGL UI 显示,覆盖从板级配置、任务/中断编排到应用层音视频管线的完整链路。
Purpose and Scope
本页介绍 sdk/apps/wifi_bbm 应用工程的整体架构与关键实现,内容包括:
- 应用入口与运行时骨架:
app_main.c中的中断表、任务表与默认按键处理; - 应用级配置中心:
include/app_config.h中的功能开关、资源分区与网络/配网选项; - WiFi 音视频链路:采集 → 编码 → AVI 封装 → WiFi 传输 → 解码 → 显示/播放的任务编排;
- 板级与硬件形态:
board/wl83板级目录、TX/RX 硬件方案(AC7923A/B/C)及配套原理图资料; - LVGL UI 资源与 WiFi 信号图标资源。
以下内容属于兄弟页面范畴,本页仅作交叉指引、不展开:通用 WiFi 协议栈与配网流程(AIRKISS/WSC/声波配网)、音频算法细节(AEC/音效处理)、LVGL 控件开发、SDK 底层驱动(flash、SDNAND 文件系统、RF TRIM 等)。
Overview
婴儿监护方案是杰理 AC792N 系列芯片的典型联网音视频应用:TX 端通过 MIPI 或 DVP 接口接入摄像头、通过麦克风采集环境声音,编码后经 WiFi 无线链路发送;RX 端接收码流,将视频显示在 MIPI 或 RGB 屏幕上、将音频经 DAC 播放,并可反向发送对讲语音。双端共用同一份应用代码,通过板级配置(board/wl83)区分角色。
关键设计意图:
- 任务表驱动:整个应用在 RTOS 上以
task_info_table静态声明的方式编排,每个任务的优先级、栈大小、队列大小一目了然,便于按产品形态裁剪(例如TCFG_WIFI_ENABLE/CONFIG_VIDEO_ENABLE/CONFIG_UI_ENABLE决定是否挂载对应任务组)。 - 配置与代码分离:
app_config.h集中管理功能开关(PA、Opus、视频解码、资源分区、网络能力),并通过条件编译联动sdk_config.h与board_config.h,换板只需改板级目录。 - 资源分区显式规划:UI、提示音、LOGO 资源在 flash 扩展预留区按固定地址排布,尾部 4K 保留给配置存储,避免生命周期后期的资源冲突。
- 硬件形态可扩展:原理图资料覆盖 AC7923A(MIPI 摄像头/MIPI 屏幕)、AC7923B(DVP 摄像头/RGB 屏幕)、AC7923C(推荐,TX/RX 分离设计),同一套应用代码适配三种硬件。
Architecture
flowchart TD
subgraph sg_App["应用层 (sdk/apps/wifi_bbm)"]
AppCore["app_core 任务 (app_main.c)"]
UI["lvgl_v8_main_task<br/>LVGL UI (240x320)"]
AudioFx["mic_effect / aec / audio_enc<br/>音频采集与音效"]
VideoRec["video0_rec / audio0_rec<br/>音视频采集编码"]
AviLib["net_avi / avilib<br/>AVI 流封装"]
NetVideo["net_video_server<br/>视频网络服务"]
CTP["ctp_server<br/>控制/配置传输"]
end
subgraph sg_Wifi["WiFi 传输层 (TCFG_WIFI_ENABLE)"]
Tasklet["tasklet / RtmpMlmeTask / RtmpCmdQTask"]
WlRx["wl_rx_irq_thread / wl_rx_query_thread"]
VP["voiceprint / change_channel"]
end
subgraph sg_Board["板级配置 (board/wl83)"]
BoardCfg["board_config.h / sdk_config.h"]
ChipCfg["chip_cfg.h / jlstream_node_cfg.h"]
end
subgraph sg_Hw["硬件形态 (TX / RX)"]
TX["TX: MIPI/DVP 摄像头 + 麦克风"]
RX["RX: MIPI/RGB 屏幕 + DAC 扬声器"]
end
AppCore --> UI
AppCore --> AudioFx
AppCore --> VideoRec
VideoRec --> AviLib
AviLib --> NetVideo
NetVideo --> Tasklet
CTP --> Tasklet
Tasklet --> WlRx
AppCore --> CTP
AppCore --> BoardCfg
BoardCfg --> ChipCfg
TX --> VideoRec
TX --> AudioFx
UI --> RX
AudioFx --> RX
架构分层说明:
- 应用层:
app_core是主任务(优先级 15、栈 2048 字、队列 1024),负责初始化与消息分发;lvgl_v8_main_task(优先级 25、栈 8192)承载 240x320 的 LVGL UI;video0_rec/audio0_rec等任务负责采集编码,net_avi/stream_avi与avilib目录共同构成 AVI 流的封装/发送管线;net_video_server为视频网络服务任务。 - WiFi 传输层:
tasklet任务注释明确指出"通过调节任务优先级平衡 WIFI 收发占据总 CPU 的比重",wl_rx_irq_thread/wl_rx_query_thread承担接收中断与查询处理;voiceprint、change_channel为 WiFi 配套任务。 - 板级配置:
app_config.h通过#include "sdk_config.h"与#include "board_config.h"引入板级定义,二者位于board/wl83目录,是换板适配的唯一入口。 - 硬件形态:TX 负责采集编码发送,RX 负责接收解码显示播放;
audio/mic_effect.c、audio/scene_switch.c、audio/vol_sync.c等模块支撑双向语音与 RX/TX 音量同步等 BBM 特有功能。
注:
ctp_server、net_video_server等任务仅以任务表名义列出;其内部协议实现细节未在本页展开,属于 WiFi/网络子系统页面的范畴。
应用配置中心 (app_config.h)
include/app_config.h 是 BBM 应用的功能总开关。它以宏定义的方式集中控制音频/视频/网络/资源分区/调试能力,并向下联动 sdk_config.h 与 board_config.h。该文件由 app_main.c 等应用源文件包含,是整个工程的配置入口。
音视频编码采样源
文件开头定义了编码采样源枚举,供音频编码(audio_enc)选择输入通道:
Source: app_config.h
#define AUDIO_ENC_SAMPLE_SOURCE_MIC 0
#define AUDIO_ENC_SAMPLE_SOURCE_PLNK0 1
#define AUDIO_ENC_SAMPLE_SOURCE_PLNK1 2
#define AUDIO_ENC_SAMPLE_SOURCE_IIS0 3
#define AUDIO_ENC_SAMPLE_SOURCE_IIS1 4
#define AUDIO_ENC_SAMPLE_SOURCE_LINEIN 5
#define CONFIG_AUDIO_DEC_PLAY_SOURCE "dac"
设计意图:BBM 双端都需要音频——TX 采集婴儿房声音编码上行,RX 解码后从 dac 播放;对讲时 RX 端麦克风声音反向编码。采样源宏允许同一份代码在 MIC、PLNK(对讲链路)、IIS、LINEIN 之间切换,适配不同硬件接线。
BBM 专属功能开关
Source: app_config.h
//PA使能
//此宏只控制了应用相关配置:WIFI增益等参数.
//PA生效需要wifi_conf.c的WIFI_PA_ENABLE变量要手动置1
#define BBM_WIFI_PA_ENABLE 1
//音频编码使用opus. 默认为pcm.
//使能opus需要修改可视化工具配置,输出对应的stream.bin
#define BBM_AUDIO_OPUS_ENABLE 0
#define CONFIG_VIDEO_DEC_ENABLE 1
BBM_WIFI_PA_ENABLE:打开 WiFi 射频 PA(功率放大器)相关应用配置。注释特别强调:该宏只控制应用层增益等参数,真正使能 PA 还需把wifi_conf.c中的WIFI_PA_ENABLE变量手动置 1——这是最容易踩的配置联动坑。BBM_AUDIO_OPUS_ENABLE:默认 0 表示音频编码使用 PCM;切到 Opus 需要同步修改可视化工具配置并输出对应的stream.bin,即编码配置由工具生成、与代码宏必须保持一致。CONFIG_VIDEO_DEC_ENABLE:RX 端视频解码总开关。
外围功能条件裁剪
app_config.h 依据芯片配置项对应用功能做二次裁剪:
Source: app_config.h
#if TCFG_IIS_NODE_ENABLE
#undef TCFG_ESCO_DL_CVSD_SR_USE_16K
#define TCFG_ESCO_DL_CVSD_SR_USE_16K 0
#endif
#ifndef CONFIG_BT_ENABLE
#undef TCFG_APP_BT_EN
#define TCFG_APP_BT_EN 0
#endif
#ifndef CONFIG_NET_ENABLE
#undef TCFG_APP_NET_MUSIC_EN
#define TCFG_APP_NET_MUSIC_EN 0
#endif
#if !defined TCFG_PC_ENABLE || !TCFG_PC_ENABLE
#undef TCFG_APP_PC_EN
#define TCFG_APP_PC_EN 0
#endif
设计意图:BBM 是"纯音视频直连"设备,若平台未使能 BT/网络/PC 能力,则应用层对应开关必须同步关闭,防止空跑任务浪费 CPU 与内存;IIS 节点使能时强制关闭 ESCO CVSD 16K 采样,避免与 IIS 通道的资源冲突。
flash/SDNAND 资源分区
使能 SD 文件扩展(CONFIG_SDFILE_EXT_ENABLE)时,工程把 flash 固定为 16MB,并规划 SDNAND 分区(HFS 16M、HFAT 4G、FAT1 8G),同时根据分区大小自动推导 FAT 簇大小(CONFIG_SDNAND_HFAT_CLUSTER_SIZE,32768/512 = 0x40 等)。这部分为录像与升级预留存储。
UI、提示音、LOGO 三类资源按"扩展预留区"模型排布,flash 尾部 4K 保留给配置存储、禁止覆盖:
Source: app_config.h
#if defined CONFIG_UI_FILE_SAVE_IN_RESERVED_EXPAND_ZONE
// #define CONFIG_UI_PACKRES_LEN 0x200000
#define CONFIG_UI_PACKRES_LEN 0x019000
#define CONFIG_UI_PACKRES_ADR ((__FLASH_SIZE__) - (CONFIG_UI_PACKRES_LEN) - 0x1000)
#endif
#if defined CONFIG_VOICE_PROMPT_FILE_SAVE_IN_RESERVED_EXPAND_ZONE
#if defined CONFIG_UI_FILE_SAVE_IN_RESERVED_EXPAND_ZONE
#define CONFIG_AUDIO_PACKRES_LEN 0xC800
#define CONFIG_AUDIO_PACKRES_ADR (CONFIG_UI_PACKRES_ADR - CONFIG_AUDIO_PACKRES_LEN)
#else
#define CONFIG_AUDIO_PACKRES_LEN 0xC800
#define CONFIG_AUDIO_PACKRES_ADR ((__FLASH_SIZE__) - CONFIG_AUDIO_PACKRES_LEN - 0x1000)
#endif
#endif
#define CONFIG_LOGO_FILE_SAVE_IN_RESERVED_EXPAND_ZONE
#if defined CONFIG_LOGO_FILE_SAVE_IN_RESERVED_EXPAND_ZONE
#define CONFIG_LOGO_PACKRES_LEN 0x025800
#define CONFIG_LOGO_PACKRES_ADR ((__FLASH_SIZE__) - (CONFIG_UI_PACKRES_LEN) - 0x1000 - CONFIG_AUDIO_PACKRES_LEN - CONFIG_LOGO_PACKRES_LEN)
#endif
布局规则(文件内注释给出了 ASCII 图):从 flash 末尾向上依次为 4K 保留区 → UI 资源 → 音频资源 → LOGO 资源。地址全部由宏自动推导,修改任一资源长度必须保持该顺序与末尾 4K 保留不变,否则会覆盖配置存储区。
调试与网络配置
- 调试类:
CONFIG_CXX_SUPPORT(C++ 支持)、CONFIG_MPU_DEBUG_ENABLE、CONFIG_LZ4_COMPRESS_APP_CODE_ENABLE(LZ4 压缩代码段,省 flash)、CONFIG_DEBUG_ENABLE、CONFIG_RTOS_STACK_CHECK_ENABLE、CONFIG_SAVE_EXCEPTION_LOG_IN_FLASH、CONFIG_MEM_LEAK_CHECK_ENABLE等,均随TCFG_*配置联动。 - 网络类:
TCFG_AI_SERVER_DISABLE 0、TCFG_DUER_ENABLE 1(使能 DuerOS AI 能力);RF TRIM 运行代码在CONFIG_SFC_ENABLE+CONFIG_NO_SDRAM_ENABLE时动态加载到 RAM 运行,否则固定到 RAM——两种策略都用于防止 RF TRIM 期间 500ms 大电流访问 flash 造成 flash 挂掉并持续大电流(低内存成本换取可靠性)。 - 配网类:
CONFIG_AIRKISS_NET_CFG、CONFIG_WSC_NET_CFG默认被注释(BBM 为点对点直连场景,配网非核心);CONFIG_ACOUSTIC_COMMUNICATION_ENABLE(声波配网)随TCFG_ACOUSTIC_COMMUNICATION_NODE_ENABLE使能;CONFIG_ASSIGN_MACADDR_ENABLE使能时首次联网由杰理服务器分配 MAC。
Configuration Options
| 配置宏 | 类型 | 默认值 | 说明 |
|---|---|---|---|
BBM_WIFI_PA_ENABLE | int | 1 | WiFi PA 应用层配置(增益等);真正生效还需 wifi_conf.c 的 WIFI_PA_ENABLE 置 1 |
BBM_AUDIO_OPUS_ENABLE | int | 0 | 音频编码 Opus(需配套 stream.bin),默认 PCM |
CONFIG_VIDEO_DEC_ENABLE | int | 1 | RX 端视频解码使能 |
CONFIG_AUDIO_DEC_PLAY_SOURCE | string | "dac" | 音频解码播放输出源 |
AUDIO_ENC_SAMPLE_SOURCE_MIC/PLNK0/PLNK1/IIS0/IIS1/LINEIN | enum | 0~5 | 音频编码采样源选择 |
TCFG_DUER_ENABLE | int | 1 | 使能 DuerOS AI 服务 |
TCFG_AI_SERVER_DISABLE | int | 0 | 禁用 AI 服务器 |
CONFIG_UI_PACKRES_LEN | hex | 0x019000 | UI 资源在扩展预留区的长度 |
CONFIG_AUDIO_PACKRES_LEN | hex | 0xC800 | 提示音资源长度 |
CONFIG_LOGO_PACKRES_LEN | hex | 0x025800 | LOGO 资源长度 |
CONFIG_SDNAND_HFAT_CLUSTER_SIZE | hex | 0x40 | SDNAND HFAT 分区簇大小(32768B/512B) |
WIFI_DEFAULT_PWR | int | 3 | 默认 WiFi 发射功率(BBM_WIFI_PA_ENABLE=1 时生效,见 wifi_raw.h) |
CONFIG_ASSIGN_MACADDR_ENABLE | bool | 随 TCFG | 首次联网用杰理服务器分配 MAC |
CONFIG_AIRKISS_NET_CFG / CONFIG_WSC_NET_CFG | bool | 关闭 | 配网方式(BBM 默认点对点直连,注释关闭) |
CONFIG_ACOUSTIC_COMMUNICATION_ENABLE | bool | 随 TCFG | 声波配网 |
CONFIG_LZ4_COMPRESS_APP_CODE_ENABLE | bool | 开 | LZ4 压缩应用代码段 |
CONFIG_RF_TRIM_CODE_MOVABLE / CONFIG_RF_TRIM_CODE_AT_RAM | bool | 随 SFC/SDRAM | RF TRIM 代码运行位置(防 flash 大电流挂死) |
运行时骨架:任务表与中断表 (app_main.c)
app_main.c 定义了整套应用的运行时骨架,包括中断注册表 irq_info_table、静态任务栈缓冲与任务列表 task_info_table,以及默认按键事件处理。
中断表
Source: app_main.c
/*中断列表 */
const struct irq_info irq_info_table[] = {
//中断号 //优先级0-7 //注册的cpu(0或1)
#ifdef CONFIG_IPMASK_ENABLE
//不可屏蔽中断方法:支持写flash,但中断函数和调用函数和const要全部放在内部ram
{ IRQ_SOFT5_IDX, 6, 0 }, //此中断强制注册到cpu0
{ IRQ_SOFT4_IDX, 6, 1 }, //此中断强制注册到cpu1
#endif
#if CPU_CORE_NUM == 1
{ IRQ_SOFT5_IDX, 7, 0 },
{ IRQ_SOFT4_IDX, 7, 1 },
{ -2, -2, -2 },//如果加入了该行, 那么只有该行之前的中断注册到对应核, 其他所有中断强制注册到CPU0
#endif
{ IRQ_BT_TIMEBASE_IDX, 5, 0 },
{ IRQ_BLE_RX_IDX, 5, 0 },
{ IRQ_BLE_EVENT_IDX, 5, 0 },
{ IRQ_BT_CLKN_IDX, 5, 0 },
{ IRQ_BREDR_IDX, 5, 0 },
{ -1, -1, -1 },
};
要点:软中断 IRQ_SOFT5/SOFT4 在 CONFIG_IPMASK_ENABLE 下以优先级 6 强制绑定 CPU0/CPU1,作为不可屏蔽中断(NMI)使用,支持在中断里写 flash——代价是中断函数、被调函数与 const 数据必须全部放内部 RAM;蓝牙相关中断统一注册到 CPU0;{ -1, -1, -1 } 为表结束符。
静态任务栈与任务表
系统关键任务(app_core、sys_event、systimer、sys_timer)使用静态分配的内存缓冲,避免启动期动态分配失败:
Source: app_main.c
#define SYS_TIMER_STK_SIZE 512
#define SYS_TIMER_Q_SIZE 256
static u8 sys_timer_tcb_stk_q[sizeof(StaticTask_t) + SYS_TIMER_STK_SIZE * 4 + sizeof(struct task_queue) + SYS_TIMER_Q_SIZE] ALIGNE(4);
#define APP_CORE_STK_SIZE 2048
#define APP_CORE_Q_SIZE 1024
static u8 app_core_tcb_stk_q[sizeof(StaticTask_t) + APP_CORE_STK_SIZE * 4 + sizeof(struct task_queue) + APP_CORE_Q_SIZE] ALIGNE(4);
task_info_table 是应用的全部任务清单,每项为 { 任务名, 优先级, 栈大小, 队列大小, 静态缓冲 }。按能力分组如下(数据均来自 app_main.c):
| 分组 | 任务(优先级) | 职责 |
|---|---|---|
| 系统 | app_core(15)、sys_event(29)、systimer(14)、sys_timer(9)、thread_fork_kill(25)、dlog(1) | 应用主控、事件分发、定时器、日志 |
| 媒体 | jlstream(23)、a2dp_dec(24)、file_dec(24)、file_cache(26)、write_file(25)、vir_data_tx(25) | 音频流/文件解码与写入 |
| 音频增强 | mic_effect(26)、audio_enc(26)、aec(26)、aud_capture(24)、dac(22)、spec(23)、spec_adv(23)、kws(3)、smart_voice(11)、audio_vad(11)、key_tone(25)、cvp_ref(24)、CVP_RefTask(26) | 麦克风音效、编码、回声消除、采集、播放、频谱、唤醒词 |
| 外设/升级 | usb_msd(1)、uda_main(2)、update(21)、dw_update(21)、uac_play(26)、uac_record(26) | USB 存储、升级、UAC |
| 网络 | update_rtc_task(1)、ntp_client_get_time(10)、get_profile_task(22)、get_macaddr_task(22)、tcpip_thread(16)、iperf_test(15)、net_download_task(11)、websocket_client_recv(18)、websocket_client_heart(19) | RTC/NTP、配置下发、MAC 分配、iperf 测试、WebSocket |
| WiFi | voiceprint(11)、change_channel(10)、tasklet(10)、RtmpMlmeTask(17)、RtmpCmdQTask(17)、wl_rx_irq_thread(7)、wl_rx_query_thread(2)、ctp_server(28)、net_video_server(16)、net_avi0/1(18)、net_mov0/1(18)、mov_unpkg0(18)、stream_avi0/1(18)、stream_mov0/1(18) | WiFi 收发、信道切换、视频/AVI/MOV 网络流 |
| 蓝牙 | btencry(14)、btctrler(19)、btstack(18)、app_proto(14) | BR/EDR/BLE 协议栈 |
| 视频 | video_server(16)、video_server_transfer(23)、vpkg_server(16)、video0_rec~video3_rec(20)、audio0_rec~audio3_rec(20)、net_avi(18)、avi(11)、jpg_dec(10)、dynamic_huffman(15)、video_dec_server(16)、vunpkg_server(16) | 视频采集/解码/打包 |
| UI | lvgl_v8_main_task(25,栈 8192,队列 1024) | LVGL v8 UI 主任务 |
任务优先级的设计意图在注释中直接体现:
mic_effect注释"麦克风音效任务优先级要高"(26);audio_enc注释"为了防止 dac buf 太大,通话一开始一直解码,导致编码输入数据需要很大的缓存,这里提高编码的优先级"(26);tasklet注释"通过调节任务优先级平衡 WIFI 收发占据总 CPU 的比重"(10)——这是 WiFi 吞吐与音视频实时性之间的调优旋钮;file_dec注释"file dec任务不打断jlstream任务运行,故优先级低于jlstream"。
默认按键处理
app_default_key_click / app_default_key_long 为默认单击/长按处理,对 KEY_OK/UP/DOWN/MODE/POWER/VOLUME_* 等键位给出空实现分支,应用层在此基础上挂接业务(如 TX 端对讲键、RX 端音量键)。详见 app_main.c。
Core Flow
TX → RX 音视频实时传输
sequenceDiagram
participant T_CAM as TX 摄像头
participant T_ENC as video0_rec / audio0_rec
participant T_AVI as net_avi / avilib
participant WIFI as WiFi RAW 链路
participant R_VID as net_video_server
participant R_APP as RX app_core
participant R_UI as LVGL UI / DAC
T_CAM->>T_ENC: MIPI/DVP 采集音视频
activate T_ENC
T_ENC->>T_ENC: 编码(PCM/视频编码)
T_ENC->>T_AVI: 编码后码流
deactivate T_ENC
activate T_AVI
T_AVI->>T_AVI: AVI 流封装(stream_avi0 发送队列)
T_AVI->>WIFI: 打包发送
deactivate T_AVI
WIFI->>R_VID: 无线接收
activate R_VID
R_VID->>R_APP: 解码分发
deactivate R_VID
R_APP->>R_UI: 视频显示 + DAC 播放
R_UI-->>WIFI: 对讲语音 / vol_sync 音量同步
启动与任务编排流程
flowchart TD
Start([上电启动]) --> Irq["注册 irq_info_table 中断"]
Irq --> Task["构建 task_info_table 任务表"]
Task --> AppCore["app_core 启动"]
AppCore --> Cfg{"TCFG_WIFI_ENABLE?"}
Cfg -->|"是"| WifiTask["挂载 WiFi/视频网络任务组<br/>tasklet / net_video_server / net_avi0"]
Cfg -->|"否"| SkipWifi["不创建 WiFi 任务"]
AppCore --> Vid{"CONFIG_VIDEO_ENABLE?"}
Vid -->|"是"| VidTask["挂载 video0_rec / avi / video_dec_server"]
Vid -->|"否"| SkipVid["不创建视频任务"]
AppCore --> Ui{"CONFIG_UI_ENABLE?"}
Ui -->|"是"| UiTask["lvgl_v8_main_task 启动 UI"]
Ui -->|"否"| SkipUi["无 UI 任务"]
WifiTask --> Ready([业务就绪: 采集/传输/显示])
VidTask --> Ready
UiTask --> Ready
SkipWifi --> Ready
SkipVid --> Ready
SkipUi --> Ready
流程要点:中断表先于任务表生效,保证外设中断在任务创建前即可安全响应;app_core 启动后按编译期能力宏裁剪任务组,BBM 的 TX/RX 形态差异正是通过这套条件编译体现——例如 RX 使能 CONFIG_VIDEO_DEC_ENABLE 与 CONFIG_UI_ENABLE,TX 侧重采集编码与发送任务。
音视频链路模块
AVI 录像/流封装 (avilib)
sdk/apps/wifi_bbm/avilib/ 提供 AVI 容器封装库(avilib.c/h + platform.c/h),配合任务表中的 avi(优先级 11)、net_avi/net_avi0/net_avi1(18)、stream_avi0/1(18)与 mov_unpkg0、net_mov0/1、stream_mov0/1 构成完整的 AVI/MOV 网络流封装与解包管线。该目录与 net_avi* 任务共同支撑两种用法:
- 录像:TX 端把编码后的音视频写入 AVI 文件(配合
write_file、SDNAND FAT 分区),实现婴儿监护的本地录像回放; - 网络流:通过
stream_avi0发送队列把 AVI 流经 WiFi 链路推给 RX 端,RX 端由net_video_server、vunpkg_server等任务解包后送video_dec_server解码显示。
由于本页未深入 avilib 内部实现,具体容器写索引、seek 等 API 请以 avilib.h 为准(属音视频编解码页面范畴)。
音频业务模块 (audio/)
audio/ 目录集中 BBM 特有的音频业务:
| 文件 | 职责推断(依据任务表与命名) |
|---|---|
mic_effect.c | 麦克风音效处理,对应 mic_effect 任务(优先级 26,"麦克风音效任务优先级要高") |
scene_switch.c | 场景切换(如监护/对讲/休眠场景) |
vol_sync.c | RX/TX 音量同步——双端音量联动,避免一端调音另一端不同步 |
tone_table.c | 提示音表(按键音、事件提示音),配合 key_tone 任务 |
这些模块与 aec(回声消除)、audio_enc(编码)、dac(播放)任务协作:对讲时 RX 端麦克风采集 → aec 消回声 → audio_enc 编码 → WiFi 上行至 TX 播放,实现"双向语音"。
WiFi 传输与 PA 配置 (wifi_raw.h)
WiFi 原始传输(RAW)是 BBM 点对点直连的承载方式。wifi/wifi_raw.h 中针对 BBM 的 PA 配置如下:
Source: wifi_raw.h
#if BBM_WIFI_PA_ENABLE
#define WIFI_DEFAULT_PWR 3 // 默认使用的发射功率
含义:当 app_config.h 的 BBM_WIFI_PA_ENABLE 为 1 时,WiFi 默认发射功率取 3(该值对应硬件 PA 增益档位)。wifi_raw 直连模式省去路由器/AP 中转,降低时延,适合"摄像头↔屏幕"的近距离固定场景;tasklet 优先级(10)是平衡 WiFi 收发 CPU 占比的调优点。
板级与 UI
板级目录 (board/wl83)
board/wl83 是 AC792N 平台的板级适配目录:
| 文件 | 作用 |
|---|---|
AC792N_WIFI_BBM.cbp | Code::Blocks 工程文件(编译入口) |
Makefile | 构建脚本 |
board_config.h | 板级引脚/外设配置(被 app_config.h include) |
sdk_config.c/h | SDK 级配置(被 app_config.h include) |
chip_cfg.h | 芯片级配置 |
board_develop_AC7925B.h / board_develop_AC7926A.h / board_develop.c | 开发板差异适配 |
jlstream_node_cfg.h | jlstream 音频节点配置 |
换板流程:复制 board/wl83 目录 → 修改 board_config.h 引脚与 sdk_config.h 能力开关 → 重新编译,应用层无需改动。
LVGL UI 资源
UI 采用 LVGL v8,工程位于 lvgl_v8_ui_app/,配套 240x320 分辨率 UI 工程(wifi_bbm_240x320)。生成资源中包括 WiFi 信号强度图标:
Source: res_common.h
typedef enum {
GUI_RES_WIFI_1_PNG = 0x4B000000, //F:\gitlab-m\ac792\ui_prj\wifi_bbm_240x320\import\image\wifi_1.png
GUI_RES_WIFI_2_PNG = 0x4B000001, //...\wifi_2.png
GUI_RES_WIFI_3_PNG = 0x4B000002, //...\wifi_3.png
GUI_RES_WIFI_4_PNG = 0x4B000003, //...\wifi_4.png
GUI_RES_WIFI_5_PNG = 0x4B000004, //...\wifi_5.png
} GUI_RES_ID;
5 档 WiFi 信号图标(wifi_1 ~ wifi_5)由上层根据链路 RSSI 动态切换,在 RX 屏幕显示 RX↔TX 连接质量。UI 资源打包后存放于 app_config.h 规划的扩展预留区(CONFIG_UI_PACKRES_ADR)。
硬件形态(TX/RX)
doc/硬件资料/原理图/Baby Monitor/ 提供三套 BBM 原理图,全部按 TX(摄像头端)+ RX(显示端)双板设计:
| 方案 | TX 端 | RX 端 |
|---|---|---|
| AC7923A | MIPI 摄像头 | MIPI 屏幕 |
| AC7923B | DVP 摄像头 | RGB 屏幕 |
| AC7923C(推荐) | 通用 TX 板 | 通用 RX 板(V1.1 推荐版) |
同一固件通过板级配置区分 TX/RX 角色,配合 app_config.h 的能力宏(视频解码/UI 开关)即可产出两端镜像。
Failure Modes, Edge Cases & Concurrency
基于源码注释与配置可见的风险点:
- PA 使能不同步:
BBM_WIFI_PA_ENABLE=1仅配应用层增益,若忘记把wifi_conf.c的WIFI_PA_ENABLE置 1,会出现"代码已配、射频未开"的静默失效——功率/信号异常时优先排查此联动点。 - Opus 配置漂移:
BBM_AUDIO_OPUS_ENABLE=1但未用可视化工具输出对应stream.bin,编码配置与固件不一致,导致 RX 解码失败/杂音。改动编码格式必须"工具配置 + 代码宏"同步。 - flash 尾部 4K 覆盖:资源预留区布局以
__FLASH_SIZE__ - 0x1000为基准,任何资源长度调整若破坏"UI→音频→LOGO→4K 保留"的顺序,会覆盖配置存储区,造成配置丢失。 - RF TRIM 大电流风险:
CONFIG_RF_TRIM_CODE_MOVABLE(动态载入 RAM)或CONFIG_RF_TRIM_CODE_AT_RAM(固定 RAM)二选一,防止 RF TRIM 期间 500ms 大电流访问 flash 导致 flash 挂掉并持续大电流;无 SDRAM 的封装下必须保留该保护。 - NMI 写 flash 约束:
CONFIG_IPMASK_ENABLE下软中断可写 flash,但中断函数、被调函数和 const 数据必须全部放内部 RAM,否则中断触发时可能访问 flash 导致不可重入。 - 并发/优先级权衡:WiFi 收发(
tasklet优先级 10)与音视频编码(audio_enc/mic_effect26)共享 CPU。tasklet优先级调高则 WiFi 吞吐上升但音视频可能卡顿;调低则反之。通话场景下audio_enc必须保持高优先级,否则 dac 缓冲会被持续解码打满、编码输入缓存暴涨。
Performance & Operational Notes
- WiFi CPU 占比旋钮:
tasklet(10)与wl_rx_irq_thread(7)/wl_rx_query_thread(2)的优先级组合决定 WiFi 收发的 CPU 预算,量产调试推荐从这里调优吞吐与实时性的平衡。 - 网络流队列:
net_avi0/1、stream_avi0/1任务各带 600 字队列,双路 AVI 流支持(如同时录像 + 网传);RX 端net_video_server(16)与解码任务组形成流水线,吞吐瓶颈通常在 WiFi 链路而非解码。 - 静态任务栈:
app_core(2048)、lvgl_v8_main_task(8192)等关键任务使用静态缓冲,启动期不依赖动态内存;栈大小按最大调用深度预留,改动需谨慎。 - 代码压缩:
CONFIG_LZ4_COMPRESS_APP_CODE_ENABLE压缩代码段节省 flash,代价是启动解压开销与data段压缩选项(CONFIG_LZ4_DATA_CODE_ENABLE)仅在CONFIG_SFC_ENABLE下可用。
Extension Points
- 音频编码采样源:
AUDIO_ENC_SAMPLE_SOURCE_*枚举决定编码输入,可扩展新采样源(如增加数字麦克风通道)。 - 编码格式:
BBM_AUDIO_OPUS_ENABLE在 PCM/Opus 间切换;视频编码/分辨率由可视化工具配置的stream.bin决定。 - 按键业务:
app_default_key_click/app_default_key_long提供默认空实现,TX/RX 业务按键(对讲、音量、休眠)在此挂接。 - UI 资源:
gui_res/res_common.h资源枚举与lvgl_v8_ui_app配套,新增图标/页面需同步资源工程与枚举 ID。 - 硬件平台:新增 TX/RX 板卡复制
board/wl83并修改board_config.h/sdk_config.h即可,应用层零改动。
Related Links
- app_config.h(应用配置中心)
- app_main.c(中断表/任务表/按键处理)
- wifi_raw.h(WiFi PA 与发射功率)
- res_common.h(LVGL UI 资源枚举)
- board/wl83 板级目录
- BBM 硬件原理图(TX/RX)
- 相关兄弟页面:WiFi 协议栈与配网(airkiss/WSC/声波配网)、音频算法(AEC/音效)、LVGL UI 开发、flash/SDNAND 存储管理。