mirror of
https://github.com/bluekitchen/btstack.git
synced 2025-02-22 06:41:17 +00:00
extract utility functions into utils.c
This commit is contained in:
parent
d8905019be
commit
ba681a6c12
@ -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
|
||||
|
||||
|
@ -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 = "<group>"; };
|
||||
9C00F7D51019082F008DAB17 /* hci_cmds.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = hci_cmds.h; path = src/hci_cmds.h; sourceTree = "<group>"; };
|
||||
9C00F7D61019082F008DAB17 /* hci_cmds.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = hci_cmds.c; path = src/hci_cmds.c; sourceTree = "<group>"; };
|
||||
9C00F86210191097008DAB17 /* utils.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = utils.c; path = src/utils.c; sourceTree = "<group>"; };
|
||||
9C00F86310191097008DAB17 /* utils.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; name = utils.h; path = src/utils.h; sourceTree = "<group>"; };
|
||||
9C1F0E980FDAE023008F472F /* run_loop.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = run_loop.c; path = src/run_loop.c; sourceTree = "<group>"; };
|
||||
9C1F0E990FDAE023008F472F /* run_loop.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; name = run_loop.h; path = src/run_loop.h; sourceTree = "<group>"; };
|
||||
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 = "<group>"; };
|
||||
@ -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 = "<group>";
|
||||
@ -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;
|
||||
};
|
||||
|
@ -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
|
||||
|
71
src/hci.c
71
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<size;i++){
|
||||
printf("%02X ", ((uint8_t *)data)[i]);
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
/**
|
||||
* Linked link list
|
||||
*/
|
||||
|
||||
/**
|
||||
* get link for given address
|
||||
*
|
||||
* @return connection OR NULL, if not found
|
||||
*/
|
||||
#if 0
|
||||
static hci_connection_t *link_for_addr(bd_addr_t addr){
|
||||
return NULL;
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Handler called by HCI transport
|
||||
* Dummy handler called by HCI
|
||||
*/
|
||||
static void dummy_handler(uint8_t *packet, uint16_t size){
|
||||
}
|
||||
|
||||
/**
|
||||
* Dummy control handler
|
||||
*/
|
||||
static int null_control_function(void *config){
|
||||
return 0;
|
||||
}
|
||||
static const char * null_control_name(void *config){
|
||||
return "Hardware unknown";
|
||||
}
|
||||
static bt_control_t null_control = {
|
||||
null_control_function,
|
||||
null_control_function,
|
||||
null_control_function,
|
||||
null_control_name
|
||||
};
|
||||
|
||||
static void acl_handler(uint8_t *packet, int size){
|
||||
hci_stack.acl_packet_handler(packet, size);
|
||||
|
||||
@ -124,20 +104,6 @@ void hci_register_acl_packet_handler (void (*handler)(uint8_t *packet, uint16_t
|
||||
hci_stack.acl_packet_handler = handler;
|
||||
}
|
||||
|
||||
static int null_control_function(void *config){
|
||||
return 0;
|
||||
}
|
||||
static const char * null_control_name(void *config){
|
||||
return "Hardware unknown";
|
||||
}
|
||||
|
||||
static bt_control_t null_control = {
|
||||
null_control_function,
|
||||
null_control_function,
|
||||
null_control_function,
|
||||
null_control_name
|
||||
};
|
||||
|
||||
void hci_init(hci_transport_t *transport, void *config, bt_control_t *control){
|
||||
|
||||
// reference to use transport layer implementation
|
||||
@ -263,14 +229,13 @@ int hci_send_cmd_packet(uint8_t *packet, int size){
|
||||
hci_stack.event_packet_handler(event, 3);
|
||||
break;
|
||||
default:
|
||||
// TODO log into hci dump as vendor specific"event"
|
||||
// TODO log into hci dump as vendor specific "event"
|
||||
printf("Error: command %u not implemented\n:", READ_CMD_OCF(packet));
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* pre: numcmds >= 0 - it's allowed to send a command to the controller
|
||||
*/
|
||||
|
89
src/hci.h
89
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 <stdint.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
#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);
|
||||
|
||||
|
@ -10,6 +10,12 @@
|
||||
#include <stdarg.h>
|
||||
#include <string.h>
|
||||
|
||||
// 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;
|
||||
|
39
src/utils.c
Normal file
39
src/utils.c
Normal file
@ -0,0 +1,39 @@
|
||||
/*
|
||||
* utils.c
|
||||
*
|
||||
* General utility functions
|
||||
*
|
||||
* Created by Matthias Ringwald on 7/23/09.
|
||||
*/
|
||||
|
||||
#include "utils.h"
|
||||
#include <stdio.h>
|
||||
|
||||
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<size;i++){
|
||||
printf("%02X ", ((uint8_t *)data)[i]);
|
||||
}
|
||||
printf("\n");
|
||||
}
|
39
src/utils.h
Normal file
39
src/utils.h
Normal file
@ -0,0 +1,39 @@
|
||||
/*
|
||||
* utils.h
|
||||
*
|
||||
* General utility functions
|
||||
*
|
||||
* Created by Matthias Ringwald on 7/23/09.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
/**
|
||||
* @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);
|
Loading…
x
Reference in New Issue
Block a user