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