summaryrefslogtreecommitdiffstats
path: root/btif/src/btif_hh.c
diff options
context:
space:
mode:
Diffstat (limited to 'btif/src/btif_hh.c')
-rwxr-xr-x[-rw-r--r--]btif/src/btif_hh.c148
1 files changed, 118 insertions, 30 deletions
diff --git a/btif/src/btif_hh.c b/btif/src/btif_hh.c
index 4046964..01061a1 100644..100755
--- a/btif/src/btif_hh.c
+++ b/btif/src/btif_hh.c
@@ -138,6 +138,7 @@ typedef enum
** Static variables
************************************************************************************/
btif_hh_cb_t btif_hh_cb;
+
static bthh_callbacks_t *bt_hh_callbacks = NULL;
#define CHECK_BTHH_INIT() if (bt_hh_callbacks == NULL)\
@@ -322,7 +323,7 @@ void btif_hh_remove_device(bt_bdaddr_t bd_addr)
p_added_dev = &btif_hh_cb.added_devices[i];
if (memcmp(&(p_added_dev->bd_addr),&bd_addr, 6) == 0) {
BTA_HhRemoveDev(p_added_dev->dev_handle);
-
+ btif_storage_remove_hid_info(&(p_added_dev->bd_addr));
memset(&(p_added_dev->bd_addr), 0, 6);
p_added_dev->dev_handle = BTA_HH_INVALID_HANDLE;
break;
@@ -489,8 +490,8 @@ static void btif_hh_upstreams_evt(UINT16 event, char* p_param)
if (p_data->status == BTA_HH_OK) {
btif_hh_cb.status = BTIF_HH_ENABLED;
BTIF_TRACE_DEBUG1("%s--Loading added devices",__FUNCTION__);
- //TODO:
- //btif_storage_load_bonded_hid_info();
+ /* Add hid descriptors for already bonded hid devices*/
+ btif_storage_load_bonded_hid_info();
}
else {
btif_hh_cb.status = BTIF_HH_DISABLED;
@@ -500,9 +501,16 @@ static void btif_hh_upstreams_evt(UINT16 event, char* p_param)
case BTA_HH_DISABLE_EVT:
btif_hh_cb.status = BTIF_HH_DISABLED;
- if (p_data->status != BTA_HH_OK) {
- BTIF_TRACE_WARNING1("BTA_HH_DISABLE_EVT: Error, HH disabling failed, status = %d", p_data->status);
+ if (p_data->status == BTA_HH_OK) {
+ int i;
+ //Clear the control block
+ memset(&btif_hh_cb, 0, sizeof(btif_hh_cb));
+ for (i = 0; i < BTIF_HH_MAX_HID; i++){
+ btif_hh_cb.devices[i].dev_status = BTHH_CONN_STATE_UNKNOWN;
+ }
}
+ else
+ BTIF_TRACE_WARNING1("BTA_HH_DISABLE_EVT: Error, HH disabling failed, status = %d", p_data->status);
break;
case BTA_HH_OPEN_EVT:
@@ -563,11 +571,14 @@ static void btif_hh_upstreams_evt(UINT16 event, char* p_param)
case BTA_HH_GET_RPT_EVT:
BTIF_TRACE_DEBUG2("BTA_HH_GET_RPT_EVT: status = %d, handle = %d",
p_data->hs_data.status, p_data->hs_data.handle);
+ p_dev = btif_hh_find_connected_dev_by_handle(p_data->conn.handle);
+ HAL_CBACK(bt_hh_callbacks, get_report_cb,(bt_bdaddr_t*) &(p_dev->bd_addr), (bthh_status_t) p_data->hs_data.status,
+ (uint8_t*) p_data->hs_data.rsp_data.p_rpt_data, BT_HDR_SIZE);
break;
case BTA_HH_SET_RPT_EVT:
BTIF_TRACE_DEBUG2("BTA_HH_SET_RPT_EVT: status = %d, handle = %d",
- p_data->dev_status.status, p_data->dev_status.handle);
+ p_data->dev_status.status, p_data->dev_status.handle);
p_dev = btif_hh_find_connected_dev_by_handle(p_data->dev_status.handle);
if (p_dev != NULL && p_dev->p_buf != NULL) {
BTIF_TRACE_DEBUG0("Freeing buffer..." );
@@ -577,32 +588,35 @@ static void btif_hh_upstreams_evt(UINT16 event, char* p_param)
break;
case BTA_HH_GET_PROTO_EVT:
+ p_dev = btif_hh_find_connected_dev_by_handle(p_data->dev_status.handle);
BTIF_TRACE_WARNING4("BTA_HH_GET_PROTO_EVT: status = %d, handle = %d, proto = [%d], %s",
p_data->hs_data.status, p_data->hs_data.handle,
p_data->hs_data.rsp_data.proto_mode,
(p_data->hs_data.rsp_data.proto_mode == BTA_HH_PROTO_RPT_MODE) ? "Report Mode" :
(p_data->hs_data.rsp_data.proto_mode == BTA_HH_PROTO_BOOT_MODE) ? "Boot Mode" : "Unsupported");
+ HAL_CBACK(bt_hh_callbacks, protocol_mode_cb,(bt_bdaddr_t*) &(p_dev->bd_addr), (bthh_status_t)p_data->hs_data.status,
+ (bthh_protocol_mode_t) p_data->hs_data.rsp_data.proto_mode);
break;
case BTA_HH_SET_PROTO_EVT:
BTIF_TRACE_DEBUG2("BTA_HH_SET_PROTO_EVT: status = %d, handle = %d",
p_data->dev_status.status, p_data->dev_status.handle);
break;
- /*
+/*
case BTA_HH_GET_IDLE_EVT:
BTIF_TRACE_DEBUG3("BTA_HH_GET_IDLE_EVT: handle = %d, status = %d, rate = %d",
p_data->hs_data.handle, p_data->hs_data.status,
p_data->hs_data.rsp_data.idle_rate);
break;
- case BTA_HH_SET_IDLE_EVT:
+ case BTA_HH_SET_IDLE_EVT:
BTIF_TRACE_DEBUG2("BTA_HH_SET_IDLE_EVT: status = %d, handle = %d",
- p_data->dev_status.status, p_data->dev_status.handle);
- btif_hh_cb.p_curr_dev = btif_hh_find_connected_dev_by_handle(p_data->dev_status.handle);
- BTA_HhGetDscpInfo(p_data->dev_status.handle);
- break;
- */
+ p_data->dev_status.status, p_data->dev_status.handle);
+ btif_hh_cb.p_curr_dev = btif_hh_find_connected_dev_by_handle(p_data->dev_status.handle);
+ BTA_HhGetDscpInfo(p_data->dev_status.handle);
+ break;
+*/
case BTA_HH_GET_DSCP_EVT:
BTIF_TRACE_WARNING2("BTA_HH_GET_DSCP_EVT: status = %d, handle = %d",
p_data->dev_status.status, p_data->dev_status.handle);
@@ -644,25 +658,14 @@ static void btif_hh_upstreams_evt(UINT16 event, char* p_param)
BTIF_TRACE_DEBUG6("BTA_HH_GET_DSCP_EVT:bda2 = %02x:%02x:%02x:%02x:%02x:%02x",
bda[0], bda[1], bda[2],
bda[3], bda[4], bda[5]);
-
- BTIF_TRACE_WARNING0("BTA_HH_GET_DSCP_EVT: Calling add device");
- BTIF_TRACE_WARNING1("BTA_HH_GET_DSCP_EVT: attr_mask %d", p_dev->attr_mask);
- BTIF_TRACE_WARNING1("BTA_HH_GET_DSCP_EVT: sub_class %d", p_dev->sub_class);
- BTIF_TRACE_WARNING1("BTA_HH_GET_DSCP_EVT: app_id %d", p_dev->app_id);
- BTIF_TRACE_WARNING2("BTA_HH_GET_DSCP_EVT:desc_len=%d, dscp_info %d",len,&dscp_info);
- BTIF_TRACE_DEBUG4("BTA_HH_GET_DSCP_EVT:country_code=%d,dscp_len=%d,version_id=%d,product_id=%d",
- dscp_info.ctry_code,
- dscp_info.descriptor.dl_len,
- dscp_info.vendor_id,dscp_info.product_id);
BTA_HhAddDev(bda, p_dev->attr_mask,p_dev->sub_class,p_dev->app_id, dscp_info);
- //TODO write hid info to nvram
- BTIF_TRACE_DEBUG0("BTA_HH_GET_DSCP_EVT:calling storage function");
- /*ret = btif_storage_add_hid_device_info(&(p_dev->bd_addr), p_dev->attr_mask,p_dev->sub_class,p_dev->app_id,
+ // write hid info to nvram
+ ret = btif_storage_add_hid_device_info(&(p_dev->bd_addr), p_dev->attr_mask,p_dev->sub_class,p_dev->app_id,
p_data->dscp_info.vendor_id, p_data->dscp_info.product_id,
p_data->dscp_info.version, p_data->dscp_info.ctry_code,
len, p_data->dscp_info.descriptor.dsc_list);
- //ASSERTC(ret == BT_STATUS_SUCCESS, "storing hid info failed", ret);*/
+ ASSERTC(ret == BT_STATUS_SUCCESS, "storing hid info failed", ret);
BTIF_TRACE_WARNING0("BTA_HH_GET_DSCP_EVT: Called add device");
//Free buffer created for dscp_info;
@@ -712,7 +715,7 @@ static void btif_hh_upstreams_evt(UINT16 event, char* p_param)
p_dev->dev_status = BTHH_CONN_STATE_DISCONNECTED;
HAL_CBACK(bt_hh_callbacks, connection_state_cb,&(p_dev->bd_addr), p_dev->dev_status);
btif_dm_cb_remove_bond(&(p_dev->bd_addr));
- HAL_CBACK(bt_hh_callbacks, virtual_unplug_cb,&(p_dev->bd_addr),BTHH_CONN_STATE_DISCONNECTED);
+ HAL_CBACK(bt_hh_callbacks, virtual_unplug_cb,&(p_dev->bd_addr),p_data->dev_status.status);
}
break;
@@ -1027,6 +1030,73 @@ static bt_status_t set_info (bt_bdaddr_t *bd_addr, bthh_hid_info_t hid_info )
return BT_STATUS_SUCCESS;
}
+/*******************************************************************************
+**
+** Function get_idle_time
+**
+** Description Get the HID idle time
+**
+** Returns bt_status_t
+**
+*******************************************************************************/
+static bt_status_t get_idle_time(bt_bdaddr_t *bd_addr)
+{
+ CHECK_BTHH_INIT();
+ btif_hh_device_t *p_dev;
+ BD_ADDR* bda = (BD_ADDR*) bd_addr;
+
+ BTIF_TRACE_DEBUG6(" addr = %02X:%02X:%02X:%02X:%02X:%02X",
+ (*bda)[0], (*bda)[1], (*bda)[2], (*bda)[3], (*bda)[4], (*bda)[5]);
+
+ if (btif_hh_cb.status != BTIF_HH_ENABLED) {
+ BTIF_TRACE_ERROR2("%s: Error, HH status = %d", __FUNCTION__, btif_hh_cb.status);
+ return BT_STATUS_FAIL;
+ }
+
+ p_dev = btif_hh_find_connected_dev_by_bda(bd_addr);
+ if (p_dev != NULL) {
+ //BTA_HhGetIdle(p_dev->dev_handle);
+ }
+ else {
+ return BT_STATUS_FAIL;
+ }
+ return BT_STATUS_SUCCESS;
+}
+
+/*******************************************************************************
+**
+** Function set_idle_time
+**
+** Description Set the HID idle time
+**
+** Returns bt_status_t
+**
+*******************************************************************************/
+static bt_status_t set_idle_time (bt_bdaddr_t *bd_addr, uint8_t idle_time)
+{
+ CHECK_BTHH_INIT();
+ btif_hh_device_t *p_dev;
+ BD_ADDR* bda = (BD_ADDR*) bd_addr;
+
+ BTIF_TRACE_DEBUG6("addr = %02X:%02X:%02X:%02X:%02X:%02X",
+ (*bda)[0], (*bda)[1], (*bda)[2], (*bda)[3], (*bda)[4], (*bda)[5]);
+
+ if (btif_hh_cb.status != BTIF_HH_ENABLED) {
+ BTIF_TRACE_ERROR2("%s: Error, HH status = %d", __FUNCTION__, btif_hh_cb.status);
+ return BT_STATUS_FAIL;
+ }
+
+ p_dev = btif_hh_find_connected_dev_by_bda(bd_addr);
+ if (p_dev == NULL) {
+ BTIF_TRACE_WARNING6(" Error, device %02X:%02X:%02X:%02X:%02X:%02X not opened.",
+ (*bda)[0], (*bda)[1], (*bda)[2], (*bda)[3], (*bda)[4], (*bda)[5]);
+ return BT_STATUS_FAIL;
+ }
+ else {
+ //BTA_HhSetIdle(p_dev->dev_handle, idle_time);
+ }
+ return BT_STATUS_SUCCESS;
+}
/*******************************************************************************
**
@@ -1208,7 +1278,7 @@ static bt_status_t set_report (bt_bdaddr_t *bd_addr, bthh_report_type_t reportTy
/* Build a SetReport data buffer */
memset(hexbuf, 0, 200);
//TODO
- /*hex_bytes_filled = scru_ascii_2_hex(report, len, hexbuf);
+ hex_bytes_filled = ascii_2_hex(report, len, hexbuf);
LOGI("Hex bytes filled, hex value: %d", hex_bytes_filled);
if (hex_bytes_filled) {
@@ -1216,7 +1286,7 @@ static bt_status_t set_report (bt_bdaddr_t *bd_addr, bthh_report_type_t reportTy
pbuf_data = (UINT8*) (p_dev->p_buf + 1) + p_dev->p_buf->offset;
memcpy(pbuf_data, hexbuf, hex_bytes_filled);
BTA_HhSetReport(p_dev->dev_handle, reportType, p_dev->p_buf);
- }*/
+ }
return BT_STATUS_SUCCESS;
}
@@ -1304,12 +1374,28 @@ static bt_status_t send_data (bt_bdaddr_t *bd_addr, char* data)
static void cleanup( void )
{
BTIF_TRACE_EVENT1("%s", __FUNCTION__);
+ btif_hh_device_t *p_dev;
+ int i;
+ if (btif_hh_cb.status != BTIF_HH_ENABLED) {
+ BTIF_TRACE_WARNING2("%s: HH disabling or disabled already, status = %d", __FUNCTION__, btif_hh_cb.status);
+ return;
+ }
+ btif_hh_cb.status = BTIF_HH_DISABLING;
+ for (i = 0; i < BTIF_HH_MAX_HID; i++) {
+ p_dev = &btif_hh_cb.devices[i];
+ if (p_dev->dev_status != BTIF_HH_DEV_UNKNOWN && p_dev->fd >= 0) {
+ BTIF_TRACE_DEBUG2("%s: Closing bthid.ko fd = %d", __FUNCTION__, p_dev->fd);
+ close(p_dev->fd);
+ p_dev->fd = -1;
+ }
+ }
if (bt_hh_callbacks)
{
btif_disable_service(BTA_HID_SERVICE_ID);
bt_hh_callbacks = NULL;
}
+
}
static const bthh_interface_t bthhInterface = {
@@ -1321,6 +1407,8 @@ static const bthh_interface_t bthhInterface = {
set_info,
get_protocol,
set_protocol,
+// get_idle_time,
+// set_idle_time,
get_report,
set_report,
send_data,