diff --git a/include/btstack/hci_cmds.h b/include/btstack/hci_cmds.h index cae3f0ca5..55c124d4a 100644 --- a/include/btstack/hci_cmds.h +++ b/include/btstack/hci_cmds.h @@ -103,6 +103,9 @@ // data: none #define BTSTACK_EVENT_POWERON_FAILED 0x62 +// data: majot (8), minor (8), revision(16) +#define BTSTACK_EVENT_VERSION 0x63 + // data: event (8), len(8), status (8), address(48), handle (16), psm (16), source_cid(16), dest_cid (16) #define L2CAP_EVENT_CHANNEL_OPENED 0x70 @@ -191,6 +194,8 @@ extern hci_cmd_t hci_write_simple_pairing_mode; extern hci_cmd_t btstack_get_state; extern hci_cmd_t btstack_set_power_mode; extern hci_cmd_t btstack_set_acl_capture_mode; +extern hci_cmd_t btstack_get_version; + // L2CAP client/server commands - see l2cap.c for info on parameters extern hci_cmd_t l2cap_create_channel; extern hci_cmd_t l2cap_disconnect; diff --git a/src/daemon.c b/src/daemon.c index b61e33197..47d81067f 100644 --- a/src/daemon.c +++ b/src/daemon.c @@ -115,6 +115,9 @@ static int btstack_command_handler(connection_t *connection, uint8_t *packet, ui l2cap_set_capture_connection(NULL); } break; + case BTSTACK_GET_VERSION: + hci_emit_btstack_version(); + break; case L2CAP_CREATE_CHANNEL: bt_flip_addr(addr, &packet[3]); psm = READ_BT_16(packet, 9); diff --git a/src/hci.c b/src/hci.c index 06fcbbdc8..4212c4d6c 100644 --- a/src/hci.c +++ b/src/hci.c @@ -43,6 +43,8 @@ #include "hci.h" #include "hci_dump.h" +#include + // temp #include "l2cap.h" @@ -434,7 +436,7 @@ void hci_emit_state(){ uint8_t len = 3; uint8_t event[len]; event[0] = BTSTACK_EVENT_STATE; - event[1] = 1; + event[1] = len - 3; event[2] = hci_stack.state; hci_dump_packet( HCI_EVENT_PACKET, 0, event, len); hci_stack.event_packet_handler(event, len); @@ -444,6 +446,7 @@ void hci_emit_connection_complete(hci_connection_t *conn){ uint8_t len = 13; uint8_t event[len]; event[0] = HCI_EVENT_CONNECTION_COMPLETE; + event[1] = len - 3; event[2] = 0; // status = OK bt_store_16(event, 3, conn->con_handle); bt_flip_addr(&event[5], conn->address); @@ -457,7 +460,7 @@ void hci_emit_l2cap_check_timeout(hci_connection_t *conn){ uint8_t len = 4; uint8_t event[len]; event[0] = L2CAP_EVENT_TIMEOUT_CHECK; - event[1] = 2; + event[1] = len - 2; bt_store_16(event, 2, conn->con_handle); hci_dump_packet( HCI_EVENT_PACKET, 0, event, len); hci_stack.event_packet_handler(event, len); @@ -467,16 +470,31 @@ void hci_emit_nr_connections_changed(){ uint8_t len = 3; uint8_t event[len]; event[0] = BTSTACK_EVENT_NR_CONNECTIONS_CHANGED; - event[1] = 1; + event[1] = len - 2; event[2] = nr_hci_connections(); hci_dump_packet( HCI_EVENT_PACKET, 0, event, len); hci_stack.event_packet_handler(event, len); } void hci_emit_hci_open_failed(){ - uint8_t len = 1; + uint8_t len = 2; uint8_t event[len]; event[0] = BTSTACK_EVENT_POWERON_FAILED; + event[1] = len - 2; hci_dump_packet( HCI_EVENT_PACKET, 0, event, len); hci_stack.event_packet_handler(event, len); } + + +void hci_emit_btstack_version() { + uint8_t len = 6; + uint8_t event[len]; + event[0] = BTSTACK_EVENT_VERSION; + event[1] = len - 2; + event[len++] = BTSTACK_MAJOR; + event[len++] = BTSTACK_MINOR; + bt_store_16(event, len, BTSTACK_REVISION); + hci_dump_packet( HCI_EVENT_PACKET, 0, event, len); + hci_stack.event_packet_handler(event, len); +} + diff --git a/src/hci.h b/src/hci.h index 4990fe539..a331dbee9 100644 --- a/src/hci.h +++ b/src/hci.h @@ -70,6 +70,9 @@ // set capture mode: @param on #define BTSTACK_SET_ACL_CAPTURE_MODE 0x03 +// get BTstack version +#define BTSTACK_GET_VERSION 0x04 + // create l2cap channel: @param bd_addr(48), psm (16) #define L2CAP_CREATE_CHANNEL 0x20 @@ -197,3 +200,5 @@ void hci_emit_connection_complete(hci_connection_t *conn); void hci_emit_l2cap_check_timeout(hci_connection_t *conn); void hci_emit_nr_connections_changed(); void hci_emit_hci_open_failed(); +void hci_emit_btstack_version(); + diff --git a/src/hci_cmds.c b/src/hci_cmds.c index 7c14278dd..1c8eb4bd9 100644 --- a/src/hci_cmds.c +++ b/src/hci_cmds.c @@ -267,6 +267,10 @@ OPCODE(OGF_BTSTACK, BTSTACK_SET_ACL_CAPTURE_MODE), "1" // mode: 0 = off, 1 = on }; +hci_cmd_t btstack_get_version = { + OPCODE(OGF_BTSTACK, BTSTACK_GET_VERSION), "" +}; + hci_cmd_t l2cap_create_channel = { OPCODE(OGF_BTSTACK, L2CAP_CREATE_CHANNEL), "B2" // @param bd_addr(48), psm (16)