diff options
author | Linux Build Service Account <lnxbuild@localhost> | 2014-11-06 15:11:56 -0800 |
---|---|---|
committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2014-11-06 15:11:56 -0800 |
commit | 27ee61b76e80f96d1f2051dabdd307f64a543151 (patch) | |
tree | a6f7a9ff6bec0c5db514c54689c568c2cb7ea49a | |
parent | 9a7ff1d3b21d3f211f6535bedbe2e58d01779e1c (diff) | |
parent | 308cbba6af46a368336e110137c6ce733cbc36bb (diff) | |
download | android_hardware_qcom_bt-27ee61b76e80f96d1f2051dabdd307f64a543151.tar.gz android_hardware_qcom_bt-27ee61b76e80f96d1f2051dabdd307f64a543151.tar.bz2 android_hardware_qcom_bt-27ee61b76e80f96d1f2051dabdd307f64a543151.zip |
Merge "Bluetooth-Wipower: BT Host to check add on feature from SOC."
-rwxr-xr-x[-rw-r--r--] | libbt-vendor/include/hw_rome.h | 7 | ||||
-rwxr-xr-x[-rw-r--r--] | libbt-vendor/src/bt_vendor_qcom.c | 26 | ||||
-rw-r--r-- | libbt-vendor/src/hw_rome.c | 55 |
3 files changed, 79 insertions, 9 deletions
diff --git a/libbt-vendor/include/hw_rome.h b/libbt-vendor/include/hw_rome.h index 539e24c..46c0e2a 100644..100755 --- a/libbt-vendor/include/hw_rome.h +++ b/libbt-vendor/include/hw_rome.h @@ -76,7 +76,8 @@ /* VS Opcode */ #define HCI_PATCH_CMD_OCF (0) #define EDL_SET_BAUDRATE_CMD_OCF (0x48) -#define EDL_WIPOWER_VS_CMD_OCF (0x0c) +#define EDL_WIPOWER_VS_CMD_OCF (0x1f) +#define HCI_VS_GET_ADDON_FEATURES_SUPPORT (0x1d) /* VS Commands */ #define VSC_SET_BAUDRATE_REQ_LEN (1) @@ -102,6 +103,7 @@ #define EDL_APP_VER_RES_EVT (0x02) #define EDL_WIP_QUERY_CHARGING_STATUS_EVT (0x18) #define EDL_WIP_START_HANDOFF_TO_HOST_EVENT (0x19) +#define HCI_VS_GET_ADDON_FEATURES_EVENT (0x1B) /* Status Codes of HCI CMD execution*/ @@ -118,6 +120,9 @@ #define WIPOWER_IN_EMBEDDED_MODE 0x01 #define NON_WIPOWER_MODE 0x02 +/* mask to validate support for wipower */ +#define ADDON_FEATURES_EVT_WIPOWER_MASK (0x01) + /* TLV_TYPE */ #define TLV_TYPE_PATCH (1) #define TLV_TYPE_NVM (2) diff --git a/libbt-vendor/src/bt_vendor_qcom.c b/libbt-vendor/src/bt_vendor_qcom.c index 7e86b13..e45d6d9 100644..100755 --- a/libbt-vendor/src/bt_vendor_qcom.c +++ b/libbt-vendor/src/bt_vendor_qcom.c @@ -37,6 +37,7 @@ #include <cutils/sockets.h> #include <linux/un.h> #include "bt_vendor_persist.h" +#include "hw_rome.h" #define WAIT_TIMEOUT 200000 @@ -48,6 +49,8 @@ extern int hw_config(int nState); extern int is_hw_ready(); extern int rome_soc_init(int fd, char *bdaddr); extern int check_embedded_mode(int fd); +extern int rome_get_addon_feature_list(int fd); +extern int rome_ver; /****************************************************************************** ** Variables ******************************************************************************/ @@ -580,6 +583,7 @@ static int op(bt_vendor_opcode_t opcode, void *param) int nState = -1; bool is_ant_req = false; char wipower_status[PROPERTY_VALUE_MAX]; + char bt_version[PROPERTY_VALUE_MAX]; ALOGV("bt-vendor : op for %d", opcode); @@ -702,13 +706,14 @@ static int op(bt_vendor_opcode_t opcode, void *param) /* Clock on */ userial_clock_operation(fd, USERIAL_OP_CLK_ON); ALOGD("userial clock on"); - property_get("ro.bluetooth.wipower", wipower_status, false); - if(strcmp(wipower_status, "true") == 0) { - /* wait for embedded mode startup */ - usleep(WAIT_TIMEOUT); - check_embedded_mode(fd); - } else { - ALOGI("Wipower not enabled"); + property_get("persist.BT3_2.version", bt_version, false); + if(strcmp(bt_version, "true") == 0) { + property_get("ro.bluetooth.wipower", wipower_status, false); + if(strcmp(wipower_status, "true") == 0) { + check_embedded_mode(fd); + } else { + ALOGI("Wipower not enabled"); + } } ALOGV("rome_soc_init is started"); property_set("wc_transport.soc_initialized", "0"); @@ -749,6 +754,13 @@ static int op(bt_vendor_opcode_t opcode, void *param) if (fd != -1) { ALOGV("%s: received the socket fd: %d is_ant_req: %d\n", __func__, fd, is_ant_req); + if(strcmp(bt_version, "true") == 0) { + if (rome_ver >= ROME_VER_3_0) { + /* get rome supported feature request */ + ALOGE("%s: %x08 %0x", __FUNCTION__,rome_ver, ROME_VER_3_0); + //rome_get_addon_feature_list(fd); + } + } for (idx=0; idx < CH_MAX; idx++) (*fd_array)[idx] = fd; retval = 1; diff --git a/libbt-vendor/src/hw_rome.c b/libbt-vendor/src/hw_rome.c index 4925c14..05298b6 100644 --- a/libbt-vendor/src/hw_rome.c +++ b/libbt-vendor/src/hw_rome.c @@ -218,7 +218,13 @@ int get_vs_hci_event(unsigned char *rsp) ALOGE("%s: WiPower Charging hand off not ready!!!", __FUNCTION__); } break; - + case HCI_VS_GET_ADDON_FEATURES_EVENT: + if ((rsp[4] & ADDON_FEATURES_EVT_WIPOWER_MASK)) + { + ALOGD("%s: WiPower feature supported!!", __FUNCTION__); + property_set("persist.bluetooth.a4wp", "true"); + } + break; default: ALOGE("%s: Not a valid status!!!", __FUNCTION__); err = -1; @@ -1454,6 +1460,42 @@ error: return err; } +int addon_feature_req(int fd) +{ + int size, err = 0; + unsigned char cmd[HCI_MAX_CMD_SIZE]; + unsigned char rsp[HCI_MAX_EVENT_SIZE]; + hci_command_hdr *cmd_hdr; + int flags; + + memset(cmd, 0x0, HCI_MAX_CMD_SIZE); + + cmd_hdr = (void *) (cmd + 1); + cmd[0] = HCI_COMMAND_PKT; + cmd_hdr->opcode = cmd_opcode_pack(HCI_VENDOR_CMD_OGF, HCI_VS_GET_ADDON_FEATURES_SUPPORT); + cmd_hdr->plen = 0x00; + + /* Total length of the packet to be sent to the Controller */ + size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + EDL_WIP_QUERY_CHARGING_STATUS_LEN); + + ALOGD("%s: Sending HCI_VS_GET_ADDON_FEATURES_SUPPORT", __FUNCTION__); + ALOGD("HCI-CMD: \t0x%x \t0x%x \t0x%x \t0x%x \t0x%x", cmd[0], cmd[1], cmd[2], cmd[3], cmd[4]); + err = hci_send_vs_cmd(fd, (unsigned char *)cmd, rsp, size); + if ( err != size) { + ALOGE("Failed to send HCI_VS_GET_ADDON_FEATURES_SUPPORT command!"); + goto error; + } + + err = read_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE); + if (err < 0) { + ALOGE("%s: Failed to get feature request", __FUNCTION__); + goto error; + } +error: + return err; +} + + int check_embedded_mode(int fd) { int err = 0; @@ -1470,6 +1512,17 @@ int check_embedded_mode(int fd) { return wipower_flag; } +int rome_get_addon_feature_list(fd) { + int err = 0; + + /* Get addon features that are supported by FW */ + if ((err = addon_feature_req(fd)) < 0) + { + ALOGE("%s: failed (0x%x)", __FUNCTION__, err); + } + return err; +} + int rome_wipower_forward_handoff_req(int fd) { int size, err = 0; |