QCC30xx学习笔记:earbuds 2.0例程简介
Posted NiceBT
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了QCC30xx学习笔记:earbuds 2.0例程简介相关的知识,希望对你有一定的参考价值。
为了方便大家学习,现与我爱蓝牙网联合推出【QCC300x/CSR867x/QCC30xx/QCC51xx开发板】。
技术交流QQ群号:743434463
开发板会员QQ群号:725398389(凭订单号入群,赠独家学习资料)
——————————正文分割线———————————–
1. 引言
苹果airpods在蓝牙耳机市场横扫千军,安卓阵营急需一员大将正面迎敌,高通的qcc302x/512x方案横空出世,成为下一代蓝牙SOC霸主的有力竞争者。
qcc30xx/51xx在硬软件架构上较上一代CSR867x有了明显的提升,主要体现在如下几点:
- 芯片制程提高到40nm
- 功耗<6mA
- 双dsp(qcc512x)+双MCU架构
- 支持tws和tws+
软件上增加earbuds例程,可以快速开发出充电盒+耳机的产品形态。
2. earbuds与sink主要区别
在开发之前,先对earbuds和sink例程的区别有一个宏观的了解:
功能 | sink例程 | earbuds例程 |
---|---|---|
ADK版本 | 4.X/6.X | 6.X |
配置方式 | config tool+pstool | 修改代码 |
产品形态 | tws耳机、音箱、soundbar | 真无线蓝牙豆 |
开发环境 | xIDE | MDE |
调音工具 | UFE | QACT |
看得出earbuds例程的开发工具链与sink例程相差很大,配置方式也不够完善,给我们开发带来了一定的挑战。
3. 跑通例程
在安装完工具链,并根据指导手册创建了第一个qcc3020的earbuds工程后,开始了常规的踩坑填坑过程。好在有QQ群里的朋友的帮助,快速完成了earbuds例程的测试,相关源码和固件都会上传到共享组,有需要的朋友可以下载测试。
3.1. 关闭电池温度检测
earbuds例程第一次deploy到硬件平台后,TRB调试器突然找不到设备。原因是硬件平台用USB供电,而非电池供电,也没有接热敏电阻。
修改方法是,将earbuds工程属性的DEFS选项中的HAVE_THERMISTOR和INCLUDE_TEMPERATURE这两个宏disable掉,再重新编译。之后TRB工具的link灯会点亮,可以进入调试模式查看运行log。
3.2. 区分左右耳
earbuds例程用蓝牙地址区分左右耳,需要修改dev_cfg_filesystem工程下的subsys1_config2.htf,然后rebuild此工程,再re-deploy earbud工程。
我的左耳地址是0x00ff01 0x5b 0x0002,右耳是0x00ff02 0x5b 0x0002。对于TWS来说,左耳是主,右耳是从。
修改完蓝牙地址后,将两个硬件平台同时复位,可以从log窗口中看到两个设备会自行建立TWS连接。
3.3. 理解物理状态机
earbuds例程的状态机的示意图如下:
当左右耳完成TWS配对后,其仍处在IN_CASE状态,即在盒中。此时我们需要通过pydbg调试工具发送状态转移命令,将左右耳都切换到OUT_OF_EAR状态,在这种状态下,左右耳的按键可以工作了,且手机能够搜索到左耳的蓝牙名称;连接手机后,再用pydbg调试工具切换到IN_EAR状态,即进入正常听音状态。
通过pydbg调试工具发送命令的方式有一个局限,即在我们只有一个TRB调试器时,需要反复插拔TRB工具,使用较繁琐。在真实的产品中,状态切换是由传感器(入耳检测和重力加速度)触发的,这里建议可以自定义一个按键来触发,方法很简单。
首先在1_button.buttonxml文件中加入PIO20作为用户自定义按键,并定义按键触发事件:
<pio>
<pinFriendlyName>USR_BUTTON_1</pinFriendlyName>
<pad>20</pad>
</pio>
<message>
<messageName>APP_USR_BUTTON_1_PRESS</messageName>
<buttonEvent>RELEASE</buttonEvent>
<activePinFriendlyName>USR_BUTTON_1</activePinFriendlyName>
</message>
然后rebuild,MDE会自动将xml转成代码。此时我们打开av_headset_ui.c,在appUiHandleMessage函数中将按键事件关联到状态机:
case APP_USR_BUTTON_1_PRESS:
DEBUG_LOG("APP_USR_BUTTON_1_PRESS");
if (appSmIsInCase())
appTestPhyStateOutOfCaseEvent();
else if (appSmIsOutOfCase())
appTestPhyStateIsInEar();
break;
这样在我们按下此键后,状态机会发生转变,方便测试验证。
3.5. 使能外接功放
由于我们的平台使用了外接功放,需要将PIO3映射到功放的使能脚才能听到音乐。修改av_headset_config.h文件,使能外放控制脚:
#define appConfigExternalAmpControlRequired() (TRUE)
#define appConfigExternalAmpControlPio() (3)
#define appConfigExternalAmpControlEnableMask() (1 << appConfigExternalAmpControlPio())
#define appConfigExternalAmpControlDisableMask() (0 << 0)
4. 总结
有以下几点直观的感觉:
- earbuds代码没有sink代码看上去精致美观,不像是欧洲人写的,怀疑是外包给印度人
- 从整体的代码架构看,写earbuds代码的可能是linux的驱动开发人员,软件思路是否杀鸡用牛刀?
- 配置方式需要修改代码,开发门槛较高
- 代码运行速度有显著提高,应该是双核MCU带来的改进
- kymera DSP还没玩转起来,调音工具也没有用起来
总体的感觉,earbuds不是很成熟,还需要时间打磨,期待下一个ADK大版本能有惊喜给到开发者们。
以上是关于QCC30xx学习笔记:earbuds 2.0例程简介的主要内容,如果未能解决你的问题,请参考以下文章
QCC3040学习笔记:部署mirror tws earbuds例程
QCC3040学习笔记:部署mirror tws earbuds例程