Loading system/btif/include/btif_bqr.h +16 −2 Original line number Diff line number Diff line Loading @@ -83,6 +83,8 @@ static constexpr uint32_t kQualityEventMaskApproachLsto = 0x1 << 1; static constexpr uint32_t kQualityEventMaskA2dpAudioChoppy = 0x1 << 2; static constexpr uint32_t kQualityEventMaskScoVoiceChoppy = 0x1 << 3; static constexpr uint32_t kQualityEventMaskRootInflammation = 0x1 << 4; static constexpr uint32_t kQualityEventMaskEnergyMonitoring = 0x1 << 5; static constexpr uint32_t kQualityEventMaskLeAudioChoppy = 0x1 << 6; static constexpr uint32_t kQualityEventMaskConnectFail = 0x1 << 7; static constexpr uint32_t kQualityEventMaskVendorSpecificQuality = 0x1 << 15; static constexpr uint32_t kQualityEventMaskLmpMessageTrace = 0x1 << 16; Loading @@ -92,7 +94,8 @@ static constexpr uint32_t kQualityEventMaskVendorSpecificTrace = 0x1 << 31; static constexpr uint32_t kQualityEventMaskAll = kQualityEventMaskMonitorMode | kQualityEventMaskApproachLsto | kQualityEventMaskA2dpAudioChoppy | kQualityEventMaskScoVoiceChoppy | kQualityEventMaskRootInflammation | kQualityEventMaskConnectFail | kQualityEventMaskRootInflammation | kQualityEventMaskEnergyMonitoring | kQualityEventMaskLeAudioChoppy | kQualityEventMaskConnectFail | kQualityEventMaskVendorSpecificQuality | kQualityEventMaskLmpMessageTrace | kQualityEventMaskBtSchedulingTrace | kQualityEventMaskControllerDbgInfo | kQualityEventMaskVendorSpecificTrace; Loading Loading @@ -123,6 +126,12 @@ static constexpr uint8_t kBqrEventQueueSize = 25; // The Property of BQR event mask configuration. static constexpr const char* kpPropertyEventMask = "persist.bluetooth.bqr.event_mask"; // The Property of BQR Vendor Quality configuration. static constexpr const char* kpPropertyVndQualityMask = "persist.bluetooth.bqr.vnd_quality_mask"; // The Property of BQR Vendor Trace configuration. static constexpr const char* kpPropertyVndTraceMask = "persist.bluetooth.bqr.vnd_trace_mask"; // The Property of BQR minimum report interval configuration. static constexpr const char* kpPropertyMinReportIntervalMs = "persist.bluetooth.bqr.min_interval_ms"; Loading Loading @@ -154,7 +163,9 @@ static uint16_t LmpLlMessageTraceCounter = 0; // Counter of Bluetooth Multi-profile/Coex scheduling trace static uint16_t BtSchedulingTraceCounter = 0; // The version supports ISO packets start from v1.01(257) static constexpr uint16_t kBqrIsoVersion = 257; static constexpr uint16_t kBqrIsoVersion = 0x101; // The version supports vendor quality and trace log starting v1.02(258) static constexpr uint16_t kBqrVndLogVersion = 0x102; // Action definition // Loading @@ -180,6 +191,7 @@ enum BqrQualityReportId : uint8_t { QUALITY_REPORT_ID_LMP_LL_MESSAGE_TRACE = 0x11, QUALITY_REPORT_ID_BT_SCHEDULING_TRACE = 0x12, QUALITY_REPORT_ID_CONTROLLER_DBG_INFO = 0x13, QUALITY_REPORT_ID_VENDOR_SPECIFIC_TRACE = 0x20, }; // Packet Type definition Loading Loading @@ -220,6 +232,8 @@ typedef struct { BqrReportAction report_action; uint32_t quality_event_mask; uint16_t minimum_report_interval_ms; uint32_t vnd_quality_mask; uint32_t vnd_trace_mask; } BqrConfiguration; // Link quality related BQR event Loading system/btif/src/btif_bqr.cc +36 −3 Original line number Diff line number Diff line Loading @@ -279,8 +279,12 @@ void EnableBtQualityReport(bool is_enable) { char bqr_prop_evtmask[PROPERTY_VALUE_MAX] = {0}; char bqr_prop_interval_ms[PROPERTY_VALUE_MAX] = {0}; char bqr_prop_vnd_quality_mask[PROPERTY_VALUE_MAX] = {0}; char bqr_prop_vnd_trace_mask[PROPERTY_VALUE_MAX] = {0}; osi_property_get(kpPropertyEventMask, bqr_prop_evtmask, ""); osi_property_get(kpPropertyMinReportIntervalMs, bqr_prop_interval_ms, ""); osi_property_get(kpPropertyVndQualityMask, bqr_prop_vnd_quality_mask, ""); osi_property_get(kpPropertyVndTraceMask, bqr_prop_vnd_trace_mask, ""); if (strlen(bqr_prop_evtmask) == 0 || strlen(bqr_prop_interval_ms) == 0) { LOG(WARNING) << __func__ << ": Bluetooth Quality Report is disabled." Loading @@ -297,10 +301,16 @@ void EnableBtQualityReport(bool is_enable) { static_cast<uint32_t>(atoi(bqr_prop_evtmask)); bqr_config.minimum_report_interval_ms = static_cast<uint16_t>(atoi(bqr_prop_interval_ms)); bqr_config.vnd_quality_mask = static_cast<uint32_t>(atoi(bqr_prop_vnd_quality_mask)); bqr_config.vnd_trace_mask = static_cast<uint32_t>(atoi(bqr_prop_vnd_trace_mask)); } else { bqr_config.report_action = REPORT_ACTION_CLEAR; bqr_config.quality_event_mask = kQualityEventMaskAllOff; bqr_config.minimum_report_interval_ms = kMinReportIntervalNoLimit; bqr_config.vnd_quality_mask = 0; bqr_config.vnd_trace_mask = 0; } tBTM_BLE_VSC_CB cmn_vsc_cb; Loading Loading @@ -336,6 +346,10 @@ void ConfigureBqr(const BqrConfiguration& bqr_config) { UINT8_TO_STREAM(p_param, bqr_config.report_action); UINT32_TO_STREAM(p_param, bqr_config.quality_event_mask); UINT16_TO_STREAM(p_param, bqr_config.minimum_report_interval_ms); if (vendor_cap_supported_version >= kBqrVndLogVersion) { UINT32_TO_STREAM(p_param, bqr_config.vnd_quality_mask); UINT32_TO_STREAM(p_param, bqr_config.vnd_trace_mask); } BTM_VendorSpecificCommand(HCI_CONTROLLER_BQR, p_param - param, param, BqrVscCompleteCallback); Loading @@ -350,9 +364,14 @@ void BqrVscCompleteCallback(tBTM_VSC_CMPL* p_vsc_cmpl_params) { uint8_t* p_event_param_buf = p_vsc_cmpl_params->p_param_buf; uint8_t status = 0xff; uint8_t command_complete_param_len = 5; uint32_t current_vnd_quality_mask = 0; uint32_t current_vnd_trace_mask = 0; // [Return Parameter] | [Size] | [Purpose] // Status | 1 octet | Command complete status // Current_Quality_Event_Mask | 4 octets | Indicates current bit mask setting // Vendor_Specific_Quality_Mask | 4 octets | vendor quality bit mask setting // Vendor_Specific_Trace_Mask | 4 octets | vendor trace bit mask setting STREAM_TO_UINT8(status, p_event_param_buf); if (status != HCI_SUCCESS) { LOG(ERROR) << __func__ Loading @@ -360,9 +379,13 @@ void BqrVscCompleteCallback(tBTM_VSC_CMPL* p_vsc_cmpl_params) { return; } if (p_vsc_cmpl_params->param_len != 5) { if (vendor_cap_supported_version >= kBqrVndLogVersion) { command_complete_param_len = 13; } if (p_vsc_cmpl_params->param_len != command_complete_param_len) { LOG(FATAL) << __func__ << ": The length of returned parameters is not equal to 5: " << ": The length of returned parameters is incorrect: " << std::to_string(p_vsc_cmpl_params->param_len); return; } Loading @@ -370,8 +393,16 @@ void BqrVscCompleteCallback(tBTM_VSC_CMPL* p_vsc_cmpl_params) { uint32_t current_quality_event_mask = kQualityEventMaskAllOff; STREAM_TO_UINT32(current_quality_event_mask, p_event_param_buf); if (vendor_cap_supported_version >= kBqrVndLogVersion) { STREAM_TO_UINT32(current_vnd_quality_mask, p_event_param_buf); STREAM_TO_UINT32(current_vnd_trace_mask, p_event_param_buf); } LOG(INFO) << __func__ << ", current event mask: " << loghex(current_quality_event_mask); << ", current event mask: " << loghex(current_quality_event_mask) << ", vendor quality: " << loghex(current_vnd_quality_mask) << ", vendor trace: " << loghex(current_vnd_trace_mask); ConfigureBqrCmpl(current_quality_event_mask); } Loading Loading @@ -472,10 +503,12 @@ void CategorizeBqrEvent(uint8_t length, const uint8_t* p_bqr_event) { // The Root Inflammation and Log Dump related event should be handled and // intercepted already. case QUALITY_REPORT_ID_VENDOR_SPECIFIC_QUALITY: case QUALITY_REPORT_ID_ROOT_INFLAMMATION: case QUALITY_REPORT_ID_LMP_LL_MESSAGE_TRACE: case QUALITY_REPORT_ID_BT_SCHEDULING_TRACE: case QUALITY_REPORT_ID_CONTROLLER_DBG_INFO: case QUALITY_REPORT_ID_VENDOR_SPECIFIC_TRACE: LOG(WARNING) << __func__ << ": Unexpected ID: " << loghex(quality_report_id); break; Loading Loading
system/btif/include/btif_bqr.h +16 −2 Original line number Diff line number Diff line Loading @@ -83,6 +83,8 @@ static constexpr uint32_t kQualityEventMaskApproachLsto = 0x1 << 1; static constexpr uint32_t kQualityEventMaskA2dpAudioChoppy = 0x1 << 2; static constexpr uint32_t kQualityEventMaskScoVoiceChoppy = 0x1 << 3; static constexpr uint32_t kQualityEventMaskRootInflammation = 0x1 << 4; static constexpr uint32_t kQualityEventMaskEnergyMonitoring = 0x1 << 5; static constexpr uint32_t kQualityEventMaskLeAudioChoppy = 0x1 << 6; static constexpr uint32_t kQualityEventMaskConnectFail = 0x1 << 7; static constexpr uint32_t kQualityEventMaskVendorSpecificQuality = 0x1 << 15; static constexpr uint32_t kQualityEventMaskLmpMessageTrace = 0x1 << 16; Loading @@ -92,7 +94,8 @@ static constexpr uint32_t kQualityEventMaskVendorSpecificTrace = 0x1 << 31; static constexpr uint32_t kQualityEventMaskAll = kQualityEventMaskMonitorMode | kQualityEventMaskApproachLsto | kQualityEventMaskA2dpAudioChoppy | kQualityEventMaskScoVoiceChoppy | kQualityEventMaskRootInflammation | kQualityEventMaskConnectFail | kQualityEventMaskRootInflammation | kQualityEventMaskEnergyMonitoring | kQualityEventMaskLeAudioChoppy | kQualityEventMaskConnectFail | kQualityEventMaskVendorSpecificQuality | kQualityEventMaskLmpMessageTrace | kQualityEventMaskBtSchedulingTrace | kQualityEventMaskControllerDbgInfo | kQualityEventMaskVendorSpecificTrace; Loading Loading @@ -123,6 +126,12 @@ static constexpr uint8_t kBqrEventQueueSize = 25; // The Property of BQR event mask configuration. static constexpr const char* kpPropertyEventMask = "persist.bluetooth.bqr.event_mask"; // The Property of BQR Vendor Quality configuration. static constexpr const char* kpPropertyVndQualityMask = "persist.bluetooth.bqr.vnd_quality_mask"; // The Property of BQR Vendor Trace configuration. static constexpr const char* kpPropertyVndTraceMask = "persist.bluetooth.bqr.vnd_trace_mask"; // The Property of BQR minimum report interval configuration. static constexpr const char* kpPropertyMinReportIntervalMs = "persist.bluetooth.bqr.min_interval_ms"; Loading Loading @@ -154,7 +163,9 @@ static uint16_t LmpLlMessageTraceCounter = 0; // Counter of Bluetooth Multi-profile/Coex scheduling trace static uint16_t BtSchedulingTraceCounter = 0; // The version supports ISO packets start from v1.01(257) static constexpr uint16_t kBqrIsoVersion = 257; static constexpr uint16_t kBqrIsoVersion = 0x101; // The version supports vendor quality and trace log starting v1.02(258) static constexpr uint16_t kBqrVndLogVersion = 0x102; // Action definition // Loading @@ -180,6 +191,7 @@ enum BqrQualityReportId : uint8_t { QUALITY_REPORT_ID_LMP_LL_MESSAGE_TRACE = 0x11, QUALITY_REPORT_ID_BT_SCHEDULING_TRACE = 0x12, QUALITY_REPORT_ID_CONTROLLER_DBG_INFO = 0x13, QUALITY_REPORT_ID_VENDOR_SPECIFIC_TRACE = 0x20, }; // Packet Type definition Loading Loading @@ -220,6 +232,8 @@ typedef struct { BqrReportAction report_action; uint32_t quality_event_mask; uint16_t minimum_report_interval_ms; uint32_t vnd_quality_mask; uint32_t vnd_trace_mask; } BqrConfiguration; // Link quality related BQR event Loading
system/btif/src/btif_bqr.cc +36 −3 Original line number Diff line number Diff line Loading @@ -279,8 +279,12 @@ void EnableBtQualityReport(bool is_enable) { char bqr_prop_evtmask[PROPERTY_VALUE_MAX] = {0}; char bqr_prop_interval_ms[PROPERTY_VALUE_MAX] = {0}; char bqr_prop_vnd_quality_mask[PROPERTY_VALUE_MAX] = {0}; char bqr_prop_vnd_trace_mask[PROPERTY_VALUE_MAX] = {0}; osi_property_get(kpPropertyEventMask, bqr_prop_evtmask, ""); osi_property_get(kpPropertyMinReportIntervalMs, bqr_prop_interval_ms, ""); osi_property_get(kpPropertyVndQualityMask, bqr_prop_vnd_quality_mask, ""); osi_property_get(kpPropertyVndTraceMask, bqr_prop_vnd_trace_mask, ""); if (strlen(bqr_prop_evtmask) == 0 || strlen(bqr_prop_interval_ms) == 0) { LOG(WARNING) << __func__ << ": Bluetooth Quality Report is disabled." Loading @@ -297,10 +301,16 @@ void EnableBtQualityReport(bool is_enable) { static_cast<uint32_t>(atoi(bqr_prop_evtmask)); bqr_config.minimum_report_interval_ms = static_cast<uint16_t>(atoi(bqr_prop_interval_ms)); bqr_config.vnd_quality_mask = static_cast<uint32_t>(atoi(bqr_prop_vnd_quality_mask)); bqr_config.vnd_trace_mask = static_cast<uint32_t>(atoi(bqr_prop_vnd_trace_mask)); } else { bqr_config.report_action = REPORT_ACTION_CLEAR; bqr_config.quality_event_mask = kQualityEventMaskAllOff; bqr_config.minimum_report_interval_ms = kMinReportIntervalNoLimit; bqr_config.vnd_quality_mask = 0; bqr_config.vnd_trace_mask = 0; } tBTM_BLE_VSC_CB cmn_vsc_cb; Loading Loading @@ -336,6 +346,10 @@ void ConfigureBqr(const BqrConfiguration& bqr_config) { UINT8_TO_STREAM(p_param, bqr_config.report_action); UINT32_TO_STREAM(p_param, bqr_config.quality_event_mask); UINT16_TO_STREAM(p_param, bqr_config.minimum_report_interval_ms); if (vendor_cap_supported_version >= kBqrVndLogVersion) { UINT32_TO_STREAM(p_param, bqr_config.vnd_quality_mask); UINT32_TO_STREAM(p_param, bqr_config.vnd_trace_mask); } BTM_VendorSpecificCommand(HCI_CONTROLLER_BQR, p_param - param, param, BqrVscCompleteCallback); Loading @@ -350,9 +364,14 @@ void BqrVscCompleteCallback(tBTM_VSC_CMPL* p_vsc_cmpl_params) { uint8_t* p_event_param_buf = p_vsc_cmpl_params->p_param_buf; uint8_t status = 0xff; uint8_t command_complete_param_len = 5; uint32_t current_vnd_quality_mask = 0; uint32_t current_vnd_trace_mask = 0; // [Return Parameter] | [Size] | [Purpose] // Status | 1 octet | Command complete status // Current_Quality_Event_Mask | 4 octets | Indicates current bit mask setting // Vendor_Specific_Quality_Mask | 4 octets | vendor quality bit mask setting // Vendor_Specific_Trace_Mask | 4 octets | vendor trace bit mask setting STREAM_TO_UINT8(status, p_event_param_buf); if (status != HCI_SUCCESS) { LOG(ERROR) << __func__ Loading @@ -360,9 +379,13 @@ void BqrVscCompleteCallback(tBTM_VSC_CMPL* p_vsc_cmpl_params) { return; } if (p_vsc_cmpl_params->param_len != 5) { if (vendor_cap_supported_version >= kBqrVndLogVersion) { command_complete_param_len = 13; } if (p_vsc_cmpl_params->param_len != command_complete_param_len) { LOG(FATAL) << __func__ << ": The length of returned parameters is not equal to 5: " << ": The length of returned parameters is incorrect: " << std::to_string(p_vsc_cmpl_params->param_len); return; } Loading @@ -370,8 +393,16 @@ void BqrVscCompleteCallback(tBTM_VSC_CMPL* p_vsc_cmpl_params) { uint32_t current_quality_event_mask = kQualityEventMaskAllOff; STREAM_TO_UINT32(current_quality_event_mask, p_event_param_buf); if (vendor_cap_supported_version >= kBqrVndLogVersion) { STREAM_TO_UINT32(current_vnd_quality_mask, p_event_param_buf); STREAM_TO_UINT32(current_vnd_trace_mask, p_event_param_buf); } LOG(INFO) << __func__ << ", current event mask: " << loghex(current_quality_event_mask); << ", current event mask: " << loghex(current_quality_event_mask) << ", vendor quality: " << loghex(current_vnd_quality_mask) << ", vendor trace: " << loghex(current_vnd_trace_mask); ConfigureBqrCmpl(current_quality_event_mask); } Loading Loading @@ -472,10 +503,12 @@ void CategorizeBqrEvent(uint8_t length, const uint8_t* p_bqr_event) { // The Root Inflammation and Log Dump related event should be handled and // intercepted already. case QUALITY_REPORT_ID_VENDOR_SPECIFIC_QUALITY: case QUALITY_REPORT_ID_ROOT_INFLAMMATION: case QUALITY_REPORT_ID_LMP_LL_MESSAGE_TRACE: case QUALITY_REPORT_ID_BT_SCHEDULING_TRACE: case QUALITY_REPORT_ID_CONTROLLER_DBG_INFO: case QUALITY_REPORT_ID_VENDOR_SPECIFIC_TRACE: LOG(WARNING) << __func__ << ": Unexpected ID: " << loghex(quality_report_id); break; Loading