杰理 SDK 文档中心
首页
首页
  • 概述与快速开始

    • SDK 总览与芯片能力
    • 环境搭建与编译构建
    • 烧录与固件升级
    • 文档与版本资源
  • 应用与示例方案

    • demo 示例工程
    • WiFi 摄像头方案 (wifi_camera)
    • WiFi 音箱方案 (wifi_soundbox)
    • WiFi 婴儿监护方案 (wifi_bbm)
    • 公共应用模块库
    • 示例代码库 (example)
  • 系统架构与平台

    • 总体架构与工程分层
    • 系统启动与运行框架
    • 芯片驱动与板级适配
    • 设备管理与文件系统
    • 系统工具库与算法
  • 音频子系统

    • 音频框架与处理节点
    • 音频编解码与音效
    • 播放器与录音器
    • 语音交互与 AI 唤醒
    • LE Audio 与蓝牙音频
    • 音频调试与歌词
  • 视频与显示子系统

    • 摄像头驱动与 ISP
    • 视频编码与图像处理
    • 显示与 GPU 加速
    • 屏幕镜像 (screen_mirror)
  • 无线连接与网络

    • 蓝牙协议栈 (双模蓝牙)
    • WiFi 协议栈与配网
    • 网络协议栈
    • 云平台与 IoT 协议
  • UI 子系统

    • LVGL 集成与应用
    • UI 工程与工具链
  • 配置系统

    • 功能配置
    • 板级配置
    • 网络与蓝牙配置
    • 音频配置与提示音
  • 工具与测试

    • 产测与射频测试工具
    • 固件升级与更新机制
    • 调试与日志工具
  • 硬件参考设计

    • 原理图参考设计
    • 芯片数据手册

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_ENABLEint1WiFi PA 应用层配置(增益等);真正生效还需 wifi_conf.c 的 WIFI_PA_ENABLE 置 1
BBM_AUDIO_OPUS_ENABLEint0音频编码 Opus(需配套 stream.bin),默认 PCM
CONFIG_VIDEO_DEC_ENABLEint1RX 端视频解码使能
CONFIG_AUDIO_DEC_PLAY_SOURCEstring"dac"音频解码播放输出源
AUDIO_ENC_SAMPLE_SOURCE_MIC/PLNK0/PLNK1/IIS0/IIS1/LINEINenum0~5音频编码采样源选择
TCFG_DUER_ENABLEint1使能 DuerOS AI 服务
TCFG_AI_SERVER_DISABLEint0禁用 AI 服务器
CONFIG_UI_PACKRES_LENhex0x019000UI 资源在扩展预留区的长度
CONFIG_AUDIO_PACKRES_LENhex0xC800提示音资源长度
CONFIG_LOGO_PACKRES_LENhex0x025800LOGO 资源长度
CONFIG_SDNAND_HFAT_CLUSTER_SIZEhex0x40SDNAND HFAT 分区簇大小(32768B/512B)
WIFI_DEFAULT_PWRint3默认 WiFi 发射功率(BBM_WIFI_PA_ENABLE=1 时生效,见 wifi_raw.h)
CONFIG_ASSIGN_MACADDR_ENABLEbool随 TCFG首次联网用杰理服务器分配 MAC
CONFIG_AIRKISS_NET_CFG / CONFIG_WSC_NET_CFGbool关闭配网方式(BBM 默认点对点直连,注释关闭)
CONFIG_ACOUSTIC_COMMUNICATION_ENABLEbool随 TCFG声波配网
CONFIG_LZ4_COMPRESS_APP_CODE_ENABLEbool开LZ4 压缩应用代码段
CONFIG_RF_TRIM_CODE_MOVABLE / CONFIG_RF_TRIM_CODE_AT_RAMbool随 SFC/SDRAMRF 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
WiFivoiceprint(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)视频采集/解码/打包
UIlvgl_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* 任务共同支撑两种用法:

  1. 录像:TX 端把编码后的音视频写入 AVI 文件(配合 write_file、SDNAND FAT 分区),实现婴儿监护的本地录像回放;
  2. 网络流:通过 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.cRX/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.cbpCode::Blocks 工程文件(编译入口)
Makefile构建脚本
board_config.h板级引脚/外设配置(被 app_config.h include)
sdk_config.c/hSDK 级配置(被 app_config.h include)
chip_cfg.h芯片级配置
board_develop_AC7925B.h / board_develop_AC7926A.h / board_develop.c开发板差异适配
jlstream_node_cfg.hjlstream 音频节点配置

换板流程:复制 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 端
AC7923AMIPI 摄像头MIPI 屏幕
AC7923BDVP 摄像头RGB 屏幕
AC7923C(推荐)通用 TX 板通用 RX 板(V1.1 推荐版)

同一固件通过板级配置区分 TX/RX 角色,配合 app_config.h 的能力宏(视频解码/UI 开关)即可产出两端镜像。

Failure Modes, Edge Cases & Concurrency

基于源码注释与配置可见的风险点:

  1. PA 使能不同步:BBM_WIFI_PA_ENABLE=1 仅配应用层增益,若忘记把 wifi_conf.c 的 WIFI_PA_ENABLE 置 1,会出现"代码已配、射频未开"的静默失效——功率/信号异常时优先排查此联动点。
  2. Opus 配置漂移:BBM_AUDIO_OPUS_ENABLE=1 但未用可视化工具输出对应 stream.bin,编码配置与固件不一致,导致 RX 解码失败/杂音。改动编码格式必须"工具配置 + 代码宏"同步。
  3. flash 尾部 4K 覆盖:资源预留区布局以 __FLASH_SIZE__ - 0x1000 为基准,任何资源长度调整若破坏"UI→音频→LOGO→4K 保留"的顺序,会覆盖配置存储区,造成配置丢失。
  4. RF TRIM 大电流风险:CONFIG_RF_TRIM_CODE_MOVABLE(动态载入 RAM)或 CONFIG_RF_TRIM_CODE_AT_RAM(固定 RAM)二选一,防止 RF TRIM 期间 500ms 大电流访问 flash 导致 flash 挂掉并持续大电流;无 SDRAM 的封装下必须保留该保护。
  5. NMI 写 flash 约束:CONFIG_IPMASK_ENABLE 下软中断可写 flash,但中断函数、被调函数和 const 数据必须全部放内部 RAM,否则中断触发时可能访问 flash 导致不可重入。
  6. 并发/优先级权衡:WiFi 收发(tasklet 优先级 10)与音视频编码(audio_enc/mic_effect 26)共享 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

  1. 音频编码采样源:AUDIO_ENC_SAMPLE_SOURCE_* 枚举决定编码输入,可扩展新采样源(如增加数字麦克风通道)。
  2. 编码格式:BBM_AUDIO_OPUS_ENABLE 在 PCM/Opus 间切换;视频编码/分辨率由可视化工具配置的 stream.bin 决定。
  3. 按键业务:app_default_key_click / app_default_key_long 提供默认空实现,TX/RX 业务按键(对讲、音量、休眠)在此挂接。
  4. UI 资源:gui_res/res_common.h 资源枚举与 lvgl_v8_ui_app 配套,新增图标/页面需同步资源工程与枚举 ID。
  5. 硬件平台:新增 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 存储管理。
Prev
WiFi 音箱方案 (wifi_soundbox)
Next
公共应用模块库