Add the bt-dev-end-rpi3.sh for RPI3
[platform/adaptation/bluetooth-firmware-bcm.git] / set-address / setbd.c
1 /*
2  * setbd.c
3  *
4  * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved
5  *
6  * Contact:  Hocheol Seo <hocheol.seo@samsung.com>
7  *           GirishAshok Joshi <girish.joshi@samsung.com>
8  *           DoHyun Pyun <dh79.pyun@samsung.com>
9  *
10  * Licensed under the Apache License, Version 2.0 (the "License");
11  * you may not use this file except in compliance with the License.
12  * You may obtain a copy of the License at
13  *
14  * http://www.apache.org/licenses/LICENSE-2.0
15  *
16  * Unless required by applicable law or agreed to in writing, software
17  * distributed under the License is distributed on an "AS IS" BASIS,
18  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
19  * See the License for the specific language governing permissions and
20  * limitations under the License.
21  *
22  */
23
24 #include <stdio.h>
25 #include <stdlib.h>
26 #include <string.h>
27 #include <errno.h>
28 #include <fcntl.h>
29 #include <unistd.h>
30 #include <time.h>
31 #include <vconf.h>
32 #include <glib.h>
33
34 #ifdef __TI_PATCH__
35 #define BT_CHIP_TI
36 #else
37 #ifdef __BROADCOM_PATCH__
38 #define BT_CHIP_BROADCOM
39 #else
40 #define BT_CHIP_CSR
41 #endif
42 #endif
43
44 #ifdef DEBUG_EN
45 #define APP_DBG(format, args...)        printf("%s(), line[%d]: " format, __FUNCTION__, __LINE__, ##args)
46 #define APP_DEBUG(format, args...)      printf(format, ##args)
47 #else
48 #define APP_DBG(format, args...)
49 #define APP_DEBUG(format, args...)
50 #endif
51
52 #define BD_ADDR_FILE    "/opt/etc/.bd_addr"
53 #define PSKEY_TEMP_FILE "/opt/etc/.bluetooth.psr"
54 #define PSR_FILE        "/opt/etc/bluetooth/bluetooth.psr"
55
56 #define BD_ADDR_LEN     14
57 #define BD_PREFIX       "0002\n"
58
59 #define PSKEY_LEN       27
60 #define PSKEY_BDADDR_PREFIX     "&0001 = 0012 "
61
62 #define READ_BD_FILE_MAX        300
63
64 static int success_make_bt_address_from_imei=-1;
65 static GMainLoop * loop;
66 const char *DEFAULT_IMEI="004999010640000";
67 static gboolean is_default_imei=FALSE;
68
69 #if defined(BT_CHIP_CSR) || defined(BT_CHIP_BROADCOM)
70 int addremoveBD(char* path, char* pskey){
71         FILE *fd, *new;
72         int ret;
73         char cmp[READ_BD_FILE_MAX];
74         char *result;
75
76         fd = fopen(path, "r");
77         if(NULL == fd){
78                 APP_DBG("Error open psr file\r\n");
79                 return -21;
80         }
81
82         new = fopen(PSKEY_TEMP_FILE, "w");
83         if(NULL == new){
84                 APP_DBG("Error creat temp file\r\n");
85                 fclose(fd);
86                 return -22;
87         }
88
89         ret = fputs(pskey,new);
90         APP_DBG("fputs ret: %d", ret);
91
92         while(1){
93                 result = fgets(cmp, READ_BD_FILE_MAX, fd);
94
95                 APP_DBG("PSR : [%s]\r\n", cmp);
96
97                 if((NULL != result) && (0 == strncmp(cmp, "&0001", 5))){
98                         APP_DBG("Find BD address set script\r\n");
99                         continue;
100                 }
101
102                 if(NULL == result){
103                         APP_DBG("EOF reaches\r\n");
104                         fclose(fd);
105                         fclose(new);
106                         return 1;
107                 }
108
109                 ret = fputs(cmp,new);
110                 APP_DBG("fputs ret: %d", ret);
111         }
112
113         return 0;
114 }
115 void makeRandomBD(unsigned char* buf){
116         int ran;
117         int i;
118         unsigned int seed;
119         memcpy(buf, BD_PREFIX, 5);
120         seed = time(NULL);
121         for(i=5;i<14;i++){
122                 if(7==i){
123                         buf[i]='\n';
124                         continue;
125                 }
126                 ran = rand_r(&seed)%16;
127                 if(10>ran)
128                         ran+=0x30;
129                 else
130                         ran+=0x57;
131                 buf[i]=ran;
132         }
133         APP_DEBUG("Random number is\r\n");
134         for(i=0;i<BD_ADDR_LEN;i++){
135                 APP_DEBUG("%c",buf[i]);
136         }
137         APP_DEBUG("\r\n");
138 }
139 #endif
140
141 #ifdef BT_CHIP_TI
142 int readBDaddrTI(void){
143         int i, cnt_lap=0, cnt_uap=0, cnt_nap=0;
144         int dev_id, fd, filedesc;
145         BD_ADDR_T bdaddr;
146         char address[18];
147         char nap[4], uap[2], lap[6];
148        int ret = 0;
149         dev_id=hci_get_route(NULL);
150         if(dev_id<0){
151                 APP_DBG("Bluetooth device not available!!!\r\n");
152                 return -1;
153         }
154         fd=hci_open_dev(dev_id);
155         if(fd<0){
156                 APP_DBG("HCI open fail!!!\r\n");
157                 return -2;
158         }
159
160         if(0>hci_read_bd_addr(fd, &bdaddr, 1000)){
161                 APP_DBG("Read BD ADDR failed!!!\r\n");
162                 return -3;
163         }
164         hci_close_dev(fd);
165
166         ba2str(&bdaddr, address);
167         for(i=0;i<17;i++){
168                 if(':' == address[i])
169                         continue;
170
171                 if(5>i)
172                         nap[cnt_nap++] = address[i];
173                 else if(8>i)
174                         uap[cnt_uap++] = address[i];
175                 else
176                         lap[cnt_lap++] = address[i];
177         }
178
179         APP_DBG("BT address [%s], nap[%c%c%c%c], uap[%c%c], lap[%c%c%c%c%c%c]\r\n",\
180          address, nap[0], nap[1], nap[2], nap[3]\
181         , uap[0],uap[1]\
182         ,lap[0], lap[1],lap[2],lap[3],lap[4],lap[5]);
183
184
185         filedesc=open(BD_ADDR_FILE, O_RDWR | O_CREAT | O_TRUNC | O_SYNC, 0644);
186         if(0>filedesc){
187                 APP_DBG("File creation fail!!!\r\n");
188                 return -4;
189         }
190         ret = write(filedesc, nap, 4);
191         ret = write(filedesc, "\n", 1);
192         ret = write(filedesc, uap, 2);
193         ret = write(filedesc, "\n", 1);
194         ret = write(filedesc, lap, 6);
195         ret = write(filedesc, "\n", 1);
196         close(filedesc);
197
198         return 0;
199 }
200 #endif
201
202 int make_bt_address(gboolean overwrite_bt_address)
203 {
204 #if defined(BT_CHIP_CSR) || defined(BT_CHIP_BROADCOM)
205
206         int fd;
207         unsigned char txt[BD_ADDR_LEN];
208         unsigned char nap[4+1], uap[2+1], lap[6+1];
209 #if defined(BT_CHIP_CSR)
210         int i;
211         char pskey[PSKEY_LEN+3];
212 #endif
213         int ret;
214
215         fd=open(BD_ADDR_FILE, O_RDONLY | O_SYNC);
216
217         if(fd<0 || overwrite_bt_address==TRUE){
218                 if(fd<0)
219                         APP_DEBUG("File not exist\n");
220                 else
221                         close(fd);
222
223                 if(overwrite_bt_address)
224                 {
225                         APP_DEBUG("Overwrite BT address\n");
226                 }
227
228                 fd=open(BD_ADDR_FILE, O_RDWR | O_CREAT | O_TRUNC | O_SYNC, 0644);
229
230                 if (fd <0)
231                 {
232                         APP_DEBUG("Can't open address file\n");
233                         return 0;
234                 }
235
236                 makeRandomBD(txt);
237
238                 ret = write(fd, txt, BD_ADDR_LEN);
239                 lseek(fd, 0, SEEK_SET);
240         }else{
241                 APP_DEBUG("%s is already existed\n",BD_ADDR_FILE);
242                 success_make_bt_address_from_imei=0;
243         }
244
245         ret = read(fd, nap, 5);
246         ret = read(fd, uap, 3);
247         ret = read(fd, lap, 7);
248         close(fd);
249
250 #if defined(BT_CHIP_CSR)
251         APP_DEBUG("nap[");
252         for(i=0;i<4;i++)
253                 APP_DEBUG("%c",nap[i]);
254         APP_DEBUG("]\r\n");
255
256         APP_DEBUG("uap[");
257         for(i=0;i<2;i++)
258                 APP_DEBUG("%c",uap[i]);
259         APP_DEBUG("]\r\n");
260
261         APP_DEBUG("lap[");
262         for(i=0;i<6;i++)
263                 APP_DEBUG("%c",lap[i]);
264         APP_DEBUG("]\r\n");
265
266         sprintf(pskey, "&0001 = 0012 %c%c%c%c %c%c%c%c %c%c%c%c\r\n",\
267          lap[0], lap[1], lap[2], lap[3], lap[4], lap[5],\
268          uap[0], uap[1],\
269          nap[0], nap[1], nap[2], nap[3]);
270
271         APP_DEBUG("BD PSKEY [");
272         for(i=0;i<PSKEY_LEN;i++)
273                 APP_DEBUG("%c", pskey[i]);
274         APP_DEBUG("]\r\n");
275
276         ret = addremoveBD(PSR_FILE, pskey);
277 #endif
278         return ret;
279 #elif defined(BT_CHIP_TI)
280         int fd;
281         int ret;
282
283         fd=open(BD_ADDR_FILE, O_RDONLY, 0644);
284         if(0>fd){
285                 APP_DBG("File not exists\r\n");
286                 ret=readBDaddrTI();
287         }else{
288                 APP_DBG("File exists\r\n");
289                 close(fd);
290                 ret=0;
291         }
292
293         return ret;
294 #else
295         printf("error BT CHIP not defined!!!\n");
296         return 0;
297 #endif
298 }
299
300 gboolean exit_cb(gpointer data)
301 {
302
303         APP_DEBUG("Time out!!!\n");
304         g_main_loop_quit(loop);
305
306         return FALSE;
307 }
308 int main()
309 {
310         loop=g_main_loop_new(NULL,FALSE);
311         APP_DEBUG("Bluetooth Address Setting\n");
312         make_bt_address(FALSE);
313
314         /* When we get proper BT address by IMEI or
315          * randome BT address due to default IMEI
316          * We don't need to wait for telephony activation, timeout */
317         if(success_make_bt_address_from_imei==0 || is_default_imei==TRUE)
318                 exit(0);
319
320 #ifdef IMEI_BASED_RAND_FEATURE
321         g_timeout_add_seconds(10,exit_cb,NULL);
322         g_main_loop_run(loop);
323 #endif
324
325         return 0;
326 }