From b06bf23fb5ec2f75d352560887cf4d9ab76d8996 Mon Sep 17 00:00:00 2001 From: Oliver Ruiz Dorantes Date: Fri, 1 Feb 2008 21:17:02 +0000 Subject: [PATCH] Add 'public' headers in order all stuff actually compiles git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@23816 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- headers/os/bluetooth/HCI/btHCI.h | 41 +++ headers/os/bluetooth/HCI/btHCI_acl.h | 39 +++ headers/os/bluetooth/HCI/btHCI_command.h | 342 +++++++++++++++++++++ headers/os/bluetooth/HCI/btHCI_event.h | 293 ++++++++++++++++++ headers/os/bluetooth/HCI/btHCI_module.h | 39 +++ headers/os/bluetooth/HCI/btHCI_transport.h | 93 ++++++ headers/os/bluetooth/LocalDevice.h | 27 +- headers/os/bluetooth/bluetooth_util.h | 58 ++++ 8 files changed, 927 insertions(+), 5 deletions(-) create mode 100644 headers/os/bluetooth/HCI/btHCI.h create mode 100644 headers/os/bluetooth/HCI/btHCI_acl.h create mode 100644 headers/os/bluetooth/HCI/btHCI_command.h create mode 100644 headers/os/bluetooth/HCI/btHCI_event.h create mode 100644 headers/os/bluetooth/HCI/btHCI_module.h create mode 100644 headers/os/bluetooth/HCI/btHCI_transport.h create mode 100644 headers/os/bluetooth/bluetooth_util.h diff --git a/headers/os/bluetooth/HCI/btHCI.h b/headers/os/bluetooth/HCI/btHCI.h new file mode 100644 index 0000000000..5b2e9e6930 --- /dev/null +++ b/headers/os/bluetooth/HCI/btHCI.h @@ -0,0 +1,41 @@ +/* + * Copyright 2007 Oliver Ruiz Dorantes, oliver.ruiz.dorantes_at_gmail.com + * + * All rights reserved. Distributed under the terms of the MIT License. + * + */ + +#ifndef _BTHCI_H_ +#define _BTHCI_H_ + +/* typedefs */ +typedef int32 hci_id; + +typedef enum { H2 = 2, H3, H4, H5 } transport_type; + +// TODO: something more authomatic here? +#define HCI_NUM_PACKET_TYPES 5 +typedef enum { BT_COMMAND = 0, + BT_EVENT, + BT_ACL, + BT_SCO, + BT_ESCO + } bt_packet_t; + + +/* packets sizes */ +#define HCI_MAX_ACL_SIZE 1024 +#define HCI_MAX_SCO_SIZE 255 +#define HCI_MAX_EVENT_SIZE 260 +#define HCI_MAX_FRAME_SIZE (HCI_MAX_ACL_SIZE + 4) + +/* fields sizes */ +#define HCI_LAP_SIZE 3 /* LAP */ +#define HCI_LINK_KEY_SIZE 16 /* link key */ +#define HCI_PIN_SIZE 16 /* PIN */ +#define HCI_EVENT_MASK_SIZE 8 /* event mask */ +#define HCI_CLASS_SIZE 3 /* class */ +#define HCI_FEATURES_SIZE 8 /* LMP features */ +#define HCI_DEVICE_NAME_SIZE 248 /* unit name size */ + +#endif \ No newline at end of file diff --git a/headers/os/bluetooth/HCI/btHCI_acl.h b/headers/os/bluetooth/HCI/btHCI_acl.h new file mode 100644 index 0000000000..e0027694f8 --- /dev/null +++ b/headers/os/bluetooth/HCI/btHCI_acl.h @@ -0,0 +1,39 @@ +/* + * Copyright 2007 Oliver Ruiz Dorantes, oliver.ruiz.dorantes_at_gmail.com + * + * All rights reserved. Distributed under the terms of the MIT License. + * + */ + +#ifndef _BTHCI_ACL_H_ +#define _BTHCI_ACL_H_ + +#include +#include + +#define HCI_ACL_HDR_SIZE 4 + +struct hci_acl_header { + uint16 handle; /* Handle & Flags(PB, BC) */ + uint16 alen; +} __attribute__ ((packed)) ; + +/* ACL handle and flags pack/unpack */ +#define pack_acl_handle_flags(h, pb, bc) (((h) & 0x0fff) | (((pb) & 3) << 12) | (((bc) & 3) << 14)) +#define get_acl_handle(h) ((h) & 0x0fff) +#define get_acl_pb_flag(h) (((h) & 0x3000) >> 12) +#define get_acl_bc_flag(h) (((h) & 0xc000) >> 14) + +/* PB flag values */ +/* 00 - reserved for future use */ +#define HCI_ACL_PACKET_FRAGMENT 0x1 +#define HCI_ACL_PACKET_START 0x2 +/* 11 - reserved for future use */ + +/* BC flag values */ +#define HCI_ACL_POINT2POINT 0x0 /* only Host controller to Host */ +#define HCI_ACL_BROADCAST_ACTIVE 0x1 /* both directions */ +#define HCI_ACL_BROADCAST_PICONET 0x2 /* both directions */ + /* 11 - reserved for future use */ + +#endif diff --git a/headers/os/bluetooth/HCI/btHCI_command.h b/headers/os/bluetooth/HCI/btHCI_command.h new file mode 100644 index 0000000000..0e832526a7 --- /dev/null +++ b/headers/os/bluetooth/HCI/btHCI_command.h @@ -0,0 +1,342 @@ +/* + * Copyright 2007 Oliver Ruiz Dorantes, oliver.ruiz.dorantes_at_gmail.com + * + * All rights reserved. Distributed under the terms of the MIT License. + * + */ + +#ifndef _BTHCI_COMMAND_H_ +#define _BTHCI_COMMAND_H_ + +#include +#include + +#define HCI_COMMAND_HDR_SIZE 3 + +struct hci_command_header { + uint16 opcode; /* OCF & OGF */ + uint8 clen; +} __attribute__ ((packed)); + + +/* Command opcode pack/unpack */ +#define hci_opcode_pack(ogf, ocf) (uint16)((ocf & 0x03ff)|(ogf << 10)) +#define hci_opcode_ogf(op) (op >> 10) +#define hci_opcode_ocf(op) (op & 0x03ff) + + +/* - Informational Parameters Command definition - */ +#define OGF_INFORMATIONAL_PARAM 0x04 + + #define OCF_READ_LOCAL_VERSION 0x0001 + struct hci_rp_read_loc_version { + uint8 status; + uint8 hci_ver; + uint16 hci_rev; + uint8 lmp_ver; + uint16 manufacturer; + uint16 lmp_subver; + } __attribute__ ((packed)); + + #define OCF_READ_LOCAL_FEATURES 0x0003 + struct hci_rp_read_loc_features { + uint8 status; + uint8 features[8]; + } __attribute__ ((packed)); + + #define OCF_READ_BUFFER_SIZE 0x0005 + struct hci_rp_read_buffer_size { + uint8 status; + uint16 acl_mtu; + uint8 sco_mtu; + uint16 acl_max_pkt; + uint16 sco_max_pkt; + } __attribute__ ((packed)); + + #define OCF_READ_BD_ADDR 0x0009 + struct hci_rp_read_bd_addr { + uint8 status; + bdaddr_t bdaddr; + } __attribute__ ((packed)); + +/* - Host Controller and Baseband Command definition - */ +#define OGF_CONTROL_BASEBAND 0x03 + + #define OCF_RESET 0x0003 + /*struct hci_reset { + void no_fields; + } __attribute__ ((packed));*/ + + #define OCF_SET_EVENT_FLT 0x0005 + struct hci_cp_set_event_flt { + uint8 flt_type; + uint8 cond_type; + uint8 condition[0]; + } __attribute__ ((packed)); + + #define OCF_READ_STORED_LINK_KEY 0x000D + struct hci_read_stored_link_key { + bdaddr_t bdaddr; + uint8 all_keys_flag; + } __attribute__ ((packed)); + struct hci_read_stored_link_key_reply { + uint8 status; + uint16 max_num_keys; + uint16 num_keys_read; + } __attribute__ ((packed)); + + #define OCF_WRITE_STORED_LINK_KEY 0x0011 + struct hci_write_stored_link_key { + uint8 num_keys_to_write; + // these are repeated "num_keys_write" times + bdaddr_t bdaddr; + uint8 key[HCI_LINK_KEY_SIZE]; + } __attribute__ ((packed)); + struct hci_write_stored_link_key_reply { + uint8 status; + uint8 num_keys_written; + } __attribute__ ((packed)); + + + #define OCF_WRITE_LOCAL_NAME 0x0013 + #define OCF_READ_LOCAL_NAME 0x0014 + struct hci_read_local_name { + uint8 status; + char local_name[248]; + } __attribute__ ((packed)); + + #define OCF_WRITE_CA_TIMEOUT 0x0016 + #define OCF_WRITE_PG_TIMEOUT 0x0018 + + #define OCF_WRITE_SCAN_ENABLE 0x001A + #define HCI_SCAN_DISABLED 0x00 + #define HCI_SCAN_INQUIRY 0x01 + #define HCI_SCAN_PAGE 0x02 + #define HCI_SCAN_INQUIRY_PAGE 0x03 + struct hci_write_scan_enable { + uint8 scan; + } __attribute__ ((packed)); + + #define OCF_READ_AUTH_ENABLE 0x001F + #define OCF_WRITE_AUTH_ENABLE 0x0020 + #define HCI_AUTH_DISABLED 0x00 + #define HCI_AUTH_ENABLED 0x01 + struct hci_write_authentication_enable { + uint8 authentication; + } __attribute__ ((packed)); + + #define OCF_READ_ENCRYPT_MODE 0x0021 + #define OCF_WRITE_ENCRYPT_MODE 0x0022 + #define HCI_ENCRYPT_DISABLED 0x00 + #define HCI_ENCRYPT_P2P 0x01 + #define HCI_ENCRYPT_BOTH 0x02 + struct hci_write_encryption_mode_enable { + uint8 encryption; + } __attribute__ ((packed)); + + /* Filter types */ + #define HCI_FLT_CLEAR_ALL 0x00 + #define HCI_FLT_INQ_RESULT 0x01 + #define HCI_FLT_CONN_SETUP 0x02 + + /* CONN_SETUP Condition types */ + #define HCI_CONN_SETUP_ALLOW_ALL 0x00 + #define HCI_CONN_SETUP_ALLOW_CLASS 0x01 + #define HCI_CONN_SETUP_ALLOW_BDADDR 0x02 + + /* CONN_SETUP Conditions */ + #define HCI_CONN_SETUP_AUTO_OFF 0x01 + #define HCI_CONN_SETUP_AUTO_ON 0x02 + + #define OCF_READ_CLASS_OF_DEV 0x0023 + + struct hci_read_dev_class_reply { + uint8 status; + uint8 dev_class[3]; + } __attribute__ ((packed)); + + #define OCF_WRITE_CLASS_OF_DEV 0x0024 + struct hci_write_dev_class { + uint8 dev_class[3]; + } __attribute__ ((packed)); + + #define OCF_READ_VOICE_SETTING 0x0025 + struct hci_rp_read_voice_setting { + uint8 status; + uint16 voice_setting; + } __attribute__ ((packed)); + + #define OCF_WRITE_VOICE_SETTING 0x0026 + struct hci_cp_write_voice_setting { + uint16 voice_setting; + } __attribute__ ((packed)); + + #define OCF_HOST_BUFFER_SIZE 0x0033 + struct hci_cp_host_buffer_size { + uint16 acl_mtu; + uint8 sco_mtu; + uint16 acl_max_pkt; + uint16 sco_max_pkt; + } __attribute__ ((packed)); + + /* Link Control Command definition */ + #define OGF_LINK_CONTROL 0x01 + #define OCF_CREATE_CONN 0x0005 + struct hci_cp_create_conn { + bdaddr_t bdaddr; + uint16 pkt_type; + uint8 pscan_rep_mode; + uint8 pscan_mode; + uint16 clock_offset; + uint8 role_switch; + } __attribute__ ((packed)); + + #define OCF_ACCEPT_CONN_REQ 0x0009 + struct hci_cp_accept_conn_req { + bdaddr_t bdaddr; + uint8 role; + } __attribute__ ((packed)); + + #define OCF_REJECT_CONN_REQ 0x000a + struct hci_cp_reject_conn_req { + bdaddr_t bdaddr; + uint8 reason; + } __attribute__ ((packed)); + + #define OCF_DISCONNECT 0x0006 + struct hci_disconnect { + uint16 handle; + uint8 reason; + } __attribute__ ((packed)); + + #define OCF_ADD_SCO 0x0007 + struct hci_cp_add_sco { + uint16 handle; + uint16 pkt_type; + } __attribute__ ((packed)); + + #define OCF_INQUIRY 0x0001 + struct hci_cp_inquiry { + uint8 lap[3]; + /* Constants related the inquiry process */ + #define B_BT_GIAC 0x9E8B33 + #define B_BT_LIAC 0x9E8B00 + uint8 length; + uint8 num_rsp; + } __attribute__ ((packed)); + + #define OCF_INQUIRY_CANCEL 0x0002 + + #define OCF_LINK_KEY_REPLY 0x000B + struct hci_cp_link_key_reply { + bdaddr_t bdaddr; + uint8 link_key[16]; + } __attribute__ ((packed)); + + #define OCF_LINK_KEY_NEG_REPLY 0x000C + struct hci_cp_link_key_neg_reply { + bdaddr_t bdaddr; + } __attribute__ ((packed)); + + #define OCF_PIN_CODE_REPLY 0x000D + struct hci_cp_pin_code_reply { + bdaddr_t bdaddr; + uint8 pin_len; + uint8 pin_code[16]; + } __attribute__ ((packed)); + + #define OCF_PIN_CODE_NEG_REPLY 0x000E + struct hci_cp_pin_code_neg_reply { + bdaddr_t bdaddr; + } __attribute__ ((packed)); + + #define OCF_CHANGE_CONN_PTYPE 0x000F + struct hci_cp_change_conn_ptype { + uint16 handle; + uint16 pkt_type; + } __attribute__ ((packed)); + + #define OCF_AUTH_REQUESTED 0x0011 + struct hci_cp_auth_requested { + uint16 handle; + } __attribute__ ((packed)); + + #define OCF_SET_CONN_ENCRYPT 0x0013 + struct hci_cp_set_conn_encrypt { + uint16 handle; + uint8 encrypt; + } __attribute__ ((packed)); + + #define OCF_CHANGE_CONN_LINK_KEY 0x0015 + struct hci_cp_change_conn_link_key { + uint16 handle; + } __attribute__ ((packed)); + + #define OCF_REMOTE_NAME_REQUEST 0x0019 + struct hci_remote_name_request { + bdaddr_t bdaddr; + uint8 pscan_rep_mode; + uint8 reserved; + uint16 clock_offset; + } __attribute__ ((packed)); + + #define OCF_READ_REMOTE_FEATURES 0x001B + struct hci_cp_read_rmt_features { + uint16 handle; + } __attribute__ ((packed)); + + #define OCF_READ_REMOTE_VERSION 0x001D + struct hci_cp_read_rmt_version { + uint16 handle; + } __attribute__ ((packed)); + + +/* Link Policy Command definition */ +#define OGF_LINK_POLICY 0x02 + + #define OCF_ROLE_DISCOVERY 0x0009 + struct hci_cp_role_discovery { + uint16 handle; + } __attribute__ ((packed)); + struct hci_rp_role_discovery { + uint8 status; + uint16 handle; + uint8 role; + } __attribute__ ((packed)); + + #define OCF_READ_LINK_POLICY 0x000C + struct hci_cp_read_link_policy { + uint16 handle; + } __attribute__ ((packed)); + struct hci_rp_read_link_policy { + uint8 status; + uint16 handle; + uint16 policy; + } __attribute__ ((packed)); + + #define OCF_SWITCH_ROLE 0x000B + struct hci_cp_switch_role { + bdaddr_t bdaddr; + uint8 role; + } __attribute__ ((packed)); + + #define OCF_WRITE_LINK_POLICY 0x000D + struct hci_cp_write_link_policy { + uint16 handle; + uint16 policy; + } __attribute__ ((packed)); + struct hci_rp_write_link_policy { + uint8 status; + uint16 handle; + } __attribute__ ((packed)); + +/* Status params */ +#define OGF_STATUS_PARAM 0x05 + +/* Testing commands */ +#define OGF_TESTING_CMD 0x3E + +/* Vendor specific commands */ +#define OGF_VENDOR_CMD 0x3F + +#endif diff --git a/headers/os/bluetooth/HCI/btHCI_event.h b/headers/os/bluetooth/HCI/btHCI_event.h new file mode 100644 index 0000000000..c8e53606e7 --- /dev/null +++ b/headers/os/bluetooth/HCI/btHCI_event.h @@ -0,0 +1,293 @@ +/* + * Copyright 2007 Oliver Ruiz Dorantes, oliver.ruiz.dorantes_at_gmail.com + * + * All rights reserved. Distributed under the terms of the MIT License. + * + */ + +#ifndef _BTHCI_EVENT_H_ +#define _BTHCI_EVENT_H_ + +#include + +#define HCI_EVENT_HDR_SIZE 2 + +struct hci_event_header { + uint8 evt; + uint8 elen; +} __attribute__ ((packed)); + + +/* ---- HCI Events ---- */ +#define HCI_EVENT_INQUIRY_COMPLETE 0x01 + +#define HCI_EVENT_INQUIRY_RESULT 0x02 +struct inquiry_info { + bdaddr_t bdaddr; + uint8 pscan_rep_mode; + uint8 pscan_period_mode; + uint8 pscan_mode; + uint8 dev_class[3]; + uint16 clock_offset; +} __attribute__ ((packed)); + +#define HCI_EVENT_CONN_COMPLETE 0x03 +struct hci_ev_conn_complete { + uint8 status; + uint16 handle; + bdaddr_t bdaddr; + uint8 link_type; + uint8 encrypt_mode; +} __attribute__ ((packed)); + +#define HCI_EVENT_CONN_REQUEST 0x04 +struct hci_ev_conn_request { + bdaddr_t bdaddr; + uint8 dev_class[3]; + uint8 link_type; +} __attribute__ ((packed)); + +#define HCI_EVENT_DISCONNECTION_COMPLETE 0x05 +struct hci_disconnection_complete_reply { + uint8 status; + uint16 handle; + uint8 reason; +} __attribute__ ((packed)); + +#define HCI_EVENT_AUTH_COMPLETE 0x06 +struct hci_ev_auth_complete { + uint8 status; + uint16 handle; +} __attribute__ ((packed)); + +#define HCI_EVENT_REMOTE_NAME_REQUEST_COMPLETE 0x07 +struct hci_remote_name_request_complete_reply { + uint8 status; + bdaddr_t bdaddr; + char remote_name[248]; +} __attribute__ ((packed)); + +#define HCI_EVENT_ENCRYPT_CHANGE 0x08 +struct hci_ev_encrypt_change { + uint8 status; + uint16 handle; + uint8 encrypt; +} __attribute__ ((packed)); + +#define HCI_EVENT_CHANGE_CONN_LINK_KEY_COMPLETE 0x09 +struct hci_ev_change_conn_link_key_complete { + uint8 status; + uint16 handle; +} __attribute__ ((packed)); + +#define HCI_EVENT_MASTER_LINK_KEY_COMPL 0x0a +struct hci_ev_master_link_key_complete { + uint8 status; /* 0x00 - success */ + uint16 handle; /* Connection handle */ + uint8 key_flag; /* Key flag */ +} __attribute__ ((packed)); + +#define HCI_EVENT_RMT_FEATURES 0x0B +struct hci_ev_rmt_features { + uint8 status; + uint16 handle; + uint8 features[8]; +} __attribute__ ((packed)); + +#define HCI_EVENT_RMT_VERSION 0x0C +struct hci_ev_rmt_version { + uint8 status; + uint16 handle; + uint8 lmp_ver; + uint16 manufacturer; + uint16 lmp_subver; +} __attribute__ ((packed)); + +#define HCI_EVENT_QOS_SETUP_COMPLETE 0x0D +struct hci_qos { + uint8 service_type; + uint32 token_rate; + uint32 peak_bandwidth; + uint32 latency; + uint32 delay_variation; +} __attribute__ ((packed)); +struct hci_ev_qos_setup_complete { + uint8 status; + uint16 handle; + struct hci_qos qos; +} __attribute__ ((packed)); + +#define HCI_EVENT_CMD_COMPLETE 0x0E +struct hci_ev_cmd_complete { + uint8 ncmd; + uint16 opcode; +} __attribute__ ((packed)); + +#define HCI_EVENT_CMD_STATUS 0x0F +struct hci_ev_cmd_status { + uint8 status; + uint8 ncmd; + uint16 opcode; +} __attribute__ ((packed)); + +#define HCI_EVENT_HARDWARE_ERROR 0x10 +struct hci_ev_hardware_error { + uint8 hardware_code; /* hardware error code */ +} __attribute__ ((packed)) ; + +#define HCI_EVENT_FLUSH_OCCUR 0x11 +struct hci_ev_flush_occur { + uint16 handle; /* connection handle */ +} __attribute__ ((packed)) ; + +#define HCI_EVENT_ROLE_CHANGE 0x12 +struct hci_ev_role_change { + uint8 status; + bdaddr_t bdaddr; + uint8 role; +} __attribute__ ((packed)); + +#define HCI_EVENT_NUM_COMP_PKTS 0x13 + struct handle_and_number { + uint16 handle; + uint16 num_completed; + } __attribute__ ((packed)); + + struct hci_ev_num_comp_pkts { + uint8 num_hndl; + // struct handle_and_number; hardcoded... + } __attribute__ ((packed)); + +#define HCI_EVENT_MODE_CHANGE 0x14 +struct hci_ev_mode_change { + uint8 status; + uint16 handle; + uint8 mode; + uint16 interval; +} __attribute__ ((packed)); + +#define HCI_EVENT_RETURN_LINK_KEYS 0x15 +struct link_key_info { + bdaddr_t bdaddr; + uint8 link_key[HCI_LINK_KEY_SIZE]; +} __attribute__ ((packed)) ; +struct hci_ev_return_link_keys { + uint8 num_keys; /* # of keys */ + struct link_key_info link_keys; /* As much as num_keys param */ +} __attribute__ ((packed)) ; + +#define HCI_EVENT_PIN_CODE_REQ 0x16 +struct hci_ev_pin_code_req { + bdaddr_t bdaddr; +} __attribute__ ((packed)); + +#define HCI_EVENT_LINK_KEY_REQ 0x17 +struct hci_ev_link_key_req { + bdaddr_t bdaddr; +} __attribute__ ((packed)); + +#define HCI_EVENT_LINK_KEY_NOTIFY 0x18 +struct hci_ev_link_key_notify { + bdaddr_t bdaddr; + uint8 link_key[16]; + uint8 key_type; +} __attribute__ ((packed)); + +#define HCI_EVENT_LOOPBACK_COMMAND 0x19 +struct hci_ev_loopback_command { + uint8 command[0]; /* depends of command */ +} __attribute__ ((packed)) ; + +#define HCI_EVENT_DATA_BUFFER_OVERFLOW 0x1a +struct hci_ev_data_buffer_overflow { + uint8 link_type; /* Link type */ +} __attribute__ ((packed)) ; + +#define HCI_EVENT_MAX_SLOT_CHANGE 0x1b +struct hci_ev_max_slot_change { + uint16 handle; /* connection handle */ + uint8 lmp_max_slots; /* Max. # of slots allowed */ +} __attribute__ ((packed)) ; + +#define HCI_EVENT_READ_CLOCK_OFFSET_COMPL 0x1c +struct hci_ev_read_clock_offset_compl { + uint8 status; /* 0x00 - success */ + uint16 handle; /* Connection handle */ + uint16 clock_offset; /* Clock offset */ +} __attribute__ ((packed)) ; + +#define HCI_EVENT_CON_PKT_TYPE_CHANGED 0x1d +struct hci_ev_con_pkt_type_changed { + uint8 status; /* 0x00 - success */ + uint16 handle; /* connection handle */ + uint16 pkt_type; /* packet type */ +} __attribute__ ((packed)); + +#define HCI_EVENT_QOS_VIOLATION 0x1e +struct hci_ev_qos_violation { + uint16 handle; /* connection handle */ +} __attribute__ ((packed)) ; + +#define HCI_EVENT_PAGE_SCAN_REP_MODE_CHANGE 0x20 +struct hci_ev_page_scan_rep_mode_change { + bdaddr_t bdaddr; /* destination address */ + uint8 page_scan_rep_mode; /* page scan repetition mode */ +} __attribute__ ((packed)); + +/* Events Beyond Bluetooth 1.1 */ +#define HCI_EVENT_FLOW_SPECIFICATION 0x21 +struct hci_ev_flow_specification { + uint8 status; + uint16 handle; + uint8 flags; + uint8 flow_direction; + uint8 service_type; + uint32 token_rate; + uint32 token_bucket_size; + uint32 peak_bandwidth; + uint32 access_latency; +} __attribute__ ((packed)); + +#define HCI_EVENT_INQUIRY_RESULT_WITH_RSSI 0x22 +struct hci_ev_inquiry_info_with_rssi { + bdaddr_t bdaddr; + uint8 pscan_rep_mode; + uint8 pscan_period_mode; + uint8 dev_class[3]; + uint16 clock_offset; + int8 rssi; +} __attribute__ ((packed)); + +#define HCI_EVENT_REMOTE_EXTENDED_FEATURES 0x23 +struct hci_ev_remote_extended_features { + uint8 status; + uint16 handle; + uint8 page_number; + uint8 maximun_page_number; + uint64 extended_lmp_features; +} __attribute__ ((packed)); + +#define HCI_EVENT_SYNCHRONOUS_CONNECTION_COMPLETED 0x2C +struct hci_ev_sychronous_connection_completed { + uint8 status; + uint16 handle; + bdaddr_t bdaddr; + uint8 link_type; + uint8 transmission_interval; + uint8 retransmission_window; + uint16 rx_packet_length; + uint16 tx_packet_length; + uint8 air_mode; +} __attribute__ ((packed)); + +#define HCI_EVENT_SYNCHRONOUS_CONNECTION_CHANGED 0x2D +struct hci_ev_sychronous_connection_changed { + uint8 status; + uint16 handle; + uint8 transmission_interval; + uint8 retransmission_window; + uint16 rx_packet_length; + uint16 tx_packet_length; +} __attribute__ ((packed)); + +#endif \ No newline at end of file diff --git a/headers/os/bluetooth/HCI/btHCI_module.h b/headers/os/bluetooth/HCI/btHCI_module.h new file mode 100644 index 0000000000..1f2d6db671 --- /dev/null +++ b/headers/os/bluetooth/HCI/btHCI_module.h @@ -0,0 +1,39 @@ +/* + * Copyright 2007 Oliver Ruiz Dorantes, oliver.ruiz.dorantes_at_gmail.com + * + * All rights reserved. Distributed under the terms of the MIT License. + * + */ + +#ifndef _BTHCI_MODULE_H_ +#define _BTHCI_MODULE_H_ + +/* includes */ + +#include +#include +#include + +/* defines */ +#define BT_HCI_MODULE_NAME "bus_managers/hci/v1" + +/* TODO: Possible definition of a bus manager of whatever is gonna be on the top */ +typedef struct bt_hci_module_info { + + /* registration */ + status_t (*RegisterDriver)(bt_hci_transport* desc, hci_id *id /*out*/, + bt_hci_device* cookie /*out*/ ); + status_t (*UnregisterDriver)(hci_id id); + + /* Transferences to be called from drivers */ + + status_t (*PostACL)(hci_id id, net_buffer* nbuf); + status_t (*PostSCO)(hci_id id, net_buffer* nbuf); + + /* Management */ + bt_hci_device* (*GetHciDevice)(hci_id id); + +} bt_hci_module_info ; + + +#endif \ No newline at end of file diff --git a/headers/os/bluetooth/HCI/btHCI_transport.h b/headers/os/bluetooth/HCI/btHCI_transport.h new file mode 100644 index 0000000000..32b22c47fd --- /dev/null +++ b/headers/os/bluetooth/HCI/btHCI_transport.h @@ -0,0 +1,93 @@ +/* + * Copyright 2007 Oliver Ruiz Dorantes, oliver.ruiz.dorantes_at_gmail.com + * + * All rights reserved. Distributed under the terms of the MIT License. + * + */ + +#ifndef _BTHCI_TRANSPORT_H_ +#define _BTHCI_TRANSPORT_H_ + +#include + +#include + + +typedef enum { ANCILLYANT = 1, + RUNNING, + LEAVING, + SENDING, + PROCESSING + } bt_transport_status_t; + +typedef uint8 bt_stat_t; +typedef struct bt_hci_statistics { + + bt_stat_t acceptedTX; + bt_stat_t rejectedTX; + bt_stat_t successfulTX; + bt_stat_t errorTX; + + bt_stat_t acceptedRX; + bt_stat_t rejectedRX; + bt_stat_t successfulRX; + bt_stat_t errorRX; + + bt_stat_t commandTX; + bt_stat_t eventRX; + bt_stat_t aclTX; + bt_stat_t aclRX; + bt_stat_t scoTX; + bt_stat_t scoRX; + bt_stat_t escoTX; + bt_stat_t escoRX; + + bt_stat_t bytesRX; + bt_stat_t bytesTX; + + +} bt_hci_statistics; + +/* TODO: Possible Hooks which drivers will have to provide */ +typedef struct bt_hci_transport { + + status_t (*SendCommand)(hci_id hci_dev, net_buffer* snbuf); + status_t (*SendPacket)(hci_id hci_dev, net_buffer* nbuf ); + status_t (*SendSCO)(hci_id hci_dev, net_buffer* nbuf ); + status_t (*DeliverStatistics)(bt_hci_statistics* statistics); + + transport_type kind; + char name[B_OS_NAME_LENGTH]; + +} bt_hci_transport; + +typedef struct bt_hci_device { + + transport_type kind; + char realName[B_OS_NAME_LENGTH]; + +} bt_hci_device; + + +/* Here the transport driver have some flags that */ +/* can be used to inform the upper layer about some */ +/* special behaouvior to perform */ + +#define BT_IGNORE_THIS_DEVICE (1<<0) +#define BT_SCO_NOT_WORKING (1<<1) +#define BT_WILL_NEED_A_RESET (1<<2) +#define BT_DIGIANSWER (1<<4) + +/* IOCTLS */ +#define ISSUE_BT_COMMAND (1<<0) +#define GET_STATICS (1<<1) +#define GET_NOTIFICATION_PORT (1<<2) +#define GET_HCI_ID (1<<3) + +#define PACK_PORTCODE(type,hid,data) ((type&0xFF)<<24|(hid&0xFF)<<16|(data&0xFFFF)) + +/* Port drivers can use to send information (1 for all for + at moment refer to ioctl GET_NOTIFICATION_PORT)*/ +#define BT_USERLAND_PORT_NAME "BT kernel-user Land" + +#endif diff --git a/headers/os/bluetooth/LocalDevice.h b/headers/os/bluetooth/LocalDevice.h index 1236483e45..81f3c0a03f 100644 --- a/headers/os/bluetooth/LocalDevice.h +++ b/headers/os/bluetooth/LocalDevice.h @@ -11,8 +11,14 @@ #include #include +#include + +#include +#include + #include + namespace Bluetooth { class DiscoveryAgent; @@ -22,7 +28,9 @@ class LocalDevice { public: /* Possible throwing */ static LocalDevice* GetLocalDevice(); - static LocalDevice* GetLocalDevice(uint8 dev); + static uint32 GetLocalDeviceCount(); + + static LocalDevice* GetLocalDevice(hci_id hid); static LocalDevice* GetLocalDevice(bdaddr_t bdaddr); DiscoveryAgent* GetDiscoveryAgent(); @@ -35,13 +43,22 @@ class LocalDevice { void GetProperty(const char* property, uint32* value); int GetDiscoverable(); - BString GetBluetoothAddress(); - /* + bdaddr_t GetBluetoothAddress(); + /* ServiceRecord getRecord(Connection notifier); void updateRecord(ServiceRecord srvRecord); - */ + */ private: - LocalDevice(); + LocalDevice(hci_id hid); + + static status_t SRetrieveBluetoothMessenger(void); + status_t RetrieveBluetoothMessenger(void); + static LocalDevice* RequestLocalDeviceID(BMessage* request); + + static BMessenger* sfMessenger; + BMessenger* fMessenger; + + hci_id hid; }; } diff --git a/headers/os/bluetooth/bluetooth_util.h b/headers/os/bluetooth/bluetooth_util.h new file mode 100644 index 0000000000..8d5743320d --- /dev/null +++ b/headers/os/bluetooth/bluetooth_util.h @@ -0,0 +1,58 @@ +/* + * Copyright 2007 Oliver Ruiz Dorantes, oliver.ruiz.dorantes_at_gmail.com + * + * All rights reserved. Distributed under the terms of the MIT License. + * + */ + +#ifndef _BLUETOOTH_UTIL_H +#define _BLUETOOTH_UTIL_H + +#include + +/* BD Address management */ +static inline int bacmp(bdaddr_t* ba1, bdaddr_t* ba2) +{ + return memcmp(ba1, ba2, sizeof(bdaddr_t)); +} + + +static inline void bacpy(bdaddr_t* dst, bdaddr_t* src) +{ + memcpy(dst, src, sizeof(bdaddr_t)); +} + + +static inline void baswap(bdaddr_t* dst, bdaddr_t* src) { + +} + + +static inline char* batostr(bdaddr_t *ba) +{ + return "00:00:00:00:00:00"; + +} + + +static inline void strtoba(const char *str, bdaddr_t *ba) +{ + +} + + +/* Link key Management */ +static inline char* lktostr( uint8 link_key[16] ) +{ + return "00:00:00:00:00:00"; +} + + +/* TODO: Bluetooth Errors */ +static inline char* btstrerror(int error_code) +{ + return "Unknown Bluetooth error"; +} + + +#endif