summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2014-11-06 15:11:56 -0800
committerGerrit - the friendly Code Review server <code-review@localhost>2014-11-06 15:11:56 -0800
commit27ee61b76e80f96d1f2051dabdd307f64a543151 (patch)
treea6f7a9ff6bec0c5db514c54689c568c2cb7ea49a
parent9a7ff1d3b21d3f211f6535bedbe2e58d01779e1c (diff)
parent308cbba6af46a368336e110137c6ce733cbc36bb (diff)
downloadandroid_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.h7
-rwxr-xr-x[-rw-r--r--]libbt-vendor/src/bt_vendor_qcom.c26
-rw-r--r--libbt-vendor/src/hw_rome.c55
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;