bta_hh_utils.cc revision 1baaae3f34a667058e7f0c5f778357d98320cf38
15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Copyright (C) 2005-2012 Broadcom Corporation 45738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 55738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 65738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * you may not use this file except in compliance with the License. 75738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * You may obtain a copy of the License at: 85738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 95738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * See the License for the specific language governing permissions and 155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * limitations under the License. 165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h> 195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_target.h" 21e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_INCLUDED == TRUE) 225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_hh_int.h" 24d7ffd64accbd50a27289a388856e56244ccbb5daMyles Watson#include "osi/include/osi.h" 255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 26ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/* if SSR max latency is not defined by remote device, set the default value 27ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta as half of the link supervision timeout */ 28cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson#define BTA_HH_GET_DEF_SSR_MAX_LAT(x) ((x) >> 1) 29ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 318af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Constants 328af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ****************************************************************************/ 33cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson#define BTA_HH_KB_CTRL_MASK 0x11 34cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson#define BTA_HH_KB_SHIFT_MASK 0x22 35cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson#define BTA_HH_KB_ALT_MASK 0x44 36cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson#define BTA_HH_KB_GUI_MASK 0x88 375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 38cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson#define BTA_HH_KB_CAPS_LOCK 0x39 /* caps lock */ 39cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson#define BTA_HH_KB_NUM_LOCK 0x53 /* num lock */ 405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 41cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson#define BTA_HH_MAX_RPT_CHARS 8 425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 43cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic const uint8_t bta_hh_mod_key_mask[BTA_HH_MOD_MAX_KEY] = { 44cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTA_HH_KB_CTRL_MASK, BTA_HH_KB_SHIFT_MASK, BTA_HH_KB_ALT_MASK, 45cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTA_HH_KB_GUI_MASK}; 465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 488af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 498af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_hh_find_cb 508af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 518af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Find best available control block according to BD address. 528af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 538af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 548af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 558af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 568af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 57cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonuint8_t bta_hh_find_cb(BD_ADDR bda) { 58cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint8_t xx; 59cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 60cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* See how many active devices there are. */ 61cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson for (xx = 0; xx < BTA_HH_MAX_DEVICE; xx++) { 62cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* check if any active/known devices is a match */ 63cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if ((!bdcmp(bda, bta_hh_cb.kdev[xx].addr) && 64cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bdcmp(bda, bd_addr_null) != 0)) { 65e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 66cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG("found kdev_cb[%d] hid_handle = %d ", xx, 67cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_hh_cb.kdev[xx].hid_handle) 685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 69cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return xx; 70cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 71e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 72cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson else 73cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG("in_use ? [%d] kdev[%d].hid_handle = %d state = [%d]", 74cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_hh_cb.kdev[xx].in_use, xx, 75cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_hh_cb.kdev[xx].hid_handle, bta_hh_cb.kdev[xx].state); 765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 77cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 79cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* if no active device match, find a spot for it */ 80cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson for (xx = 0; xx < BTA_HH_MAX_DEVICE; xx++) { 81cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (!bta_hh_cb.kdev[xx].in_use) { 82cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bdcpy(bta_hh_cb.kdev[xx].addr, bda); 83cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson break; 845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 85cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 86cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson/* If device list full, report BTA_HH_IDX_INVALID */ 87e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 88cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG("bta_hh_find_cb:: index = %d while max = %d", xx, 89cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTA_HH_MAX_DEVICE); 905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 92cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (xx == BTA_HH_MAX_DEVICE) xx = BTA_HH_IDX_INVALID; 93ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 94cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return xx; 955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 988af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 998af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_hh_clean_up_kdev 1008af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1018af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Clean up device control block when device is removed from 1028af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * manitainace list, and update control block index map. 1038af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1048af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 1058af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1068af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 107cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_hh_clean_up_kdev(tBTA_HH_DEV_CB* p_cb) { 108cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint8_t index; 1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 110cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_cb->hid_handle != BTA_HH_INVALID_HANDLE) { 111e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_LE_INCLUDED == TRUE) 112cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_cb->is_le_device) 113cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_hh_cb.le_cb_index[BTA_HH_GET_LE_CB_IDX(p_cb->hid_handle)] = 114cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTA_HH_IDX_INVALID; 115cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson else 1162e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif 117cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_hh_cb.cb_index[p_cb->hid_handle] = BTA_HH_IDX_INVALID; 118cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 120cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* reset device control block */ 121cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson index = p_cb->index; /* Preserve index for this control block */ 1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 123cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* Free buffer for report descriptor info */ 124cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson osi_free_and_reset((void**)&p_cb->dscp_info.descriptor.dsc_list); 1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 126cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson memset(p_cb, 0, sizeof(tBTA_HH_DEV_CB)); /* Reset control block */ 1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 128cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_cb->index = index; /* Restore index for this control block */ 129cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_cb->state = BTA_HH_IDLE_ST; 130cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_cb->hid_handle = BTA_HH_INVALID_HANDLE; 1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1338af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1348af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_hh_update_di_info 1358af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1368af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Maintain a known device list for BTA HH. 1378af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1388af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 1398af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1408af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 141cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_hh_update_di_info(tBTA_HH_DEV_CB* p_cb, uint16_t vendor_id, 142cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint16_t product_id, uint16_t version, 143d628a0695e73973e0bd54dd026bfed900b69f804Myles Watson#if (BTA_HH_LE_INCLUDED == TRUE) 144d628a0695e73973e0bd54dd026bfed900b69f804Myles Watson uint8_t flag) 145d628a0695e73973e0bd54dd026bfed900b69f804Myles Watson#else 146d628a0695e73973e0bd54dd026bfed900b69f804Myles Watson UNUSED_ATTR uint8_t flag) 147d628a0695e73973e0bd54dd026bfed900b69f804Myles Watson#endif 1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 149e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 150cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG("vendor_id = 0x%2x product_id = 0x%2x version = 0x%2x", 151cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson vendor_id, product_id, version); 1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 153cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_cb->dscp_info.vendor_id = vendor_id; 154cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_cb->dscp_info.product_id = product_id; 155cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_cb->dscp_info.version = version; 156e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_LE_INCLUDED == TRUE) 157cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_cb->dscp_info.flag = flag; 1582e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif 1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1618af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1628af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_hh_add_device_to_list 1638af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1648af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Maintain a known device list for BTA HH. 1658af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1668af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 1678af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1688af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 169cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_hh_add_device_to_list(tBTA_HH_DEV_CB* p_cb, uint8_t handle, 170e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen uint16_t attr_mask, 171cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tHID_DEV_DSCP_INFO* p_dscp_info, 172cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint8_t sub_class, uint16_t ssr_max_latency, 173cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint16_t ssr_min_tout, uint8_t app_id) { 174e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 175cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG("subclass = 0x%2x", sub_class); 1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 178cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_cb->hid_handle = handle; 179cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_cb->in_use = true; 180cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_cb->attr_mask = attr_mask; 1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 182cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_cb->sub_class = sub_class; 183cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_cb->app_id = app_id; 1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 185cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_cb->dscp_info.ssr_max_latency = ssr_max_latency; 186cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_cb->dscp_info.ssr_min_tout = ssr_min_tout; 1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 188cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* store report descriptor info */ 189cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_dscp_info) { 190cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson osi_free_and_reset((void**)&p_cb->dscp_info.descriptor.dsc_list); 1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 192cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_dscp_info->dl_len) { 193cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_cb->dscp_info.descriptor.dsc_list = 194cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (uint8_t*)osi_malloc(p_dscp_info->dl_len); 195cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_cb->dscp_info.descriptor.dl_len = p_dscp_info->dl_len; 196cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson memcpy(p_cb->dscp_info.descriptor.dsc_list, p_dscp_info->dsc_list, 197cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_dscp_info->dl_len); 1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 199cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2038af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 2048af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_hh_tod_spt 2058af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 2068af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Check to see if this type of device is supported 2078af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 2088af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns 2098af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 2108af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 211cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonbool bta_hh_tod_spt(tBTA_HH_DEV_CB* p_cb, uint8_t sub_class) { 212cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint8_t xx; 213cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint8_t cod = (sub_class >> 2); /* lower two bits are reserved */ 214cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 215cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson for (xx = 0; xx < p_bta_hh_cfg->max_devt_spt; xx++) { 216cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (cod == (uint8_t)p_bta_hh_cfg->p_devt_list[xx].tod) { 217cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_cb->app_id = p_bta_hh_cfg->p_devt_list[xx].app_id; 218e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 219cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_EVENT("bta_hh_tod_spt sub_class:0x%x supported", sub_class); 2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 221cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return true; 2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 223cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 224e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 225cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_EVENT("bta_hh_tod_spt sub_class:0x%x NOT supported", sub_class); 2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 227cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return false; 2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2318af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 2328af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_hh_parse_keybd_rpt 2338af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 2348af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description This utility function parse a boot mode keyboard report. 2358af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 2368af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 2378af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 2388af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 239cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_hh_parse_keybd_rpt(tBTA_HH_BOOT_RPT* p_kb_data, uint8_t* p_report, 240cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint16_t report_len) { 241cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_HH_KB_CB* p_kb = &bta_hh_cb.kb_cb; 242cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_HH_KEYBD_RPT* p_data = &p_kb_data->data_rpt.keybd_rpt; 2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 244cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint8_t this_char, ctl_shift; 245cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint16_t xx, yy, key_idx = 0; 246cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint8_t this_report[BTA_HH_MAX_RPT_CHARS]; 2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 248e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 249cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG("bta_hh_parse_keybd_rpt: (report=%p, report_len=%d) called", 250cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_report, report_len); 2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 253cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (report_len < 2) return; 254cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 255cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson ctl_shift = *p_report++; 256cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson report_len--; 2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 258cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (report_len > BTA_HH_MAX_RPT_CHARS) report_len = BTA_HH_MAX_RPT_CHARS; 259cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 260cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson memset(this_report, 0, BTA_HH_MAX_RPT_CHARS); 261cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson memset(p_data, 0, sizeof(tBTA_HH_KEYBD_RPT)); 262cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson memcpy(this_report, p_report, report_len); 263cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 264cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* Take care of shift, control, GUI and alt, modifier keys */ 265cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson for (xx = 0; xx < BTA_HH_MOD_MAX_KEY; xx++) { 266cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (ctl_shift & bta_hh_mod_key_mask[xx]) { 267cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG("Mod Key[%02x] pressed", bta_hh_mod_key_mask[xx]); 268cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_kb->mod_key[xx] = true; 269cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else if (p_kb->mod_key[xx]) { 270cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_kb->mod_key[xx] = false; 271cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 272cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* control key flag is set */ 273cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_data->mod_key[xx] = p_kb->mod_key[xx]; 274cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 275cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 276cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /***************************************************************************/ 277cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* First step is to remove all characters we saw in the last report */ 278cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /***************************************************************************/ 279cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson for (xx = 0; xx < report_len; xx++) { 280cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson for (yy = 0; yy < BTA_HH_MAX_RPT_CHARS; yy++) { 281cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (this_report[xx] == p_kb->last_report[yy]) { 282cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson this_report[xx] = 0; 283cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 285cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 286cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /***************************************************************************/ 287cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* Now, process all the characters in the report, up to 6 keycodes */ 288cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /***************************************************************************/ 289cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson for (xx = 0; xx < report_len; xx++) { 290e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 291cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG("this_char = %02x", this_report[xx]); 2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 293cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if ((this_char = this_report[xx]) == 0) continue; 294cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* take the key code as the report data */ 295cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (this_report[xx] == BTA_HH_KB_CAPS_LOCK) 296cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_kb->caps_lock = p_kb->caps_lock ? false : true; 297cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson else if (this_report[xx] == BTA_HH_KB_NUM_LOCK) 298cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_kb->num_lock = p_kb->num_lock ? false : true; 299cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson else 300cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_data->this_char[key_idx++] = this_char; 3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 302e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 303cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG("found keycode %02x ", this_report[xx]); 3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 305cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_data->caps_lock = p_kb->caps_lock; 306cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_data->num_lock = p_kb->num_lock; 307cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 309cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson memset(p_kb->last_report, 0, BTA_HH_MAX_RPT_CHARS); 310cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson memcpy(p_kb->last_report, p_report, report_len); 3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 312cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return; 3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3168af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 3178af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_hh_parse_mice_rpt 3188af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 3198af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description This utility function parse a boot mode mouse report. 3208af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 3218af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 3228af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 3238af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 324cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_hh_parse_mice_rpt(tBTA_HH_BOOT_RPT* p_mice_data, uint8_t* p_report, 325cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint16_t report_len) { 326cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_HH_MICE_RPT* p_data = &p_mice_data->data_rpt.mice_rpt; 327e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 328cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint8_t xx; 3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 330cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG( 331cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson "bta_hh_parse_mice_rpt: bta_keybd_rpt_rcvd(report=%p, \ 332cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson report_len=%d) called", 333cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_report, report_len); 3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 336cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (report_len < 3) return; 3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 338cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (report_len > BTA_HH_MAX_RPT_CHARS) report_len = BTA_HH_MAX_RPT_CHARS; 3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 340e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 341cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson for (xx = 0; xx < report_len; xx++) { 342cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG("this_char = %02x", p_report[xx]); 343cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 346cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* only first bytes lower 3 bits valid */ 347cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_data->mouse_button = (p_report[0] & 0x07); 3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 349cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* x displacement */ 350cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_data->delta_x = p_report[1]; 3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 352cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* y displacement */ 353cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_data->delta_y = p_report[2]; 3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 355e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 356cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG("mice button: 0x%2x", p_data->mouse_button); 357cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG("mice move: x = %d y = %d", p_data->delta_x, 358cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_data->delta_y); 3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 361cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return; 3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 364ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************* 3658af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 3668af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_hh_read_ssr_param 3678af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 3688af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Read the SSR Parameter for the remote device 3698af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 3708af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns tBTA_HH_STATUS operation status 3718af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 3728af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 373cd1fd07f1306e08fe048682dd5918987e579f937Myles WatsontBTA_HH_STATUS bta_hh_read_ssr_param(BD_ADDR bd_addr, uint16_t* p_max_ssr_lat, 374cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint16_t* p_min_ssr_tout) { 375cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_HH_STATUS status = BTA_HH_ERR; 376cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_HH_CB* p_cb = &bta_hh_cb; 377cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint8_t i; 378cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint16_t ssr_max_latency; 379cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson for (i = 0; i < BTA_HH_MAX_KNOWN; i++) { 380cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (memcmp(p_cb->kdev[i].addr, bd_addr, BD_ADDR_LEN) == 0) { 381cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* if remote device does not have HIDSSRHostMaxLatency attribute in SDP, 382cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson set SSR max latency default value here. */ 383cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_cb->kdev[i].dscp_info.ssr_max_latency == HID_SSR_PARAM_INVALID) { 384cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* The default is calculated as half of link supervision timeout.*/ 385cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 386cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_GetLinkSuperTout(p_cb->kdev[i].addr, &ssr_max_latency); 387cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson ssr_max_latency = BTA_HH_GET_DEF_SSR_MAX_LAT(ssr_max_latency); 388cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 389cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* per 1.1 spec, if the newly calculated max latency is greater than 390cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTA_HH_SSR_MAX_LATENCY_DEF which is 500ms, use 391cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTA_HH_SSR_MAX_LATENCY_DEF */ 392cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (ssr_max_latency > BTA_HH_SSR_MAX_LATENCY_DEF) 393cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson ssr_max_latency = BTA_HH_SSR_MAX_LATENCY_DEF; 394cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 395cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson *p_max_ssr_lat = ssr_max_latency; 396cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else 397cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson *p_max_ssr_lat = p_cb->kdev[i].dscp_info.ssr_max_latency; 398cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 399cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_cb->kdev[i].dscp_info.ssr_min_tout == HID_SSR_PARAM_INVALID) 400cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson *p_min_ssr_tout = BTA_HH_SSR_MIN_TOUT_DEF; 401cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson else 402cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson *p_min_ssr_tout = p_cb->kdev[i].dscp_info.ssr_min_tout; 403cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 404cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson status = BTA_HH_OK; 405cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 406cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson break; 407ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 408cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 409ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 410cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return status; 411ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 412ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 413ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************* 4148af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 4158af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_hh_cleanup_disable 4168af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 417cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * Description when disable finished, cleanup control block and send 4181baaae3f34a667058e7f0c5f778357d98320cf38Myles Watson * callback 4198af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 4208af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 4218af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 4228af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 4238af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 424cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_hh_cleanup_disable(tBTA_HH_STATUS status) { 425cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint8_t xx; 426cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* free buffer in CB holding report descriptors */ 427cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson for (xx = 0; xx < BTA_HH_MAX_DEVICE; xx++) { 428cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson osi_free_and_reset( 429cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (void**)&bta_hh_cb.kdev[xx].dscp_info.descriptor.dsc_list); 430cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 431cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson osi_free_and_reset((void**)&bta_hh_cb.p_disc_db); 432cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 433cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (*bta_hh_cb.p_cback)(BTA_HH_DISABLE_EVT, (tBTA_HH*)&status); 434cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* all connections are down, no waiting for diconnect */ 435cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson memset(&bta_hh_cb, 0, sizeof(tBTA_HH_CB)); 436ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 437ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 438ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************* 4398af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 4408af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_hh_dev_handle_to_cb_idx 4418af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 442cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * Description convert a HID device handle to the device control block 4431baaae3f34a667058e7f0c5f778357d98320cf38Myles Watson * index. 4448af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 4458af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 4468af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns uint8_t: index of the device control block. 4478af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 4488af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 449cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonuint8_t bta_hh_dev_handle_to_cb_idx(uint8_t dev_handle) { 450cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint8_t index = BTA_HH_IDX_INVALID; 451ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 452e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_LE_INCLUDED == TRUE) 453cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (BTA_HH_IS_LE_DEV_HDL(dev_handle)) { 454cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (BTA_HH_IS_LE_DEV_HDL_VALID(dev_handle)) 455cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson index = bta_hh_cb.le_cb_index[BTA_HH_GET_LE_CB_IDX(dev_handle)]; 456e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 457cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG("bta_hh_dev_handle_to_cb_idx dev_handle = %d index = %d", 458cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson dev_handle, index); 4592e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif 460cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else 4612e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif 462cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* regular HID device checking */ 463cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (dev_handle < BTA_HH_MAX_KNOWN) 464cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson index = bta_hh_cb.cb_index[dev_handle]; 465ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 466cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return index; 467ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 468e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4708af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 4718af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_hh_trace_dev_db 4728af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 4738af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Check to see if this type of device is supported 4748af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 4758af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns 4768af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 4778af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 478cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_hh_trace_dev_db(void) { 479cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint8_t xx; 4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 481cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG("bta_hh_trace_dev_db:: Device DB list********************"); 4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 483cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson for (xx = 0; xx < BTA_HH_MAX_DEVICE; xx++) { 484cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG("kdev[%d] in_use[%d] handle[%d] ", xx, 485cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_hh_cb.kdev[xx].in_use, bta_hh_cb.kdev[xx].hid_handle); 4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 487cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG( 488cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson "\t\t\t attr_mask[%04x] state [%d] sub_class[%02x] index = %d", 489cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_hh_cb.kdev[xx].attr_mask, bta_hh_cb.kdev[xx].state, 490cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_hh_cb.kdev[xx].sub_class, bta_hh_cb.kdev[xx].index); 491cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 492cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG("*********************************************************"); 4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* HL_INCLUDED */ 496