24 #define PS3_VID 0x054C // Sony Corporation
25 #define PS3_PID 0x0268 // PS3 Controller DualShock 3
26 #define PS3NAVIGATION_PID 0x042F // Navigation controller
27 #define PS3MOVE_PID 0x03D5 // Motion controller
29 #define IOGEAR_GBU521_VID 0x0A5C // The IOGEAR GBU521 dongle does not presents itself correctly, so we have to check for it manually
30 #define IOGEAR_GBU521_PID 0x21E8
33 #define BULK_MAXPKTSIZE 64 // Max size for ACL data
36 #define bmREQ_HCI_OUT USB_SETUP_HOST_TO_DEVICE|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_DEVICE
38 #define bmREQ_HID_OUT USB_SETUP_HOST_TO_DEVICE|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_INTERFACE
39 #define HID_REQUEST_SET_REPORT 0x09
42 #define HCI_INIT_STATE 0
43 #define HCI_RESET_STATE 1
44 #define HCI_CLASS_STATE 2
45 #define HCI_BDADDR_STATE 3
46 #define HCI_LOCAL_VERSION_STATE 4
47 #define HCI_SET_NAME_STATE 5
48 #define HCI_CHECK_DEVICE_SERVICE 6
50 #define HCI_INQUIRY_STATE 7 // These three states are only used if it should pair and connect to a device
51 #define HCI_CONNECT_DEVICE_STATE 8
52 #define HCI_CONNECTED_DEVICE_STATE 9
54 #define HCI_SCANNING_STATE 10
55 #define HCI_CONNECT_IN_STATE 11
56 #define HCI_REMOTE_NAME_STATE 12
57 #define HCI_CONNECTED_STATE 13
58 #define HCI_DISABLE_SCAN_STATE 14
59 #define HCI_DONE_STATE 15
60 #define HCI_DISCONNECT_STATE 16
63 #define HCI_FLAG_CMD_COMPLETE 0x01
64 #define HCI_FLAG_CONNECT_COMPLETE 0x02
65 #define HCI_FLAG_DISCONNECT_COMPLETE 0x04
66 #define HCI_FLAG_REMOTE_NAME_COMPLETE 0x08
67 #define HCI_FLAG_INCOMING_REQUEST 0x10
68 #define HCI_FLAG_READ_BDADDR 0x20
69 #define HCI_FLAG_READ_VERSION 0x40
70 #define HCI_FLAG_DEVICE_FOUND 0x80
71 #define HCI_FLAG_CONNECT_EVENT 0x100
74 #define hci_check_flag(flag) (hci_event_flag & (flag))
75 #define hci_set_flag(flag) (hci_event_flag |= (flag))
76 #define hci_clear_flag(flag) (hci_event_flag &= ~(flag))
79 #define EV_INQUIRY_COMPLETE 0x01
80 #define EV_INQUIRY_RESULT 0x02
81 #define EV_CONNECT_COMPLETE 0x03
82 #define EV_INCOMING_CONNECT 0x04
83 #define EV_DISCONNECT_COMPLETE 0x05
84 #define EV_AUTHENTICATION_COMPLETE 0x06
85 #define EV_REMOTE_NAME_COMPLETE 0x07
86 #define EV_ENCRYPTION_CHANGE 0x08
87 #define EV_CHANGE_CONNECTION_LINK 0x09
88 #define EV_ROLE_CHANGED 0x12
89 #define EV_NUM_COMPLETE_PKT 0x13
90 #define EV_PIN_CODE_REQUEST 0x16
91 #define EV_LINK_KEY_REQUEST 0x17
92 #define EV_LINK_KEY_NOTIFICATION 0x18
93 #define EV_DATA_BUFFER_OVERFLOW 0x1A
94 #define EV_MAX_SLOTS_CHANGE 0x1B
95 #define EV_READ_REMOTE_VERSION_INFORMATION_COMPLETE 0x0C
96 #define EV_QOS_SETUP_COMPLETE 0x0D
97 #define EV_COMMAND_COMPLETE 0x0E
98 #define EV_COMMAND_STATUS 0x0F
99 #define EV_LOOPBACK_COMMAND 0x19
100 #define EV_PAGE_SCAN_REP_MODE 0x20
107 #define L2CAP_CONTROL_CONNECT_REQUEST 2
108 #define L2CAP_CONTROL_CONFIG_REQUEST 3
109 #define L2CAP_CONTROL_SUCCESS 4
110 #define L2CAP_CONTROL_DISCONNECT 5
113 #define L2CAP_INTERRUPT_SETUP 6
114 #define L2CAP_INTERRUPT_CONNECT_REQUEST 7
115 #define L2CAP_INTERRUPT_CONFIG_REQUEST 8
116 #define L2CAP_INTERRUPT_DISCONNECT 9
119 #define L2CAP_SDP_WAIT 10
120 #define L2CAP_SDP_SUCCESS 11
123 #define L2CAP_RFCOMM_WAIT 12
124 #define L2CAP_RFCOMM_SUCCESS 13
126 #define L2CAP_DISCONNECT_RESPONSE 14 // Used for both SDP and RFCOMM channel
129 #define TURN_ON_LED 17
130 #define PS3_ENABLE_SIXAXIS 18
131 #define WII_CHECK_MOTION_PLUS_STATE 19
132 #define WII_CHECK_EXTENSION_STATE 20
133 #define WII_INIT_MOTION_PLUS_STATE 21
136 #define L2CAP_FLAG_CONNECTION_CONTROL_REQUEST 0x00000001
137 #define L2CAP_FLAG_CONFIG_CONTROL_SUCCESS 0x00000002
138 #define L2CAP_FLAG_CONTROL_CONNECTED 0x00000004
139 #define L2CAP_FLAG_DISCONNECT_CONTROL_RESPONSE 0x00000008
142 #define L2CAP_FLAG_CONNECTION_INTERRUPT_REQUEST 0x00000010
143 #define L2CAP_FLAG_CONFIG_INTERRUPT_SUCCESS 0x00000020
144 #define L2CAP_FLAG_INTERRUPT_CONNECTED 0x00000040
145 #define L2CAP_FLAG_DISCONNECT_INTERRUPT_RESPONSE 0x00000080
148 #define L2CAP_FLAG_CONNECTION_SDP_REQUEST 0x00000100
149 #define L2CAP_FLAG_CONFIG_SDP_SUCCESS 0x00000200
150 #define L2CAP_FLAG_DISCONNECT_SDP_REQUEST 0x00000400
153 #define L2CAP_FLAG_CONNECTION_RFCOMM_REQUEST 0x00000800
154 #define L2CAP_FLAG_CONFIG_RFCOMM_SUCCESS 0x00001000
155 #define L2CAP_FLAG_DISCONNECT_RFCOMM_REQUEST 0x00002000
157 #define L2CAP_FLAG_DISCONNECT_RESPONSE 0x00004000
160 #define l2cap_check_flag(flag) (l2cap_event_flag & (flag))
161 #define l2cap_set_flag(flag) (l2cap_event_flag |= (flag))
162 #define l2cap_clear_flag(flag) (l2cap_event_flag &= ~(flag))
165 #define L2CAP_CMD_COMMAND_REJECT 0x01
166 #define L2CAP_CMD_CONNECTION_REQUEST 0x02
167 #define L2CAP_CMD_CONNECTION_RESPONSE 0x03
168 #define L2CAP_CMD_CONFIG_REQUEST 0x04
169 #define L2CAP_CMD_CONFIG_RESPONSE 0x05
170 #define L2CAP_CMD_DISCONNECT_REQUEST 0x06
171 #define L2CAP_CMD_DISCONNECT_RESPONSE 0x07
172 #define L2CAP_CMD_INFORMATION_REQUEST 0x0A
173 #define L2CAP_CMD_INFORMATION_RESPONSE 0x0B
177 #define SUCCESSFUL 0x00
180 #define SDP_PSM 0x01 // Service Discovery Protocol PSM Value
181 #define RFCOMM_PSM 0x03 // RFCOMM PSM Value
182 #define HID_CTRL_PSM 0x11 // HID_Control PSM Value
183 #define HID_INTR_PSM 0x13 // HID_Interrupt PSM Value
186 #define WI_SUBCLASS_RF 0x01 // RF Controller
187 #define WI_PROTOCOL_BT 0x01 // Bluetooth Programming Interface
189 #define BTD_MAX_ENDPOINTS 4
190 #define BTD_NUM_SERVICES 4 // Max number of Bluetooth services - if you need more than 4 simply increase this number
196 #define UHS_ACL_HANDLE_OK(x, y) ((uint16_t)(x[0]) | (uint16_t)(x[1] << 8)) == (y | 0x2000U)
207 #define UHS_ACL_HANDLE_OK(x, y) ((x[0] == (y & 0xff)) && (x[1] == ((y >> 8) | 0x20)))
221 virtual void Reset();
246 virtual uint8_t
ConfigureDevice(uint8_t parent, uint8_t port,
bool lowspeed);
254 virtual uint8_t
Init(uint8_t parent, uint8_t port,
bool lowspeed);
264 virtual uint8_t
Poll();
298 virtual boolean VIDPIDOK(uint16_t vid, uint16_t pid) {
336 btService[i] = pService;
413 void L2CAP_Command(uint16_t handle, uint8_t* data, uint8_t nbytes, uint8_t channelLow = 0x01, uint8_t channelHigh = 0x00);
571 uint8_t pollInterval;
575 uint8_t classOfDevice[3];
579 uint16_t hci_counter;
580 uint16_t hci_num_reset_loops;
581 uint16_t hci_event_flag;
582 uint8_t inquiry_counter;
586 uint8_t l2capoutbuf[14];
589 void HCI_event_task();
591 void ACL_event_task();
594 void setBdaddr(uint8_t* BDADDR);
595 void setMoveBdaddr(uint8_t* BDADDR);
static const uint8_t BTD_DATAOUT_PIPE
void l2cap_connection_response(uint16_t handle, uint8_t rxid, uint8_t *dcid, uint8_t *scid, uint8_t result)
void l2cap_connection_request(uint16_t handle, uint8_t rxid, uint8_t *scid, uint16_t psm)
bool sdpConnectionClaimed
virtual boolean DEVCLASSOK(uint8_t klass)
void l2cap_disconnection_request(uint16_t handle, uint8_t rxid, uint8_t *dcid, uint8_t *scid)
bool rfcommConnectionClaimed
static const uint8_t BTD_EVENT_PIPE
void hci_write_scan_disable()
virtual void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep)
virtual uint8_t GetAddress()
uint8_t readPollInterval()
static const uint8_t BTD_DATAIN_PIPE
void hci_set_local_name(const char *name)
void hci_write_scan_enable()
virtual uint8_t Release()
void l2cap_disconnection_response(uint16_t handle, uint8_t rxid, uint8_t *dcid, uint8_t *scid)
#define USB_CLASS_WIRELESS_CTRL
void PrintEndpointDescriptor(const USB_ENDPOINT_DESCRIPTOR *ep_ptr)
#define IOGEAR_GBU521_PID
virtual uint8_t ConfigureDevice(uint8_t parent, uint8_t port, bool lowspeed)
virtual uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
void hci_disconnect(uint16_t handle)
void hci_inquiry_cancel()
virtual boolean VIDPIDOK(uint16_t vid, uint16_t pid)
static const uint8_t BTD_CONTROL_PIPE
int8_t registerServiceClass(BluetoothService *pService)
bool l2capConnectionClaimed
EpInfo epInfo[BTD_MAX_ENDPOINTS]
#define IOGEAR_GBU521_VID
virtual void ACLData(uint8_t *ACLData)
#define BTD_MAX_ENDPOINTS
#define PS3NAVIGATION_PID
void l2cap_information_response(uint16_t handle, uint8_t rxid, uint8_t infoTypeLow, uint8_t infoTypeHigh)
void hci_write_class_of_device()
void hci_pin_code_negative_request_reply()
#define HCI_CHECK_DEVICE_SERVICE
void hci_link_key_request_negative_reply()
void L2CAP_Command(uint16_t handle, uint8_t *data, uint8_t nbytes, uint8_t channelLow=0x01, uint8_t channelHigh=0x00)
void l2cap_config_response(uint16_t handle, uint8_t rxid, uint8_t *scid)
void l2cap_config_request(uint16_t handle, uint8_t rxid, uint8_t *dcid)
void hci_pin_code_request_reply()
virtual void disconnect()
void hci_authentication_request()
void hci_read_local_version_information()
void hci_accept_connection()
void HCI_Command(uint8_t *data, uint16_t nbytes)