summaryrefslogtreecommitdiff
path: root/extmod/btstack
diff options
context:
space:
mode:
authorJim Mussared <jim.mussared@gmail.com>2020-08-18 11:05:34 +1000
committerDamien George <damien@micropython.org>2020-09-08 12:53:24 +1000
commit99a29ec705b463290d5a2ac1eabc46fb7f2a83b0 (patch)
tree13918c236f68fea9de4425169877a9b932c4c4e2 /extmod/btstack
parent6077c63a450d7c2ab5e31e5845ecb5f1a4634b26 (diff)
extmod/btstack: Detect HCI UART init failure.
Diffstat (limited to 'extmod/btstack')
-rw-r--r--extmod/btstack/btstack_hci_uart.c14
-rw-r--r--extmod/btstack/modbluetooth_btstack.c7
2 files changed, 17 insertions, 4 deletions
diff --git a/extmod/btstack/btstack_hci_uart.c b/extmod/btstack/btstack_hci_uart.c
index 5c96e02dc..ae18628a9 100644
--- a/extmod/btstack/btstack_hci_uart.c
+++ b/extmod/btstack/btstack_hci_uart.c
@@ -50,6 +50,7 @@ STATIC uint8_t *recv_buf;
STATIC size_t recv_len;
STATIC size_t recv_idx;
STATIC void (*recv_handler)(void);
+STATIC bool init_success = false;
STATIC int btstack_uart_init(const btstack_uart_config_t *uart_config) {
(void)uart_config;
@@ -62,14 +63,21 @@ STATIC int btstack_uart_init(const btstack_uart_config_t *uart_config) {
// Set up the UART peripheral, attach IRQ and power up the HCI controller.
// We haven't been told the baud rate yet, so defer that until btstack_uart_set_baudrate.
- mp_bluetooth_hci_uart_init(MICROPY_HW_BLE_UART_ID, 0);
- mp_bluetooth_hci_controller_init();
+ if (mp_bluetooth_hci_uart_init(MICROPY_HW_BLE_UART_ID, 0)) {
+ init_success = false;
+ return -1;
+ }
+ if (mp_bluetooth_hci_controller_init()) {
+ init_success = false;
+ return -1;
+ }
+ init_success = true;
return 0;
}
STATIC int btstack_uart_open(void) {
- return 0;
+ return init_success ? 0 : 1;
}
STATIC int btstack_uart_close(void) {
diff --git a/extmod/btstack/modbluetooth_btstack.c b/extmod/btstack/modbluetooth_btstack.c
index 2e1bd47cf..cde802a61 100644
--- a/extmod/btstack/modbluetooth_btstack.c
+++ b/extmod/btstack/modbluetooth_btstack.c
@@ -317,6 +317,9 @@ STATIC void btstack_packet_handler(uint8_t packet_type, uint8_t *packet, uint8_t
// Signal that de-initialisation has completed.
mp_bluetooth_btstack_state = MP_BLUETOOTH_BTSTACK_STATE_OFF;
}
+ } else if (event_type == BTSTACK_EVENT_POWERON_FAILED) {
+ // Signal that initialisation has failed.
+ mp_bluetooth_btstack_state = MP_BLUETOOTH_BTSTACK_STATE_OFF;
} else if (event_type == HCI_EVENT_TRANSPORT_PACKET_SENT) {
DEBUG_printf(" --> hci transport packet sent\n");
} else if (event_type == HCI_EVENT_COMMAND_COMPLETE) {
@@ -644,6 +647,8 @@ int mp_bluetooth_init(void) {
if (mp_bluetooth_btstack_state != MP_BLUETOOTH_BTSTACK_STATE_ACTIVE) {
DEBUG_printf("mp_bluetooth_init: stack startup timed out\n");
+ bool timeout = mp_bluetooth_btstack_state == MP_BLUETOOTH_BTSTACK_STATE_TIMEOUT;
+
// Required to stop the polling loop.
mp_bluetooth_btstack_state = MP_BLUETOOTH_BTSTACK_STATE_OFF;
// Attempt a shutdown (may not do anything).
@@ -652,7 +657,7 @@ int mp_bluetooth_init(void) {
// Clean up.
MP_STATE_PORT(bluetooth_btstack_root_pointers) = NULL;
- return MP_ETIMEDOUT;
+ return timeout ? MP_ETIMEDOUT : MP_EINVAL;
}
DEBUG_printf("mp_bluetooth_init: stack startup complete\n");