]> rtime.felk.cvut.cz Git - tiny-bt.git/blob - src2/bt_hw.c
new version
[tiny-bt.git] / src2 / bt_hw.c
1 /*
2 *  C Implementation: bt_hw
3 *
4 * Description: 
5 *
6 *
7 * Author: root <root@ubuntu>, (C) 2008
8 *
9 * Copyright: See COPYING file that comes with this distribution
10 *
11 */
12 int hw_dd;
13 __u8 hw_type;
14
15
16 int hw_bt_open_device(__u8 type, __u8 dev_id){
17         hw_type=type;
18         
19         switch(type){
20
21         case 0:{
22                 struct sockaddr_hci address;
23                 int dd;
24                 int oldflag;
25         
26                 if((dd=socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI))<0){
27                         perror("socket no created");
28                         return dd; //it return -1 when socket isn't created
29                 }
30                 
31                 oldflag=fcntl(dd, F_GETFL, 0);
32                 if(fcntl(dd, F_SETFL, oldflag | O_NONBLOCK) < 0){
33                         perror("problem with socket flag setting");
34                         return -1;
35                 }
36         
37                 memset(&address,0,sizeof(address));
38                 address.hci_family=AF_BLUETOOTH;
39                 address.hci_dev=dev_id;
40                 if(bind(dd,(struct sockaddr *) &address, sizeof(address))<0){
41                         perror("Socket not binded to hci device");
42                         close(dd);
43                         return -1;
44                 }
45         
46                 if(ioctl(dd, HCISETRAW,1)<0){
47                         perror("error in ioctl HCISETRAW");
48                         return -1;
49                         
50                 }
51                 hw_dd=dd;
52                 return dd;
53                 }
54         case 1:{
55
56                 }
57         }
58
59         return -1;
60 }
61
62 int hw_bt_close_dev(){
63         switch(hw_type){
64         case 0:{
65                 return close(hw_dd);
66         }
67         case 1:{
68
69         }
70         
71         }
72                 
73         return -1;
74 }
75
76 int hw_bt_write(__u8 *p_array, __u16 length){
77         switch(hw_type){
78         case 0:{
79                 while(write(hw_dd, p_array, length)<0){
80                         perror("write interrupted");
81                         if(errno == EAGAIN || errno == EINTR)
82                                 continue;
83                         return -1;
84                 }
85         }
86         case 1:{
87
88         }
89         }
90         return 0;
91 }
92
93 int hw_bt_read(__u8 *p_recbuf){
94         int len;
95         switch(hw_type){        
96         case 0:{
97                 while((len=read(hw_dd, p_recbuf, sizeof(p_recbuf*HCI_MAX_EVENT_SIZE)))<0){
98                                 if(errno == EINTR)
99                                         continue;
100                                 if(errno == EAGAIN)
101                                         return 0;
102                                 perror("Problem with reading \n");
103                                 return -1;
104                         }
105                 return len;
106         }
107         case 1:{
108
109         }
110         }
111
112 }