news 2026/11/3 13:55:39

AB1568头戴耳机开发实战:ANC切换、NVkey固化与UI Shell事件框架

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
AB1568头戴耳机开发实战:ANC切换、NVkey固化与UI Shell事件框架

简介:这份PDF资料面向从事Airoha洛达AB1568蓝牙耳机固件与应用开发的工程师,系统梳理该芯片平台从底层启动到上层功能实现的完整知识脉络,帮助开发者快速建立工程认知、定位关键代码入口。内容围绕headset工程展开,涵盖上电后执行函数、mk文件中的宏定义、app活动行为开启、ANC模式切换、LED呼吸灯样式修改、充电参数监测、超时时间设置、事件发送与删除、Airoha API使用、回调注册、自动关机、配对时间、开机提示电量、清除配对列表、链路丢失重连、UI Shell框架、SideTone与音频路径设置、DUT模式测RF、硬件复位及PEQ设定等模块,目录层次清晰,便于按主题查阅。资源包为1个PDF文件,约9.58MB,单文件结构适合随身查阅与打印对照。目前已有374人学习,适合需要系统掌握AB1568开发要点、补齐功能模块实现思路的初中级开发者参考。

1. 拿到 AB1568 的 headset 工程,先别急着改代码

三连击电源键,提示音响了,ANC 却没反应——这是我在 AB1568 头戴耳机项目上遇到的第一个翻车现场。按键映射对了,宏也开了,问题出在 ANC 参数根本没写进固件。Airoha AB1568 蓝牙耳机应用开发这件事,难的不是写代码,而是搞清楚这套 SDK 里「代码、配置、NVkey、固件」四层东西各自管什么。这份 headset 工程分析资料,从 bootloader 上电流程一路讲到 FOTA 更新 NVkey,覆盖 ANC 切换、LED 呼吸灯、充电监测、UI Shell 事件框架、产测模式等三十多个技术点,适合正在用 AB1568x 做头戴耳机、又不想在 SDK 里瞎摸的固件工程师。下面按我实际拆工程的顺序,把能抄的部分和会踩的坑都摊开。

2. 上电流程与编译宏:先搞清楚代码从哪跑起来

2.1 bootloader 到 app main 的两级跳

AB1568 上电后不是直接进你的应用代码。第一段跑的是apps目录下 bootloader 的main函数,这里有个条件编译的坑:BL_FOTA_ENABLE宏必须在 GCC 目录下的 mk 文件里定义,bl_fota_process函数才会被编进去。没定义,FOTA 相关逻辑直接消失,编译不报错,运行时才发现升级流程走不通。

bootloader 跑完才跳到apps下对应工程(earbuds或headset)的main函数,然后apps_inits初始化各种应用模块。我一般排查启动问题时,先在这两个main里各打一条 log,确认跳转顺序没被改乱。

2.2 宏到底在哪个 mk 文件里定义

这是新手最容易卡住的地方。GCC 目录下有一堆 mk 文件,代码里的宏定义在哪个文件,取决于你编译的是哪个工程。别猜,用命令查:

# 列出所有可编译工程及其调用的 mk 文件 ./build.sh list

输出里能看到每个工程对应的 mk 文件。当前头戴耳机(AB1568x 芯片)是基于ab1565_ab1568_evk开发板工程改的,编译ab1568_evk的headset_ref_desgin工程时,调用的是feature_68_evk.mk。打开这个文件,宏定义都在里面,要加新宏也往这里加。

提示:改宏之前先跑一遍./build.sh list确认工程名,不同板子对应的 mk 文件不一样,改错了编译能过但行为不对,这种玄学问题最难查。

2.3 活动行为是怎么被拉起来的

apps_inits里包含了所有活动行为的初始化。ui_shell_start_activity函数负责在活动堆里申请空闲 item,app_preproc_activity_proc是主进程,管理和调配其它子进程,比如app_home_screen_idle_activity_proc。开机后系统会拉起很多进程,每个进程有自己的事件组。系统产生事件时把事件抛出去,所有进程都能监听到,事件属于谁谁处理。

这套机制类似一个个 UI 界面:当前处于某个活动进程,发生的事件就由该进程处理。比如在 home_screen 状态下,能处理的事件集合是固定的。理解这一点,后面加按键、加 ANC 切换才不会把事件挂错进程。

3. ANC 模式切换:从按键到滤波器的完整链路

3.1 音频通路与四种 ANC 模式

AB1568 的音频通路分 Line-in 和 BT 两种。ANC 用 FF 麦(前馈)和 FB 麦(反馈)实现,Configtool 上有三种参数:ANC(含 FF 和 FB)、FBC(FB 的补偿)、Passthrough(通透)。硬件上是 4 个麦克风用于降噪,1 个主麦负责说话,2 个振动喇叭加 2 个声音喇叭。音频降噪用 FF 和 FB,通话降噪用 talk 麦加 FF。

目标场景很明确:在 home_screen 状态下用按键切换 ANC 模式。按键事件先进_proc_key_event_group处理,这里需要MTK_ANC_ENABLE宏开启,feature_68_evk.mk里默认已开。所有 ANC 事件行为最终都调app_home_screen_process_anc_and_pass_through函数。

按键行为key_action有四个值,对应 Configtool 的 UI 行为:

key_action 值行为含义
KEY_PASS_THROUGH通透模式开/关
KEY_ANCANC 开/关
KEY_SWITCH_ANC_AND_PASSTHROUGH全关→通透→ANC
KEY_BETWEEN_ANC_PASSTHROUGH通透开与 ANC 开之间切换

按键行为到key_action的映射在customerized_key_config.c里配。

3.2 参数没写进去,按键就是白按

我第一次配完三连击 POWER,提示音响了,ANC 毫无效果。用 Configtool 打开工程的download文件夹,发现 ANC 模式里根本没有调整过的参数——代码链路是通的,但滤波器参数是空的。

解决路径是把声学调好的 ANC 参数(nvr 文件)导入工程,或者直接在 tool 上调整。操作顺序是:先 Write NV,再 Reset,把 FF、FB、FBC、AiroThru 参数写进耳机。写完再循环三连击,能听出不同模式的降噪差异,才算真正使能成功。

ANC 执行代码的逻辑是:KEY_SWITCH_ANC_AND_PASSTHROUGH改变target_anc_type和target_filter_id两个变量,再传入app_anc_service_enable执行。看切换 log 时过滤anc_result,能看到三个模式循环。ANC 默认滤波器AUDIO_ANC_CONTROL_ANC_FILTER_DEFAULT是值为 1 的枚举,PassThrough 默认滤波器AUDIO_ANC_CONTROL_PASS_THRU_FILTER_DEFAULT是值为 9 的枚举。

3.3 四组滤波器与 NVkey 的对应关系

Configtool 里把下面的 R 和上面的 L 重叠看,就是 4 组滤波器,每组都是 FF+FB+FBC 三件套:

  • Filter 1:FF1(L/R) + FB1(L/R) + FBC1(L/R)
  • Filter 2:FF2(L/R) + FB2(L/R) + FBC2(L/R)
  • Filter 3:FF3(L/R) + FB3(L/R) + FBC3(L/R)
  • Filter 4:FF4(L/R) + FB4(L/R) + FBC4(L/R)

点保存,参数落到download文件。但要让参数进代码,得走另一条路:先 clean 再 build 生成最新download,用 Configtool 打开后导入声学 NVR 文件,再用 Special_Export 导出变更。导出会生成 4 个文件;如果用 Save 方式存成 download 文件则生成 3 个,其中 syskey 和 bin 文件是一致的,部分 NVkey 被存进filesystem.bin。

3.4 把 ANC 参数固化进代码

量产编译时,XML 和 bin 文件要一起参与。编译ab1568_evk时用到三个 nvkey.xml:xml 1 有 7 个 KeyID,xml 2 有 4 个,xml 3 有剩下的所有 KeyID。把 Special_Export 导出的syskey.xml里变更的参数逐个更新到这三个文件——syskey.xml 里有的 keyID,nvkey.xml 里不一定有,没有就添加,有就替换。注意 ANC 参数的 keyID 在0xEE00~0xEEFF区间,这部分在 nvkey.xml 里原本没有,得手动补。同时替换filesystem.bin,重新编译生成 download,用 Configtool 打开确认 ANC 参数已变成 nvr 文件的配置,才算固化成功。

3.5 Component Gain 的 NVR 解析

ANC Default Setting 里的 Component Gain 校准值需要手动解析。比如0xE1E5 = 10FF 1400 D8DC D8DC,高字节在前低字节在后。FF 对应10FF,解析时前后位反转成FF10,十六进制转十进制再减 65536,得到 -240,即 -2.4dB。FB 对应1400,反转成0014,转十进制得 20,即 0.2dB。这个反转规则不记住,看 NVR 就是看天书。

4. 事件框架与系统配置:UI Shell 是绕不开的地基

4.1 ui_shell_send_event 与事件生命周期

UI Shell 框架是整个应用的事件总线。发事件用ui_shell_send_event,删事件用ui_shell_remove_event,接收事件消息在ui_shell_init_input_msg里初始化。这三个函数构成事件从产生到消费的闭环。

发事件时要注意事件组归属,发错组等于石沉大海。我一般在新加功能时,先在目标 activity 的 handler 里打 log 确认事件到了,再往下写业务逻辑。删事件主要用于超时场景,比如配对超时后把挂起的事件撤掉,避免回调在对象已销毁后触发。

4.2 超时、自动关机与配对时间

超时时间设置、自动关机配置、配对时间设置是三个容易混的配置项。超时时间管的是事件等待上限;自动关机是空闲多久后断电,属于节能管理;配对时间是开机后可被搜索的窗口期。三者数值互相影响——配对时间设太长,自动关机还没触发就先被连上了;自动关机设太短,用户还没配对完就关机。

常见做法是配对窗口 3 到 5 分钟,自动关机 10 到 15 分钟,超时事件按业务单独设。具体值看产品定位,但改完一定要实测「开机不操作→自动关机」和「开机配对超时→回 idle」两条路径。

4.3 开机提示电量与清除配对列表

开机提示电量要在电量监测机制就绪之后触发,顺序错了会播报错误电量。清除配对列表是隐私保护和重置配对的必要功能,实现时注意同时清 flash 里的配对信息和内存里的链路状态,只清一边会出现「显示已清除但还能连上」的怪现象。

4.4 链路丢失重连与 SideTone

链路丢失重连的逻辑要区分「主动断开」和「异常掉链」,前者不该重连,后者才触发。SideTone(侧音)设置影响通话时听到自己声音的量,参数过大会啸叫,过小用户觉得闷,一般在音频路径设置里和 PEQ 一起调。

4.5 音频路径、PEQ 与通话降噪

音频路径设置决定声音从哪个源进、经过哪些处理、从哪个喇叭出。PEQ 设定方法按频段调增益,通话降噪涉及 iGO 算法和 ENC。这几块参数耦合度高,改 PEQ 可能影响 ANC 效果,调 ENC 可能改变 SideTone 听感,建议一次只动一个变量并留好回退版本。

5. 避坑与排查:五个让我返工的现场

5.1 按键有提示音但 ANC 无效

现象:三连击 POWER 有提示音,降噪无变化。原因:ANC 参数没写入固件,download文件夹里滤波器参数为空。解决:导入 nvr 文件,Write NV 后 Reset,再验证模式切换。

5.2 改了宏但行为没变

现象:在代码里加了宏定义,编译通过,运行行为没变。原因:宏加错了 mk 文件,实际编译用的是另一个 feature 文件。解决:./build.sh list确认工程对应的 mk 文件,宏加到正确位置。

5.3 FOTA 流程编译后消失

现象:FOTA 相关函数编译后找不到。原因:BL_FOTA_ENABLE没在 GCC 目录 mk 文件里定义,bl_fota_process没被编进去。解决:在对应 mk 文件补宏定义后重新编译。

5.4 ANC 参数固化后仍是旧值

现象:按流程更新了 nvkey.xml,编译下载后 ANC 还是旧参数。原因:0xEE00~0xEEFF区间的 keyID 在 nvkey.xml 里原本不存在,只替换没添加。解决:对照 syskey.xml 把缺失 keyID 补进 nvkey.xml,同时替换filesystem.bin。

5.5 事件发了但没人处理

现象:ui_shell_send_event调用成功,目标 activity 没反应。原因:事件组归属错误,或目标 activity 当前不在活动栈顶。解决:确认事件组 ID 与目标进程匹配,检查 activity 是否已ui_shell_start_activity拉起。

6. 产测与调试通道:DUT、AT 命令和 USB log 怎么配合用

产测阶段最耗时的不是功能本身,是验证通道搭不起来。AB1568 提供了几条并行的调试路径,用对了能省大量时间。

DUT 模式测 RF 是射频验证的入口,进入 DUT 后配合 RACE 和 RAW 指令下发测试项。AT+CMD 命令是另一条通道,AT 转 Race 指令有固定格式,转换时注意参数顺序和校验位。USB 口通信用来打 log,产测时把 log 级别调高,能直接看到指令执行结果。

设置设备信息、读取耳机现有 NVkey、理解 SDK 的 NVKEY 机制,这三件事在产测前必须做完。NVKEY 是配置的持久化载体,NVKEY_Setting.c里的函数负责写该文件中的 NVkey。FOTA 更新 NVkey 的路径是:Special_Export 导出变更,再通过 FOTA 下发,不用整包重刷。

AP 测试和硬件复位功能属于产线兜底手段,硬件复位要确认复位后 NVkey 不丢。我一般会在产测前跑一遍完整链路:DUT 进 RF 测试 → AT 命令读设备信息 → USB 抓 log 确认无异常 → FOTA 推一次 NVkey 变更 → 复位后复查参数。这套流程走顺了,量产阶段的问题基本能在样机阶段暴露。

从那以后我每次改 ANC 或 NVkey 相关配置,都强制走一遍「clean → build → Configtool 打开 download 确认参数 → 下载实测」四步,不再相信「编译过了应该没问题」。希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/11/3 13:54:30

硬件测试入门指南:从检视到可靠性,建立完整测试闭环

简介:这是一份面向测试工程师入门与进阶的硬件测试技术培训教材,以PPT形式系统梳理硬件测试的理念、目的、方法与流程,适合刚接触硬件测试的工程师、研发转测试人员及需要建立测试规范的技术管理者参考。压缩包内共1个PPT文件,约7…

作者头像 李华
网站建设 2026/11/3 13:54:29

AB1568蓝牙耳机SDK开发实战:从工程配置到ANC调试与量产固化

简介:这份PDF资料面向从事Airoha洛达AB1568蓝牙耳机固件与应用开发的工程师,系统梳理从硬件启动到应用层功能实现的完整知识链路,适合具备一定嵌入式基础、希望快速上手该芯片平台的中高级开发者。资源包内仅含1个PDF文件,大小约9…

作者头像 李华
网站建设 2026/11/3 13:54:29

HarmonyOS6 RcText组件:分布式文本渲染与智能排版实战

1. HarmonyOS6与RcText组件概述 去年发布的HarmonyOS6系统在开发者工具层面做了大量优化,其中RcText组件作为文本显示的核心控件,经过长达半年的迭代开发终于正式亮相。作为一名参与过多个HarmonyOS应用开发的前端工程师,我发现这个看似简单的…

作者头像 李华
网站建设 2026/11/3 13:53:39

高性能计算中的异构编程技术与优化实践

1. 高性能计算异构编程概述 在当今计算密集型应用领域,传统单一架构的计算设备已难以满足日益增长的性能需求。异构编程作为一种突破性的计算范式,通过协同利用CPU、GPU、FPGA等不同架构处理器的优势,为高性能计算提供了全新的解决方案。我在…

作者头像 李华
网站建设 2026/11/3 13:53:14

MPC在自动泊车系统中的应用与优化实践

1. 项目概述:当MPC遇见自动泊车 在停车场里看着新手司机反复揉库的场景,你是否有过"要是车子能自己停进去就好了"的念头?这正是MPC(模型预测控制)在智能驾驶领域最接地气的应用——自动泊车与跟踪系统。不同…

作者头像 李华
网站建设 2026/11/3 13:52:04

基于Python的听力题库结构化解析与错题复盘实战

简介:这份文档面向西北工业大学修读核心听力课程的学生,聚焦雨课堂随堂练习与课后作业的答案核对需求,帮助学习者在听力训练后快速自查、定位错题并梳理考点。内容覆盖多个单元的客观题与填空题答案,涉及图书馆、租房、新生入学、…

作者头像 李华