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 "hci.h" 12 13 14 hci_cmd_t hci_inquiry = { 15 0x01, 0x01, "311" // LAP, Inquiry length, Num_responses 16 }; 17 18 hci_cmd_t hci_reset = { 19 0x03, 0x03, "" 20 }; 21 22 23 static hci_transport_t *hci_transport; 24 25 void hci_init(hci_transport_t *transport, void *config){ 26 27 // reference to use transport layer implementation 28 hci_transport = transport; 29 30 // open unix socket 31 32 // wait for connections 33 34 // enter loop 35 36 // handle events 37 } 38 39 int hci_power_control(HCI_POWER_MODE power_mode){ 40 return 0; 41 } 42 43 int hci_send_cmd(uint8_t *buffer, int size){ 44 return hci_transport->send_cmd_packet(buffer, size); 45 } 46 47 void hci_run(){ 48 while (1) { 49 // construct file descriptor set to wait for 50 // select 51 52 // for each ready file in FD - call handle_data 53 sleep(1); 54 } 55 } 56 57 58 void hci_create_cmd_packet(uint8_t *buffer, uint8_t *cmd_len, hci_cmd_t *cmd, ...){ 59 buffer[0] = cmd->ocf; 60 buffer[1] = cmd->ocf >> 8 | cmd->ogf << 2; 61 int pos = 3; 62 63 va_list argptr; 64 va_start(argptr, cmd); 65 const char *format = cmd->format; 66 uint16_t word; 67 uint32_t longword; 68 uint8_t * bt_addr; 69 while (*format) { 70 switch(*format) { 71 case '1': // 8 bit value 72 case '2': // 16 bit value 73 case 'H': // hci_handle 74 word = va_arg(argptr, int); // minimum c parameter width is int 75 buffer[pos++] = word & 0xff; 76 if (*format == '2') { 77 buffer[pos++] = word >> 8; 78 } else if (*format == 'H') { 79 80 } 81 break; 82 case '3': 83 case '4': 84 longword = va_arg(argptr, uint32_t); 85 // longword = va_arg(argptr, int); 86 buffer[pos++] = longword; 87 buffer[pos++] = longword >> 8; 88 buffer[pos++] = longword >> 16; 89 if (*format == '4'){ 90 buffer[pos++] = longword >> 24; 91 } 92 break; 93 case 'B': // bt-addr 94 bt_addr = va_arg(argptr, uint8_t *); 95 memcpy( &buffer[pos], bt_addr, 6); 96 pos += 6; 97 break; 98 default: 99 break; 100 } 101 format++; 102 }; 103 va_end(argptr); 104 buffer[2] = pos - 3; 105 *cmd_len = pos; 106 }