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