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 ******************************************************************************/ 579e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowskiuint8_t bta_hh_find_cb(const RawAddress& 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 */ 63aaa50649b95c0ab2cd84e67fab77596bbb24d095Jakub Pawlowski if ((bda == bta_hh_cb.kdev[xx].addr && !bda.IsEmpty())) { 64e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 65cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG("found kdev_cb[%d] hid_handle = %d ", xx, 66cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_hh_cb.kdev[xx].hid_handle) 675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 68cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return xx; 69cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 70e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 71cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson else 72cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG("in_use ? [%d] kdev[%d].hid_handle = %d state = [%d]", 73cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_hh_cb.kdev[xx].in_use, xx, 74cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_hh_cb.kdev[xx].hid_handle, bta_hh_cb.kdev[xx].state); 755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 76cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 78cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* if no active device match, find a spot for it */ 79cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson for (xx = 0; xx < BTA_HH_MAX_DEVICE; xx++) { 80cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (!bta_hh_cb.kdev[xx].in_use) { 81011a61951975849b23a10d2be87e5268008d3407Jakub Pawlowski bta_hh_cb.kdev[xx].addr = bda; 82cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson break; 835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 84cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 85cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson/* If device list full, report BTA_HH_IDX_INVALID */ 86e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 87cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG("bta_hh_find_cb:: index = %d while max = %d", xx, 88cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTA_HH_MAX_DEVICE); 895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 91cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (xx == BTA_HH_MAX_DEVICE) xx = BTA_HH_IDX_INVALID; 92ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 93cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return xx; 945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 978af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 988af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_hh_clean_up_kdev 998af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1008af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Clean up device control block when device is removed from 1018af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * manitainace list, and update control block index map. 1028af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1038af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 1048af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1058af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 106cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_hh_clean_up_kdev(tBTA_HH_DEV_CB* p_cb) { 107cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint8_t index; 1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 109cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_cb->hid_handle != BTA_HH_INVALID_HANDLE) { 110e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_LE_INCLUDED == TRUE) 111cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_cb->is_le_device) 112cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_hh_cb.le_cb_index[BTA_HH_GET_LE_CB_IDX(p_cb->hid_handle)] = 113cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTA_HH_IDX_INVALID; 114cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson else 1152e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif 116cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_hh_cb.cb_index[p_cb->hid_handle] = BTA_HH_IDX_INVALID; 117cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 119cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* reset device control block */ 120cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson index = p_cb->index; /* Preserve index for this control block */ 1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 122cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* Free buffer for report descriptor info */ 123cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson osi_free_and_reset((void**)&p_cb->dscp_info.descriptor.dsc_list); 1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 125cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson memset(p_cb, 0, sizeof(tBTA_HH_DEV_CB)); /* Reset control block */ 1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 127cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_cb->index = index; /* Restore index for this control block */ 128cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_cb->state = BTA_HH_IDLE_ST; 129cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_cb->hid_handle = BTA_HH_INVALID_HANDLE; 1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1328af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1338af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_hh_update_di_info 1348af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1358af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Maintain a known device list for BTA HH. 1368af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1378af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 1388af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1398af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 140cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_hh_update_di_info(tBTA_HH_DEV_CB* p_cb, uint16_t vendor_id, 141cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint16_t product_id, uint16_t version, 142d628a0695e73973e0bd54dd026bfed900b69f804Myles Watson#if (BTA_HH_LE_INCLUDED == TRUE) 143d628a0695e73973e0bd54dd026bfed900b69f804Myles Watson uint8_t flag) 144d628a0695e73973e0bd54dd026bfed900b69f804Myles Watson#else 145d628a0695e73973e0bd54dd026bfed900b69f804Myles Watson UNUSED_ATTR uint8_t flag) 146d628a0695e73973e0bd54dd026bfed900b69f804Myles Watson#endif 1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 148e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 149cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG("vendor_id = 0x%2x product_id = 0x%2x version = 0x%2x", 150cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson vendor_id, product_id, version); 1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 152cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_cb->dscp_info.vendor_id = vendor_id; 153cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_cb->dscp_info.product_id = product_id; 154cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_cb->dscp_info.version = version; 155e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_LE_INCLUDED == TRUE) 156cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_cb->dscp_info.flag = flag; 1572e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif 1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1608af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1618af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_hh_add_device_to_list 1628af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1638af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Maintain a known device list for BTA HH. 1648af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1658af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 1668af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1678af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 168cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_hh_add_device_to_list(tBTA_HH_DEV_CB* p_cb, uint8_t handle, 169e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen uint16_t attr_mask, 170cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tHID_DEV_DSCP_INFO* p_dscp_info, 171cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint8_t sub_class, uint16_t ssr_max_latency, 172cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint16_t ssr_min_tout, uint8_t app_id) { 173e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 174cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG("subclass = 0x%2x", sub_class); 1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 177cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_cb->hid_handle = handle; 178cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_cb->in_use = true; 179cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_cb->attr_mask = attr_mask; 1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 181cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_cb->sub_class = sub_class; 182cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_cb->app_id = app_id; 1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 184cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_cb->dscp_info.ssr_max_latency = ssr_max_latency; 185cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_cb->dscp_info.ssr_min_tout = ssr_min_tout; 1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 187cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* store report descriptor info */ 188cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_dscp_info) { 189cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson osi_free_and_reset((void**)&p_cb->dscp_info.descriptor.dsc_list); 1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 191cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_dscp_info->dl_len) { 192cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_cb->dscp_info.descriptor.dsc_list = 193cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (uint8_t*)osi_malloc(p_dscp_info->dl_len); 194cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_cb->dscp_info.descriptor.dl_len = p_dscp_info->dl_len; 195cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson memcpy(p_cb->dscp_info.descriptor.dsc_list, p_dscp_info->dsc_list, 196cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_dscp_info->dl_len); 1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 198cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2028af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 2038af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_hh_tod_spt 2048af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 2058af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Check to see if this type of device is supported 2068af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 2078af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns 2088af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 2098af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 210cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonbool bta_hh_tod_spt(tBTA_HH_DEV_CB* p_cb, uint8_t sub_class) { 211cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint8_t xx; 212cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint8_t cod = (sub_class >> 2); /* lower two bits are reserved */ 213cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 214cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson for (xx = 0; xx < p_bta_hh_cfg->max_devt_spt; xx++) { 215cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (cod == (uint8_t)p_bta_hh_cfg->p_devt_list[xx].tod) { 216cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_cb->app_id = p_bta_hh_cfg->p_devt_list[xx].app_id; 217e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 218cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_EVENT("bta_hh_tod_spt sub_class:0x%x supported", sub_class); 2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 220cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return true; 2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 222cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 223e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 224cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_EVENT("bta_hh_tod_spt sub_class:0x%x NOT supported", sub_class); 2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 226cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return false; 2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2308af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 2318af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_hh_parse_keybd_rpt 2328af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 2338af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description This utility function parse a boot mode keyboard report. 2348af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 2358af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 2368af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 2378af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 238cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_hh_parse_keybd_rpt(tBTA_HH_BOOT_RPT* p_kb_data, uint8_t* p_report, 239cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint16_t report_len) { 240cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_HH_KB_CB* p_kb = &bta_hh_cb.kb_cb; 241cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_HH_KEYBD_RPT* p_data = &p_kb_data->data_rpt.keybd_rpt; 2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 243cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint8_t this_char, ctl_shift; 244cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint16_t xx, yy, key_idx = 0; 245cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint8_t this_report[BTA_HH_MAX_RPT_CHARS]; 2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 247e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 248cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG("bta_hh_parse_keybd_rpt: (report=%p, report_len=%d) called", 249cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_report, report_len); 2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 252cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (report_len < 2) return; 253cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 254cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson ctl_shift = *p_report++; 255cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson report_len--; 2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 257cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (report_len > BTA_HH_MAX_RPT_CHARS) report_len = BTA_HH_MAX_RPT_CHARS; 258cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 259cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson memset(this_report, 0, BTA_HH_MAX_RPT_CHARS); 260cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson memset(p_data, 0, sizeof(tBTA_HH_KEYBD_RPT)); 261cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson memcpy(this_report, p_report, report_len); 262cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 263cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* Take care of shift, control, GUI and alt, modifier keys */ 264cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson for (xx = 0; xx < BTA_HH_MOD_MAX_KEY; xx++) { 265cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (ctl_shift & bta_hh_mod_key_mask[xx]) { 266cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG("Mod Key[%02x] pressed", bta_hh_mod_key_mask[xx]); 267cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_kb->mod_key[xx] = true; 268cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else if (p_kb->mod_key[xx]) { 269cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_kb->mod_key[xx] = false; 270cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 271cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* control key flag is set */ 272cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_data->mod_key[xx] = p_kb->mod_key[xx]; 273cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 274cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 275cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /***************************************************************************/ 276cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* First step is to remove all characters we saw in the last report */ 277cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /***************************************************************************/ 278cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson for (xx = 0; xx < report_len; xx++) { 279cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson for (yy = 0; yy < BTA_HH_MAX_RPT_CHARS; yy++) { 280cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (this_report[xx] == p_kb->last_report[yy]) { 281cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson this_report[xx] = 0; 282cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 284cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 285cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /***************************************************************************/ 286cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* Now, process all the characters in the report, up to 6 keycodes */ 287cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /***************************************************************************/ 288cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson for (xx = 0; xx < report_len; xx++) { 289e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 290cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG("this_char = %02x", this_report[xx]); 2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 292f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen this_char = this_report[xx]; 293f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen if (this_char == 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 ******************************************************************************/ 3739e030fde05352ec4385d7baf6cc2af89e95e039cJakub PawlowskitBTA_HH_STATUS bta_hh_read_ssr_param(const RawAddress& bd_addr, 374011a61951975849b23a10d2be87e5268008d3407Jakub Pawlowski uint16_t* p_max_ssr_lat, 375cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint16_t* p_min_ssr_tout) { 376cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_HH_STATUS status = BTA_HH_ERR; 377cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_HH_CB* p_cb = &bta_hh_cb; 378cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint8_t i; 379cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint16_t ssr_max_latency; 380cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson for (i = 0; i < BTA_HH_MAX_KNOWN; i++) { 381011a61951975849b23a10d2be87e5268008d3407Jakub Pawlowski if (p_cb->kdev[i].addr == bd_addr) { 382cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* if remote device does not have HIDSSRHostMaxLatency attribute in SDP, 383cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson set SSR max latency default value here. */ 384cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_cb->kdev[i].dscp_info.ssr_max_latency == HID_SSR_PARAM_INVALID) { 385cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* The default is calculated as half of link supervision timeout.*/ 386cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 387011a61951975849b23a10d2be87e5268008d3407Jakub Pawlowski BTM_GetLinkSuperTout(p_cb->kdev[i].addr, &ssr_max_latency); 388cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson ssr_max_latency = BTA_HH_GET_DEF_SSR_MAX_LAT(ssr_max_latency); 389cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 390cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* per 1.1 spec, if the newly calculated max latency is greater than 391cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTA_HH_SSR_MAX_LATENCY_DEF which is 500ms, use 392cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTA_HH_SSR_MAX_LATENCY_DEF */ 393cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (ssr_max_latency > BTA_HH_SSR_MAX_LATENCY_DEF) 394cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson ssr_max_latency = BTA_HH_SSR_MAX_LATENCY_DEF; 395cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 396cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson *p_max_ssr_lat = ssr_max_latency; 397cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else 398cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson *p_max_ssr_lat = p_cb->kdev[i].dscp_info.ssr_max_latency; 399cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 400cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_cb->kdev[i].dscp_info.ssr_min_tout == HID_SSR_PARAM_INVALID) 401cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson *p_min_ssr_tout = BTA_HH_SSR_MIN_TOUT_DEF; 402cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson else 403cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson *p_min_ssr_tout = p_cb->kdev[i].dscp_info.ssr_min_tout; 404cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 405cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson status = BTA_HH_OK; 406cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 407cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson break; 408ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 409cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 410ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 411cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return status; 412ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 413ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 414ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************* 4158af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 4168af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_hh_cleanup_disable 4178af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 418cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * Description when disable finished, cleanup control block and send 4191baaae3f34a667058e7f0c5f778357d98320cf38Myles Watson * callback 4208af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 4218af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 4228af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 4238af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 4248af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 425cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_hh_cleanup_disable(tBTA_HH_STATUS status) { 426cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint8_t xx; 427cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* free buffer in CB holding report descriptors */ 428cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson for (xx = 0; xx < BTA_HH_MAX_DEVICE; xx++) { 429cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson osi_free_and_reset( 430cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (void**)&bta_hh_cb.kdev[xx].dscp_info.descriptor.dsc_list); 431cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 4328ed9a77792370b007515c5a3b3d060adf5883883Hemant Gupta 4338ed9a77792370b007515c5a3b3d060adf5883883Hemant Gupta if (bta_hh_cb.p_disc_db) { 4348ed9a77792370b007515c5a3b3d060adf5883883Hemant Gupta /* Cancel SDP if it had been started. */ 4358ed9a77792370b007515c5a3b3d060adf5883883Hemant Gupta (void)SDP_CancelServiceSearch (bta_hh_cb.p_disc_db); 4368ed9a77792370b007515c5a3b3d060adf5883883Hemant Gupta osi_free_and_reset((void**)&bta_hh_cb.p_disc_db); 4378ed9a77792370b007515c5a3b3d060adf5883883Hemant Gupta } 438cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 4398843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta if (bta_hh_cb.p_cback) { 4408843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta (*bta_hh_cb.p_cback)(BTA_HH_DISABLE_EVT, (tBTA_HH*)&status); 4418843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta /* all connections are down, no waiting for diconnect */ 4428843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta memset(&bta_hh_cb, 0, sizeof(tBTA_HH_CB)); 4438843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta } 444ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 445ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 446ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************* 4478af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 4488af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_hh_dev_handle_to_cb_idx 4498af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 450cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * Description convert a HID device handle to the device control block 4511baaae3f34a667058e7f0c5f778357d98320cf38Myles Watson * index. 4528af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 4538af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 4548af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns uint8_t: index of the device control block. 4558af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 4568af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 457cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonuint8_t bta_hh_dev_handle_to_cb_idx(uint8_t dev_handle) { 458cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint8_t index = BTA_HH_IDX_INVALID; 459ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 460e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_LE_INCLUDED == TRUE) 461cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (BTA_HH_IS_LE_DEV_HDL(dev_handle)) { 462cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (BTA_HH_IS_LE_DEV_HDL_VALID(dev_handle)) 463cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson index = bta_hh_cb.le_cb_index[BTA_HH_GET_LE_CB_IDX(dev_handle)]; 464e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 465cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG("bta_hh_dev_handle_to_cb_idx dev_handle = %d index = %d", 466cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson dev_handle, index); 4672e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif 468cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else 4692e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif 470cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* regular HID device checking */ 471cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (dev_handle < BTA_HH_MAX_KNOWN) 472cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson index = bta_hh_cb.cb_index[dev_handle]; 473ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 474cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return index; 475ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 476e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4788af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 4798af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_hh_trace_dev_db 4808af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 4818af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Check to see if this type of device is supported 4828af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 4838af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns 4848af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 4858af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 486cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_hh_trace_dev_db(void) { 487cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint8_t xx; 4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 489cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG("bta_hh_trace_dev_db:: Device DB list********************"); 4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 491cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson for (xx = 0; xx < BTA_HH_MAX_DEVICE; xx++) { 492cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG("kdev[%d] in_use[%d] handle[%d] ", xx, 493cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_hh_cb.kdev[xx].in_use, bta_hh_cb.kdev[xx].hid_handle); 4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 495cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG( 496cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson "\t\t\t attr_mask[%04x] state [%d] sub_class[%02x] index = %d", 497cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_hh_cb.kdev[xx].attr_mask, bta_hh_cb.kdev[xx].state, 498cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_hh_cb.kdev[xx].sub_class, bta_hh_cb.kdev[xx].index); 499cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 500cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG("*********************************************************"); 5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* HL_INCLUDED */ 504