1 /*******************************************************************
4 hci.h - main structures for keeping an information about a queie, definition of global val,
5 and any macros and inline fce
7 Copyright (C) 2006 by Petr Kovacik petr_kovacik@gmail.com
9 *******************************************************************/
17 /* Byte order conversions */
18 #if __BYTE_ORDER == __LITTLE_ENDIAN
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)
29 #error "Unknown byte order"
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}})
43 /* Copy, swap, convert BD Address */
44 // static inline int bacmp(const bdaddr_t *ba1, const bdaddr_t *ba2)
46 // return memcmp(ba1, ba2, sizeof(bdaddr_t));
48 // static inline void bacpy(bdaddr_t *dst, const bdaddr_t *src)
50 // memcpy(dst, src, sizeof(bdaddr_t));
53 /*pro typ char (nikoliv u16)*/
54 #define store16(field, val) field=val;
57 // Returns an offset of a field in a structure
58 #define OFFSETOF(struct_type, field) \
59 ((int)&(((struct_type *)0)->field))
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 /********************************************************************************/
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}})
72 /*pocet L2cap spojeni, ktere muze byt navazano s jednim BT zarizenim*/
73 #define L2CAP_NUM_OF_CANAL 2
76 /* HCI Packet types */
77 #define HCI_PKT_SIZE 0x01
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 -----------------------------*/
86 typedef struct bth_ch_com {
90 struct bth_ch_com *next;
93 /*-----------------------------buffer info -----------------------------*/
98 } bths_command_buf_info;
99 /*------------------------- local device info -------------------------*/
107 uint32_t link_policy;
116 /*------------------------- connect device info -------------------------*/
117 typedef struct con_bluet {
126 uint16_t scid[L2CAP_NUM_OF_CANAL];
127 uint16_t dcid[L2CAP_NUM_OF_CANAL];
132 /* -------- HCI Packet structures -------- */
133 /*--------------------------------*/
135 uint16_t opcode; /* OCF & OGF */
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 /*--------------------------------*/
146 uint8_t evt; //event kod
147 uint8_t plen; //delka dat
149 #define HCI_EVENT_HDR____evt 0
150 #define HCI_EVENT_HDR____plen 1
151 /*--------------------------------*/
152 #define HCI_EVENT_HDR_SIZE 2
153 /****************************************************************/
154 /****************************************************************/
156 /*--------------------------------*/
158 uint16_t handle; /* Handle & Flags(PB, BC) */
161 #define HCI_ACL_HDR____handle 0
162 #define HCI_ACL_HDR____dlen 2
163 /*--------------------------------*/
164 #define HCI_ACL_HDR_SIZE 4
165 /****************************************************************/
166 /****************************************************************/
168 /*--------------------------------*/
173 #define HCI_SCO_HDR____handle 0
174 #define HCI_SCO_HDR____dlen 2
175 /*--------------------------------*/
176 #define HCI_SCO_HDR_SIZE 3
177 /****************************************************************/
178 /****************************************************************/
180 /*--------------------------------*/
186 #define HCI_MSG_HDR____device 0
187 #define HCI_MSG_HDR____type 2
188 #define HCI_MSG_HDR____plen 4
189 /*--------------------------------*/
190 /****************************************************************/
191 /****************************************************************/
194 /*----------------local device info (master) -----------------------*/
195 extern bths_dev_info bth_local_info;
197 /*----------------conect device info (slave) -----------------------*/
198 extern bths_connect_bluet *bth_connected[];
199 //extern void *bth_for_connecting[];
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;
206 extern void *bth_pole_adrr_check_packet[LENCOMMAND];
207 extern bths_command_buf_info bth_check_buf_info;
209 extern uint8_t bth_controll_flag;
211 /*--------BD address whitch are accept for connection-------------*/
212 extern bdaddr_t bth_accept_bd_addr[]; //for future use
215 inline static int bth_find_conected_dev(uint16_t handle)
219 for(j=0; j<8;j++) //8 moznych zarizeni, se kterymi lze komunikovat
221 if(bth_connected[j]!=NULL)
223 if(bth_connected[j]->handle==handle)
230 inline static int bth_find_chanal(uint16_t num_dev, uint16_t chanal)
233 for(j=0; j<L2CAP_NUM_OF_CANAL;j++) //8 moznych zarizeni, se kterymi lze komunikovat
235 if(bth_connected[num_dev]->scid[j]==chanal)
243 inline static int bth_add_chanal_dcid(uint16_t num_dev, uint16_t chanal)
246 for(j=0; j<L2CAP_NUM_OF_CANAL;j++) //8 moznych zarizeni, se kterymi lze komunikovat
248 if(bth_connected[num_dev]->dcid[j]==0)
250 (bth_connected[num_dev])->dcid[j]=chanal;
257 inline static int bth_find_chanal_dcid(uint16_t num_dev, uint16_t chanal)
260 for(j=0; j<L2CAP_NUM_OF_CANAL;j++) //8 moznych zarizeni, se kterymi lze komunikovat
262 if(bth_connected[num_dev]->dcid[j]==chanal)
270 inline static int bth_find_chanal_scid(uint16_t num_dev, uint16_t chanal)
273 for(j=0; j<L2CAP_NUM_OF_CANAL;j++) //8 moznych zarizeni, se kterymi lze komunikovat
275 if(bth_connected[num_dev]->scid[j]==chanal)
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);