1 /* 2 * hci.c 3 * 4 * Created by Matthias Ringwald on 4/29/09. 5 * 6 */ 7 8 #include <unistd.h> 9 #include <stdarg.h> 10 #include <string.h> 11 #include <stdio.h> 12 #include "hci.h" 13 14 /** 15 * Link Control Commands 16 */ 17 hci_cmd_t hci_inquiry = { 18 OPCODE(OGF_LINK_CONTROL, 0x01), "311" 19 // LAP, Inquiry length, Num_responses 20 }; 21 hci_cmd_t hci_inquiry_cancel = { 22 OPCODE(OGF_LINK_CONTROL, 0x02), "" 23 // no params 24 }; 25 hci_cmd_t hci_create_connection = { 26 OPCODE(OGF_LINK_CONTROL, 0x05), "B21121" 27 // BD_ADDR, Packet_Type, Page_Scan_Repetition_Mode, Reserved, Clock_Offset, Allow_Role_Switch 28 }; 29 30 hci_cmd_t hci_accept_connection_request = { 31 OPCODE(OGF_LINK_CONTROL, 0x09), "B1" 32 // BD_ADDR, Role: become master, stay slave 33 }; 34 hci_cmd_t hci_link_key_request_negative_reply = { 35 OPCODE(OGF_LINK_CONTROL, 0x0c), "B" 36 }; 37 hci_cmd_t hci_pin_code_request_reply = { 38 OPCODE(OGF_LINK_CONTROL, 0x0d), "B1P" 39 // BD_ADDR, pin length, PIN: c-string 40 }; 41 hci_cmd_t hci_remote_name_request = { 42 OPCODE(OGF_LINK_CONTROL, 0x19), "B112" 43 // BD_ADDR, Page_Scan_Repetition_Mode, Reserved, Clock_Offset 44 }; 45 hci_cmd_t hci_remote_name_request_cancel = { 46 OPCODE(OGF_LINK_CONTROL, 0x1A), "B" 47 // BD_ADDR 48 }; 49 50 /** 51 * Controller & Baseband Commands 52 */ 53 hci_cmd_t hci_set_event_mask = { 54 OPCODE(OGF_CONTROLLER_BASEBAND, 0x01), "44" 55 // event_mask lower 4 octets, higher 4 bytes 56 }; 57 hci_cmd_t hci_reset = { 58 OPCODE(OGF_CONTROLLER_BASEBAND, 0x03), "" 59 // no params 60 }; 61 hci_cmd_t hci_delete_stored_link_key = { 62 OPCODE(OGF_CONTROLLER_BASEBAND, 0x12), "B1" 63 // BD_ADDR, Delete_All_Flag 64 }; 65 hci_cmd_t hci_write_local_name = { 66 OPCODE(OGF_CONTROLLER_BASEBAND, 0x13), "N" 67 // Local name (UTF-8, Null Terminated, max 248 octets) 68 }; 69 hci_cmd_t hci_write_page_timeout = { 70 OPCODE(OGF_CONTROLLER_BASEBAND, 0x18), "2" 71 // Page_Timeout * 0.625 ms 72 }; 73 hci_cmd_t hci_write_scan_enable = { 74 OPCODE(OGF_CONTROLLER_BASEBAND, 0x1A), "1" 75 // Scan_enable: no, inq, page, inq+page 76 }; 77 hci_cmd_t hci_write_authentication_enable = { 78 OPCODE(OGF_CONTROLLER_BASEBAND, 0x20), "1" 79 // Authentication_Enable 80 }; 81 hci_cmd_t hci_write_class_of_device = { 82 OPCODE(OGF_CONTROLLER_BASEBAND, 0x24), "3" 83 // Class of Device 84 }; 85 hci_cmd_t hci_host_buffer_size = { 86 OPCODE(OGF_CONTROLLER_BASEBAND, 0x33), "2122" 87 // Host_ACL_Data_Packet_Length:, Host_Synchronous_Data_Packet_Length:, Host_Total_Num_ACL_Data_Packets:, Host_Total_Num_Synchronous_Data_Packets: 88 }; 89 90 hci_cmd_t hci_write_inquiry_mode = { 91 OPCODE(OGF_CONTROLLER_BASEBAND, 0x45), "1" 92 // Inquiry mode: 0x00 = standard, 0x01 = with RSSI, 0x02 = extended 93 }; 94 95 hci_cmd_t hci_write_extended_inquiry_response = { 96 OPCODE(OGF_CONTROLLER_BASEBAND, 0x52), "1E" 97 // FEC_Required, Exstended Inquiry Response 98 }; 99 100 hci_cmd_t hci_write_simple_pairing_mode = { 101 OPCODE(OGF_CONTROLLER_BASEBAND, 0x56), "1" 102 // mode: 0 = off, 1 = on 103 }; 104 105 hci_cmd_t hci_read_bd_addr = { 106 OPCODE(OGF_INFORMATIONAL_PARAMETERS, 0x09), "" 107 // no params 108 }; 109 110 hci_cmd_t hci_get_btstack_state = { 111 OPCODE(OGF_BTSTACK, HCI_BTSTACK_GET_STATE), "" 112 // no params -> 113 }; 114 115 116 // the stack is here 117 static hci_stack_t hci_stack; 118 119 120 void bt_store_16(uint8_t *buffer, uint16_t pos, uint16_t value){ 121 buffer[pos++] = value; 122 buffer[pos++] = value >> 8; 123 } 124 125 void bt_store_32(uint8_t *buffer, uint16_t pos, uint32_t value){ 126 buffer[pos++] = value; 127 buffer[pos++] = value >> 8; 128 buffer[pos++] = value >> 16; 129 buffer[pos++] = value >> 24; 130 } 131 132 void bt_flip_addr(bd_addr_t dest, bd_addr_t src){ 133 dest[0] = src[5]; 134 dest[1] = src[4]; 135 dest[2] = src[3]; 136 dest[3] = src[2]; 137 dest[4] = src[1]; 138 dest[5] = src[0]; 139 } 140 141 void hexdump(void *data, int size){ 142 int i; 143 for (i=0; i<size;i++){ 144 printf("%02X ", ((uint8_t *)data)[i]); 145 } 146 printf("\n"); 147 } 148 149 /** 150 * Linked link list 151 */ 152 153 /** 154 * get link for given address 155 * 156 * @return connection OR NULL, if not found 157 */ 158 #if 0 159 static hci_connection_t *link_for_addr(bd_addr_t addr){ 160 return NULL; 161 } 162 #endif 163 164 /** 165 * Handler called by HCI transport 166 */ 167 static void dummy_handler(uint8_t *packet, uint16_t size){ 168 } 169 170 static void acl_handler(uint8_t *packet, int size){ 171 hci_stack.acl_packet_handler(packet, size); 172 173 // execute main loop 174 hci_run(); 175 } 176 177 static void event_handler(uint8_t *packet, int size){ 178 bd_addr_t addr; 179 180 // Get Num_HCI_Command_Packets 181 if (packet[0] == HCI_EVENT_COMMAND_COMPLETE || 182 packet[0] == HCI_EVENT_COMMAND_STATUS){ 183 hci_stack.num_cmd_packets = packet[2]; 184 } 185 186 // handle BT initialization 187 if (hci_stack.state == HCI_STATE_INITIALIZING){ 188 // handle H4 synchronization loss on restart 189 // if (hci_stack.substate == 1 && packet[0] == HCI_EVENT_HARDWARE_ERROR){ 190 // hci_stack.substate = 0; 191 // } 192 // handle normal init sequence 193 if (hci_stack.substate % 2){ 194 // odd: waiting for event 195 if (packet[0] == HCI_EVENT_COMMAND_COMPLETE){ 196 hci_stack.substate++; 197 } 198 } 199 } 200 201 // link key request 202 if (packet[0] == HCI_EVENT_LINK_KEY_REQUEST){ 203 bt_flip_addr(addr, &packet[2]); 204 hci_send_cmd(&hci_link_key_request_negative_reply, &addr); 205 return; 206 } 207 208 // pin code request 209 if (packet[0] == HCI_EVENT_PIN_CODE_REQUEST){ 210 bt_flip_addr(addr, &packet[2]); 211 hci_send_cmd(&hci_pin_code_request_reply, &addr, 4, "1234"); 212 } 213 214 hci_stack.event_packet_handler(packet, size); 215 216 // execute main loop 217 hci_run(); 218 } 219 220 /** Register L2CAP handlers */ 221 void hci_register_event_packet_handler(void (*handler)(uint8_t *packet, uint16_t size)){ 222 hci_stack.event_packet_handler = handler; 223 } 224 void hci_register_acl_packet_handler (void (*handler)(uint8_t *packet, uint16_t size)){ 225 hci_stack.acl_packet_handler = handler; 226 } 227 228 static int null_control_function(void *config){ 229 return 0; 230 } 231 static const char * null_control_name(void *config){ 232 return "Hardware unknown"; 233 } 234 235 static bt_control_t null_control = { 236 null_control_function, 237 null_control_function, 238 null_control_function, 239 null_control_name 240 }; 241 242 void hci_init(hci_transport_t *transport, void *config, bt_control_t *control){ 243 244 // reference to use transport layer implementation 245 hci_stack.hci_transport = transport; 246 247 // references to used control implementation 248 if (control) { 249 hci_stack.control = control; 250 } else { 251 hci_stack.control = &null_control; 252 } 253 254 // reference to used config 255 hci_stack.config = config; 256 257 // empty cmd buffer 258 hci_stack.hci_cmd_buffer = malloc(3+255); 259 260 // higher level handler 261 hci_stack.event_packet_handler = dummy_handler; 262 hci_stack.acl_packet_handler = dummy_handler; 263 264 // register packet handlers with transport 265 transport->register_event_packet_handler( event_handler); 266 transport->register_acl_packet_handler( acl_handler); 267 } 268 269 int hci_power_control(HCI_POWER_MODE power_mode){ 270 if (power_mode == HCI_POWER_ON) { 271 272 // set up state machine 273 hci_stack.num_cmd_packets = 1; // assume that one cmd can be sent 274 hci_stack.state = HCI_STATE_INITIALIZING; 275 hci_stack.substate = 0; 276 277 // power on 278 hci_stack.control->on(hci_stack.config); 279 280 // open low-level device 281 hci_stack.hci_transport->open(hci_stack.config); 282 283 } else if (power_mode == HCI_POWER_OFF){ 284 285 // close low-level device 286 hci_stack.hci_transport->close(hci_stack.config); 287 288 // power off 289 hci_stack.control->off(hci_stack.config); 290 } 291 292 // trigger next/first action 293 hci_run(); 294 295 return 0; 296 } 297 298 uint32_t hci_run(){ 299 uint8_t micro_packet; 300 switch (hci_stack.state){ 301 case HCI_STATE_INITIALIZING: 302 if (hci_stack.substate % 2) { 303 // odd: waiting for command completion 304 return 0; 305 } 306 if (hci_stack.num_cmd_packets == 0) { 307 // cannot send command yet 308 return 0; 309 } 310 switch (hci_stack.substate/2){ 311 case 0: 312 hci_send_cmd(&hci_reset); 313 break; 314 case 1: 315 hci_send_cmd(&hci_read_bd_addr); 316 break; 317 case 2: 318 // ca. 15 sec 319 hci_send_cmd(&hci_write_page_timeout, 0x6000); 320 break; 321 case 3: 322 hci_send_cmd(&hci_write_scan_enable, 3); // 3 inq scan + page scan 323 break; 324 case 4: 325 // done. 326 hci_stack.state = HCI_STATE_WORKING; 327 micro_packet = HCI_EVENT_BTSTACK_WORKING; 328 hci_stack.event_packet_handler(µ_packet, 1); 329 break; 330 default: 331 break; 332 } 333 hci_stack.substate++; 334 break; 335 default: 336 break; 337 } 338 339 // don't check for timetous yet 340 return 0; 341 } 342 343 344 int hci_send_acl_packet(uint8_t *packet, int size){ 345 return hci_stack.hci_transport->send_acl_packet(packet, size); 346 } 347 348 int hci_send_cmd_packet(uint8_t *packet, int size){ 349 if (READ_CMD_OGF(packet) != OGF_BTSTACK) { 350 hci_stack.num_cmd_packets--; 351 return hci_stack.hci_transport->send_cmd_packet(packet, size); 352 } 353 354 hci_dump_packet( HCI_COMMAND_DATA_PACKET, 1, packet, size); 355 356 // BTstack internal commands 357 uint8_t event[3]; 358 switch (READ_CMD_OCF(packet)){ 359 case HCI_BTSTACK_GET_STATE: 360 event[0] = HCI_EVENT_BTSTACK_STATE; 361 event[1] = 1; 362 event[2] = hci_stack.state; 363 hci_dump_packet( HCI_EVENT_PACKET, 0, event, 3); 364 hci_stack.event_packet_handler(event, 3); 365 break; 366 default: 367 // TODO log into hci dump as vendor specific"event" 368 printf("Error: command %u not implemented\n:", READ_CMD_OCF(packet)); 369 break; 370 } 371 return 0; 372 } 373 374 uint16_t hci_create_cmd_internal(uint8_t *hci_cmd_buffer, hci_cmd_t *cmd, va_list argptr){ 375 376 hci_cmd_buffer[0] = cmd->opcode & 0xff; 377 hci_cmd_buffer[1] = cmd->opcode >> 8; 378 int pos = 3; 379 380 const char *format = cmd->format; 381 uint16_t word; 382 uint32_t longword; 383 uint8_t * ptr; 384 while (*format) { 385 switch(*format) { 386 case '1': // 8 bit value 387 case '2': // 16 bit value 388 case 'H': // hci_handle 389 word = va_arg(argptr, int); // minimal va_arg is int: 2 bytes on 8+16 bit CPUs 390 hci_cmd_buffer[pos++] = word & 0xff; 391 if (*format == '2') { 392 hci_cmd_buffer[pos++] = word >> 8; 393 } else if (*format == 'H') { 394 // TODO 395 } 396 break; 397 case '3': 398 case '4': 399 longword = va_arg(argptr, uint32_t); 400 // longword = va_arg(argptr, int); 401 hci_cmd_buffer[pos++] = longword; 402 hci_cmd_buffer[pos++] = longword >> 8; 403 hci_cmd_buffer[pos++] = longword >> 16; 404 if (*format == '4'){ 405 hci_cmd_buffer[pos++] = longword >> 24; 406 } 407 break; 408 case 'B': // bt-addr 409 ptr = va_arg(argptr, uint8_t *); 410 hci_cmd_buffer[pos++] = ptr[5]; 411 hci_cmd_buffer[pos++] = ptr[4]; 412 hci_cmd_buffer[pos++] = ptr[3]; 413 hci_cmd_buffer[pos++] = ptr[2]; 414 hci_cmd_buffer[pos++] = ptr[1]; 415 hci_cmd_buffer[pos++] = ptr[0]; 416 break; 417 case 'P': // c string passed as pascal string with leading 1-byte len 418 ptr = va_arg(argptr, uint8_t *); 419 memcpy(&hci_cmd_buffer[pos], ptr, 16); 420 pos += 16; 421 break; 422 case 'N': // UTF-8 string, null terminated 423 ptr = va_arg(argptr, uint8_t *); 424 memcpy(&hci_cmd_buffer[pos], ptr, 248); 425 pos += 248; 426 break; 427 case 'E': // Extended Inquiry Information 240 octets 428 ptr = va_arg(argptr, uint8_t *); 429 memcpy(&hci_cmd_buffer[pos], ptr, 240); 430 pos += 240; 431 break; 432 default: 433 break; 434 } 435 format++; 436 }; 437 hci_cmd_buffer[2] = pos - 3; 438 return pos; 439 } 440 441 uint16_t hci_create_cmd(uint8_t *hci_cmd_buffer, hci_cmd_t *cmd, ...){ 442 va_list argptr; 443 va_start(argptr, cmd); 444 uint16_t len = hci_create_cmd_internal(hci_cmd_buffer, cmd, argptr); 445 va_end(argptr); 446 return len; 447 } 448 449 /** 450 * pre: numcmds >= 0 - it's allowed to send a command to the controller 451 */ 452 int hci_send_cmd(hci_cmd_t *cmd, ...){ 453 va_list argptr; 454 va_start(argptr, cmd); 455 uint8_t * hci_cmd_buffer = hci_stack.hci_cmd_buffer; 456 uint16_t size = hci_create_cmd_internal(hci_stack.hci_cmd_buffer, cmd, argptr); 457 va_end(argptr); 458 return hci_send_cmd_packet(hci_cmd_buffer, size); 459 }