extract utility functions into utils.c

This commit is contained in:
matthias.ringwald 2009-07-23 21:43:37 +00:00
parent d8905019be
commit ba681a6c12
8 changed files with 178 additions and 155 deletions

View File

@ -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

View File

@ -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;
};

View File

@ -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

View File

@ -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
*/

View File

@ -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);

View File

@ -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
View 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
View 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);