diff --git a/example/Makefile.am b/example/Makefile.am index 6c24e053a..990ca0ac8 100644 --- a/example/Makefile.am +++ b/example/Makefile.am @@ -1,5 +1,5 @@ bin_PROGRAMS = test -test_SOURCES = test.c ../src/btstack.c ../src/hci.c \ +test_SOURCES = test.c ../src/btstack.c ../src/utils.c ../src/hci.c \ ../src/l2cap.c ../src/linked_list.c ../src/run_loop.c \ ../src/hci_dump.c ../src/hci_cmds.c ../src/socket_connection.c diff --git a/project.xcodeproj/project.pbxproj b/project.xcodeproj/project.pbxproj index 8a9dc2ff8..615a76af1 100644 --- a/project.xcodeproj/project.pbxproj +++ b/project.xcodeproj/project.pbxproj @@ -10,6 +10,8 @@ 9C00F7321017ACC3008DAB17 /* socket_connection.c in Sources */ = {isa = PBXBuildFile; fileRef = 9C00F7301017ACC3008DAB17 /* socket_connection.c */; }; 9C00F7D71019082F008DAB17 /* hci_cmds.c in Sources */ = {isa = PBXBuildFile; fileRef = 9C00F7D61019082F008DAB17 /* hci_cmds.c */; }; 9C00F7D81019082F008DAB17 /* hci_cmds.c in Sources */ = {isa = PBXBuildFile; fileRef = 9C00F7D61019082F008DAB17 /* hci_cmds.c */; }; + 9C00F86410191097008DAB17 /* utils.c in Sources */ = {isa = PBXBuildFile; fileRef = 9C00F86210191097008DAB17 /* utils.c */; }; + 9C00F86510191097008DAB17 /* utils.c in Sources */ = {isa = PBXBuildFile; fileRef = 9C00F86210191097008DAB17 /* utils.c */; }; 9C1F0E9A0FDAE023008F472F /* run_loop.c in Sources */ = {isa = PBXBuildFile; fileRef = 9C1F0E980FDAE023008F472F /* run_loop.c */; }; 9C2071F310014D3200A07EA4 /* hci_transport_usb.c in Sources */ = {isa = PBXBuildFile; fileRef = 9C2071F210014D3200A07EA4 /* hci_transport_usb.c */; }; 9C20720F10025E0500A07EA4 /* libusb-1.0.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 9C20720E10025E0500A07EA4 /* libusb-1.0.dylib */; }; @@ -49,6 +51,8 @@ 9C00F7311017ACC3008DAB17 /* socket_connection.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; name = socket_connection.h; path = src/socket_connection.h; sourceTree = ""; }; 9C00F7D51019082F008DAB17 /* hci_cmds.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = hci_cmds.h; path = src/hci_cmds.h; sourceTree = ""; }; 9C00F7D61019082F008DAB17 /* hci_cmds.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = hci_cmds.c; path = src/hci_cmds.c; sourceTree = ""; }; + 9C00F86210191097008DAB17 /* utils.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = utils.c; path = src/utils.c; sourceTree = ""; }; + 9C00F86310191097008DAB17 /* utils.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; name = utils.h; path = src/utils.h; sourceTree = ""; }; 9C1F0E980FDAE023008F472F /* run_loop.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = run_loop.c; path = src/run_loop.c; sourceTree = ""; }; 9C1F0E990FDAE023008F472F /* run_loop.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; name = run_loop.h; path = src/run_loop.h; sourceTree = ""; }; 9C2071F210014D3200A07EA4 /* hci_transport_usb.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = hci_transport_usb.c; path = src/hci_transport_usb.c; sourceTree = ""; }; @@ -121,6 +125,10 @@ 9CC813A40FFC0A51002816F9 /* daemon.c */, 9C46FC350FA906F700ABEF05 /* hci.h */, 9C46FC340FA906F700ABEF05 /* hci.c */, + 9C00F7D51019082F008DAB17 /* hci_cmds.h */, + 9C00F7D61019082F008DAB17 /* hci_cmds.c */, + 9C7ECBB30FCC95DD0085DAC5 /* hci_dump.h */, + 9C7ECBB40FCC95DD0085DAC5 /* hci_dump.c */, 9C46FC380FA906F700ABEF05 /* hci_transport.h */, 9C46FC370FA906F700ABEF05 /* hci_transport_h4.h */, 9C46FC360FA906F700ABEF05 /* hci_transport_h4.c */, @@ -128,16 +136,14 @@ 9C2071F210014D3200A07EA4 /* hci_transport_usb.c */, 9C88500C0FBF6702004980E4 /* l2cap.c */, 9C88500D0FBF6702004980E4 /* l2cap.h */, - 9C7ECBB30FCC95DD0085DAC5 /* hci_dump.h */, - 9C7ECBB40FCC95DD0085DAC5 /* hci_dump.c */, 9C7B5ABE100BD3340065D87E /* linked_list.h */, 9C7B5ABF100BD3340065D87E /* linked_list.c */, 9C1F0E990FDAE023008F472F /* run_loop.h */, 9C1F0E980FDAE023008F472F /* run_loop.c */, 9C00F7301017ACC3008DAB17 /* socket_connection.c */, 9C00F7311017ACC3008DAB17 /* socket_connection.h */, - 9C00F7D51019082F008DAB17 /* hci_cmds.h */, - 9C00F7D61019082F008DAB17 /* hci_cmds.c */, + 9C00F86210191097008DAB17 /* utils.c */, + 9C00F86310191097008DAB17 /* utils.h */, ); name = Source; sourceTree = ""; @@ -239,6 +245,7 @@ 9C7B5AC0100BD3340065D87E /* linked_list.c in Sources */, 9C00F7321017ACC3008DAB17 /* socket_connection.c in Sources */, 9C00F7D71019082F008DAB17 /* hci_cmds.c in Sources */, + 9C00F86510191097008DAB17 /* utils.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -255,6 +262,7 @@ 9C7B5D0E100FC9D00065D87E /* run_loop.c in Sources */, 9C7B5D12100FC9F00065D87E /* l2cap.c in Sources */, 9C00F7D81019082F008DAB17 /* hci_cmds.c in Sources */, + 9C00F86410191097008DAB17 /* utils.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/src/Makefile.am b/src/Makefile.am index d5828ffd2..309b9fa2b 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -15,18 +15,20 @@ BTdaemon_SOURCES = \ l2cap.c \ linked_list.c \ run_loop.c \ - socket_connection.c + socket_connection.c \ + utils.c include_HEADERS = \ - bt_control.h \ - bt_control_iphone.h \ - hci.h \ - hci_cmds.h \ - hci_dump.h \ - hci_transport.h \ - hci_transport_h4.h \ - hci_transport_usb.h \ - linked_list.h \ - l2cap.h \ - run_loop.h \ - socket_connection.h + bt_control.h \ + bt_control_iphone.h \ + hci.h \ + hci_cmds.h \ + hci_dump.h \ + hci_transport.h \ + hci_transport_h4.h \ + hci_transport_usb.h \ + linked_list.h \ + l2cap.h \ + run_loop.h \ + socket_connection.h \ + utils.h diff --git a/src/hci.c b/src/hci.c index 8514a2db0..ec9168643 100644 --- a/src/hci.c +++ b/src/hci.c @@ -15,57 +15,37 @@ // the stack is here static hci_stack_t hci_stack; - -void bt_store_16(uint8_t *buffer, uint16_t pos, uint16_t value){ - buffer[pos++] = value; - buffer[pos++] = value >> 8; -} - -void bt_store_32(uint8_t *buffer, uint16_t pos, uint32_t value){ - buffer[pos++] = value; - buffer[pos++] = value >> 8; - buffer[pos++] = value >> 16; - buffer[pos++] = value >> 24; -} - -void bt_flip_addr(bd_addr_t dest, bd_addr_t src){ - dest[0] = src[5]; - dest[1] = src[4]; - dest[2] = src[3]; - dest[3] = src[2]; - dest[4] = src[1]; - dest[5] = src[0]; -} - -void hexdump(void *data, int size){ - int i; - for (i=0; i= 0 - it's allowed to send a command to the controller */ diff --git a/src/hci.h b/src/hci.h index 32208d274..a6adb6989 100644 --- a/src/hci.h +++ b/src/hci.h @@ -7,84 +7,15 @@ #pragma once +#include "hci_cmds.h" +#include "utils.h" +#include "hci_transport.h" +#include "bt_control.h" + #include #include #include -#include "hci_cmds.h" -#include "hci_transport.h" -#include "bt_control.h" - -// helper for BT little endian format -#define READ_BT_16( buffer, pos) ( ((uint16_t) buffer[pos]) | (((uint16_t)buffer[pos+1]) << 8)) -#define READ_BT_24( buffer, pos) ( ((uint32_t) buffer[pos]) | (((uint32_t)buffer[pos+1]) << 8) | (((uint32_t)buffer[pos+2]) << 16)) -#define READ_BT_32( buffer, pos) ( ((uint32_t) buffer[pos]) | (((uint32_t)buffer[pos+1]) << 8) | (((uint32_t)buffer[pos+2]) << 16) | (((uint32_t) buffer[pos+3])) << 24) - -// packet header lengh -#define HCI_CMD_DATA_PKT_HDR 0x03 -#define HCI_ACL_DATA_PKT_HDR 0x04 -#define HCI_SCO_DATA_PKT_HDR 0x03 -#define HCI_EVENT_PKT_HDR 0x02 - -// Events from host controller to host -#define HCI_EVENT_INQUIRY_COMPLETE 0x01 -#define HCI_EVENT_INQUIRY_RESULT 0x02 -#define HCI_EVENT_CONNECTION_COMPLETE 0x03 -#define HCI_EVENT_CONNECTION_REQUEST 0x04 -#define HCI_EVENT_DISCONNECTION_COMPLETE 0x05 -#define HCI_EVENT_AUTHENTICATION_COMPLETE_EVENT 0x06 -#define HCI_EVENT_REMOTE_NAME_REQUEST_COMPLETE 0x07 -#define HCI_EVENT_ENCRIPTION_CHANGE 0x08 -#define HCI_EVENT_CHANGE_CONNECTION_LINK_KEY_COMPLETE 0x09 -#define HCI_EVENT_MASTER_LINK_KEY_COMPLETE 0x0A -#define HCI_EVENT_READ_REMOTE_SUPPORTED_FEATURES_COMPLETE 0x0B -#define HCI_EVENT_READ_REMOTE_VERSION_INFORMATION_COMPLETE 0x0C -#define HCI_EVENT_QOS_SETUP_COMPLETE 0x0D -#define HCI_EVENT_COMMAND_COMPLETE 0x0E -#define HCI_EVENT_COMMAND_STATUS 0x0F -#define HCI_EVENT_HARDWARE_ERROR 0x10 -#define HCI_EVENT_FLUSH_OCCURED 0x11 -#define HCI_EVENT_ROLE_CHANGE 0x12 -#define HCI_EVENT_NUMBER_OF_COMPLETED_PACKETS 0x13 -#define HCI_EVENT_MODE_CHANGE_EVENT 0x14 -#define HCI_EVENT_RETURN_LINK_KEYS 0x15 -#define HCI_EVENT_PIN_CODE_REQUEST 0x16 -#define HCI_EVENT_LINK_KEY_REQUEST 0x17 -#define HCI_EVENT_LINK_KEY_NOTIFICATION 0x18 -#define HCI_EVENT_DATA_BUFFER_OVERFLOW 0x1A -#define HCI_EVENT_MAX_SLOTS_CHANGED 0x1B -#define HCI_EVENT_READ_CLOCK_OFFSET_COMPLETE 0x1C -#define NECTEVENT_ION_PACKET_TYPE_CHANGED 0x1D -#define HCI_EVENT_INQUIRY_RESULT_WITH_RSSI 0x22 -#define HCI_EVENT_VENDOR_SPECIFIC 0xFF - -// events from BTstack for application/client lib -#define HCI_EVENT_BTSTACK_WORKING 0x80 -#define HCI_EVENT_BTSTACK_STATE 0x81 - -#define COMMAND_COMPLETE_EVENT(event,cmd) ( event[0] == HCI_EVENT_COMMAND_COMPLETE && READ_BT_16(event,3) == cmd.opcode) - -/** - * Default INQ Mode - */ -#define HCI_INQUIRY_LAP 0x9E8B33L // 0x9E8B33: General/Unlimited Inquiry Access Code (GIAC) - -/** - * @brief Length of a bluetooth device address. - */ -#define BD_ADDR_LEN 6 -typedef uint8_t bd_addr_t[BD_ADDR_LEN]; - -/** - * @brief The link key type - */ -#define LINK_KEY_LEN 16 -typedef uint8_t link_key_t[LINK_KEY_LEN]; - -/** - * @brief hci connection handle type - */ -typedef uint16_t hci_con_handle_t; typedef enum { HCI_POWER_OFF = 0, @@ -118,7 +49,6 @@ typedef struct hci_connection { typedef struct { - hci_transport_t * hci_transport; bt_control_t * control; void * config; @@ -159,9 +89,6 @@ int hci_power_control(HCI_POWER_MODE mode); */ uint32_t hci_run(); -// -void hexdump(void *data, int size); - // create and send hci command packets based on a template and a list of parameters int hci_send_cmd(hci_cmd_t *cmd, ...); @@ -170,9 +97,3 @@ int hci_send_cmd_packet(uint8_t *packet, int size); // send ACL packet int hci_send_acl_packet(uint8_t *packet, int size); - -// helper -extern void bt_store_16(uint8_t *buffer, uint16_t pos, uint16_t value); -extern void bt_store_32(uint8_t *buffer, uint16_t pos, uint32_t value); -extern void bt_flip_addr(bd_addr_t dest, bd_addr_t src); - diff --git a/src/hci_cmds.h b/src/hci_cmds.h index 0b5bac22a..5c909f1c5 100644 --- a/src/hci_cmds.h +++ b/src/hci_cmds.h @@ -10,6 +10,12 @@ #include #include +// packet header lenghts +#define HCI_CMD_DATA_PKT_HDR 0x03 +#define HCI_ACL_DATA_PKT_HDR 0x04 +#define HCI_SCO_DATA_PKT_HDR 0x03 +#define HCI_EVENT_PKT_HDR 0x02 + // calculate combined ogf/ocf value #define OPCODE(ogf, ocf) (ocf | ogf << 10) @@ -27,6 +33,48 @@ // cmds for BTstack #define HCI_BTSTACK_GET_STATE 0x01 +// Events from host controller to host +#define HCI_EVENT_INQUIRY_COMPLETE 0x01 +#define HCI_EVENT_INQUIRY_RESULT 0x02 +#define HCI_EVENT_CONNECTION_COMPLETE 0x03 +#define HCI_EVENT_CONNECTION_REQUEST 0x04 +#define HCI_EVENT_DISCONNECTION_COMPLETE 0x05 +#define HCI_EVENT_AUTHENTICATION_COMPLETE_EVENT 0x06 +#define HCI_EVENT_REMOTE_NAME_REQUEST_COMPLETE 0x07 +#define HCI_EVENT_ENCRIPTION_CHANGE 0x08 +#define HCI_EVENT_CHANGE_CONNECTION_LINK_KEY_COMPLETE 0x09 +#define HCI_EVENT_MASTER_LINK_KEY_COMPLETE 0x0A +#define HCI_EVENT_READ_REMOTE_SUPPORTED_FEATURES_COMPLETE 0x0B +#define HCI_EVENT_READ_REMOTE_VERSION_INFORMATION_COMPLETE 0x0C +#define HCI_EVENT_QOS_SETUP_COMPLETE 0x0D +#define HCI_EVENT_COMMAND_COMPLETE 0x0E +#define HCI_EVENT_COMMAND_STATUS 0x0F +#define HCI_EVENT_HARDWARE_ERROR 0x10 +#define HCI_EVENT_FLUSH_OCCURED 0x11 +#define HCI_EVENT_ROLE_CHANGE 0x12 +#define HCI_EVENT_NUMBER_OF_COMPLETED_PACKETS 0x13 +#define HCI_EVENT_MODE_CHANGE_EVENT 0x14 +#define HCI_EVENT_RETURN_LINK_KEYS 0x15 +#define HCI_EVENT_PIN_CODE_REQUEST 0x16 +#define HCI_EVENT_LINK_KEY_REQUEST 0x17 +#define HCI_EVENT_LINK_KEY_NOTIFICATION 0x18 +#define HCI_EVENT_DATA_BUFFER_OVERFLOW 0x1A +#define HCI_EVENT_MAX_SLOTS_CHANGED 0x1B +#define HCI_EVENT_READ_CLOCK_OFFSET_COMPLETE 0x1C +#define NECTEVENT_ION_PACKET_TYPE_CHANGED 0x1D +#define HCI_EVENT_INQUIRY_RESULT_WITH_RSSI 0x22 +#define HCI_EVENT_VENDOR_SPECIFIC 0xFF + +// events from BTstack for application/client lib +#define HCI_EVENT_BTSTACK_WORKING 0x80 +#define HCI_EVENT_BTSTACK_STATE 0x81 + +#define COMMAND_COMPLETE_EVENT(event,cmd) ( event[0] == HCI_EVENT_COMMAND_COMPLETE && READ_BT_16(event,3) == cmd.opcode) + +/** + * Default INQ Mode + */ +#define HCI_INQUIRY_LAP 0x9E8B33L // 0x9E8B33: General/Unlimited Inquiry Access Code (GIAC) /** * compact HCI Command packet description @@ -40,6 +88,7 @@ uint16_t hci_create_cmd(uint8_t *hci_cmd_buffer, hci_cmd_t *cmd, ...); uint16_t hci_create_cmd_internal(uint8_t *hci_cmd_buffer, hci_cmd_t *cmd, va_list argptr); + // HCI Commands - see hci_cmds.c for info on parameters extern hci_cmd_t hci_inquiry; extern hci_cmd_t hci_inquiry_cancel; diff --git a/src/utils.c b/src/utils.c new file mode 100644 index 000000000..1eb30d36a --- /dev/null +++ b/src/utils.c @@ -0,0 +1,39 @@ +/* + * utils.c + * + * General utility functions + * + * Created by Matthias Ringwald on 7/23/09. + */ + +#include "utils.h" +#include + +void bt_store_16(uint8_t *buffer, uint16_t pos, uint16_t value){ + buffer[pos++] = value; + buffer[pos++] = value >> 8; +} + +void bt_store_32(uint8_t *buffer, uint16_t pos, uint32_t value){ + buffer[pos++] = value; + buffer[pos++] = value >> 8; + buffer[pos++] = value >> 16; + buffer[pos++] = value >> 24; +} + +void bt_flip_addr(bd_addr_t dest, bd_addr_t src){ + dest[0] = src[5]; + dest[1] = src[4]; + dest[2] = src[3]; + dest[3] = src[2]; + dest[4] = src[1]; + dest[5] = src[0]; +} + +void hexdump(void *data, int size){ + int i; + for (i=0; i + +/** + * @brief hci connection handle type + */ +typedef uint16_t hci_con_handle_t; + +/** + * @brief Length of a bluetooth device address. + */ +#define BD_ADDR_LEN 6 +typedef uint8_t bd_addr_t[BD_ADDR_LEN]; + +/** + * @brief The link key type + */ +#define LINK_KEY_LEN 16 +typedef uint8_t link_key_t[LINK_KEY_LEN]; + +// helper for BT little endian format +#define READ_BT_16( buffer, pos) ( ((uint16_t) buffer[pos]) | (((uint16_t)buffer[pos+1]) << 8)) +#define READ_BT_24( buffer, pos) ( ((uint32_t) buffer[pos]) | (((uint32_t)buffer[pos+1]) << 8) | (((uint32_t)buffer[pos+2]) << 16)) +#define READ_BT_32( buffer, pos) ( ((uint32_t) buffer[pos]) | (((uint32_t)buffer[pos+1]) << 8) | (((uint32_t)buffer[pos+2]) << 16) | (((uint32_t) buffer[pos+3])) << 24) + +void bt_store_16(uint8_t *buffer, uint16_t pos, uint16_t value); +void bt_store_32(uint8_t *buffer, uint16_t pos, uint32_t value); +void bt_flip_addr(bd_addr_t dest, bd_addr_t src); + +void hexdump(void *data, int size);