mirror of
https://github.com/Evolution-X/hardware_interfaces
synced 2026-02-01 22:04:26 +00:00
Merge "Bluetooth HAL: fix ISO handling for H4 protocol" am: 389e9aa728 am: a088953e11
Original change: https://android-review.googlesource.com/c/platform/hardware/interfaces/+/1506098 Change-Id: Ia0478fe7751009940814bc933cf847b246da460c
This commit is contained in:
@@ -90,6 +90,7 @@ void H4Protocol::OnDataReady(int fd) {
|
||||
hci_packet_type_ = static_cast<HciPacketType>(buffer[0]);
|
||||
if (hci_packet_type_ != HCI_PACKET_TYPE_ACL_DATA &&
|
||||
hci_packet_type_ != HCI_PACKET_TYPE_SCO_DATA &&
|
||||
hci_packet_type_ != HCI_PACKET_TYPE_ISO_DATA &&
|
||||
hci_packet_type_ != HCI_PACKET_TYPE_EVENT) {
|
||||
LOG_ALWAYS_FATAL("%s: Unimplemented packet type %d", __func__,
|
||||
static_cast<int>(hci_packet_type_));
|
||||
|
||||
@@ -44,6 +44,10 @@ const size_t HCI_LENGTH_OFFSET_SCO = 2;
|
||||
const size_t HCI_EVENT_PREAMBLE_SIZE = 2;
|
||||
const size_t HCI_LENGTH_OFFSET_EVT = 1;
|
||||
|
||||
// 2 bytes for handle and flags, 2 byte for data length (Volume 4, Part E, 5.4.5)
|
||||
const size_t HCI_ISO_PREAMBLE_SIZE = 4;
|
||||
const size_t HCI_LENGTH_OFFSET_ISO = 2;
|
||||
|
||||
const size_t HCI_PREAMBLE_SIZE_MAX = HCI_ACL_PREAMBLE_SIZE;
|
||||
|
||||
// Event codes (Volume 2, Part E, 7.7.14)
|
||||
|
||||
@@ -26,17 +26,27 @@
|
||||
|
||||
namespace {
|
||||
|
||||
const size_t preamble_size_for_type[] = {
|
||||
0, HCI_COMMAND_PREAMBLE_SIZE, HCI_ACL_PREAMBLE_SIZE, HCI_SCO_PREAMBLE_SIZE,
|
||||
HCI_EVENT_PREAMBLE_SIZE};
|
||||
const size_t packet_length_offset_for_type[] = {
|
||||
0, HCI_LENGTH_OFFSET_CMD, HCI_LENGTH_OFFSET_ACL, HCI_LENGTH_OFFSET_SCO,
|
||||
HCI_LENGTH_OFFSET_EVT};
|
||||
const size_t preamble_size_for_type[] = {0,
|
||||
HCI_COMMAND_PREAMBLE_SIZE,
|
||||
HCI_ACL_PREAMBLE_SIZE,
|
||||
HCI_SCO_PREAMBLE_SIZE,
|
||||
HCI_EVENT_PREAMBLE_SIZE,
|
||||
HCI_ISO_PREAMBLE_SIZE};
|
||||
const size_t packet_length_offset_for_type[] = {0,
|
||||
HCI_LENGTH_OFFSET_CMD,
|
||||
HCI_LENGTH_OFFSET_ACL,
|
||||
HCI_LENGTH_OFFSET_SCO,
|
||||
HCI_LENGTH_OFFSET_EVT,
|
||||
HCI_LENGTH_OFFSET_ISO};
|
||||
|
||||
size_t HciGetPacketLengthForType(HciPacketType type, const uint8_t* preamble) {
|
||||
size_t offset = packet_length_offset_for_type[type];
|
||||
if (type != HCI_PACKET_TYPE_ACL_DATA) return preamble[offset];
|
||||
return (((preamble[offset + 1]) << 8) | preamble[offset]);
|
||||
if (type == HCI_PACKET_TYPE_ACL_DATA) {
|
||||
return (((preamble[offset + 1]) << 8) | preamble[offset]);
|
||||
} else if (type == HCI_PACKET_TYPE_ISO_DATA) {
|
||||
return ((((preamble[offset + 1]) & 0x3f) << 8) | preamble[offset]);
|
||||
}
|
||||
return preamble[offset];
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
@@ -190,8 +190,10 @@ class H4ProtocolTest : public ::testing::Test {
|
||||
|
||||
void WriteAndExpectInboundIsoData(char* payload) {
|
||||
// h4 type[1] + handle[2] + size[1]
|
||||
char preamble[4] = {HCI_PACKET_TYPE_ISO_DATA, 20, 17, 0};
|
||||
preamble[3] = strlen(payload) & 0xFF;
|
||||
char preamble[5] = {HCI_PACKET_TYPE_ISO_DATA, 19, 92, 0, 0};
|
||||
int length = strlen(payload);
|
||||
preamble[3] = length & 0xFF;
|
||||
preamble[4] = (length >> 8) & 0x3F;
|
||||
|
||||
ALOGD("%s writing", __func__);
|
||||
TEMP_FAILURE_RETRY(write(fake_uart_, preamble, sizeof(preamble)));
|
||||
|
||||
Reference in New Issue
Block a user