4 * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved
6 * Contact: Hocheol Seo <hocheol.seo@samsung.com>
7 * GirishAshok Joshi <girish.joshi@samsung.com>
8 * DoHyun Pyun <dh79.pyun@samsung.com>
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
14 * http://www.apache.org/licenses/LICENSE-2.0
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.
37 #ifdef __BROADCOM_PATCH__
38 #define BT_CHIP_BROADCOM
45 #define APP_DBG(format, args...) printf("%s(), line[%d]: " format, __FUNCTION__, __LINE__, ##args)
46 #define APP_DEBUG(format, args...) printf(format, ##args)
48 #define APP_DBG(format, args...)
49 #define APP_DEBUG(format, args...)
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"
56 #define BD_ADDR_LEN 14
57 #define BD_PREFIX "0002\n"
60 #define PSKEY_BDADDR_PREFIX "&0001 = 0012 "
62 #define READ_BD_FILE_MAX 300
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;
69 #if defined(BT_CHIP_CSR) || defined(BT_CHIP_BROADCOM)
70 int addremoveBD(char* path, char* pskey){
73 char cmp[READ_BD_FILE_MAX];
76 fd = fopen(path, "r");
78 APP_DBG("Error open psr file\r\n");
82 new = fopen(PSKEY_TEMP_FILE, "w");
84 APP_DBG("Error creat temp file\r\n");
89 ret = fputs(pskey,new);
92 result = fgets(cmp, READ_BD_FILE_MAX, fd);
94 APP_DBG("PSR : [%s]\r\n", cmp);
96 if((NULL != result) && (0 == strncmp(cmp, "&0001", 5))){
97 APP_DBG("Find BD address set script\r\n");
102 APP_DBG("EOF reaches\r\n");
108 ret = fputs(cmp,new);
113 void makeRandomBD(unsigned char* buf){
117 memcpy(buf, BD_PREFIX, 5);
124 ran = rand_r(&seed)%16;
131 APP_DEBUG("Random number is\r\n");
132 for(i=0;i<BD_ADDR_LEN;i++){
133 APP_DEBUG("%c",buf[i]);
140 int readBDaddrTI(void){
141 int i, cnt_lap=0, cnt_uap=0, cnt_nap=0;
142 int dev_id, fd, filedesc;
145 char nap[4], uap[2], lap[6];
147 dev_id=hci_get_route(NULL);
149 APP_DBG("Bluetooth device not available!!!\r\n");
152 fd=hci_open_dev(dev_id);
154 APP_DBG("HCI open fail!!!\r\n");
158 if(0>hci_read_bd_addr(fd, &bdaddr, 1000)){
159 APP_DBG("Read BD ADDR failed!!!\r\n");
164 ba2str(&bdaddr, address);
166 if(':' == address[i])
170 nap[cnt_nap++] = address[i];
172 uap[cnt_uap++] = address[i];
174 lap[cnt_lap++] = address[i];
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]\
180 ,lap[0], lap[1],lap[2],lap[3],lap[4],lap[5]);
183 filedesc=open(BD_ADDR_FILE, O_RDWR | O_CREAT | O_TRUNC | O_SYNC, 0644);
185 APP_DBG("File creation fail!!!\r\n");
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);
199 int make_bt_address_from_tapi_imei(unsigned char * bt_address)
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);
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;
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;
227 if(strcmp(temp,"")==0)
233 memcpy(bt_address, BD_PREFIX, 5);
241 bt_address[i]=temp[i];
245 APP_DEBUG("TAPI_IMEI Reading Error\n");
249 APP_DEBUG("Bluetooth Address\n");
250 for(i=0;i<BD_ADDR_LEN;i++)
251 APP_DEBUG("%c",bt_address[i]);
259 int make_bt_address(gboolean overwrite_bt_address)
261 #if defined(BT_CHIP_CSR) || defined(BT_CHIP_BROADCOM)
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];
270 fd=open(BD_ADDR_FILE, O_RDONLY | O_SYNC);
272 if(fd<0 || overwrite_bt_address==TRUE){
274 APP_DEBUG("File not exist\n");
278 if(overwrite_bt_address)
280 APP_DEBUG("Overwrite BT address because TAPI write correct IMEI.\n");
283 fd=open(BD_ADDR_FILE, O_RDWR | O_CREAT | O_TRUNC | O_SYNC, 0644);
287 APP_DEBUG("Can't open address file\n");
290 success_make_bt_address_from_imei=make_bt_address_from_tapi_imei(txt);
292 if(success_make_bt_address_from_imei<0)
295 ret = write(fd, txt, BD_ADDR_LEN);
296 lseek(fd, 0, SEEK_SET);
298 APP_DEBUG("%s is already existed\n",BD_ADDR_FILE);
299 success_make_bt_address_from_imei=0;
302 ret = read(fd, nap, 5);
303 ret = read(fd, uap, 3);
304 ret = read(fd, lap, 7);
307 #if defined(BT_CHIP_CSR)
310 APP_DEBUG("%c",nap[i]);
315 APP_DEBUG("%c",uap[i]);
320 APP_DEBUG("%c",lap[i]);
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],\
326 nap[0], nap[1], nap[2], nap[3]);
328 APP_DEBUG("BD PSKEY [");
329 for(i=0;i<PSKEY_LEN;i++)
330 APP_DEBUG("%c", pskey[i]);
333 ret = addremoveBD(PSR_FILE, pskey);
336 #elif defined(BT_CHIP_TI)
340 fd=open(BD_ADDR_FILE, O_RDONLY, 0644);
342 APP_DBG("File not exists\r\n");
345 APP_DBG("File exists\r\n");
352 printf("error BT CHIP not defined!!!\n");
357 void vconf_cb(keynode_t *key, void * data)
359 char * key_string=NULL;
361 switch(vconf_keynode_get_type(key))
363 case VCONF_TYPE_STRING:
364 key_string=vconf_keynode_get_str(key);
365 if(strcmp(key_string,"")!=0)
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);
383 gboolean exit_cb(gpointer data)
386 APP_DEBUG("Time out!!!\n");
387 g_main_loop_quit(loop);
393 loop=g_main_loop_new(NULL,FALSE);
394 APP_DEBUG("Bluetooth Address Setting\n");
395 make_bt_address(FALSE);
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)
403 #ifdef IMEI_BASED_RAND_FEATURE
404 vconf_notify_key_changed(VCONFKEY_TELEPHONY_IMEI,vconf_cb,NULL);
406 g_timeout_add_seconds(10,exit_cb,NULL);
407 g_main_loop_run(loop);
409 vconf_ignore_key_changed(VCONFKEY_TELEPHONY_IMEI,vconf_cb);