Skip to content

Commit f6869c6

Browse files
committed
wip: advertising; not tested
1 parent f03045b commit f6869c6

19 files changed

Lines changed: 378 additions & 178 deletions

File tree

devices/ble_hci/common-hal/_bleio/Adapter.c

Lines changed: 210 additions & 141 deletions
Large diffs are not rendered by default.

devices/ble_hci/common-hal/_bleio/Adapter.h

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,20 +43,32 @@
4343

4444
extern bleio_connection_internal_t bleio_connections[BLEIO_TOTAL_CONNECTION_COUNT];
4545

46+
47+
4648
typedef struct _bleio_adapter_obj_t {
4749
mp_obj_base_t base;
48-
uint8_t* advertising_data;
49-
uint8_t* scan_response_data;
50-
uint8_t* current_advertising_data;
5150
bleio_scanresults_obj_t *scan_results;
5251
mp_obj_t name;
5352
mp_obj_tuple_t *connection_objs;
5453
busio_uart_obj_t* hci_uart;
5554
digitalio_digitalinout_obj_t *rts_digitalinout;
5655
digitalio_digitalinout_obj_t *cts_digitalinout;
56+
bool now_advertising;
57+
bool extended_advertising;
58+
bool circuitpython_advertising;
5759
bool enabled;
60+
61+
// Used to monitor advertising timeout for legacy avertising.
62+
uint64_t advertising_start_ticks;
63+
uint64_t advertising_timeout_msecs; // If zero, do not check.
64+
65+
uint16_t max_acl_buffer_len;
66+
uint16_t max_acl_num_buffers;
67+
uint16_t max_adv_data_len;
68+
5869
} bleio_adapter_obj_t;
5970

71+
void bleio_adapter_background(bleio_adapter_obj_t* adapter);
6072
void bleio_adapter_gc_collect(bleio_adapter_obj_t* adapter);
6173
void bleio_adapter_reset(bleio_adapter_obj_t* adapter);
6274

devices/ble_hci/common-hal/_bleio/__init__.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -263,3 +263,10 @@ void common_hal_bleio_gattc_write(uint16_t handle, uint16_t conn_handle, mp_buff
263263
void common_hal_bleio_gc_collect(void) {
264264
bleio_adapter_gc_collect(&common_hal_bleio_adapter_obj);
265265
}
266+
267+
268+
void bleio_background(void) {
269+
supervisor_bluetooth_background();
270+
bleio_adapter_background(&common_hal_bleio_adapter_obj);
271+
//FIX bonding_background();
272+
}

devices/ble_hci/common-hal/_bleio/__init__.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131

3232
#include "hci_api.h"
3333

34+
void bleio_background(void);
3435
void bleio_reset(void);
3536

3637
typedef struct {

devices/ble_hci/common-hal/_bleio/hci_api.c

Lines changed: 57 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,7 @@ STATIC void process_evt_pkt(size_t pkt_len, uint8_t pkt[])
215215
//FIX
216216
// ATT.removeConnection(disconn_complete->handle, disconn_complete->reason);
217217
// L2CAPSignaling.removeConnection(disconn_complete->handle, disconn_complete->reason);
218-
hci_le_set_advertise_enable(0x01);
218+
hci_le_set_advertising_enable(0x01);
219219
break;
220220
}
221221

@@ -365,7 +365,7 @@ hci_result_t hci_poll_for_incoming_pkt(void) {
365365
// Stop incoming data while processing packet.
366366
common_hal_digitalio_digitalinout_set_value(adapter->rts_digitalinout, true);
367367
size_t pkt_len = rx_idx;
368-
// Reset for next pack
368+
// Reset for next packet.
369369
rx_idx = 0;
370370

371371
switch (rx_buffer[0]) {
@@ -395,7 +395,6 @@ hci_result_t hci_poll_for_incoming_pkt(void) {
395395
}
396396

397397

398-
// Returns
399398
STATIC hci_result_t write_pkt(uint8_t *buffer, size_t len) {
400399
// Wait for CTS to go low before writing to HCI adapter.
401400
uint64_t start = supervisor_ticks_ms64();
@@ -555,7 +554,7 @@ hci_result_t hci_set_evt_mask(uint64_t event_mask) {
555554
return send_command(BT_HCI_OP_SET_EVENT_MASK, sizeof(event_mask), &event_mask);
556555
}
557556

558-
hci_result_t hci_read_le_buffer_size(uint16_t *le_max_len, uint8_t *le_max_num) {
557+
hci_result_t hci_le_read_buffer_size(uint16_t *le_max_len, uint8_t *le_max_num) {
559558
int result = send_command(BT_HCI_OP_LE_READ_BUFFER_SIZE, 0, NULL);
560559
if (result == HCI_OK) {
561560
struct bt_hci_rp_le_read_buffer_size *response =
@@ -567,6 +566,20 @@ hci_result_t hci_read_le_buffer_size(uint16_t *le_max_len, uint8_t *le_max_num)
567566
return result;
568567
}
569568

569+
hci_result_t hci_read_buffer_size(uint16_t *acl_max_len, uint8_t *sco_max_len, uint16_t *acl_max_num, uint16_t *sco_max_num) {
570+
int result = send_command(BT_HCI_OP_READ_BUFFER_SIZE, 0, NULL);
571+
if (result == HCI_OK) {
572+
struct bt_hci_rp_read_buffer_size *response =
573+
(struct bt_hci_rp_read_buffer_size *) cmd_response_data;
574+
*acl_max_len = response->acl_max_len;
575+
*sco_max_len = response->sco_max_len;
576+
*acl_max_num = response->acl_max_num;
577+
*sco_max_num = response->sco_max_num;
578+
}
579+
580+
return result;
581+
}
582+
570583
hci_result_t hci_le_set_random_address(uint8_t addr[6]) {
571584
return send_command(BT_HCI_OP_LE_SET_RANDOM_ADDRESS, 6, addr);
572585
}
@@ -587,7 +600,30 @@ hci_result_t hci_le_set_advertising_parameters(uint16_t min_interval, uint16_t m
587600
return send_command(BT_HCI_OP_LE_SET_ADV_PARAM, sizeof(params), &params);
588601
}
589602

590-
hci_result_t hci_le_read_maximum_advertising_data_length(int *max_adv_data_len) {
603+
hci_result_t hci_le_set_extended_advertising_parameters(uint8_t handle, uint16_t props, uint32_t prim_min_interval, uint32_t prim_max_interval, uint8_t prim_channel_map, uint8_t own_addr_type, bt_addr_le_t *peer_addr, uint8_t filter_policy, int8_t tx_power, uint8_t prim_adv_phy, uint8_t sec_adv_max_skip, uint8_t sec_adv_phy, uint8_t sid, uint8_t scan_req_notify_enable) {
604+
struct bt_hci_cp_le_set_ext_adv_param params = {
605+
.handle = handle,
606+
.props = props,
607+
// .prim_min_interval and .prim_max_interval set below
608+
.prim_channel_map = prim_channel_map,
609+
.own_addr_type = own_addr_type,
610+
// .peer_addr set below.
611+
.tx_power = tx_power,
612+
.sec_adv_max_skip = sec_adv_max_skip,
613+
.sec_adv_phy = sec_adv_phy,
614+
.sid = sid,
615+
.scan_req_notify_enable = scan_req_notify_enable,
616+
};
617+
// Assumes little-endian.
618+
memcpy(params.prim_min_interval, (void *) &prim_min_interval,
619+
sizeof_field(struct bt_hci_cp_le_set_ext_adv_param, prim_min_interval));
620+
memcpy(params.prim_max_interval, (void *) &prim_max_interval,
621+
sizeof_field(struct bt_hci_cp_le_set_ext_adv_param, prim_max_interval));
622+
memcpy(params.peer_addr.a.val, peer_addr->a.val, sizeof_field(bt_addr_le_t, a.val));
623+
return send_command(BT_HCI_OP_LE_SET_EXT_ADV_PARAM, sizeof(params), &params);
624+
}
625+
626+
hci_result_t hci_le_read_maximum_advertising_data_length(uint16_t *max_adv_data_len) {
591627
int result = send_command(BT_HCI_OP_LE_READ_MAX_ADV_DATA_LEN, 0, NULL);
592628
if (result == HCI_OK) {
593629
struct bt_hci_rp_le_read_max_adv_data_len *response =
@@ -625,10 +661,25 @@ hci_result_t hci_le_set_scan_response_data(uint8_t len, uint8_t data[]) {
625661
return send_command(BT_HCI_OP_LE_SET_SCAN_RSP_DATA, sizeof(params), &params);
626662
}
627663

628-
hci_result_t hci_le_set_advertise_enable(uint8_t enable) {
664+
hci_result_t hci_le_set_advertising_enable(uint8_t enable) {
629665
return send_command(BT_HCI_OP_LE_SET_ADV_ENABLE, sizeof(enable), &enable);
630666
}
631667

668+
hci_result_t hci_le_set_extended_advertising_enable(uint8_t enable, uint8_t set_num, uint8_t handle[], uint16_t duration[], uint8_t max_ext_adv_evts[]) {
669+
uint8_t params[sizeof(struct bt_hci_cp_le_set_ext_adv_enable) +
670+
set_num * (sizeof(struct bt_hci_ext_adv_set))];
671+
struct bt_hci_cp_le_set_ext_adv_enable *params_p = (struct bt_hci_cp_le_set_ext_adv_enable *) &params;
672+
params_p->enable = enable;
673+
params_p->set_num = set_num;
674+
for (size_t i = 0; i < set_num; i++) {
675+
params_p->s[i].handle = handle[i];
676+
params_p->s[i].duration = duration[i];
677+
params_p->s[i].max_ext_adv_evts = max_ext_adv_evts[i];
678+
}
679+
680+
return send_command(BT_HCI_OP_LE_SET_EXT_ADV_ENABLE, sizeof(params), &params);
681+
}
682+
632683
hci_result_t hci_le_set_scan_parameters(uint8_t scan_type, uint16_t interval, uint16_t window, uint8_t addr_type, uint8_t filter_policy) {
633684
struct bt_hci_cp_le_set_scan_param params = {
634685
.scan_type = scan_type,

devices/ble_hci/common-hal/_bleio/hci_api.h

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,11 +45,16 @@ hci_result_t hci_le_cancel_conn(void);
4545
hci_result_t hci_le_conn_update(uint16_t handle, uint16_t conn_interval_min, uint16_t conn_interval_max, uint16_t conn_latency, uint16_t supervision_timeout);
4646
hci_result_t hci_le_create_conn(uint16_t scan_interval, uint16_t scan_window, uint8_t filter_policy, bt_addr_le_t *peer_addr, uint8_t own_addr_type, uint16_t conn_interval_min, uint16_t conn_interval_max, uint16_t conn_latency, uint16_t supervision_timeout, uint16_t min_ce_len, uint16_t max_ce_len);
4747

48-
hci_result_t hci_le_read_maximum_advertising_data_length(int *max_adv_data_len);
48+
hci_result_t hci_le_read_buffer_size(uint16_t *le_max_len, uint8_t *le_max_num);
49+
hci_result_t hci_le_read_maximum_advertising_data_length(uint16_t *max_adv_data_len);
4950

50-
hci_result_t hci_le_set_advertise_enable(uint8_t enable);
5151
hci_result_t hci_le_set_advertising_data(uint8_t length, uint8_t data[]);
52+
hci_result_t hci_le_set_advertising_enable(uint8_t enable);
5253
hci_result_t hci_le_set_advertising_parameters(uint16_t min_interval, uint16_t max_interval, uint8_t type, uint8_t own_addr_type, bt_addr_le_t *direct_addr, uint8_t channel_map, uint8_t filter_policy);
54+
55+
hci_result_t hci_le_set_extended_advertising_enable(uint8_t enable, uint8_t set_num, uint8_t handle[], uint16_t duration[], uint8_t max_ext_adv_evts[]);
56+
hci_result_t hci_le_set_extended_advertising_parameters(uint8_t handle, uint16_t props, uint32_t prim_min_interval, uint32_t prim_max_interval, uint8_t prim_channel_map, uint8_t own_addr_type, bt_addr_le_t *peer_addr, uint8_t filter_policy, int8_t tx_power, uint8_t prim_adv_phy, uint8_t sec_adv_max_skip, uint8_t sec_adv_phy, uint8_t sid, uint8_t scan_req_notify_enable);
57+
5358
hci_result_t hci_le_set_random_address(uint8_t addr[6]);
5459
hci_result_t hci_le_set_scan_enable(uint8_t enable, uint8_t filter_dup);
5560
hci_result_t hci_le_set_scan_parameters(uint8_t scan_type, uint16_t interval, uint16_t window, uint8_t addr_type, uint8_t filter_policy);
@@ -58,7 +63,7 @@ hci_result_t hci_le_set_scan_response_data(uint8_t length, uint8_t data[]);
5863
hci_result_t hci_poll_for_incoming_pkt(void);
5964

6065
hci_result_t hci_read_bd_addr(bt_addr_t *addr);
61-
hci_result_t hci_read_le_buffer_size(uint16_t *le_max_len, uint8_t *le_max_num);
66+
hci_result_t hci_read_buffer_size(uint16_t *acl_max_len, uint8_t *sco_max_len, uint16_t *acl_max_num, uint16_t *sco_max_num);
6267
hci_result_t hci_read_local_version(uint8_t *hci_version, uint16_t *hci_revision, uint8_t *lmp_version, uint16_t *manufacturer, uint16_t *lmp_subversion);
6368
hci_result_t hci_read_rssi(uint16_t handle, int *rssi);
6469

devices/ble_hci/common-hal/_bleio/hci_include/hci.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
#include <string.h>
1515
#include "addr.h"
1616

17+
#define BIT(n) (1UL << (n))
18+
1719
/* Special own address types for LL privacy (used in adv & scan parameters) */
1820
#define BT_HCI_OWN_ADDR_RPA_OR_PUBLIC 0x02
1921
#define BT_HCI_OWN_ADDR_RPA_OR_RANDOM 0x03

ports/atmel-samd/background.c

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,11 @@
3535
#include "supervisor/shared/stack.h"
3636
#include "supervisor/port.h"
3737

38-
#ifdef CIRCUITPY_DISPLAYIO
38+
#if CIRCUITPY_BLEIO
39+
#include "common-hal/_bleio/__init__.h"
40+
#endif
41+
42+
#if CIRCUITPY_DISPLAYIO
3943
#include "shared-module/displayio/__init__.h"
4044
#endif
4145

@@ -77,16 +81,22 @@ void run_background_tasks(void) {
7781
assert_heap_ok();
7882
running_background_tasks = true;
7983

80-
#if CIRCUITPY_AUDIOIO || CIRCUITPY_AUDIOBUSIO
84+
#if CIRCUITPY_AUDIOIO || CIRCUITPY_AUDIOBUSIO
8185
audio_dma_background();
82-
#endif
83-
#if CIRCUITPY_DISPLAYIO
86+
#endif
87+
88+
#if CIRCUITPY_BLEIO
89+
bleio_background();
90+
#endif
91+
92+
#if CIRCUITPY_DISPLAYIO
8493
displayio_background();
85-
#endif
94+
#endif
8695

87-
#if CIRCUITPY_NETWORK
96+
#if CIRCUITPY_NETWORK
8897
network_module_background();
89-
#endif
98+
#endif
99+
90100
filesystem_background();
91101
usb_background();
92102
running_background_tasks = false;

ports/cxd56/background.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,10 @@ void run_background_tasks(void) {
4545
assert_heap_ok();
4646
running_background_tasks = true;
4747

48+
#if CIRCUITPY_BLEIO
49+
bleio_background();
50+
#endif
51+
4852
usb_background();
4953
filesystem_background();
5054

ports/esp32s2/background.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,10 @@ void run_background_tasks(void) {
5454
running_background_tasks = true;
5555
filesystem_background();
5656

57+
#if CIRCUITPY_BLEIO
58+
bleio_background();
59+
#endif
60+
5761
// #if CIRCUITPY_DISPLAYIO
5862
// displayio_background();
5963
// #endif

0 commit comments

Comments
 (0)