diff options
author | Bhakthavatsala Raghavendra <braghave@codeaurora.org> | 2015-02-03 17:56:59 -0800 |
---|---|---|
committer | Bhakthavatsala Raghavendra <braghave@codeaurora.org> | 2015-03-10 15:29:23 -0700 |
commit | 61afda4e4f808e2f3abc847ce9a621419692ba5b (patch) | |
tree | f187c3dab88c1694db3951a3655085049e36c7a6 | |
parent | b67fd9879efdce13379c17def8d6baddf9da2a03 (diff) | |
download | android_hardware_qcom_bt-61afda4e4f808e2f3abc847ce9a621419692ba5b.tar.gz android_hardware_qcom_bt-61afda4e4f808e2f3abc847ce9a621419692ba5b.tar.bz2 android_hardware_qcom_bt-61afda4e4f808e2f3abc847ce9a621419692ba5b.zip |
Bluetooth: Set BD address from boot property
Read the Bluetooth Mac address from property and use it for
provisioning the Bluetooth address.
If there desired property is not available or any error in reading
property, Bluetooth address written using btnvtool will be used
Change-Id: I4a2644c912119ca5d231a88dbd801db902abbb24
CRs-fixed: 787516
-rw-r--r-- | libbt-vendor/Android.mk | 1 | ||||
-rw-r--r-- | libbt-vendor/src/bt_vendor_qcom.c | 73 |
2 files changed, 72 insertions, 2 deletions
diff --git a/libbt-vendor/Android.mk b/libbt-vendor/Android.mk index 540592b..3414909 100644 --- a/libbt-vendor/Android.mk +++ b/libbt-vendor/Android.mk @@ -64,6 +64,7 @@ LOCAL_MODULE_CLASS := SHARED_LIBRARIES LOCAL_MODULE_OWNER := qcom LOCAL_CFLAGS += -DBT_NV_SUPPORT +#LOCAL_CFLAGS += -DREAD_BT_ADDR_FROM_PROP include $(LOCAL_PATH)/vnd_buildcfg.mk diff --git a/libbt-vendor/src/bt_vendor_qcom.c b/libbt-vendor/src/bt_vendor_qcom.c index 8e15c81..0545a6e 100644 --- a/libbt-vendor/src/bt_vendor_qcom.c +++ b/libbt-vendor/src/bt_vendor_qcom.c @@ -25,6 +25,7 @@ ******************************************************************************/ #define LOG_TAG "bt_vendor" +#define BLUETOOTH_MAC_ADDR_BOOT_PROPERTY "ro.boot.btmacaddr" #include <utils/Log.h> #include <cutils/properties.h> @@ -529,7 +530,32 @@ static int init(const bt_vendor_callbacks_t* p_cb, unsigned char *local_bdaddr) return 0; } - +#ifdef READ_BT_ADDR_FROM_PROP +static bool validate_tok(char* bdaddr_tok) { + int i = 0; + bool ret; + + if (strlen(bdaddr_tok) != 2) { + ret = FALSE; + ALOGE("Invalid token length"); + } else { + ret = TRUE; + for (i=0; i<2; i++) { + if ((bdaddr_tok[i] >= '0' && bdaddr_tok[i] <= '9') || + (bdaddr_tok[i] >= 'A' && bdaddr_tok[i] <= 'F') || + (bdaddr_tok[i] >= 'a' && bdaddr_tok[i] <= 'f')) { + ret = TRUE; + ALOGV("%s: tok %s @ %d is good", __func__, bdaddr_tok, i); + } else { + ret = FALSE; + ALOGE("invalid character in tok: %s at ind: %d", bdaddr_tok, i); + break; + } + } + } + return ret; +} +#endif /*READ_BT_ADDR_FROM_PROP*/ int connect_to_local_socket(char* name) { socklen_t len; int sk = -1; @@ -584,6 +610,14 @@ static int op(bt_vendor_opcode_t opcode, void *param) bool is_ant_req = false; char wipower_status[PROPERTY_VALUE_MAX]; char emb_wp_mode[PROPERTY_VALUE_MAX]; + char bt_version[PROPERTY_VALUE_MAX]; + bool ignore_boot_prop = TRUE; +#ifdef READ_BT_ADDR_FROM_PROP + int i = 0; + static char bd_addr[PROPERTY_VALUE_MAX]; + uint8_t local_bd_addr_from_prop[6]; + char* tok; +#endif ALOGV("bt-vendor : op for %d", opcode); @@ -717,8 +751,43 @@ static int op(bt_vendor_opcode_t opcode, void *param) } ALOGV("rome_soc_init is started"); property_set("wc_transport.soc_initialized", "0"); +#ifdef READ_BT_ADDR_FROM_PROP + /*Give priority to read BD address from boot property*/ + ignore_boot_prop = FALSE; + if (property_get(BLUETOOTH_MAC_ADDR_BOOT_PROPERTY, bd_addr, NULL)) { + ALOGV("BD address read from Boot property: %s\n", bd_addr); + tok = strtok(bd_addr, ":"); + while (tok != NULL) { + ALOGV("bd add [%d]: %d ", i, strtol(tok, NULL, 16)); + if (i>=6) { + ALOGE("bd property of invalid length"); + ignore_boot_prop = TRUE; + break; + } + if (!validate_tok(tok)) { + ALOGE("Invalid token in BD address"); + ignore_boot_prop = TRUE; + break; + } + local_bd_addr_from_prop[5-i] = strtol(tok, NULL, 16); + tok = strtok(NULL, ":"); + i++; + } + if (i == 6 && !ignore_boot_prop) { + ALOGV("Valid BD address read from prop"); + memcpy(vnd_local_bd_addr, local_bd_addr_from_prop, sizeof(vnd_local_bd_addr)); + ignore_boot_prop = FALSE; + } else { + ALOGE("There are not enough tokens in BD addr"); + ignore_boot_prop = TRUE; + } + } else { + ALOGE("BD address boot property not set"); + ignore_boot_prop = TRUE; + } +#endif //READ_BT_ADDR_FROM_PROP /* Always read BD address from NV file */ - if(!bt_vendor_nv_read(1, vnd_local_bd_addr)) + if(ignore_boot_prop && !bt_vendor_nv_read(1, vnd_local_bd_addr)) { /* Since the BD address is configured in boot time We should not be here */ ALOGI("Failed to read BD address. Use the one from bluedroid stack/ftm"); |