1 /*******************************************************************
4 hci.h - main structures for keeping an information about a queue,
5 definition of global val, and any macros and inline fce
7 Copyright (C) 2006 by Petr Kovacik petr_kovacik@gmail.com
9 *******************************************************************/
17 #include <bth_config.h>
19 #ifdef CONFIG_BLUETOOTH_LINUX
23 /* Byte order conversions */
24 #if __BYTE_ORDER == __LITTLE_ENDIAN
29 #elif __BYTE_ORDER == __BIG_ENDIAN
30 #define htobs(d) bswap_16(d)
31 #define htobl(d) bswap_32(d)
32 #define btohs(d) bswap_16(d)
33 #define btohl(d) bswap_32(d)
35 #error "Unknown byte order"
45 #define BDADDR_ANY (&(bdaddr_t) {{0, 0, 0, 0, 0, 0}})
46 #define BDADDR_ALL (&(bdaddr_t) {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff}})
47 #define BDADDR_LOCAL (&(bdaddr_t) {{0, 0, 0, 0xff, 0xff, 0xff}})
49 /* Copy, swap, convert BD Address */
50 // static inline int bacmp(const bdaddr_t *ba1, const bdaddr_t *ba2)
52 // return memcmp(ba1, ba2, sizeof(bdaddr_t));
54 // static inline void bacpy(bdaddr_t *dst, const bdaddr_t *src)
56 // memcpy(dst, src, sizeof(bdaddr_t));
59 /*pro typ char (nikoliv u16)*/
60 #define store8(field, val) field=val;
63 // Returns an offset of a field in a structure
64 #define OFFSETOF(struct_type, field) \
65 ((int)&(((struct_type *)0)->field))
67 /********************************************************************************/
68 /*----------------------------- DEFINICE MAKER -----------------------------*/
69 #define cmd_opcode_pack(ogf, ocf) (uint16_t)((ocf & 0x03ff)|(ogf << 10))
70 #define cmd_opcode_ogf(op) (op >> 10)
71 #define cmd_opcode_ocf(op) (op & 0x03ff)
72 /********************************************************************************/
74 #define BDADDR_ANY (&(bdaddr_t) {{0, 0, 0, 0, 0, 0}})
75 #define BDADDR_ALL (&(bdaddr_t) {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff}})
76 #define BDADDR_LOCAL (&(bdaddr_t) {{0, 0, 0, 0xff, 0xff, 0xff}})
78 /*pocet L2cap spojeni, ktere muze byt navazano s jednim BT zarizenim*/
79 #define L2CAP_NUM_OF_CANAL 2
82 /* HCI Packet types */
83 #define HCI_PKT_SIZE 0x01
85 #define HCI_COMMAND_PKT 0x01
86 #define HCI_ACLDATA_PKT 0x02
87 #define HCI_SCODATA_PKT 0x03
88 #define HCI_EVENT_PKT 0x04
89 #define HCI_VENDOR_PKT 0xff
90 /*----------------------------- check command by event -----------------------------*/
92 typedef struct bth_ch_com {
96 struct bth_ch_com *next;
99 /*-----------------------------buffer info -----------------------------*/
104 } bths_command_buf_info;
105 /*------------------------- local device info -------------------------*/
113 uint32_t link_policy;
122 /*------------------------- connect device info -------------------------*/
123 typedef struct con_bluet {
132 uint16_t scid[L2CAP_NUM_OF_CANAL];
133 uint16_t dcid[L2CAP_NUM_OF_CANAL];
138 /* -------- HCI Packet structures -------- */
139 /*--------------------------------*/
141 uint16_t opcode; /* OCF & OGF */
144 #define HCI_COMMAND_HDR____opcode 0
145 #define HCI_COMMAND_HDR____plen 2
146 /*--------------------------------*/
147 #define HCI_COMMAND_HDR_SIZE 3
148 /****************************************************************/
149 /****************************************************************/
150 /*--------------------------------*/
152 uint8_t evt; //event kod
153 uint8_t plen; //delka dat
155 #define HCI_EVENT_HDR____evt 0
156 #define HCI_EVENT_HDR____plen 1
157 /*--------------------------------*/
158 #define HCI_EVENT_HDR_SIZE 2
159 /****************************************************************/
160 /****************************************************************/
162 /*--------------------------------*/
164 uint16_t handle; /* Handle & Flags(PB, BC) */
167 #define HCI_ACL_HDR____handle 0
168 #define HCI_ACL_HDR____dlen 2
169 /*--------------------------------*/
170 #define HCI_ACL_HDR_SIZE 4
171 /****************************************************************/
172 /****************************************************************/
174 /*--------------------------------*/
179 #define HCI_SCO_HDR____handle 0
180 #define HCI_SCO_HDR____dlen 2
181 /*--------------------------------*/
182 #define HCI_SCO_HDR_SIZE 3
183 /****************************************************************/
184 /****************************************************************/
186 /*--------------------------------*/
192 #define HCI_MSG_HDR____device 0
193 #define HCI_MSG_HDR____type 2
194 #define HCI_MSG_HDR____plen 4
195 /*--------------------------------*/
196 /****************************************************************/
197 /****************************************************************/
200 /*----------------local device info (master) -----------------------*/
201 extern bths_dev_info bth_local_info;
203 /*----------------conect device info (slave) -----------------------*/
204 extern bths_connect_bluet *bth_connected[];
205 //extern void *bth_for_connecting[];
207 /*---------------- command and acknowledge queues -----------------------*/
208 #define LENCOMMAND 10
209 extern void *bth_array_adrr_comm_packet[LENCOMMAND];
210 extern bths_command_buf_info bth_com_buf_info;
212 extern void *bth_array_adrr_check_packet[LENCOMMAND];
213 extern bths_command_buf_info bth_check_buf_info;
215 extern uint8_t bth_controll_flag;
217 /*--------BD address whitch are accept for connection-------------*/
218 extern bdaddr_t bth_accept_bd_addr[]; //for future use
221 inline static int bth_find_conected_dev(uint16_t handle)
225 for(j=0; j<8;j++) //8 moznych zarizeni, se kterymi lze komunikovat
227 if(bth_connected[j]!=NULL)
229 if(bth_connected[j]->handle==handle)
236 inline static int bth_find_chanal(uint16_t num_dev, uint16_t chanal)
239 for(j=0; j<L2CAP_NUM_OF_CANAL;j++) //8 moznych zarizeni, se kterymi lze komunikovat
241 if(bth_connected[num_dev]->scid[j]==chanal)
249 inline static int bth_add_chanal_dcid(uint16_t num_dev, uint16_t chanal)
252 for(j=0; j<L2CAP_NUM_OF_CANAL;j++) //8 moznych zarizeni, se kterymi lze komunikovat
254 if(bth_connected[num_dev]->dcid[j]==0)
256 (bth_connected[num_dev])->dcid[j]=chanal;
263 inline static int bth_find_chanal_dcid(uint16_t num_dev, uint16_t chanal)
266 for(j=0; j<L2CAP_NUM_OF_CANAL;j++) //8 moznych zarizeni, se kterymi lze komunikovat
268 if(bth_connected[num_dev]->dcid[j]==chanal)
276 inline static int bth_find_chanal_scid(uint16_t num_dev, uint16_t chanal)
279 for(j=0; j<L2CAP_NUM_OF_CANAL;j++) //8 moznych zarizeni, se kterymi lze komunikovat
281 if(bth_connected[num_dev]->scid[j]==chanal)
289 /*-----------funkce ---------------*/
290 int bth_send_packet(uint8_t *hp, uint16_t hp_size);
291 int VypisHexa(uint8_t *s, int delka);
292 void bth_conv_char_text(uint8_t zn);