From 99a29ec705b463290d5a2ac1eabc46fb7f2a83b0 Mon Sep 17 00:00:00 2001 From: Jim Mussared Date: Tue, 18 Aug 2020 11:05:34 +1000 Subject: [PATCH] extmod/btstack: Detect HCI UART init failure. --- extmod/btstack/btstack_hci_uart.c | 14 +++++++++++--- extmod/btstack/modbluetooth_btstack.c | 7 ++++++- ports/unix/mpbthciport.c | 4 ++-- 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/extmod/btstack/btstack_hci_uart.c b/extmod/btstack/btstack_hci_uart.c index 5c96e02dc0..ae18628a9c 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 2e1bd47cfa..cde802a61f 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"); diff --git a/ports/unix/mpbthciport.c b/ports/unix/mpbthciport.c index 5a5c1d4a4e..dbfb5e0d0e 100644 --- a/ports/unix/mpbthciport.c +++ b/ports/unix/mpbthciport.c @@ -124,12 +124,12 @@ int mp_bluetooth_hci_uart_init(uint32_t port, uint32_t baudrate) { if (path != NULL) { strcpy(uart_device_name, path); } - DEBUG_printf("Using HCI UART: %s\n", uart_device_name); + DEBUG_printf("mp_bluetooth_hci_uart_init: Using HCI UART: %s\n", uart_device_name); int flags = O_RDWR | O_NOCTTY | O_NONBLOCK; uart_fd = open(uart_device_name, flags); if (uart_fd == -1) { - DEBUG_printf("Unable to open port %s", uart_device_name); + printf("mp_bluetooth_hci_uart_init: Unable to open port %s\n", uart_device_name); return -1; }