mirror of
https://github.com/ponces/treble_aosp.git
synced 2024-11-22 05:26:14 +00:00
132 lines
5.4 KiB
Diff
132 lines
5.4 KiB
Diff
From 8a315f66383f91115ba8e3a28afa63ab7bea7834 Mon Sep 17 00:00:00 2001
|
|
From: Pierre-Hugues Husson <phh@phh.me>
|
|
Date: Sat, 27 May 2023 06:41:32 -0400
|
|
Subject: [PATCH 6/8] Add properties to disable some features/commands/states
|
|
that the ble chip declared but doesnt actually support
|
|
|
|
---
|
|
system/gd/hci/controller.cc | 72 ++++++++++++++++++++++++++++++++++---
|
|
1 file changed, 68 insertions(+), 4 deletions(-)
|
|
|
|
diff --git a/system/gd/hci/controller.cc b/system/gd/hci/controller.cc
|
|
index a6c16a9061..237dbe6b93 100644
|
|
--- a/system/gd/hci/controller.cc
|
|
+++ b/system/gd/hci/controller.cc
|
|
@@ -18,6 +18,7 @@
|
|
|
|
#include <android_bluetooth_flags.h>
|
|
|
|
+#include <base/strings/string_split.h>
|
|
#include <future>
|
|
#include <memory>
|
|
#include <string>
|
|
@@ -33,6 +34,7 @@
|
|
#include "os/metrics.h"
|
|
#include "os/system_properties.h"
|
|
#include "sysprops/sysprops_module.h"
|
|
+using bluetooth::os::GetSystemProperty;
|
|
|
|
namespace bluetooth {
|
|
namespace hci {
|
|
@@ -313,7 +315,23 @@ struct Controller::impl {
|
|
ASSERT(complete_view.IsValid());
|
|
ErrorCode status = complete_view.GetStatus();
|
|
ASSERT_LOG(status == ErrorCode::SUCCESS, "Status 0x%02hhx, %s", status, ErrorCodeText(status).c_str());
|
|
- local_supported_commands_ = complete_view.GetSupportedCommands();
|
|
+ //local_supported_commands_ = complete_view.GetSupportedCommands();
|
|
+
|
|
+ auto local_commands = complete_view.GetSupportedCommands();
|
|
+ std::string ignored_commands = GetSystemProperty("persist.sys.bt.unsupported.commands").value_or("");
|
|
+
|
|
+ if (ignored_commands != "") {
|
|
+ auto s = base::SplitString(ignored_commands, ",", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
|
|
+ for(auto command: s) {
|
|
+ int index = std::stoi(command);
|
|
+ LOG_WARN("Ignoring local supported command %d", index);
|
|
+ uint16_t byte_index = index / 10;
|
|
+ uint16_t bit_index = index % 10;
|
|
+ local_commands[byte_index] &= ~(1 << bit_index);
|
|
+ }
|
|
+ }
|
|
+
|
|
+ local_supported_commands_ = local_commands;
|
|
}
|
|
|
|
void read_local_extended_features_complete_handler(std::promise<void> promise, CommandCompleteView view) {
|
|
@@ -322,7 +340,25 @@ struct Controller::impl {
|
|
ErrorCode status = complete_view.GetStatus();
|
|
ASSERT_LOG(status == ErrorCode::SUCCESS, "Status 0x%02hhx, %s", status, ErrorCodeText(status).c_str());
|
|
uint8_t page_number = complete_view.GetPageNumber();
|
|
- extended_lmp_features_array_.push_back(complete_view.GetExtendedLmpFeatures());
|
|
+
|
|
+ //extended_lmp_features_array_.push_back(complete_view.GetExtendedLmpFeatures());
|
|
+ auto lmp_features = complete_view.GetExtendedLmpFeatures();
|
|
+
|
|
+ std::string ignored_features = GetSystemProperty("persist.sys.bt.unsupported.ogfeatures").value_or("");
|
|
+
|
|
+ if (ignored_features != "") {
|
|
+ auto s = base::SplitString(ignored_features, ",", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
|
|
+ int offset = page_number * 64;
|
|
+ for(auto feature: s) {
|
|
+ int index = std::stoi(feature) - offset;
|
|
+ if(index >= 0 && index < 64) {
|
|
+ LOG_WARN("Ignoring local supported feature %d", index);
|
|
+ lmp_features &= ~(1ULL << index);
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+ extended_lmp_features_array_.push_back(lmp_features);
|
|
+
|
|
bluetooth::os::LogMetricBluetoothLocalSupportedFeatures(page_number, complete_view.GetExtendedLmpFeatures());
|
|
// Query all extended features
|
|
if (page_number < complete_view.GetMaximumPageNumber()) {
|
|
@@ -475,7 +511,21 @@ struct Controller::impl {
|
|
ASSERT(complete_view.IsValid());
|
|
ErrorCode status = complete_view.GetStatus();
|
|
ASSERT_LOG(status == ErrorCode::SUCCESS, "Status 0x%02hhx, %s", status, ErrorCodeText(status).c_str());
|
|
- le_local_supported_features_ = complete_view.GetLeFeatures();
|
|
+
|
|
+ //le_local_supported_features_ = complete_view.GetLeFeatures();
|
|
+ auto local_features = complete_view.GetLeFeatures();
|
|
+ std::string ignored_features = GetSystemProperty("persist.sys.bt.unsupported.lefeatures").value_or("");
|
|
+
|
|
+ if (ignored_features != "") {
|
|
+ auto s = base::SplitString(ignored_features, ",", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
|
|
+ for(auto feature: s) {
|
|
+ int index = std::stoi(feature);
|
|
+ LOG_WARN("Ignoring local supported feature %d", index);
|
|
+ local_features &= ~(1ULL << index);
|
|
+ }
|
|
+ }
|
|
+
|
|
+ le_local_supported_features_ = local_features;
|
|
}
|
|
|
|
void le_read_supported_states_handler(CommandCompleteView view) {
|
|
@@ -483,7 +533,21 @@ struct Controller::impl {
|
|
ASSERT(complete_view.IsValid());
|
|
ErrorCode status = complete_view.GetStatus();
|
|
ASSERT_LOG(status == ErrorCode::SUCCESS, "Status 0x%02hhx, %s", status, ErrorCodeText(status).c_str());
|
|
- le_supported_states_ = complete_view.GetLeStates();
|
|
+ //le_supported_states_ = complete_view.GetLeStates();
|
|
+
|
|
+ auto local_states = complete_view.GetLeStates();
|
|
+ std::string ignored_states = GetSystemProperty("persist.sys.bt.unsupported.states").value_or("");
|
|
+
|
|
+ if (ignored_states != "") {
|
|
+ auto s = base::SplitString(ignored_states, ",", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
|
|
+ for(auto state: s) {
|
|
+ int index = std::stoi(state);
|
|
+ LOG_WARN("Ignoring local supported state %d", index);
|
|
+ local_states &= ~(1ULL << index);
|
|
+ }
|
|
+ }
|
|
+
|
|
+ le_supported_states_ = local_states;
|
|
}
|
|
|
|
void le_read_accept_list_size_handler(CommandCompleteView view) {
|
|
--
|
|
2.34.1
|
|
|