]> rtime.felk.cvut.cz Git - mirosot.git/blob - bluetooth/hci.h
9cab25fac424b9a628844fbac40b37156ddbe4a2
[mirosot.git] / bluetooth / hci.h
1 /*******************************************************************
2   bluetooth library
3
4   hci.h - main structures for keeping an information about a queie, definition of global val,
5           and any macros and inline fce
6
7   Copyright (C) 2006 by Petr Kovacik petr_kovacik@gmail.com
8
9  *******************************************************************/
10
11
12
13
14 #ifndef HCI_H_H
15 #define HCI_H_H
16
17 /* Byte order conversions */
18 #if __BYTE_ORDER == __LITTLE_ENDIAN
19 #define htobs(d)  (d)
20 #define htobl(d)  (d)
21 #define btohs(d)  (d)
22 #define btohl(d)  (d)
23 #elif __BYTE_ORDER == __BIG_ENDIAN
24 #define htobs(d)  bswap_16(d)
25 #define htobl(d)  bswap_32(d)
26 #define btohs(d)  bswap_16(d)
27 #define btohl(d)  bswap_32(d)
28 #else
29 #error "Unknown byte order"
30 #endif
31
32
33 /* BD Address */
34 typedef struct {
35         uint8_t b[6];
36 } bdaddr_t;
37
38
39 #define BDADDR_ANY   (&(bdaddr_t) {{0, 0, 0, 0, 0, 0}})
40 #define BDADDR_ALL   (&(bdaddr_t) {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff}})
41 #define BDADDR_LOCAL (&(bdaddr_t) {{0, 0, 0, 0xff, 0xff, 0xff}})
42
43 /* Copy, swap, convert BD Address */
44 // static inline int bacmp(const bdaddr_t *ba1, const bdaddr_t *ba2)
45 // {
46 //      return memcmp(ba1, ba2, sizeof(bdaddr_t));
47 // }
48 // static inline void bacpy(bdaddr_t *dst, const bdaddr_t *src)
49 // {
50 //      memcpy(dst, src, sizeof(bdaddr_t));
51 // }
52
53 /*pro typ char (nikoliv u16)*/
54 #define store16(field, val) field=val;
55
56
57 // Returns an offset of a field in a structure
58 #define OFFSETOF(struct_type, field) \
59   ((int)&(((struct_type *)0)->field))
60
61 /********************************************************************************/
62 /*----------------------------- DEFINICE MAKER -----------------------------*/
63 #define cmd_opcode_pack(ogf, ocf)       (uint16_t)((ocf & 0x03ff)|(ogf << 10))
64 #define cmd_opcode_ogf(op)              (op >> 10)
65 #define cmd_opcode_ocf(op)              (op & 0x03ff)
66 /********************************************************************************/
67
68 #define BDADDR_ANY   (&(bdaddr_t) {{0, 0, 0, 0, 0, 0}})
69 #define BDADDR_ALL   (&(bdaddr_t) {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff}})
70 #define BDADDR_LOCAL (&(bdaddr_t) {{0, 0, 0, 0xff, 0xff, 0xff}})
71
72 /*pocet L2cap spojeni, ktere muze byt navazano s jednim BT zarizenim*/
73 #define L2CAP_NUM_OF_CANAL 2 
74
75
76 /* HCI Packet types */
77 #define HCI_PKT_SIZE            0x01
78
79 #define HCI_COMMAND_PKT         0x01
80 #define HCI_ACLDATA_PKT         0x02
81 #define HCI_SCODATA_PKT         0x03
82 #define HCI_EVENT_PKT             0x04
83 #define HCI_VENDOR_PKT          0xff
84 /*----------------------------- check command by event -----------------------------*/
85
86 typedef struct bth_ch_com {
87   uint16_t obcod;
88   int len;
89   void *position;
90   struct bth_ch_com *next;
91 } bths_check_command;
92
93 /*-----------------------------buffer info -----------------------------*/
94 typedef struct {
95   int len;
96   uint8_t aktual;
97   uint8_t sent;
98 } bths_command_buf_info;
99 /*------------------------- local device info -------------------------*/
100 typedef struct {
101         char     name[8];
102         bdaddr_t bdaddr;
103         uint32_t flags;
104         uint8_t  type;
105         uint8_t  features[8];
106         uint32_t pkt_type;
107         uint32_t link_policy;
108         uint32_t link_mode;
109         uint16_t acl_mtu;
110         uint16_t acl_pkts;
111         uint8_t  sco_mtu;
112         uint16_t sco_pkts;
113         uint8_t  busy;
114 }bths_dev_info;
115
116 /*------------------------- connect device info -------------------------*/
117 typedef struct con_bluet {      
118         bdaddr_t bdaddr;
119         uint8_t  grupe[8];
120         uint16_t handle;
121         uint8_t  link_type;
122         uint8_t  encr_mode;
123         uint16_t max_slots;
124         uint16_t ptype;
125         uint16_t ident;
126         uint16_t scid[L2CAP_NUM_OF_CANAL];
127         uint16_t dcid[L2CAP_NUM_OF_CANAL];
128 }bths_connect_bluet;
129
130
131
132 /* --------  HCI Packet structures  -------- */
133 /*--------------------------------*/
134 typedef struct {
135         uint16_t        opcode;         /* OCF & OGF */
136         uint8_t         plen;
137 } hci_command_hdr;
138    #define HCI_COMMAND_HDR____opcode            0
139    #define HCI_COMMAND_HDR____plen     2
140 /*--------------------------------*/
141 #define HCI_COMMAND_HDR_SIZE    3
142 /****************************************************************/
143 /****************************************************************/
144 /*--------------------------------*/
145 typedef struct{
146         uint8_t         evt;    //event kod
147         uint8_t         plen;   //delka dat
148 } hci_event_hdr;
149    #define HCI_EVENT_HDR____evt         0
150    #define HCI_EVENT_HDR____plen        1
151 /*--------------------------------*/
152 #define HCI_EVENT_HDR_SIZE      2
153 /****************************************************************/
154 /****************************************************************/
155
156 /*--------------------------------*/
157 typedef struct {
158         uint16_t        handle;         /* Handle & Flags(PB, BC) */
159         uint16_t        dlen;
160 }       hci_acl_hdr;
161    #define HCI_ACL_HDR____handle                0
162    #define HCI_ACL_HDR____dlen          2
163 /*--------------------------------*/
164 #define HCI_ACL_HDR_SIZE        4
165 /****************************************************************/
166 /****************************************************************/
167
168 /*--------------------------------*/
169 typedef struct {
170         uint16_t        handle;
171         uint8_t         dlen;
172 }       hci_sco_hdr;
173    #define HCI_SCO_HDR____handle                0
174    #define HCI_SCO_HDR____dlen          2
175 /*--------------------------------*/
176 #define HCI_SCO_HDR_SIZE        3
177 /****************************************************************/
178 /****************************************************************/
179
180 /*--------------------------------*/
181 typedef struct {
182         uint16_t        device;
183         uint16_t        type;
184         uint16_t        plen;
185 }       hci_msg_hdr;
186    #define HCI_MSG_HDR____device                0
187    #define HCI_MSG_HDR____type          2
188    #define HCI_MSG_HDR____plen            4
189 /*--------------------------------*/
190 /****************************************************************/
191 /****************************************************************/
192
193
194 /*----------------local device info (master) -----------------------*/
195 extern bths_dev_info  bth_local_info;
196
197 /*----------------conect device info (slave) -----------------------*/
198 extern bths_connect_bluet *bth_connected[];
199 //extern void *bth_for_connecting[];
200
201 /*---------------- queue prikazova a potvrzovaci-----------------------*/
202 #define LENCOMMAND    10
203 extern void  *bth_pole_adrr_comm_packet[LENCOMMAND];
204 extern bths_command_buf_info bth_com_buf_info;
205
206 extern void  *bth_pole_adrr_check_packet[LENCOMMAND];
207 extern bths_command_buf_info bth_check_buf_info;
208
209 extern uint8_t bth_controll_flag;
210
211 /*--------BD address whitch are accept for connection-------------*/
212 extern bdaddr_t bth_accept_bd_addr[]; //for future use
213         
214
215 inline static int bth_find_conected_dev(uint16_t handle)
216 {
217   int j;
218   
219   for(j=0; j<8;j++)  //8 moznych zarizeni, se kterymi lze komunikovat
220   {
221     if(bth_connected[j]!=NULL)
222     {
223       if(bth_connected[j]->handle==handle)
224       {return (j);};
225     };
226   }
227   return(-1);
228 };
229
230 inline static int bth_find_chanal(uint16_t num_dev, uint16_t chanal)
231 {
232   int j;
233   for(j=0; j<L2CAP_NUM_OF_CANAL;j++)  //8 moznych zarizeni, se kterymi lze komunikovat
234   {
235     if(bth_connected[num_dev]->scid[j]==chanal)
236     {
237       return(j);
238     };
239   }
240   return(-1);
241 };
242
243 inline static int bth_add_chanal_dcid(uint16_t num_dev, uint16_t chanal)
244 {
245   int j;
246   for(j=0; j<L2CAP_NUM_OF_CANAL;j++)  //8 moznych zarizeni, se kterymi lze komunikovat
247   {
248     if(bth_connected[num_dev]->dcid[j]==0)
249     {
250       (bth_connected[num_dev])->dcid[j]=chanal;
251       return(j);
252     };
253   }
254   return(-1);
255 };
256
257 inline static int bth_find_chanal_dcid(uint16_t num_dev, uint16_t chanal)
258 {
259   int j;
260   for(j=0; j<L2CAP_NUM_OF_CANAL;j++)  //8 moznych zarizeni, se kterymi lze komunikovat
261   {
262     if(bth_connected[num_dev]->dcid[j]==chanal)
263     {
264       return(j);
265     };
266   }
267   return(-1);
268 };
269
270 inline static int bth_find_chanal_scid(uint16_t num_dev, uint16_t chanal)
271 {
272   int j;
273   for(j=0; j<L2CAP_NUM_OF_CANAL;j++)  //8 moznych zarizeni, se kterymi lze komunikovat
274   {
275     if(bth_connected[num_dev]->scid[j]==chanal)
276     {
277       return(j);
278     };
279   }
280   return(-1);
281 };
282
283 /*-----------funkce ---------------*/
284 int bth_send_packet(uint8_t *hp, uint16_t hp_size);
285 int VypisHexa(uint8_t *s, int delka);
286 void bth_conv_char_text(uint8_t zn);
287
288 #endif