背景

项目中,换了一个AP的WIFI/BT模块,AP6356S换成了AP6236。按照RK的WIFI/BT模块兼容框架,把新模块加了进去,简单测试,WIFI的station和ap都没问题,蓝牙a2dp播放没问题,但发现SCO通话模式有问题,一点正常的声音都没有,而且每隔一段时间会有一个很明显的噪声。

后面通过和硬件一起排查,发现新模块(AP6236)在SCO通话模式下,I2S的两边都有时钟输出,即CPU和模块都是master模式。

为什么a2dp模式是正常的呢?
AP模块的A2DP模式走的是UART,SCO模式才走I2S接口

解决

找到上述原因之后,解决就好办了。修改CPU和模块的模式。

在未修改之前,CPU是master,模块是slave。以前的老模块是OK没问题,但是新模块(AP6236)就是不行,估计是它的固件不支持做slave。
首先我只修改CPU的模式,由以前的主改成了从。果然,新模块(AP6236)就OK,但是老模块不行,因为模块这边也是配置的从模式。
RK3399这边主要修改DTS配置,修改如下:

bt_sound: bt-sound {
		status = "disabled";
		compatible = "simple-audio-card";
		simple-audio-card,format = "i2s";
		simple-audio-card,name = "bt-sco-pcm";
		//simple-audio-card,mclk-fs = <128>;	
		simple-audio-card,bitclock-master = <&dailink0_master>;
		simple-audio-card,frame-master = <&dailink0_master>;
		
		simple-audio-card,cpu {
		    sound-dai = <&i2s0>;
		};
		dailink0_master: simple-audio-card,codec {
		    sound-dai = <&bt_sco_codec>;
		};
	};

修改模块这边的模式,两个模块都OK了,兼容OK了。
模块这边主要修改HAL,修改如下:
/hardware/broadcom/libbt/src/include/vnd_rk30sdk.txt :

SCO_PCM_IF_SYNC_MODE = 1 //master/slave 模式,1为Master

上面txt(vnd_rk30sdk.txt)里的flag最终影响bt_vendor_brcm.h,和AP模块相关,即broadcom芯片相关

/* SCO_I2SPCM_IF_ROLE - 0=Slave, 1=Master */

/* SCO_PCM_IF_SYNC_MODE

    NOTICE: in most usage cases the value will be the same as
            SCO_PCM_IF_CLOCK_MODE setting

    0 : Slave
    1 : Master
*/

/* SCO_PCM_IF_CLOCK_MODE

    NOTICE: suggested to be consistent with SCO_I2SPCM_IF_ROLE

    0 : Slave
    1 : Master
*/

/* SCO_PCM_IF_CLOCK_RATE

    NOTICE: suggested to be consistent with SCO_I2SPCM_IF_CLOCK_RATE

    0 : 128K
    1 : 256K
    2 : 512K
    3 : 1024K
    4 : 2048K
*/