bta_hh_utils.cc revision d628a0695e73973e0bd54dd026bfed900b69f804
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 245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_hh_int.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 */ 28ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#define BTA_HH_GET_DEF_SSR_MAX_LAT(x) ((x)>> 1) 29ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Constants 325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*****************************************************************************/ 335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTA_HH_KB_CTRL_MASK 0x11 345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTA_HH_KB_SHIFT_MASK 0x22 355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTA_HH_KB_ALT_MASK 0x44 365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTA_HH_KB_GUI_MASK 0x88 375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTA_HH_KB_CAPS_LOCK 0x39 /* caps lock */ 395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTA_HH_KB_NUM_LOCK 0x53 /* num lock */ 405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTA_HH_MAX_RPT_CHARS 8 435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 44e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssenstatic const uint8_t bta_hh_mod_key_mask[BTA_HH_MOD_MAX_KEY] = 455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_HH_KB_CTRL_MASK, 475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_HH_KB_SHIFT_MASK, 485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_HH_KB_ALT_MASK, 495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_HH_KB_GUI_MASK 505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_hh_find_cb 565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Find best available control block according to BD address. 585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 63e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssenuint8_t bta_hh_find_cb(BD_ADDR bda) 645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 65e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen uint8_t xx; 665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* See how many active devices there are. */ 68ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta for (xx = 0; xx < BTA_HH_MAX_DEVICE; xx++) 695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* check if any active/known devices is a match */ 715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((!bdcmp (bda, bta_hh_cb.kdev[xx].addr) && 725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdcmp(bda, bd_addr_null) != 0) ) 735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 74e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 75e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("found kdev_cb[%d] hid_handle = %d ", xx, 765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_cb.kdev[xx].hid_handle) 775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return xx; 795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 80e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 82e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("in_use ? [%d] kdev[%d].hid_handle = %d state = [%d]", 835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_cb.kdev[xx].in_use, xx, 845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_cb.kdev[xx].hid_handle, 855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_cb.kdev[xx].state); 865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if no active device match, find a spot for it */ 90ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta for (xx = 0; xx < BTA_HH_MAX_DEVICE; xx++) 915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!bta_hh_cb.kdev[xx].in_use) 935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdcpy(bta_hh_cb.kdev[xx].addr, bda); 955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 98ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* If device list full, report BTA_HH_IDX_INVALID */ 99e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 100e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_hh_find_cb:: index = %d while max = %d", 101ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta xx, BTA_HH_MAX_DEVICE); 1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 104ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (xx == BTA_HH_MAX_DEVICE) 105ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta xx = BTA_HH_IDX_INVALID; 106ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return xx; 1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_hh_clean_up_kdev 1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Clean up device control block when device is removed from 1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** manitainace list, and update control block index map. 1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_clean_up_kdev(tBTA_HH_DEV_CB *p_cb) 1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 122e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen uint8_t index; 1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cb->hid_handle != BTA_HH_INVALID_HANDLE ) 125ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 126e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_LE_INCLUDED == TRUE) 1272e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_cb->is_le_device) 1282e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_cb.le_cb_index[BTA_HH_GET_LE_CB_IDX(p_cb->hid_handle)] = BTA_HH_IDX_INVALID; 1292e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach else 1302e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif 131ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta bta_hh_cb.cb_index[p_cb->hid_handle] = BTA_HH_IDX_INVALID; 132ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* reset device control block */ 1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project index = p_cb->index; /* Preserve index for this control block */ 1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Free buffer for report descriptor info */ 138cceb430489a70add1b996d54289867c17f4ac0fdPavlin Radoslavov osi_free_and_reset((void **)&p_cb->dscp_info.descriptor.dsc_list); 1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14020524d393e8b3bea4c573f7980cd843500b0e6a4Pavlin Radoslavov memset(p_cb, 0, sizeof(tBTA_HH_DEV_CB)); /* Reset control block */ 1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->index = index; /* Restore index for this control block */ 1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->state = BTA_HH_IDLE_ST; 1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->hid_handle = BTA_HH_INVALID_HANDLE; 1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_hh_update_di_info 1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Maintain a known device list for BTA HH. 1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 156e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssenvoid bta_hh_update_di_info(tBTA_HH_DEV_CB *p_cb, uint16_t vendor_id, uint16_t product_id, 157d628a0695e73973e0bd54dd026bfed900b69f804Myles Watson uint16_t version, 158d628a0695e73973e0bd54dd026bfed900b69f804Myles Watson#if (BTA_HH_LE_INCLUDED == TRUE) 159d628a0695e73973e0bd54dd026bfed900b69f804Myles Watson uint8_t flag) 160d628a0695e73973e0bd54dd026bfed900b69f804Myles Watson#else 161d628a0695e73973e0bd54dd026bfed900b69f804Myles Watson UNUSED_ATTR uint8_t flag) 162d628a0695e73973e0bd54dd026bfed900b69f804Myles Watson#endif 1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 164e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 165e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("vendor_id = 0x%2x product_id = 0x%2x version = 0x%2x", 1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project vendor_id, product_id, version); 1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->dscp_info.vendor_id = vendor_id; 1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->dscp_info.product_id = product_id; 1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->dscp_info.version = version; 171e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_LE_INCLUDED == TRUE) 1722e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_cb->dscp_info.flag = flag; 1732e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif 1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_hh_add_device_to_list 1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Maintain a known device list for BTA HH. 1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 184e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssenvoid bta_hh_add_device_to_list(tBTA_HH_DEV_CB *p_cb, uint8_t handle, 185e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen uint16_t attr_mask, 1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tHID_DEV_DSCP_INFO *p_dscp_info, 187e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen uint8_t sub_class, 188e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen uint16_t ssr_max_latency, 189e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen uint16_t ssr_min_tout, 190e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen uint8_t app_id) 1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 192e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 193e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("subclass = 0x%2x", sub_class); 1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->hid_handle = handle; 197e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen p_cb->in_use = true; 1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->attr_mask = attr_mask; 1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->sub_class = sub_class; 2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->app_id = app_id; 2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 203ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_cb->dscp_info.ssr_max_latency = ssr_max_latency; 204ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_cb->dscp_info.ssr_min_tout = ssr_min_tout; 2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* store report descriptor info */ 207717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov if (p_dscp_info) { 208cceb430489a70add1b996d54289867c17f4ac0fdPavlin Radoslavov osi_free_and_reset((void **)&p_cb->dscp_info.descriptor.dsc_list); 2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 210717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov if (p_dscp_info->dl_len) { 211717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov p_cb->dscp_info.descriptor.dsc_list = 212e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen (uint8_t *)osi_malloc(p_dscp_info->dl_len); 2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->dscp_info.descriptor.dl_len = p_dscp_info->dl_len; 2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(p_cb->dscp_info.descriptor.dsc_list, p_dscp_info->dsc_list, 215717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov p_dscp_info->dl_len); 2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_hh_tod_spt 2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Check to see if this type of device is supported 2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns 2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 229e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssenbool bta_hh_tod_spt(tBTA_HH_DEV_CB *p_cb,uint8_t sub_class) 2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 231e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen uint8_t xx; 232e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen uint8_t cod = (sub_class >> 2); /* lower two bits are reserved */ 2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (xx = 0 ; xx < p_bta_hh_cfg->max_devt_spt; xx ++) 2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 236e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen if (cod == (uint8_t) p_bta_hh_cfg->p_devt_list[xx].tod) 2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->app_id = p_bta_hh_cfg->p_devt_list[xx].app_id; 239e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 240e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_EVENT("bta_hh_tod_spt sub_class:0x%x supported", sub_class); 2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 242e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen return true; 2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 245e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 246e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_EVENT("bta_hh_tod_spt sub_class:0x%x NOT supported", sub_class); 2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 248e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen return false; 2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_hh_parse_keybd_rpt 2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This utility function parse a boot mode keyboard report. 2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 261e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssenvoid bta_hh_parse_keybd_rpt(tBTA_HH_BOOT_RPT *p_kb_data, uint8_t *p_report, 262e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen uint16_t report_len) 2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_HH_KB_CB *p_kb = &bta_hh_cb.kb_cb; 2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_HH_KEYBD_RPT *p_data = &p_kb_data->data_rpt.keybd_rpt; 2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 267e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen uint8_t this_char, ctl_shift; 268e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen uint16_t xx, yy, key_idx = 0; 269e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen uint8_t this_report[BTA_HH_MAX_RPT_CHARS]; 2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 271e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 272e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_hh_parse_keybd_rpt: (report=%p, report_len=%d) called", 2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_report, report_len); 2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (report_len < 2) 2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ctl_shift = *p_report++; 2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project report_len--; 2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (report_len > BTA_HH_MAX_RPT_CHARS) 2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project report_len = BTA_HH_MAX_RPT_CHARS; 2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset (this_report, 0, BTA_HH_MAX_RPT_CHARS); 2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset (p_data, 0, sizeof(tBTA_HH_KEYBD_RPT)); 2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (this_report, p_report, report_len); 2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Take care of shift, control, GUI and alt, modifier keys */ 2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (xx = 0; xx < BTA_HH_MOD_MAX_KEY; xx ++ ) 2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (ctl_shift & bta_hh_mod_key_mask[xx]) 2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 294e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("Mod Key[%02x] pressed", bta_hh_mod_key_mask[xx] ); 295e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen p_kb->mod_key[xx] = true; 2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (p_kb->mod_key[xx]) 2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 299e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen p_kb->mod_key[xx] = false; 3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* control key flag is set */ 3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->mod_key[xx] = p_kb->mod_key[xx]; 3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /***************************************************************************/ 3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* First step is to remove all characters we saw in the last report */ 3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /***************************************************************************/ 3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (xx = 0; xx < report_len; xx++) 3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (yy = 0; yy < BTA_HH_MAX_RPT_CHARS; yy++) 3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (this_report[xx] == p_kb->last_report[yy]) 3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project this_report[xx] = 0; 3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /***************************************************************************/ 3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Now, process all the characters in the report, up to 6 keycodes */ 3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /***************************************************************************/ 3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (xx = 0; xx < report_len; xx++) 3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 323e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 324e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("this_char = %02x", this_report[xx]); 3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((this_char = this_report[xx]) == 0) 3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project continue; 3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* take the key code as the report data */ 3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (this_report[xx] == BTA_HH_KB_CAPS_LOCK) 330e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen p_kb->caps_lock = p_kb->caps_lock ? false : true; 3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (this_report[xx] == BTA_HH_KB_NUM_LOCK) 332e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen p_kb->num_lock = p_kb->num_lock ? false : true; 3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->this_char[key_idx ++] = this_char; 3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 336e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 337e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("found keycode %02x ", this_report[xx]); 3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->caps_lock = p_kb->caps_lock; 340ae003af6b43030d4059db29dee28e48bf0c6ea49Kim Schulz p_data->num_lock = p_kb->num_lock; 3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset (p_kb->last_report, 0, BTA_HH_MAX_RPT_CHARS); 3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (p_kb->last_report, p_report, report_len); 3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_hh_parse_mice_rpt 3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This utility function parse a boot mode mouse report. 3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 358e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssenvoid bta_hh_parse_mice_rpt(tBTA_HH_BOOT_RPT *p_mice_data, uint8_t *p_report, 359e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen uint16_t report_len) 3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_HH_MICE_RPT *p_data = &p_mice_data->data_rpt.mice_rpt; 362e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 363e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen uint8_t xx; 3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 365e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_hh_parse_mice_rpt: bta_keybd_rpt_rcvd(report=%p, \ 3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project report_len=%d) called", p_report, report_len); 3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (report_len < 3) 3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (report_len > BTA_HH_MAX_RPT_CHARS) 3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project report_len = BTA_HH_MAX_RPT_CHARS; 3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 375e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (xx = 0; xx < report_len; xx++) 3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 378e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("this_char = %02x", p_report[xx]); 3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* only first bytes lower 3 bits valid */ 3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->mouse_button = (p_report[0] & 0x07); 3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* x displacement */ 3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->delta_x = p_report[1]; 3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* y displacement */ 3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->delta_y = p_report[2]; 3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 391e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 392e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("mice button: 0x%2x", p_data->mouse_button); 393e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("mice move: x = %d y = %d", p_data->delta_x, 3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->delta_y ); 3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 401ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************* 402ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 403ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function bta_hh_read_ssr_param 404ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 405ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description Read the SSR Parameter for the remote device 406ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 407ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns tBTA_HH_STATUS operation status 408ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 409ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/ 410e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie JanssentBTA_HH_STATUS bta_hh_read_ssr_param(BD_ADDR bd_addr, uint16_t *p_max_ssr_lat, uint16_t *p_min_ssr_tout) 411ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{ 412ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta tBTA_HH_STATUS status = BTA_HH_ERR; 413ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta tBTA_HH_CB *p_cb = &bta_hh_cb; 414e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen uint8_t i; 415e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen uint16_t ssr_max_latency; 416ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta for (i = 0; i < BTA_HH_MAX_KNOWN; i ++) 417ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 418ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (memcmp(p_cb->kdev[i].addr, bd_addr, BD_ADDR_LEN) == 0) 419ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 420ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 421ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* if remote device does not have HIDSSRHostMaxLatency attribute in SDP, 422ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta set SSR max latency default value here. */ 423ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (p_cb->kdev[i].dscp_info.ssr_max_latency == HID_SSR_PARAM_INVALID) 424ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 425ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* The default is calculated as half of link supervision timeout.*/ 426ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 427ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta BTM_GetLinkSuperTout(p_cb->kdev[i].addr, &ssr_max_latency) ; 428ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta ssr_max_latency = BTA_HH_GET_DEF_SSR_MAX_LAT(ssr_max_latency); 429ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 430ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* per 1.1 spec, if the newly calculated max latency is greater than 431ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta BTA_HH_SSR_MAX_LATENCY_DEF which is 500ms, use BTA_HH_SSR_MAX_LATENCY_DEF */ 432ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (ssr_max_latency > BTA_HH_SSR_MAX_LATENCY_DEF) 433ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta ssr_max_latency = BTA_HH_SSR_MAX_LATENCY_DEF; 434ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 435ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta * p_max_ssr_lat = ssr_max_latency; 436ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 437ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta else 438ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta * p_max_ssr_lat = p_cb->kdev[i].dscp_info.ssr_max_latency; 439ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 440ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (p_cb->kdev[i].dscp_info.ssr_min_tout == HID_SSR_PARAM_INVALID) 441ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta * p_min_ssr_tout = BTA_HH_SSR_MIN_TOUT_DEF; 442ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta else 443ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta * p_min_ssr_tout = p_cb->kdev[i].dscp_info.ssr_min_tout; 444ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 445ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta status = BTA_HH_OK; 446ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 447ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta break; 448ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 449ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 450ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 451ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return status; 452ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 453ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 454ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************* 455ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 456ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function bta_hh_cleanup_disable 457ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 458ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description when disable finished, cleanup control block and send callback 459ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 460ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 461ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns void 462ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 463ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/ 464ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battavoid bta_hh_cleanup_disable(tBTA_HH_STATUS status) 465ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{ 466e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen uint8_t xx; 467ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* free buffer in CB holding report descriptors */ 46820524d393e8b3bea4c573f7980cd843500b0e6a4Pavlin Radoslavov for (xx = 0; xx < BTA_HH_MAX_DEVICE; xx ++) { 469cceb430489a70add1b996d54289867c17f4ac0fdPavlin Radoslavov osi_free_and_reset((void **)&bta_hh_cb.kdev[xx].dscp_info.descriptor.dsc_list); 470ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 471cceb430489a70add1b996d54289867c17f4ac0fdPavlin Radoslavov osi_free_and_reset((void **)&bta_hh_cb.p_disc_db); 472ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 473ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta (* bta_hh_cb.p_cback)(BTA_HH_DISABLE_EVT, (tBTA_HH *)&status); 474ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* all connections are down, no waiting for diconnect */ 475ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta memset(&bta_hh_cb, 0, sizeof(tBTA_HH_CB)); 476ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 477ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 478ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************* 479ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 480ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function bta_hh_dev_handle_to_cb_idx 481ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 482ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description convert a HID device handle to the device control block index. 483ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 484ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 485e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen** Returns uint8_t: index of the device control block. 486ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 487ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/ 488e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssenuint8_t bta_hh_dev_handle_to_cb_idx(uint8_t dev_handle) 489ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{ 490e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen uint8_t index = BTA_HH_IDX_INVALID; 491ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 492e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_LE_INCLUDED == TRUE) 4932e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (BTA_HH_IS_LE_DEV_HDL(dev_handle)) 4942e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 4952e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (BTA_HH_IS_LE_DEV_HDL_VALID(dev_handle)) 4962e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach index = bta_hh_cb.le_cb_index[BTA_HH_GET_LE_CB_IDX(dev_handle)]; 497e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 498e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_hh_dev_handle_to_cb_idx dev_handle = %d index = %d", dev_handle, index); 4992e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif 5002e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 5012e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach else 5022e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif 503ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* regular HID device checking */ 504ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (dev_handle < BTA_HH_MAX_KNOWN ) 505ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta index = bta_hh_cb.cb_index[dev_handle]; 506ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 507ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return index; 508ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 509ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 510e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_hh_trace_dev_db 5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Check to see if this type of device is supported 5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns 5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_trace_dev_db(void) 5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 522e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen uint8_t xx; 5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 524e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_hh_trace_dev_db:: Device DB list********************"); 5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 526ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta for (xx = 0; xx < BTA_HH_MAX_DEVICE; xx++) 5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 528e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("kdev[%d] in_use[%d] handle[%d] ",xx, 5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_cb.kdev[xx].in_use, bta_hh_cb.kdev[xx].hid_handle); 5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 531e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("\t\t\t attr_mask[%04x] state [%d] sub_class[%02x] index = %d", 5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_cb.kdev[xx].attr_mask, bta_hh_cb.kdev[xx].state, 5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_cb.kdev[xx].sub_class, bta_hh_cb.kdev[xx].index); 5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 535e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("*********************************************************"); 5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* HL_INCLUDED */ 539