10 #include "hcidriver.h"
14 /************************** hci command functions**************************/
15 int call_hci_inquiry_cmd(int dd, bt_address *p_addressarray,int timeout){
16 inquiry_cp cmdp,*p_cmdp=&cmdp;
17 hci_request req,*p_req=&req;
19 //hci_inquiry_complete_ev com_ev,*p_com_ev=&com_ev;
20 __u16 OCF_OGF,*p_OCF_OGF=&OCF_OGF;
27 memset(p_req,0,sizeof(req));
28 assemble_ocf_ogf(0x01,0x01,p_OCF_OGF);
29 p_req->p_OCF_OGF=p_OCF_OGF;
30 p_req->p_retcmdp=p_addressarray;
32 p_req->retcmdp_len=INQUIRY_INFO_SIZE;
33 p_req->cmdp_len=INQUIRY_CP_SIZE;
34 p_req->event=EVT_INQUIRY_RESULT;
36 if(hci_send_request(dd,p_req,timeout)<0)
38 // if(p_com_ev->status)
44 // fill up the input parameter address pointer by one address
45 int call_hci_read_bd_addr_cmd(int dd,bt_address *p_address, int timeout){
46 read_bd_addr_rp cmdp,*p_cmdp; //command parameters return/comand
47 hci_request req,*p_req;
48 __u16 OCF_OGF,*p_OCF_OGF;
54 memset(p_req,0,sizeof(req));
55 assemble_ocf_ogf(0x09,0x04,p_OCF_OGF);
56 p_req->p_OCF_OGF=p_OCF_OGF;
57 p_req->p_retcmdp=p_cmdp;
58 p_req->retcmdp_len=READ_BD_ADDR_RP_SIZE;
60 p_req->event=EVT_CMD_COMPLETE;
62 if(hci_send_request(dd,p_req,timeout)<0)
67 bacpy(p_address, &cmdp.bdaddr);
71 int call_hci_create_connection_cmd(int dd, bt_address *p_address, int timeout){
72 create_conn_cp cmdp,*p_cmdp=&cmdp;
73 hci_request req,*p_req=&req;
74 __u16 OCF_OGF,*p_OCF_OGF=&OCF_OGF;
76 p_cmdp->bdaddr=*p_address;
77 p_cmdp->pkt_type=0x0010;
78 p_cmdp->pscan_rep_mode=0x01;
79 p_cmdp->pscan_mode=0x00;
80 p_cmdp->clock_offset=0xf000;
81 p_cmdp->role_switch=0x00;
82 memset(p_req,0,sizeof(req));
83 assemble_ocf_ogf(0x05,0x01,p_OCF_OGF);
84 p_req->p_OCF_OGF=p_OCF_OGF;
86 p_req->cmdp_len=CREATE_CONN_CP_SIZE;
87 p_req->event=EVT_CONN_COMPLETE;
89 if(hci_send_request(dd,p_req,timeout)<0)
91 //if(p_com_ev->status)
98 /*******************************HCI main functions ********************************/
100 //create and bind the socket to one device, return -1 when error, device descriptor when OK
101 int hci_open_device(int dev_id){
102 struct sockaddr_hci address;
105 if((dd=socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI))<0){
106 perror("socket no created");
107 return dd; //it return -1 when socket isn't created
110 memset(&address,0,sizeof(address));
111 address.hci_family=AF_BLUETOOTH;
112 address.hci_dev=dev_id;
113 if(bind(dd,(struct sockaddr *) &address, sizeof(address))<0){
114 perror("Socket not binded to hci device");
122 int hci_close_dev(int dd){
126 int hci_send_command(int dd, hci_request *p_req){
127 __u8 array[p_req->cmdp_len+4]; //type + OCF+OGF+plen
130 memcpy(&array[1],p_req->p_OCF_OGF,2);
131 array[3]= p_req->cmdp_len;
132 if(p_req->cmdp_len > 0){
133 memcpy(&array[4],p_req->p_cmdp,p_req->cmdp_len); // !!!!!!!!! segmentation fault
136 for(ii=0;ii<sizeof(array);ii++){
137 printf(" %x",array[ii]);
141 while(write(dd, &array, (p_req->cmdp_len+4))<0){
142 perror("write interrupted");
143 if(errno == EAGAIN || errno == EINTR)
150 int hci_send_request(int dd, hci_request *p_req,int timeout){
154 /*void print_device_list(int ctl){
155 bt_device_req_list dlist,*p_dlist;
156 bt_device_req *p_dreq;
161 p_dlist->dev_num=HCI_MAX_DEV;
162 p_dreq=p_dlist->dev_req;
164 if(ioctl(ctl, HCIGETDEVLIST, (void *) p_dlist)<0){
165 perror("Can't get device list");
169 for(i=0;i<p_dlist->dev_num;i++){
170 devi.dev_id=(p_dreq+i)->dev_id;
171 if(ioctl(ctl, HCIGETDEVINFO, (void *) &devi)<0)
181 void assemble_hci_data(void *p_con_handle,void *p_data_size,void *p_data){
183 data_size= *(__u16 *)p_data_size;
184 __u8 array[data_size+5]; //type + handle + flags + size
186 memcpy(&array[1],p_con_handle,2);
187 memcpy(&array[3],p_data_size,2);
188 memcpy(&array[6],p_data,data_size);
189 //call send to socket/uart
195 /*****************************HCI support functions*****************************/
198 void assemble_ocf_ogf(__u8 ocf,__u8 ogf,__u16 *p_ocf_ogf){
202 //result=(result<<8);
204 //*p_ocf_ogf=(result|var1);
207 *p_ocf_ogf=(result|var1);
210 void printba(bt_address *ba){
211 printf("address: %2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X: \n",ba->byte[0],ba->byte[1],ba->byte[2],ba->byte[3],ba->byte[4],ba->byte[5]);
214 int compare_bda(bt_address *p_first, bt_address *p_second){
216 for(i=0;i<sizeof(bt_address);i++){
217 if(p_first->byte[i]==p_second->byte[i])
220 if(k==sizeof(bt_address)) return 1; //all bytes are similar
222 return 0; //addreses are different in one byte at least
225 void fill_zero(bt_address *p_addr){
227 for(i=0;i<sizeof(bt_address);i++){
228 p_addr->byte[i]=0x00;
231 void swap_addrbytes(bt_address *p_addr){
232 bt_address help,*p_help=&help;
234 for(i=0;i<sizeof(bt_address);i++){
235 p_help->byte[i]=p_addr->byte[5-i];
240 __u8 swap8(__u8 byte1){
241 __u8 i,mask=0,hvar1=0,resvar=0;
243 mask=1<<i; // 1,2,4,8,16,32,64,128
246 resvar=resvar + (128>>i);
251 __u16 swap16(__u16 byte2){
253 __u16 mask=0,hvar1=0,resvar=0;
258 resvar=resvar + (32768>>i);
263 void fill_add(bt_address *addr,__u8 first, __u8 sec, __u8 third, __u8 forth, __u8 fifth, __u8 sixth){