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.X6.X
配置方式config tool+pstool修改代码
产品形态tws耳机、音箱、soundbar真无线蓝牙豆
开发环境xIDEMDE
调音工具UFEQACT

看得出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例程

QCC3040学习笔记:部署mirror tws earbuds例程

QCC51xx学习笔记:KSE简介和跑通官方仿真例程

QCC51xx学习笔记:KSE简介和跑通官方仿真例程

QCC51xx学习笔记:理解CVC Audio Chain