OH5.0.3WQ9201B 蓝牙问题排查
1、问题描述:默认开机开启蓝牙,此时可以搜索到周围蓝牙设备,但无法配对,重新开关蓝牙后,配对功能正常。
2、问题根因:系统未等BtmReadBufferSize回调完成就执行了HCI_SetBufferSize,导致g_readBufferSizeResult.hcAclDataPacketLength为0,从而HciFargmentAndSendData发送数据失败,HCI log中未触发SMP连接。
正常打印
3、解决方法:
diff --git a/services/bluetooth/stack/src/btm/btm_controller.c b/services/bluetooth/stack/src/btm/btm_controller.c
index 73691ae..0f5c766 100644
--- a/services/bluetooth/stack/src/btm/btm_controller.c
+++ b/services/bluetooth/stack/src/btm/btm_controller.c
@@ -40,6 +40,7 @@
static HciEventCallbacks g_hciEventCallbacks;
static Event *g_waitSetupController = NULL;
+static bool g_btm_read_buffer_done = false;
static HciResetReturnParam g_hciResetResult;
static HciReadBufferSizeReturnParam g_readBufferSizeResult;
@@ -69,6 +70,7 @@ static void BtmControllerOnResetComplete(const HciResetReturnParam *returnParam)
static void BtmControllerOnReadBufferSizeComplete(const HciReadBufferSizeReturnParam *returnParam)
{
g_readBufferSizeResult = *returnParam;
+ g_btm_read_buffer_done = true;
EventSet(g_waitSetupController);
}
@@ -328,26 +330,38 @@ static int BtmHciReset()
static int BtmReadBufferSize()
{
+ memset(&g_readBufferSizeResult, 0, sizeof(g_readBufferSizeResult));
+ g_btm_read_buffer_done = false;
+ EventClear(g_waitSetupController);
+
int result = HCI_ReadBufferSize();
if (result != BT_SUCCESS) {
LOG_ERROR("HCI_ReadBufferSize failed: %{public}d", result);
return result;
}
+
if (EventWait(g_waitSetupController, WAIT_CMD_TIMEOUT) == 0) {
- switch (g_readBufferSizeResult.status) {
- case HCI_SUCCESS:
- case HCI_UNKNOWN_HCI_COMMAND:
- result = BT_SUCCESS;
- break;
- default:
- LOG_ERROR("HCI_ReadBufferSize status: 0x%02x", g_readBufferSizeResult.status);
- result = BT_OPERATION_FAILED;
- break;
+ int retry = 10;
+ while (retry-- > 0 && !g_btm_read_buffer_done) {
+ usleep(1000);
}
} else {
LOG_ERROR("HCI_ReadBufferSize Timeout");
result = BT_OPERATION_FAILED;
+ return result;
+ }
+
+ switch (g_readBufferSizeResult.status) {
+ case HCI_SUCCESS:
+ case HCI_UNKNOWN_HCI_COMMAND:
+ result = BT_SUCCESS;
+ break;
+ default:
+ LOG_ERROR("HCI_ReadBufferSize status: 0x%02x", g_readBufferSizeResult.status);
+ result = BT_OPERATION_FAILED;
+ break;
}
+
return result;
}
添加全局变量g_btm_read_buffer_done,在确定BtmControllerOnResetComplete执行完成后,再往下执行
更多推荐
所有评论(0)