Add BT firmware for Tizen mobile profile
[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
91         while(1){
92                 result = fgets(cmp, READ_BD_FILE_MAX, fd);
93
94                 APP_DBG("PSR : [%s]\r\n", cmp);
95
96                 if((NULL != result) && (0 == strncmp(cmp, "&0001", 5))){
97                         APP_DBG("Find BD address set script\r\n");
98                         continue;
99                 }
100
101                 if(NULL == result){
102                         APP_DBG("EOF reaches\r\n");
103                         fclose(fd);
104                         fclose(new);
105                         return 1;
106                 }
107
108                 ret = fputs(cmp,new);
109         }
110
111         return 0;
112 }
113 void makeRandomBD(unsigned char* buf){
114         int ran;
115         int i;
116         unsigned int seed;
117         memcpy(buf, BD_PREFIX, 5);
118         seed = time(NULL);
119         for(i=5;i<14;i++){
120                 if(7==i){
121                         buf[i]='\n';
122                         continue;
123                 }
124                 ran = rand_r(&seed)%16;
125                 if(10>ran)
126                         ran+=0x30;
127                 else
128                         ran+=0x57;
129                 buf[i]=ran;
130         }
131         APP_DEBUG("Random number is\r\n");
132         for(i=0;i<BD_ADDR_LEN;i++){
133                 APP_DEBUG("%c",buf[i]);
134         }
135         APP_DEBUG("\r\n");
136 }
137 #endif
138
139 #ifdef BT_CHIP_TI
140 int readBDaddrTI(void){
141         int i, cnt_lap=0, cnt_uap=0, cnt_nap=0;
142         int dev_id, fd, filedesc;
143         BD_ADDR_T bdaddr;
144         char address[18];
145         char nap[4], uap[2], lap[6];
146        int ret = 0;
147         dev_id=hci_get_route(NULL);
148         if(dev_id<0){
149                 APP_DBG("Bluetooth device not available!!!\r\n");
150                 return -1;
151         }
152         fd=hci_open_dev(dev_id);
153         if(fd<0){
154                 APP_DBG("HCI open fail!!!\r\n");
155                 return -2;
156         }
157
158         if(0>hci_read_bd_addr(fd, &bdaddr, 1000)){
159                 APP_DBG("Read BD ADDR failed!!!\r\n");
160                 return -3;
161         }
162         hci_close_dev(fd);
163
164         ba2str(&bdaddr, address);
165         for(i=0;i<17;i++){
166                 if(':' == address[i])
167                         continue;
168
169                 if(5>i)
170                         nap[cnt_nap++] = address[i];
171                 else if(8>i)
172                         uap[cnt_uap++] = address[i];
173                 else
174                         lap[cnt_lap++] = address[i];
175         }
176
177         APP_DBG("BT address [%s], nap[%c%c%c%c], uap[%c%c], lap[%c%c%c%c%c%c]\r\n",\
178          address, nap[0], nap[1], nap[2], nap[3]\
179         , uap[0],uap[1]\
180         ,lap[0], lap[1],lap[2],lap[3],lap[4],lap[5]);
181
182
183         filedesc=open(BD_ADDR_FILE, O_RDWR | O_CREAT | O_TRUNC | O_SYNC, 0644);
184         if(0>filedesc){
185                 APP_DBG("File creation fail!!!\r\n");
186                 return -4;
187         }
188         ret = write(filedesc, nap, 4);
189         ret = write(filedesc, "\n", 1);
190         ret = write(filedesc, uap, 2);
191         ret = write(filedesc, "\n", 1);
192         ret = write(filedesc, lap, 6);
193         ret = write(filedesc, "\n", 1);
194         close(filedesc);
195
196         return 0;
197 }
198 #endif
199 int make_bt_address_from_tapi_imei(unsigned char * bt_address)
200 {
201         char * temp=NULL;
202         int tapi_state=0;
203         int ret=-1;
204         int i=0;
205
206         if(bt_address==NULL)
207                 return -EBADR;
208
209         ret=vconf_get_int(VCONFKEY_TELEPHONY_TAPI_STATE,&tapi_state);
210         if(tapi_state==VCONFKEY_TELEPHONY_TAPI_STATE_READY && ret==0){
211                 temp=vconf_get_str(VCONFKEY_TELEPHONY_IMEI);
212                 APP_DEBUG("TAPI_IMEI: %s\n",temp);
213
214 #ifdef IMEI_BASED_RAND_FEATURE
215                 if(strcmp(temp,DEFAULT_IMEI)==0){
216                         APP_DEBUG("TAPI_IMEI is defulat IMEI\n");
217                         is_default_imei=TRUE;
218                         return -ENODATA;
219                 }
220 #else
221                 APP_DEBUG("Temporarily we skip reading TAPI_IMEI\n");
222                 APP_DEBUG("  due to TAPI IMEI API is deprecated\n");
223                 is_default_imei=TRUE;
224                 return -ENODATA;
225 #endif
226
227                 if(strcmp(temp,"")==0)
228                         return -ENODATA;
229
230                 if(strlen(temp)<14)
231                         return -ENODATA;
232
233                 memcpy(bt_address, BD_PREFIX, 5);
234
235                 for(i=5 ;i<14;i++){
236                         if(i==7){
237                                 bt_address[i]='\n';
238                                 continue;
239                         }
240
241                         bt_address[i]=temp[i];
242                 }
243
244         }else{
245                 APP_DEBUG("TAPI_IMEI Reading Error\n");
246                 return -ENODATA;
247         }
248
249         APP_DEBUG("Bluetooth Address\n");
250         for(i=0;i<BD_ADDR_LEN;i++)
251                 APP_DEBUG("%c",bt_address[i]);
252
253         APP_DEBUG("\n");
254
255         return 0;
256
257 }
258
259 int make_bt_address(gboolean overwrite_bt_address)
260 {
261 #if defined(BT_CHIP_CSR) || defined(BT_CHIP_BROADCOM)
262
263         int fd;
264         int i;
265         unsigned char txt[BD_ADDR_LEN];
266         unsigned char nap[4+1], uap[2+1], lap[6+1];
267         char pskey[PSKEY_LEN+3];
268         int ret;
269
270         fd=open(BD_ADDR_FILE, O_RDONLY | O_SYNC);
271
272         if(fd<0 || overwrite_bt_address==TRUE){
273                 if(fd<0)
274                         APP_DEBUG("File not exist\n");
275                 else
276                         close(fd);
277
278                 if(overwrite_bt_address)
279                 {
280                         APP_DEBUG("Overwrite BT address because TAPI write correct IMEI.\n");
281                 }
282
283                 fd=open(BD_ADDR_FILE, O_RDWR | O_CREAT | O_TRUNC | O_SYNC, 0644);
284
285                 if (fd <0)
286                 {
287                         APP_DEBUG("Can't open address file\n");
288                         return 0;
289                 }
290                 success_make_bt_address_from_imei=make_bt_address_from_tapi_imei(txt);
291
292                 if(success_make_bt_address_from_imei<0)
293                         makeRandomBD(txt);
294
295                 ret = write(fd, txt, BD_ADDR_LEN);
296                 lseek(fd, 0, SEEK_SET);
297         }else{
298                 APP_DEBUG("%s is already existed\n",BD_ADDR_FILE);
299                 success_make_bt_address_from_imei=0;
300         }
301
302         ret = read(fd, nap, 5);
303         ret = read(fd, uap, 3);
304         ret = read(fd, lap, 7);
305         close(fd);
306
307 #if defined(BT_CHIP_CSR)
308         APP_DEBUG("nap[");
309         for(i=0;i<4;i++)
310                 APP_DEBUG("%c",nap[i]);
311         APP_DEBUG("]\r\n");
312
313         APP_DEBUG("uap[");
314         for(i=0;i<2;i++)
315                 APP_DEBUG("%c",uap[i]);
316         APP_DEBUG("]\r\n");
317
318         APP_DEBUG("lap[");
319         for(i=0;i<6;i++)
320                 APP_DEBUG("%c",lap[i]);
321         APP_DEBUG("]\r\n");
322
323         sprintf(pskey, "&0001 = 0012 %c%c%c%c %c%c%c%c %c%c%c%c\r\n",\
324          lap[0], lap[1], lap[2], lap[3], lap[4], lap[5],\
325          uap[0], uap[1],\
326          nap[0], nap[1], nap[2], nap[3]);
327
328         APP_DEBUG("BD PSKEY [");
329         for(i=0;i<PSKEY_LEN;i++)
330                 APP_DEBUG("%c", pskey[i]);
331         APP_DEBUG("]\r\n");
332
333         ret = addremoveBD(PSR_FILE, pskey);
334 #endif
335         return ret;
336 #elif defined(BT_CHIP_TI)
337         int fd;
338         int ret;
339
340         fd=open(BD_ADDR_FILE, O_RDONLY, 0644);
341         if(0>fd){
342                 APP_DBG("File not exists\r\n");
343                 ret=readBDaddrTI();
344         }else{
345                 APP_DBG("File exists\r\n");
346                 close(fd);
347                 ret=0;
348         }
349
350         return ret;
351 #else
352         printf("error BT CHIP not defined!!!\n");
353         return 0;
354 #endif
355 }
356
357 void vconf_cb(keynode_t *key, void * data)
358 {
359         char * key_string=NULL;
360
361         switch(vconf_keynode_get_type(key))
362         {
363                 case VCONF_TYPE_STRING:
364                         key_string=vconf_keynode_get_str(key);
365                         if(strcmp(key_string,"")!=0)
366                         {
367                                 APP_DEBUG("Vconf Call back trial\n");
368                                 /* This case means TAPI writes IMEI correctly */
369                                 /* Because we write BT address which comes from IMEI again  */
370                                 make_bt_address(TRUE);
371                                 g_main_loop_quit(loop);
372                         }
373
374                         break;
375
376
377                 default:
378                         break;
379         }
380         return;
381 }
382
383 gboolean exit_cb(gpointer data)
384 {
385
386         APP_DEBUG("Time out!!!\n");
387         g_main_loop_quit(loop);
388
389         return FALSE;
390 }
391 int main()
392 {
393         loop=g_main_loop_new(NULL,FALSE);
394         APP_DEBUG("Bluetooth Address Setting\n");
395         make_bt_address(FALSE);
396
397         /* When we get proper BT address by IMEI or
398          * randome BT address due to default IMEI
399          * We don't need to wait for telephony activation, timeout */
400         if(success_make_bt_address_from_imei==0 || is_default_imei==TRUE)
401                 exit(0);
402
403 #ifdef IMEI_BASED_RAND_FEATURE
404         vconf_notify_key_changed(VCONFKEY_TELEPHONY_IMEI,vconf_cb,NULL);
405
406         g_timeout_add_seconds(10,exit_cb,NULL);
407         g_main_loop_run(loop);
408
409         vconf_ignore_key_changed(VCONFKEY_TELEPHONY_IMEI,vconf_cb);
410 #endif
411
412         return 0;
413 }