From 636d6714a4c08dd99d2147dcce05dc3892e804b4 Mon Sep 17 00:00:00 2001 From: Priti Aghera Date: Thu, 18 Dec 2014 13:55:48 -0800 Subject: LE Data Packet Extension support Included support for LE data packet extension feature according to BT 4.2 spec. This patch checks if the controller supports LE packet extension and provides functions to set the PDU length. Bug: 20013956 Change-Id: I6a92970fede2f793ad48c9fa2e0247ad00297533 --- device/include/controller.h | 3 +++ device/src/controller.c | 25 ++++++++++++++++++++++++- 2 files changed, 27 insertions(+), 1 deletion(-) (limited to 'device') diff --git a/device/include/controller.h b/device/include/controller.h index af93e4742..2acca1bc0 100644 --- a/device/include/controller.h +++ b/device/include/controller.h @@ -51,6 +51,7 @@ typedef struct controller_t { bool (*supports_master_slave_role_switch)(void); bool (*supports_ble)(void); + bool (*supports_ble_packet_extension)(void); bool (*supports_ble_connection_parameters_request)(void); bool (*supports_ble_privacy)(void); @@ -64,6 +65,8 @@ typedef struct controller_t { uint16_t (*get_acl_packet_size_classic)(void); uint16_t (*get_acl_packet_size_ble)(void); + uint16_t (*get_ble_default_data_packet_length)(void); + // Get the number of acl packets the controller can buffer. uint16_t (*get_acl_buffer_count_classic)(void); uint8_t (*get_acl_buffer_count_ble)(void); diff --git a/device/src/controller.c b/device/src/controller.c index f0d3e584d..02edc4faf 100644 --- a/device/src/controller.c +++ b/device/src/controller.c @@ -34,7 +34,8 @@ #include "stack/include/btm_ble_api.h" #include "btcore/include/version.h" -const bt_event_mask_t BLE_EVENT_MASK = { "\x00\x00\x00\x00\x00\x00\x00\x3f" }; +const bt_event_mask_t BLE_EVENT_MASK = { "\x00\x00\x00\x00\x00\x00\x04\x7f" }; + #if (BLE_INCLUDED) const bt_event_mask_t CLASSIC_EVENT_MASK = { HCI_DUMO_EVENT_MASK_EXT }; #else @@ -69,6 +70,7 @@ static uint8_t ble_white_list_size; static uint8_t ble_resolving_list_max_size; static uint8_t ble_supported_states[BLE_SUPPORTED_STATES_SIZE]; static bt_device_features_t features_ble; +static uint16_t ble_suggested_default_data_length; static bool readable; static bool ble_supported; @@ -225,6 +227,13 @@ static future_t *start_up(void) { &ble_resolving_list_max_size); } + if (HCI_LE_DATA_LEN_EXT_SUPPORTED(features_ble.as_array)) { + response = AWAIT_COMMAND(packet_factory->make_ble_read_suggested_default_data_length()); + packet_parser->parse_ble_read_suggested_default_data_length_response( + response, + &ble_suggested_default_data_length); + } + // Set the ble event mask next response = AWAIT_COMMAND(packet_factory->make_ble_set_event_mask(&BLE_EVENT_MASK)); packet_parser->parse_generic_command_complete(response); @@ -348,6 +357,12 @@ static bool supports_ble_privacy(void) { return HCI_LE_ENHANCED_PRIVACY_SUPPORTED(features_ble.as_array); } +static bool supports_ble_packet_extension(void) { + assert(readable); + assert(ble_supported); + return HCI_LE_DATA_LEN_EXT_SUPPORTED(features_ble.as_array); +} + static bool supports_ble_connection_parameters_request(void) { assert(readable); assert(ble_supported); @@ -375,6 +390,12 @@ static uint16_t get_acl_packet_size_ble(void) { return acl_data_size_ble + HCI_DATA_PREAMBLE_SIZE; } +static uint16_t get_ble_suggested_default_data_length(void) { + assert(readable); + assert(ble_supported); + return ble_suggested_default_data_length; +} + static uint16_t get_acl_buffer_count_classic(void) { assert(readable); return acl_buffer_count_classic; @@ -420,6 +441,7 @@ static const controller_t interface = { supports_master_slave_role_switch, supports_ble, + supports_ble_packet_extension, supports_ble_connection_parameters_request, supports_ble_privacy, @@ -428,6 +450,7 @@ static const controller_t interface = { get_acl_packet_size_classic, get_acl_packet_size_ble, + get_ble_suggested_default_data_length, get_acl_buffer_count_classic, get_acl_buffer_count_ble, -- cgit v1.2.3