xref: /btstack/src/hci.c (revision 8b658ebcf868c8176b3f7e17042b1385b71e098d)
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 // calculate combined ogf/ocf value
15 #define OPCODE(ogf, ocf) (ocf | ogf << 10)
16 #define OGF_LINK_CONTROL 0x01
17 #define OGF_CONTROLLER_BASEBAND 0x03
18 
19 hci_cmd_t hci_inquiry = {
20     OPCODE(OGF_LINK_CONTROL, 0x01), "311"
21     // LAP, Inquiry length, Num_responses
22 };
23 
24 hci_cmd_t hci_link_key_request_negative_reply = {
25     OPCODE(OGF_LINK_CONTROL, 0x0c), "B"
26 };
27 
28 hci_cmd_t hci_pin_code_request_reply = {
29     OPCODE(OGF_LINK_CONTROL, 0x0d), "B1P"
30     // BD_ADDR, pin length, PIN: c-string
31 };
32 
33 hci_cmd_t hci_reset = {
34     OPCODE(OGF_CONTROLLER_BASEBAND, 0x03), ""
35 };
36 
37 hci_cmd_t hci_create_connection = {
38     OPCODE(OGF_LINK_CONTROL, 0x05), "B21121"
39     // BD_ADDR, Packet_Type, Page_Scan_Repetition_Mode, Reserved, Clock_Offset, Allow_Role_Switch
40 };
41 
42 hci_cmd_t hci_write_page_timeout = {
43     OPCODE(OGF_CONTROLLER_BASEBAND, 0x18), "2"
44     // Page_Timeout * 0.625 ms
45 };
46 
47 hci_cmd_t hci_write_authentication_enable = {
48     OPCODE(OGF_CONTROLLER_BASEBAND, 0x20), "1"
49     // Authentication_Enable
50 };
51 
52 hci_cmd_t hci_host_buffer_size = {
53     OPCODE(OGF_CONTROLLER_BASEBAND, 0x33), "2122"
54     // Host_ACL_Data_Packet_Length:, Host_Synchronous_Data_Packet_Length:, Host_Total_Num_ACL_Data_Packets:, Host_Total_Num_Synchronous_Data_Packets:
55 };
56 
57 
58 // the stack is here
59 static hci_stack_t       hci_stack;
60 
61 
62 void bt_store_16(uint8_t *buffer, uint16_t pos, uint16_t value){
63     buffer[pos++] = value;
64     buffer[pos++] = value >> 8;
65 }
66 
67 void bt_store_32(uint8_t *buffer, uint16_t pos, uint32_t value){
68     buffer[pos++] = value;
69     buffer[pos++] = value >> 8;
70     buffer[pos++] = value >> 16;
71     buffer[pos++] = value >> 24;
72 }
73 
74 void bt_flip_addr(bd_addr_t dest, bd_addr_t src){
75     dest[0] = src[5];
76     dest[1] = src[4];
77     dest[2] = src[3];
78     dest[3] = src[2];
79     dest[4] = src[1];
80     dest[5] = src[0];
81 }
82 
83 void hexdump(void *data, int size){
84     int i;
85     for (i=0; i<size;i++){
86         printf("%02X ", ((uint8_t *)data)[i]);
87     }
88     printf("\n");
89 }
90 
91 #if 0
92 static void *hci_daemon_thread(void *arg){
93     printf("HCI Daemon started\n");
94     hci_run(transport, &config);
95     return NULL;
96 }
97 #endif
98 
99 /**
100  * Linked link list
101  */
102 
103 /**
104  * get link for given address
105  *
106  * @return connection OR NULL, if not found
107  */
108 #if 0
109 static hci_connection_t *link_for_addr(bd_addr_t addr){
110     return NULL;
111 }
112 #endif
113 
114 /**
115  * Handler called by HCI transport
116  */
117 static void dummy_handler(uint8_t *packet, int size){
118 }
119 
120 static void acl_handler(uint8_t *packet, int size){
121     hci_stack.acl_packet_handler(packet, size);
122 }
123 
124 static void event_handler(uint8_t *packet, int size){
125     bd_addr_t addr;
126 
127     // Get Num_HCI_Command_Packets
128     if (packet[0] == HCI_EVENT_COMMAND_COMPLETE ||
129         packet[0] == HCI_EVENT_COMMAND_STATUS){
130         hci_stack.num_cmd_packets = packet[2];
131     }
132 
133     // handle BT initialization
134     if (hci_stack.state == HCI_STATE_INITIALIZING){
135         if (hci_stack.substate % 2){
136             // odd: waiting for event
137             if (packet[0] == HCI_EVENT_COMMAND_COMPLETE){
138                 hci_stack.substate++;
139             }
140         }
141     }
142 
143     // link key request
144     if (packet[0] == HCI_EVENT_LINK_KEY_REQUEST){
145         bt_flip_addr(addr, &packet[2]);
146         hci_send_cmd(&hci_link_key_request_negative_reply, &addr);
147         return;
148     }
149 
150     // pin code request
151     if (packet[0] == HCI_EVENT_PIN_CODE_REQUEST){
152         bt_flip_addr(addr, &packet[2]);
153         hci_send_cmd(&hci_pin_code_request_reply, &addr, 4, "1234");
154     }
155 
156     hci_stack.event_packet_handler(packet, size);
157 }
158 
159 /** Register L2CAP handlers */
160 void hci_register_event_packet_handler(void (*handler)(uint8_t *packet, int size)){
161     hci_stack.event_packet_handler = handler;
162 }
163 void hci_register_acl_packet_handler  (void (*handler)(uint8_t *packet, int size)){
164     hci_stack.acl_packet_handler = handler;
165 }
166 
167 void hci_init(hci_transport_t *transport, void *config, bt_control_t *control){
168 
169     // reference to use transport layer implementation
170     hci_stack.hci_transport = transport;
171 
172     // references to used control implementation
173     hci_stack.control = control;
174 
175     // reference to used config
176     hci_stack.config = config;
177 
178     // empty cmd buffer
179     hci_stack.hci_cmd_buffer = malloc(3+255);
180 
181     // set up state
182     hci_stack.num_cmd_packets = 1; // assume that one cmd can be sent
183     hci_stack.state = HCI_STATE_INITIALIZING;
184     hci_stack.substate = 0;
185 
186     // higher level handler
187     hci_stack.event_packet_handler = dummy_handler;
188     hci_stack.acl_packet_handler = dummy_handler;
189 
190     // register packet handlers with transport
191     transport->register_event_packet_handler( event_handler);
192     transport->register_acl_packet_handler( acl_handler);
193 
194     // turn on
195     hci_power_control(HCI_POWER_ON);
196 
197     // open low-level device
198     transport->open(config);
199 }
200 
201 int hci_power_control(HCI_POWER_MODE power_mode){
202     if (hci_stack.control) {
203         if (power_mode == HCI_POWER_ON) {
204             hci_stack.control->on(hci_stack.config);
205         } else if (power_mode == HCI_POWER_OFF){
206             hci_stack.control->off(hci_stack.config);
207         }
208     }
209     return 0;
210 }
211 
212 uint32_t hci_run(){
213     uint8_t micro_packet;
214     switch (hci_stack.state){
215         case HCI_STATE_INITIALIZING:
216             if (hci_stack.substate % 2) {
217                 // odd: waiting for command completion
218                 return 0;
219             }
220             if (hci_stack.num_cmd_packets == 0) {
221                 // cannot send command yet
222                 return 0;
223             }
224             switch (hci_stack.substate/2){
225                 case 0:
226                     hci_send_cmd(&hci_reset);
227                     break;
228                 case 1:
229                     // ca. 15 sec
230                     hci_send_cmd(&hci_write_page_timeout, 0x6000);
231                     break;
232                 case 2:
233                     // done.
234                     hci_stack.state = HCI_STATE_WORKING;
235                     micro_packet = BTSTACK_EVENT_HCI_WORKING;
236                     hci_stack.event_packet_handler(&micro_packet, 1);
237                     break;
238                 default:
239                     break;
240             }
241             hci_stack.substate++;
242             break;
243         default:
244             break;
245     }
246 
247     // don't check for timetous yet
248     return 0;
249 }
250 
251 
252 int hci_send_acl_packet(uint8_t *packet, int size){
253     return hci_stack.hci_transport->send_acl_packet(packet, size);
254 }
255 
256 
257 /**
258  * pre: numcmds >= 0 - it's allowed to send a command to the controller
259  */
260 int hci_send_cmd(hci_cmd_t *cmd, ...){
261     uint8_t * hci_cmd_buffer = hci_stack.hci_cmd_buffer;
262     hci_cmd_buffer[0] = cmd->opcode & 0xff;
263     hci_cmd_buffer[1] = cmd->opcode >> 8;
264     int pos = 3;
265 
266     va_list argptr;
267     va_start(argptr, cmd);
268     const char *format = cmd->format;
269     uint16_t word;
270     uint32_t longword;
271     uint8_t * ptr;
272     while (*format) {
273         switch(*format) {
274             case '1': //  8 bit value
275             case '2': // 16 bit value
276             case 'H': // hci_handle
277                 word = va_arg(argptr, int);  // minimal va_arg is int: 2 bytes on 8+16 bit CPUs
278                 hci_cmd_buffer[pos++] = word & 0xff;
279                 if (*format == '2') {
280                     hci_cmd_buffer[pos++] = word >> 8;
281                 } else if (*format == 'H') {
282                     // TODO
283                 }
284                 break;
285             case '3':
286             case '4':
287                 longword = va_arg(argptr, uint32_t);
288                 // longword = va_arg(argptr, int);
289                 hci_cmd_buffer[pos++] = longword;
290                 hci_cmd_buffer[pos++] = longword >> 8;
291                 hci_cmd_buffer[pos++] = longword >> 16;
292                 if (*format == '4'){
293                     hci_cmd_buffer[pos++] = longword >> 24;
294                 }
295                 break;
296             case 'B': // bt-addr
297                 ptr = va_arg(argptr, uint8_t *);
298                 hci_cmd_buffer[pos++] = ptr[5];
299                 hci_cmd_buffer[pos++] = ptr[4];
300                 hci_cmd_buffer[pos++] = ptr[3];
301                 hci_cmd_buffer[pos++] = ptr[2];
302                 hci_cmd_buffer[pos++] = ptr[1];
303                 hci_cmd_buffer[pos++] = ptr[0];
304                 break;
305             case 'P': // c string passed as pascal string with leading 1-byte len
306                 ptr = va_arg(argptr, uint8_t *);
307                 memcpy(&hci_cmd_buffer[pos], ptr, 16);
308                 pos += 16;
309                 break;
310             default:
311                 break;
312         }
313         format++;
314     };
315     va_end(argptr);
316     hci_cmd_buffer[2] = pos - 3;
317     // send packet
318     hci_stack.num_cmd_packets--;
319     return hci_stack.hci_transport->send_cmd_packet(hci_cmd_buffer, pos);
320 }