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" 215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if defined(BTA_HH_INCLUDED) && (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 445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic const UINT8 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*******************************************************************************/ 635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 bta_hh_find_cb(BD_ADDR bda) 645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 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 { 745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_HH_DEBUG 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 } 805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_HH_DEBUG 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 */ 995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_HH_DEBUG 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{ 1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 index; 1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cb->hid_handle != BTA_HH_INVALID_HANDLE ) 125ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 1262e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#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 */ 1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project utl_freebuf((void **)&p_cb->dscp_info.descriptor.dsc_list); 1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 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*******************************************************************************/ 1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_update_di_info(tBTA_HH_DEV_CB *p_cb, UINT16 vendor_id, UINT16 product_id, 157ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta UINT16 version, UINT8 flag) 1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_HH_DEBUG 160e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("vendor_id = 0x%2x product_id = 0x%2x version = 0x%2x", 1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project vendor_id, product_id, version); 1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->dscp_info.vendor_id = vendor_id; 1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->dscp_info.product_id = product_id; 1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->dscp_info.version = version; 1662e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if (defined BTA_HH_LE_INCLUDED && BTA_HH_LE_INCLUDED == TRUE) 1672e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_cb->dscp_info.flag = flag; 168bf9a8aa26988aedbc161d75f2688641ce59dc001Mike J. Chen#else 169bf9a8aa26988aedbc161d75f2688641ce59dc001Mike J. Chen UNUSED(flag); 1702e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif 1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_hh_add_device_to_list 1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Maintain a known device list for BTA HH. 1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_add_device_to_list(tBTA_HH_DEV_CB *p_cb, UINT8 handle, 1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 attr_mask, 1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tHID_DEV_DSCP_INFO *p_dscp_info, 1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 sub_class, 1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 ssr_max_latency, 1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 ssr_min_tout, 1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 app_id) 1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_HH_DEBUG 190e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("subclass = 0x%2x", sub_class); 1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->hid_handle = handle; 1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->in_use = TRUE; 1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->attr_mask = attr_mask; 1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->sub_class = sub_class; 1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->app_id = app_id; 1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 200ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_cb->dscp_info.ssr_max_latency = ssr_max_latency; 201ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_cb->dscp_info.ssr_min_tout = ssr_min_tout; 2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* store report descriptor info */ 2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( p_dscp_info) 2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project utl_freebuf((void **)&p_cb->dscp_info.descriptor.dsc_list); 2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dscp_info->dl_len && 2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_cb->dscp_info.descriptor.dsc_list = 2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (UINT8 *)GKI_getbuf(p_dscp_info->dl_len)) != NULL) 2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->dscp_info.descriptor.dl_len = p_dscp_info->dl_len; 2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(p_cb->dscp_info.descriptor.dsc_list, p_dscp_info->dsc_list, 2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dscp_info->dl_len); 2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 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*******************************************************************************/ 2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN bta_hh_tod_spt(tBTA_HH_DEV_CB *p_cb,UINT8 sub_class) 2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 xx; 2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 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 { 2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (cod == (UINT8) 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; 2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_HH_DEBUG 240e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_EVENT("bta_hh_tod_spt sub_class:0x%x supported", sub_class); 2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return TRUE; 2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_HH_DEBUG 246e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_EVENT("bta_hh_tod_spt sub_class:0x%x NOT supported", sub_class); 2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 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*******************************************************************************/ 2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_parse_keybd_rpt(tBTA_HH_BOOT_RPT *p_kb_data, UINT8 *p_report, 2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 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 2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 this_char, ctl_shift; 2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 xx, yy, key_idx = 0; 2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 this_report[BTA_HH_MAX_RPT_CHARS]; 2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_HH_DEBUG 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] ); 2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 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 { 2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 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 { 3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_HH_DEBUG 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) 3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 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) 3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 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 3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_HH_DEBUG 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*******************************************************************************/ 3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_parse_mice_rpt(tBTA_HH_BOOT_RPT *p_mice_data, UINT8 *p_report, 3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 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; 3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_HH_DEBUG 3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 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 3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_HH_DEBUG 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 3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_HH_DEBUG 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*******************************************************************************/ 410ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi BattatBTA_HH_STATUS bta_hh_read_ssr_param(BD_ADDR bd_addr, UINT16 *p_max_ssr_lat, UINT16 *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; 414ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta UINT8 i; 415ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta UINT16 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{ 466ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta UINT8 xx; 467ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* free buffer in CB holding report descriptors */ 468ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta for(xx = 0; xx < BTA_HH_MAX_DEVICE; xx ++) 469ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 470ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta utl_freebuf((void **)&bta_hh_cb.kdev[xx].dscp_info.descriptor.dsc_list); 471ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 472ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta utl_freebuf((void **)&bta_hh_cb.p_disc_db); 473ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 474ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta (* bta_hh_cb.p_cback)(BTA_HH_DISABLE_EVT, (tBTA_HH *)&status); 475ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* all connections are down, no waiting for diconnect */ 476ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta memset(&bta_hh_cb, 0, sizeof(tBTA_HH_CB)); 477ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 478ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 479ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************* 480ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 481ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function bta_hh_dev_handle_to_cb_idx 482ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 483ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description convert a HID device handle to the device control block index. 484ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 485ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 486ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns UINT8: index of the device control block. 487ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 488ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/ 489ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi BattaUINT8 bta_hh_dev_handle_to_cb_idx(UINT8 dev_handle) 490ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{ 491ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta UINT8 index = BTA_HH_IDX_INVALID; 492ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 4932e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if BTA_HH_LE_INCLUDED == TRUE 4942e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (BTA_HH_IS_LE_DEV_HDL(dev_handle)) 4952e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 4962e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (BTA_HH_IS_LE_DEV_HDL_VALID(dev_handle)) 4972e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach index = bta_hh_cb.le_cb_index[BTA_HH_GET_LE_CB_IDX(dev_handle)]; 4982e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if BTA_HH_DEBUG == TRUE 499e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_hh_dev_handle_to_cb_idx dev_handle = %d index = %d", dev_handle, index); 5002e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif 5012e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 5022e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach else 5032e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif 504ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* regular HID device checking */ 505ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (dev_handle < BTA_HH_MAX_KNOWN ) 506ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta index = bta_hh_cb.cb_index[dev_handle]; 507ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 508ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return index; 509ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 510ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_HH_DEBUG 5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_hh_trace_dev_db 5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Check to see if this type of device is supported 5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns 5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_trace_dev_db(void) 5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 xx; 5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 525e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_hh_trace_dev_db:: Device DB list********************"); 5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 527ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta for (xx = 0; xx < BTA_HH_MAX_DEVICE; xx++) 5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 529e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("kdev[%d] in_use[%d] handle[%d] ",xx, 5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_cb.kdev[xx].in_use, bta_hh_cb.kdev[xx].hid_handle); 5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 532e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("\t\t\t attr_mask[%04x] state [%d] sub_class[%02x] index = %d", 5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_cb.kdev[xx].attr_mask, bta_hh_cb.kdev[xx].state, 5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_cb.kdev[xx].sub_class, bta_hh_cb.kdev[xx].index); 5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 536e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("*********************************************************"); 5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* HL_INCLUDED */ 540