diff --git a/drivers/wireless/bluetooth/bt_uart_bridge.c b/drivers/wireless/bluetooth/bt_uart_bridge.c index 6f424138571..3caa80c7954 100644 --- a/drivers/wireless/bluetooth/bt_uart_bridge.c +++ b/drivers/wireless/bluetooth/bt_uart_bridge.c @@ -39,7 +39,7 @@ * Pre-processor Definitions ****************************************************************************/ -#define HCI_RECVBUF_SIZE 4096 +#define HCI_RECVBUF_SIZE 8192 #define HCI_SENDBUF_SIZE 1024 #define HCI_NPOLLWAITERS 2 @@ -76,7 +76,7 @@ struct bt_uart_bridge_s sem_t sendlock; struct file filep; - char tmpbuf[HCI_RECVBUF_SIZE]; + char tmpbuf[1024]; }; /**************************************************************************** diff --git a/drivers/wireless/bluetooth/bt_uart_filter.c b/drivers/wireless/bluetooth/bt_uart_filter.c index c57fe02fa8a..d40afa1995c 100644 --- a/drivers/wireless/bluetooth/bt_uart_filter.c +++ b/drivers/wireless/bluetooth/bt_uart_filter.c @@ -251,13 +251,49 @@ bool bt_uart_filter_forward_recv(FAR struct bt_uart_filter_s *filter, case BT_HCI_EVT_CMD_COMPLETE: { FAR struct hci_evt_cmd_complete_s *evt; + uint8_t ogf; evt = (FAR void *)&buffer[3]; + ogf = evt->opcode >> 10; - if (BT_OGF_BASEBAND == (evt->opcode >> 10)) + if (BT_OGF_BASEBAND == ogf || + BT_OGF_LINK_CTRL == ogf || + BT_OGF_INFO == ogf) { return bt_uart_filter_free_opcode(filter, evt->opcode); } + else if (BT_OGF_LINK_POLICY == ogf || + BT_OGF_STATUS == ogf) + { + if (filter->type == BT_UART_FILTER_TYPE_BLE) + { + return false; + } + } + } + break; + case BT_HCI_EVT_CMD_STATUS: + { + FAR struct bt_hci_evt_cmd_status_s *stat; + uint8_t ogf; + + stat = (FAR void *)&buffer[3]; + ogf = stat->opcode >> 10; + + if (BT_OGF_BASEBAND == ogf || + BT_OGF_LINK_CTRL == ogf || + BT_OGF_INFO == ogf) + { + return bt_uart_filter_free_opcode(filter, stat->opcode); + } + if (BT_OGF_LINK_POLICY == ogf || + BT_OGF_STATUS == ogf) + { + if (filter->type == BT_UART_FILTER_TYPE_BLE) + { + return false; + } + } } break; default: @@ -284,6 +320,7 @@ bool bt_uart_filter_forward_send(FAR struct bt_uart_filter_s *filter, if (buffer[0] == H4_CMD) { opcode = (uint16_t)buffer[2] << 8 | (uint16_t)buffer[1]; + ogf = buffer[2] >> 2; switch (opcode) { @@ -302,22 +339,23 @@ bool bt_uart_filter_forward_send(FAR struct bt_uart_filter_s *filter, break; } - ogf = buffer[2] >> 2; - if (BT_OGF_BASEBAND == ogf) + if (BT_OGF_BASEBAND == ogf || + BT_OGF_LINK_CTRL == ogf || + BT_OGF_INFO == ogf) { if (!bt_uart_filter_alloc_opcode(filter, opcode)) - { - nerr("Unable to set opcode 0x%04x.\n", opcode); + { + nerr("Unable to set opcode 0x%04x.\n", opcode); - for (i = 0; i < BT_UART_FILTER_OPCODE_COUNT; i++) - { - nerr("PENDING opcode: %04x.\n", filter->opcode[i]); - } + for (i = 0; i < BT_UART_FILTER_OPCODE_COUNT; i++) + { + nerr("PENDING opcode: %04x.\n", filter->opcode[i]); + } - memset(filter->opcode, 0, sizeof(filter->opcode)); + memset(filter->opcode, 0, sizeof(filter->opcode)); - bt_uart_filter_alloc_opcode(filter, opcode); - } + bt_uart_filter_alloc_opcode(filter, opcode); + } } } diff --git a/include/nuttx/wireless/bluetooth/bt_hci.h b/include/nuttx/wireless/bluetooth/bt_hci.h index 98822c04df3..88d16c00bfd 100644 --- a/include/nuttx/wireless/bluetooth/bt_hci.h +++ b/include/nuttx/wireless/bluetooth/bt_hci.h @@ -115,8 +115,10 @@ /* OpCode Group Fields */ #define BT_OGF_LINK_CTRL 0x01 +#define BT_OGF_LINK_POLICY 0x02 #define BT_OGF_BASEBAND 0x03 #define BT_OGF_INFO 0x04 +#define BT_OGF_STATUS 0x05 #define BT_OGF_LE 0x08 /* Construct OpCode from OGF and OCF */ @@ -127,6 +129,7 @@ #define BT_OP(ogf, ocf) ((ocf) | ((ogf) << 10)) #define BT_HCI_OP_DISCONNECT BT_OP(BT_OGF_LINK_CTRL, 0x0006) +#define BT_HCI_OP_READ_REMOTE_VERSION_INFO BT_OP(BT_OGF_LINK_CTRL, 0x001d) #define BT_HCI_OP_SET_EVENT_MASK BT_OP(BT_OGF_BASEBAND, 0x0001) #define BT_HCI_OP_RESET BT_OP(BT_OGF_BASEBAND, 0x0003) #define BT_HCI_OP_SET_CTL_TO_HOST_FLOW BT_OP(BT_OGF_BASEBAND, 0x0031)