RK3399之AP模块蓝牙兼容问题

背景

项目中,换了一个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配置,修改如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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:

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/* 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
*/

Donate comment here