bta_hh_act.cc revision 717a4a9f3a044f264ec2482c2d1806ec3093707a
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
195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************
205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  This file contains the HID host action functions.
225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/
245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_target.h"
265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if defined(BTA_HH_INCLUDED) && (BTA_HH_INCLUDED == TRUE)
285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h>
305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_sys.h"
325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_api.h"
335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "l2c_api.h"
345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_hh_int.h"
355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_hh_co.h"
365cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen#include "utl.h"
375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Constants
405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*****************************************************************************/
415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Local Function prototypes
455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*****************************************************************************/
462e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachstatic void bta_hh_cback (UINT8 dev_handle, BD_ADDR addr, UINT8 event,
472e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                            UINT32 data, BT_HDR *pdata);
485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTA_HH_STATUS bta_hh_get_trans_status(UINT32 result);
495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_HH_DEBUG
515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic char* bta_hh_get_w4_event(UINT16 event);
525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic char * bta_hh_hid_event_name(UINT16 event);
535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Action Functions
575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*****************************************************************************/
585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_hh_api_enable
615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Perform necessary operations to enable HID host.
635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_api_enable(tBTA_HH_DATA *p_data)
695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_HH_STATUS      status = BTA_HH_ERR;
715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8               xx;
725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* initialize BTE HID */
745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    HID_HostInit();
755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset(&bta_hh_cb, 0, sizeof(tBTA_HH_CB));
775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    HID_HostSetSecurityLevel("", p_data->api_enable.sec_mask);
795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Register with L2CAP */
815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( HID_HostRegister (bta_hh_cback) == HID_SUCCESS)
825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* store parameters */
845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_hh_cb.p_cback = p_data->api_enable.p_cback;
855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        status = BTA_HH_OK;
875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* initialize device CB */
88ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        for (xx = 0; xx < BTA_HH_MAX_DEVICE; xx ++)
895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_hh_cb.kdev[xx].state        = BTA_HH_IDLE_ST;
915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_hh_cb.kdev[xx].hid_handle   = BTA_HH_INVALID_HANDLE;
925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_hh_cb.kdev[xx].index        = xx;
935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
94ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
95ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        /* initialize control block map */
96ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        for (xx = 0; xx < BTA_HH_MAX_KNOWN; xx ++)
97ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            bta_hh_cb.cb_index[xx]          = BTA_HH_IDX_INVALID;
985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1002e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if (BTA_HH_LE_INCLUDED == TRUE)
1012e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (status == BTA_HH_OK)
1022e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
1032e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        bta_hh_le_enable();
1042e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
1052e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    else
1062e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif
107ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        /* signal BTA call back event */
108ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        (* bta_hh_cb.p_cback)(BTA_HH_ENABLE_EVT, (tBTA_HH *)&status);
1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_hh_api_disable
1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Perform necessary operations to disable HID host.
1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
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_api_disable(void)
1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 xx;
1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* service is not enabled */
1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (bta_hh_cb.p_cback == NULL)
1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* no live connection, signal DISC_CMPL_EVT directly */
1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!bta_hh_cb.cnt_num)
1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_hh_disc_cmpl();
1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else /* otherwise, disconnect all live connections */
1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_hh_cb.w4_disable = TRUE;
1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
137ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        for(xx = 0; xx < BTA_HH_MAX_DEVICE; xx ++)
1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* send API_CLOSE event to every connected device */
1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ( bta_hh_cb.kdev[xx].state == BTA_HH_CONN_ST )
1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* disconnect all connected devices */
1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_hh_sm_execute(&bta_hh_cb.kdev[xx],
1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                BTA_HH_API_CLOSE_EVT,
1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                NULL);
1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return;
1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_hh_disc_cmpl
1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      All connections have been closed, disable service.
1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_disc_cmpl(void)
1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_HH_STATUS  status = BTA_HH_OK;
1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Deregister with lower layer */
1684540f59bc447dc2b7b31a3e974b74a60b2417e7dVenkatRaghavan VijayaRaghavan    if (HID_HostDeregister() != HID_SUCCESS)
1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        status = BTA_HH_ERR;
1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1712e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if (BTA_HH_LE_INCLUDED == TRUE)
1722e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    bta_hh_le_deregister();
1734540f59bc447dc2b7b31a3e974b74a60b2417e7dVenkatRaghavan VijayaRaghavan    UNUSED(status);
1744540f59bc447dc2b7b31a3e974b74a60b2417e7dVenkatRaghavan VijayaRaghavan#else
175ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    bta_hh_cleanup_disable(status);
1764540f59bc447dc2b7b31a3e974b74a60b2417e7dVenkatRaghavan VijayaRaghavan#endif
1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
178ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_hh_sdp_cback
1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      SDP callback function.
1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_hh_sdp_cback(UINT16 result, UINT16 attr_mask,
1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                  tHID_DEV_SDP_INFO *sdp_rec )
1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_HH_DEV_CB     *p_cb = bta_hh_cb.p_cur;
1924540f59bc447dc2b7b31a3e974b74a60b2417e7dVenkatRaghavan VijayaRaghavan    UINT8              hdl = 0;
1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_HH_STATUS    status = BTA_HH_ERR_SDP;
1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
195ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    /* make sure sdp succeeded and hh has not been disabled */
196ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if ((result == SDP_SUCCESS) && (p_cb != NULL))
1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* security is required for the connection, add attr_mask bit*/
1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_cb->sec_mask)
2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            attr_mask |= HID_SEC_REQUIRED;
2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_HH_DEBUG
203e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_EVENT("bta_hh_sdp_cback: p_cb: %d result 0x%02x, \
2042e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                            attr_mask 0x%02x, handle %x", \
2052e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                            p_cb, result, attr_mask,p_cb->hid_handle);
2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* check to see type of device is supported , and should not been added before */
2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (bta_hh_tod_spt(p_cb, sdp_rec->sub_class))
2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* if not added before */
2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_cb->hid_handle == BTA_HH_INVALID_HANDLE)
2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /*  add device/update attr_mask information */
2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if(HID_HostAddDev (p_cb->addr, attr_mask, &hdl) == HID_SUCCESS)
2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    status = BTA_HH_OK;
2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    /* update cb_index[] map */
2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    bta_hh_cb.cb_index[hdl] = p_cb->index;
2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else
2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_cb->app_id = 0;
2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
2259628abf10efe5df159f7ad4c192c3ef89fd7731cZhihai Xu            }
2262a2701cdddac0859a95e58aec542742c450145b9Kim Schulz            else
2272a2701cdddac0859a95e58aec542742c450145b9Kim Schulz            {
2282a2701cdddac0859a95e58aec542742c450145b9Kim Schulz                hdl = p_cb->hid_handle;
2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* else : incoming connection after SDP should update the SDP information as well */
2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_cb->app_id != 0)
2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* update cb information with attr_mask, dscp_info etc. */
2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_hh_add_device_to_list(p_cb,  hdl, attr_mask,
2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                            &sdp_rec->dscp_info,
2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                            sdp_rec->sub_class,
2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                            sdp_rec->ssr_max_latency,
2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                            sdp_rec->ssr_min_tout,
2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                            p_cb->app_id);
2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_cb->dscp_info.ctry_code = sdp_rec->ctry_code;
2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                status = BTA_HH_OK;
2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else /* type of device is not supported */
2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            status = BTA_HH_ERR_TOD_UNSPT;
2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* free disc_db when SDP is completed */
253cceb430489a70add1b996d54289867c17f4ac0fdPavlin Radoslavov    osi_free_and_reset((void **)&bta_hh_cb.p_disc_db);
2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* send SDP_CMPL_EVT into state machine */
2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_hh_sm_execute(p_cb, BTA_HH_SDP_CMPL_EVT, (tBTA_HH_DATA *)&status);
2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return;
2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_hh_di_sdp_cback
2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      SDP DI callback function.
2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_hh_di_sdp_cback(UINT16 result)
2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_HH_DEV_CB     *p_cb = bta_hh_cb.p_cur;
2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_HH_STATUS         status = BTA_HH_ERR_SDP;
2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tSDP_DI_GET_RECORD  di_rec;
2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tHID_STATUS ret;
2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_HH_DEBUG
276e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_EVENT("bta_hh_di_sdp_cback: p_cb: %d result 0x%02x", p_cb, result);
2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
2782e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if DI record does not exist on remote device, vendor_id in tBTA_HH_DEV_DSCP_INFO will be
2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         * set to 0xffff and we will allow the connection to go through. Spec mandates that DI
2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         * record be set, but many HID devices do not set this. So for IOP purposes, we allow the
2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         * connection to go through and update the DI record to invalid DI entry.*/
283ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if (((result == SDP_SUCCESS) || (result == SDP_NO_RECS_MATCH)) && (p_cb != NULL))
2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if(result == SDP_SUCCESS && SDP_GetNumDiRecords(bta_hh_cb.p_disc_db) != 0)
2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* always update information with primary DI record */
2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (SDP_GetDiRecord(1, &di_rec, bta_hh_cb.p_disc_db) == SDP_SUCCESS)
2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
290ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                bta_hh_update_di_info(p_cb, di_rec.rec.vendor, di_rec.rec.product, di_rec.rec.version, 0);
2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else /* no DI recrod available */
2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
296ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            bta_hh_update_di_info(p_cb, BTA_HH_VENDOR_ID_INVALID, 0, 0, 0);
2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((ret = HID_HostGetSDPRecord(p_cb->addr,
3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                 bta_hh_cb.p_disc_db,
3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                 p_bta_hh_cfg->sdp_db_size,
3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                 bta_hh_sdp_cback)) == HID_SUCCESS)
3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            status = BTA_HH_OK;
3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_HH_DEBUG
309e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_DEBUG ("bta_hh_di_sdp_cback:  HID_HostGetSDPRecord failed: Status 0x%2x",
3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                               ret);
3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
31620524d393e8b3bea4c573f7980cd843500b0e6a4Pavlin Radoslavov    if (status != BTA_HH_OK) {
317cceb430489a70add1b996d54289867c17f4ac0fdPavlin Radoslavov        osi_free_and_reset((void **)&bta_hh_cb.p_disc_db);
3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* send SDP_CMPL_EVT into state machine */
3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_hh_sm_execute(p_cb, BTA_HH_SDP_CMPL_EVT, (tBTA_HH_DATA *)&status);
3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return;
3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_hh_start_sdp
3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Start SDP service search, and obtain necessary SDP records.
3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  Only one SDP service search request is allowed at the same
3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  time. For every BTA_HhOpen API call, do SDP first unless SDP
3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  has been done previously.
3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_start_sdp(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data)
3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_HH_STATUS          status = BTA_HH_ERR_SDP;
3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8                   hdl;
3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cb->sec_mask  = p_data->api_conn.sec_mask;
3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cb->mode      = p_data->api_conn.mode;
345ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    bta_hh_cb.p_cur = p_cb;
3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3472e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if (BTA_HH_LE_INCLUDED == TRUE)
3482e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (bta_hh_is_le_device(p_cb, p_data->api_conn.bd_addr))
3492e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
3502e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        bta_hh_le_open_conn(p_cb, p_data->api_conn.bd_addr);
3512e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        return;
3522e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
3532e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif
3542e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if previously virtually cabled device, skip SDP */
3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_cb->app_id)
3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        status = BTA_HH_OK;
3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_HH_DEBUG
360e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_DEBUG("bta_hh_start_sdp:: skip SDP for known devices");
3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_cb->hid_handle == BTA_HH_INVALID_HANDLE)
3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3642e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            if (HID_HostAddDev (p_cb->addr, p_cb->attr_mask, &hdl) \
3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                == HID_SUCCESS)
3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* update device CB with newly register device handle */
3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_hh_add_device_to_list(p_cb,  hdl, p_cb->attr_mask, NULL,
3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                          p_cb->sub_class,
3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                          p_cb->dscp_info.ssr_max_latency,
3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                          p_cb->dscp_info.ssr_min_tout,
3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                          p_cb->app_id);
3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* update cb_index[] map */
3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_hh_cb.cb_index[hdl] = p_cb->index;
3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
377ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                status = BTA_HH_ERR_NO_RES;
3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_hh_sm_execute(p_cb, BTA_HH_SDP_CMPL_EVT, (tBTA_HH_DATA *)&status);
3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* GetSDPRecord. at one time only one SDP precedure can be active */
3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if (!bta_hh_cb.p_disc_db)
3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
386717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov        bta_hh_cb.p_disc_db = (tSDP_DISCOVERY_DB *)osi_malloc(p_bta_hh_cfg->sdp_db_size);
387717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov        bta_hh_cb.p_cur = p_cb;
388717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov        /* do DI discovery first */
389717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov        if (SDP_DiDiscover(p_data->api_conn.bd_addr,
390717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov                           bta_hh_cb.p_disc_db,
391717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov                           p_bta_hh_cfg->sdp_db_size,
392717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov                           bta_hh_di_sdp_cback) != SDP_SUCCESS) {
3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_HH_DEBUG
394717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov            APPL_TRACE_DEBUG("bta_hh_start_sdp:  SDP_DiDiscover failed: \
3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    Status 0x%2X",status);
3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
397717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov            status = BTA_HH_ERR_SDP;
398717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov            osi_free_and_reset((void **)&bta_hh_cb.p_disc_db);
399717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov        } else {
400717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov            status = BTA_HH_OK;
4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (status != BTA_HH_OK)
4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_hh_sm_execute(p_cb, BTA_HH_SDP_CMPL_EVT, (tBTA_HH_DATA *)&status);
4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return;
4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_hh_sdp_cmpl
4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      When SDP completed, initiate a connection or report error depend
4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  on SDP result.
4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_sdp_cmpl(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data)
4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_HH_CONN            conn_dat;
4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_HH_STATUS          status = p_data->status;
4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_HH_DEBUG
427e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG ("bta_hh_sdp_cmpl:  status 0x%2X",p_data->status);
4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* initialize call back data */
4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset((void *)&conn_dat, 0, sizeof(tBTA_HH_CONN));
4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    conn_dat.handle = p_cb->hid_handle;
4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bdcpy(conn_dat.bda, p_cb->addr);
4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if SDP compl success */
4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( status == BTA_HH_OK)
4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* not incoming connection doing SDP, initiate a HID connection */
4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!p_cb->incoming_conn)
4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            tHID_STATUS ret;
4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* set security level */
4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            HID_HostSetSecurityLevel("", p_cb->sec_mask);
4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* open HID connection */
4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ((ret = HID_HostOpenDev (p_cb->hid_handle)) != HID_SUCCESS)
4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_HH_DEBUG
449e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati                APPL_TRACE_DEBUG ("bta_hh_sdp_cmpl:  HID_HostOpenDev failed: \
4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    Status 0x%2X",ret);
4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* open fail, remove device from management device list */
4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                HID_HostRemoveDev( p_cb->hid_handle);
4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                status = BTA_HH_ERR;
4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                status = BTA_HH_OK;
4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else /* incoming connection SDP finish */
4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_hh_sm_execute(p_cb, BTA_HH_OPEN_CMPL_EVT, NULL);
4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (status != BTA_HH_OK)
4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4692e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        /* Check if this was incoming connection request  from an unknown device
4702e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach           **and connection failed due to missing HID Device SDP UUID
4712e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach           **In above condition, disconnect the link as well as remove the
4722e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach           **device from list of HID devices*/
4732e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        if ((status == BTA_HH_ERR_SDP) &&
4742e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach           (p_cb->incoming_conn) &&(p_cb->app_id == 0))
4752e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        {
476e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_DEBUG ("bta_hh_sdp_cmpl:SDP failed for  incoming conn :hndl %d",
4772e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                p_cb->incoming_hid_handle);
4782e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            HID_HostRemoveDev( p_cb->incoming_hid_handle);
4792e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        }
4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        conn_dat.status = status;
4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (* bta_hh_cb.p_cback)(BTA_HH_OPEN_EVT, (tBTA_HH *)&conn_dat);
4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* move state machine W4_CONN ->IDLE */
4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_hh_sm_execute(p_cb, BTA_HH_API_CLOSE_EVT, NULL);
4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* if this is an outgoing connection to an unknown device, clean up cb */
4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_cb->app_id == 0 && !p_cb->incoming_conn)
4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* clean up device control block */
4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_hh_clean_up_kdev(p_cb);
4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_HH_DEBUG
4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_hh_trace_dev_db();
4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return;
4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_hh_api_disc_act
5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      HID Host initiate a disconnection.
5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_api_disc_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data)
5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_HH_CBDATA    disc_dat;
5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tHID_STATUS     status;
5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5142e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if BTA_HH_LE_INCLUDED == TRUE
5152e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (p_cb->is_le_device)
5162e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        bta_hh_le_api_disc_act(p_cb);
5172e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    else
5182e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif
5192e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
5202e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        /* found an active connection */
5212e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        disc_dat.handle = p_data ?(UINT8)p_data->hdr.layer_specific :p_cb->hid_handle;
5222e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        disc_dat.status = BTA_HH_ERR;
5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5242e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        status = HID_HostCloseDev(disc_dat.handle);
5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5262e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        if (status)
5272e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            (* bta_hh_cb.p_cback)(BTA_HH_CLOSE_EVT, (tBTA_HH *)&disc_dat);
5282e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return;
5312e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_hh_open_cmpl_act
5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      HID host connection completed
5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_open_cmpl_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data)
5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_HH_CONN        conn ;
5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   dev_handle = p_data ? (UINT8)p_data->hid_cback.hdr.layer_specific : \
5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        p_cb->hid_handle;
5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset((void *)&conn, 0, sizeof (tBTA_HH_CONN));
5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    conn.handle = dev_handle;
5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bdcpy(conn.bda, p_cb->addr);
5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* increase connection number */
5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_hh_cb.cnt_num ++;
5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* initialize device driver */
5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_hh_co_open(p_cb->hid_handle, p_cb->sub_class,
558ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                       p_cb->attr_mask,  p_cb->app_id);
5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5602e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if (BTA_HH_LE_INCLUDED == TRUE)
5612e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    conn.status = p_cb->status;
5622e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    conn.le_hid = p_cb->is_le_device;
5632e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    conn.scps_supported = p_cb->scps_supported;
5642e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
5652e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (!p_cb->is_le_device)
5662e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif
5672e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
5682e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        /* inform role manager */
5692e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        bta_sys_conn_open( BTA_ID_HH ,p_cb->app_id, p_cb->addr);
5702e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* set protocol mode when not default report mode */
5722e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if ( p_cb->mode != BTA_HH_PROTO_RPT_MODE
5732e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if (BTA_HH_LE_INCLUDED == TRUE)
5742e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach         && !p_cb->is_le_device
5752e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif
5762e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        )
5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((HID_HostWriteDev(dev_handle,
5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                              HID_TRANS_SET_PROTOCOL, HID_PAR_PROTOCOL_BOOT_MODE,
5805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                              0,
5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                              0, NULL)) != HID_SUCCESS)
5825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
5835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* HID connection is up, while SET_PROTO fail */
5845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            conn.status = BTA_HH_ERR_PROTO;
5855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (* bta_hh_cb.p_cback)(BTA_HH_OPEN_EVT, (tBTA_HH *)&conn);
5865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
5875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            conn.status = BTA_HH_OK;
5905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_cb->w4_evt = BTA_HH_OPEN_EVT;
5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (* bta_hh_cb.p_cback)(BTA_HH_OPEN_EVT, (tBTA_HH *)&conn);
5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cb->incoming_conn = FALSE;
5972e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    p_cb->incoming_hid_handle = BTA_HH_INVALID_HANDLE;
5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_hh_open_act
6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      HID host receive HID_OPEN_EVT .
6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_open_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data)
6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_HH_API_CONN    conn_data;
6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   dev_handle = p_data ? (UINT8)p_data->hid_cback.hdr.layer_specific : \
6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        p_cb->hid_handle;
6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6172e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if BTA_HH_DEBUG
618e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_EVENT ("bta_hh_open_act:  Device[%d] connected", dev_handle);
6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* SDP has been done */
6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_cb->app_id != 0)
6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_hh_sm_execute(p_cb, BTA_HH_OPEN_CMPL_EVT, p_data);
6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
6275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /*  app_id == 0 indicates an incoming conenction request arrives without SDP
6285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        performed, do it first */
6295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_cb->incoming_conn = TRUE;
6312e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        /* store the handle here in case sdp fails - need to disconnect */
6322e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        p_cb->incoming_hid_handle = dev_handle;
6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memset(&conn_data, 0, sizeof(tBTA_HH_API_CONN));
6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bdcpy(conn_data.bd_addr, p_cb->addr);
6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_hh_start_sdp(p_cb, (tBTA_HH_DATA *)&conn_data);
6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return;
6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_hh_data_act
6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      HID Host process a data report
6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_data_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA * p_data)
6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR  *pdata = p_data->hid_cback.p_data;
6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   *p_rpt = (UINT8 *)(pdata + 1) + pdata->offset;
6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_hh_co_data((UINT8)p_data->hid_cback.hdr.layer_specific, p_rpt, pdata->len,
6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_cb->mode, p_cb->sub_class, p_cb->dscp_info.ctry_code, p_cb->addr, p_cb->app_id);
6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
661cceb430489a70add1b996d54289867c17f4ac0fdPavlin Radoslavov    osi_free_and_reset((void **)&pdata);
6625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_hh_handsk_act
6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      HID Host process a handshake acknoledgement.
6705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
6735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
6755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_handsk_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA * p_data)
6765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_HH_CBDATA  cback_data ;
6785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_HH_HSDATA  hs_data;
6795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_HH_CONN    conn ;
6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_HH_DEBUG
682e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("HANDSHAKE received for: event = %s data= %d",
6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_hh_get_w4_event(p_cb->w4_evt), p_data->hid_cback.data);
6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
6855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset(&hs_data, 0, sizeof(tBTA_HH_HSDATA));
6872e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    memset(&cback_data, 0, sizeof(tBTA_HH_CBDATA));
6885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (p_cb->w4_evt)
6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* GET_ transsaction, handshake indicate unsupported request */
6925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_HH_GET_PROTO_EVT:
6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            hs_data.rsp_data.proto_mode = BTA_HH_PROTO_UNKNOWN;
6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* fall through */
6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_HH_GET_RPT_EVT:
6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_HH_GET_IDLE_EVT :
6975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            hs_data.handle = p_cb->hid_handle;
6985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* if handshake gives an OK code for these transaction, fill in UNSUPT */
6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ((hs_data.status = bta_hh_get_trans_status(p_data->hid_cback.data)) == BTA_HH_OK)
7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 hs_data.status = BTA_HH_HS_TRANS_NOT_SPT;
7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (* bta_hh_cb.p_cback)(p_cb->w4_evt, (tBTA_HH *)&hs_data);
7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_cb->w4_evt = 0;
7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* acknoledgement from HID device for SET_ transaction */
7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_HH_SET_RPT_EVT:
7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_HH_SET_PROTO_EVT:
7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_HH_SET_IDLE_EVT :
7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            cback_data.handle  = p_cb->hid_handle;
7115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            cback_data.status = bta_hh_get_trans_status(p_data->hid_cback.data);
7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (* bta_hh_cb.p_cback)(p_cb->w4_evt, (tBTA_HH *)&cback_data);
7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_cb->w4_evt = 0;
7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* SET_PROTOCOL when open connection */
7175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_HH_OPEN_EVT:
7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            conn.status =p_data->hid_cback.data ? BTA_HH_ERR_PROTO: BTA_HH_OK;
7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            conn.handle = p_cb->hid_handle;
7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bdcpy(conn.bda, p_cb->addr);
7215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (* bta_hh_cb.p_cback)(p_cb->w4_evt, (tBTA_HH *)&conn);
7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_HH_DEBUG
7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_hh_trace_dev_db();
7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_cb->w4_evt = 0;
7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        default:
7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* unknow transaction handshake response */
730e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_DEBUG("unknown transaction type");
7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* transaction achknoledgement received, inform PM for mode change */
7355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_sys_idle(BTA_ID_HH, p_cb->app_id, p_cb->addr);
7365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return;
7375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
7395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_hh_ctrl_dat_act
7415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      HID Host process a data report from control channel.
7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
7465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
7485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_ctrl_dat_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA * p_data)
7495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR          *pdata = p_data->hid_cback.p_data;
7515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8           *data = (UINT8 *)(pdata + 1) + pdata->offset;
7525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_HH_HSDATA    hs_data;
7535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_HH_DEBUG
755e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("Ctrl DATA received w4: event[%s]",
7565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        bta_hh_get_w4_event(p_cb->w4_evt));
7575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
7585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    hs_data.status  = BTA_HH_OK;
7595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    hs_data.handle  = p_cb->hid_handle;
7605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (p_cb->w4_evt)
7625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTA_HH_GET_IDLE_EVT:
7645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        hs_data.rsp_data.idle_rate = *data;
7655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
7665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTA_HH_GET_RPT_EVT:
7675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        hs_data.rsp_data.p_rpt_data = pdata;
7685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
7695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTA_HH_GET_PROTO_EVT:
7705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* match up BTE/BTA report/boot mode def*/
7715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        hs_data.rsp_data.proto_mode = ((*data) == HID_PAR_PROTOCOL_REPORT)? \
7725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    BTA_HH_PROTO_RPT_MODE : BTA_HH_PROTO_BOOT_MODE;
7735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_HH_DEBUG
774e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_DEBUG("GET_PROTOCOL Mode = [%s]",
7755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (hs_data.rsp_data.proto_mode == BTA_HH_PROTO_RPT_MODE)? "Report" : "Boot");
7765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
7775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
7785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* should not expect control DATA for SET_ transaction */
7795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTA_HH_SET_PROTO_EVT:
7805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* fall through */
7815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTA_HH_SET_RPT_EVT:
7825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* fall through */
7835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTA_HH_SET_IDLE_EVT :
7845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* fall through */
7855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    default:
7865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_HH_DEBUG
787e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_DEBUG("invalid  transaction type for DATA payload: 4_evt[%s]",
7885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        bta_hh_get_w4_event(p_cb->w4_evt));
7895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
7905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
7915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* inform PM for mode change */
7945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_sys_busy(BTA_ID_HH, p_cb->app_id, p_cb->addr);
7955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_sys_idle(BTA_ID_HH, p_cb->app_id, p_cb->addr);
7965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    (* bta_hh_cb.p_cback)(p_cb->w4_evt, (tBTA_HH *)&hs_data);
7985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cb->w4_evt = 0;
800cceb430489a70add1b996d54289867c17f4ac0fdPavlin Radoslavov    osi_free_and_reset((void **)&pdata);
8015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
8035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
8055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8062e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         bta_hh_open_failure
8072e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
8082e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      report HID open failure when at wait for connection state and receive
8092e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**                  device close event.
8102e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
8112e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
8122e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Returns          void
8132e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
8142e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
8152e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_open_failure(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data)
8162e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
8172e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tBTA_HH_CONN            conn_dat ;
8182e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    UINT32                  reason = p_data->hid_cback.data;    /* Reason for closing (32-bit) */
8192e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
8202e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    memset(&conn_dat, 0, sizeof(tBTA_HH_CONN));
8212e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach     conn_dat.handle = p_cb->hid_handle;
8222e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach     conn_dat.status = (reason == HID_ERR_AUTH_FAILED) ?
8232e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                    BTA_HH_ERR_AUTH_FAILED : BTA_HH_ERR;
8242e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach     bdcpy(conn_dat.bda, p_cb->addr);
8252e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach     HID_HostCloseDev(p_cb->hid_handle);
8262e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
8272e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach     /* Report OPEN fail event */
8282e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach     (*bta_hh_cb.p_cback)(BTA_HH_OPEN_EVT, (tBTA_HH *)&conn_dat);
8292e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
8302e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if BTA_HH_DEBUG
8312e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    bta_hh_trace_dev_db();
8322e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif
8332e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    /* clean up control block, but retain SDP info and device handle */
8342e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    p_cb->vp            = FALSE;
8352e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    p_cb->w4_evt        = 0;
8362e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
8372e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    /* if no connection is active and HH disable is signaled, disable service */
8382e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (bta_hh_cb.cnt_num == 0 && bta_hh_cb.w4_disable)
8392e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
8402e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        bta_hh_disc_cmpl();
8412e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
8422e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
8432e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
8442e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
8452e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
8462e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
8475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_hh_close_act
8485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      HID Host process a close event
8505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
8535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
8555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_close_act (tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data)
8565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
8575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_HH_CONN            conn_dat ;
8585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_HH_CBDATA          disc_dat = {BTA_HH_OK, 0};
8595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT32                  reason = p_data->hid_cback.data;    /* Reason for closing (32-bit) */
8605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if HID_HDEV_EVT_VC_UNPLUG was received, report BTA_HH_VC_UNPLUG_EVT */
8625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16     event = p_cb->vp ? BTA_HH_VC_UNPLUG_EVT : BTA_HH_CLOSE_EVT;
8635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    disc_dat.handle = p_cb->hid_handle;
8655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    disc_dat.status = p_data->hid_cback.data;
8665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Check reason for closing */
8685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((reason & (HID_L2CAP_CONN_FAIL|HID_L2CAP_REQ_FAIL)) ||  /* Failure to initialize connection (page timeout or l2cap error) */
8695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (reason == HID_ERR_AUTH_FAILED) ||                      /* Authenication error (while initiating) */
8705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (reason == HID_ERR_L2CAP_FAILED))                       /* Failure creating l2cap connection */
8715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
8725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Failure in opening connection */
8735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        conn_dat.handle = p_cb->hid_handle;
8745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        conn_dat.status = (reason == HID_ERR_AUTH_FAILED) ? BTA_HH_ERR_AUTH_FAILED : BTA_HH_ERR;
8755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bdcpy(conn_dat.bda, p_cb->addr);
8765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        HID_HostCloseDev(p_cb->hid_handle);
8775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Report OPEN fail event */
8795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*bta_hh_cb.p_cback)(BTA_HH_OPEN_EVT, (tBTA_HH *)&conn_dat);
8805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_HH_DEBUG
8825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_hh_trace_dev_db();
8835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
8845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
8855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* otherwise report CLOSE/VC_UNPLUG event */
8875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
8885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
8895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* finaliza device driver */
8905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_hh_co_close(p_cb->hid_handle, p_cb->app_id);
8915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* inform role manager */
8925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_sys_conn_close( BTA_ID_HH ,p_cb->app_id, p_cb->addr);
8935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* update total conn number */
8945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_hh_cb.cnt_num --;
8955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (disc_dat.status)
8975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            disc_dat.status = BTA_HH_ERR;
8985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*bta_hh_cb.p_cback)(event, (tBTA_HH *)&disc_dat);
9005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* if virtually unplug, remove device */
9025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_cb->vp )
9035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
9045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            HID_HostRemoveDev( p_cb->hid_handle);
9055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_hh_clean_up_kdev(p_cb);
9065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
9075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_HH_DEBUG
9095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_hh_trace_dev_db();
9105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
9115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* clean up control block, but retain SDP info and device handle */
9145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cb->vp            = FALSE;
9155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cb->w4_evt        = 0;
9165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if no connection is active and HH disable is signaled, disable service */
9185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (bta_hh_cb.cnt_num == 0 && bta_hh_cb.w4_disable)
9195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
9205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_hh_disc_cmpl();
9215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return;
9245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
9255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
9275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_hh_get_dscp_act
9295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Get device report descriptor
9315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
9345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
9365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_get_dscp_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data)
9375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
9385cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(p_data);
9395cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen
9402e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if (BTA_HH_LE_INCLUDED == TRUE)
9412e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (p_cb->is_le_device)
9422e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
9432e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        bta_hh_le_get_dscp_act(p_cb);
9442e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
9452e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    else
9462e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif
9475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    (*bta_hh_cb.p_cback)(BTA_HH_GET_DSCP_EVT, (tBTA_HH *)&p_cb->dscp_info);
9485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
9495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
9515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_hh_maint_dev_act
9535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      HID Host maintain device list.
9555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
9585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
9605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_maint_dev_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data)
9615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
9625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_HH_MAINT_DEV       *p_dev_info = &p_data->api_maintdev;
9635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_HH_DEV_INFO        dev_info ;
9645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8                   dev_handle;
9655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    dev_info.status = BTA_HH_ERR;
9675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    dev_info.handle = BTA_HH_INVALID_HANDLE;
9685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (p_dev_info->sub_event)
9705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
9715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTA_HH_ADD_DEV_EVT:    /* add a device */
9725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bdcpy(dev_info.bda, p_dev_info->bda);
9735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* initialize callback data */
9745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_cb->hid_handle == BTA_HH_INVALID_HANDLE)
9755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
9762e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if (BTA_HH_LE_INCLUDED == TRUE)
9772e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            if (bta_hh_is_le_device(p_cb, p_data->api_conn.bd_addr))
9782e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            {
9792e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                dev_info.handle   = bta_hh_le_add_device(p_cb, p_dev_info);
9802e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                dev_info.status   = BTA_HH_OK;
9812e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            }
9822e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            else
9832e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif
9842e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
9855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (HID_HostAddDev(p_dev_info->bda, p_dev_info->attr_mask, &dev_handle)\
9865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            == HID_SUCCESS)
9875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
9885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                dev_info.handle   = dev_handle;
9895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                dev_info.status   = BTA_HH_OK;
9905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9912e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if (defined BTA_HH_LE_INCLUDED && BTA_HH_LE_INCLUDED == TRUE)
9925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* update DI information */
9935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_hh_update_di_info(p_cb,
9945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                      p_dev_info->dscp_info.vendor_id,
9955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                      p_dev_info->dscp_info.product_id,
996ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                                      p_dev_info->dscp_info.version,
9972e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                      p_dev_info->dscp_info.flag);
9982e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#else
9992e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                bta_hh_update_di_info(p_cb,
10002e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                      p_dev_info->dscp_info.vendor_id,
10012e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                      p_dev_info->dscp_info.product_id,
10022e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                      p_dev_info->dscp_info.version,
1003ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                                      0);
10045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10052e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif
10065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* add to BTA device list */
10075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_hh_add_device_to_list(p_cb, dev_handle,
10085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                          p_dev_info->attr_mask,
10095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                          &p_dev_info->dscp_info.descriptor,
10105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                          p_dev_info->sub_class,
10115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                          p_dev_info->dscp_info.ssr_max_latency,
10125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                          p_dev_info->dscp_info.ssr_min_tout,
10135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                          p_dev_info->app_id);
10145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* update cb_index[] map */
10155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_hh_cb.cb_index[dev_handle] = p_cb->index;
10165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
10175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
10185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else    /* device already been added */
10195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
10205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            dev_info.handle = p_cb->hid_handle;
10215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            dev_info.status = BTA_HH_OK;
10225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
10235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_HH_DEBUG
10245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_hh_trace_dev_db();
10255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
10265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1027ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        break;
10285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTA_HH_RMV_DEV_EVT:    /* remove device */
10295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        dev_info.handle = (UINT8)p_dev_info->hdr.layer_specific;
10305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bdcpy(dev_info.bda, p_cb->addr);
1031ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
10322e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if BTA_HH_LE_INCLUDED == TRUE
10332e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        if (p_cb->is_le_device)
10342e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        {
10352e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            bta_hh_le_remove_dev_bg_conn(p_cb);
10362e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            bta_hh_sm_execute(p_cb, BTA_HH_API_CLOSE_EVT, NULL);
10372e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            bta_hh_clean_up_kdev(p_cb);
10382e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        }
10392e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        else
10402e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif
10415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
10425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if(HID_HostRemoveDev( dev_info.handle ) == HID_SUCCESS)
10435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
10445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                dev_info.status  = BTA_HH_OK;
10455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* remove from known device list in BTA */
10475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_hh_clean_up_kdev(p_cb);
10485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
10495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
10505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
10515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    default:
1053e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_DEBUG("invalid command");
10545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
10555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    (* bta_hh_cb.p_cback)(p_dev_info->sub_event, (tBTA_HH *)&dev_info);
10585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
10595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
10605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_hh_write_dev_act
10625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Write device action. can be SET/GET/DATA transaction.
10645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
10665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
10685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_write_dev_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data)
10695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
10705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_HH_CBDATA     cbdata = {BTA_HH_OK, 0};
10715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16  event = (p_data->api_sndcmd.t_type - BTA_HH_FST_BTE_TRANS_EVT) +
10725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        BTA_HH_FST_TRANS_CB_EVT;
10735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10742e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if BTA_HH_LE_INCLUDED == TRUE
10752e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (p_cb->is_le_device)
10762e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        bta_hh_le_write_dev_act(p_cb, p_data);
10772e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    else
10782e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif
10792e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
10802e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
10815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cbdata.handle = p_cb->hid_handle;
10825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* match up BTE/BTA report/boot mode def */
10845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_data->api_sndcmd.t_type == HID_TRANS_SET_PROTOCOL)
10855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
10865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_data->api_sndcmd.param = ( p_data->api_sndcmd.param == BTA_HH_PROTO_RPT_MODE) ?\
10875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        HID_PAR_PROTOCOL_REPORT :HID_PAR_PROTOCOL_BOOT_MODE;
10885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (HID_HostWriteDev (p_cb->hid_handle,
10915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                       p_data->api_sndcmd.t_type,
10925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                       p_data->api_sndcmd.param,
10935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                       p_data->api_sndcmd.data,
10945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                       p_data->api_sndcmd.rpt_id,
10955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                       p_data->api_sndcmd.p_data) != HID_SUCCESS)
10965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1097e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_ERROR("HID_HostWriteDev Error ");
10985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        cbdata.status = BTA_HH_ERR;
10995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_data->api_sndcmd.t_type != HID_TRANS_CONTROL &&
11015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_data->api_sndcmd.t_type != HID_TRANS_DATA)
11025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (* bta_hh_cb.p_cback)(event, (tBTA_HH *)&cbdata);
11035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if (p_data->api_sndcmd.param == BTA_HH_CTRL_VIRTUAL_CABLE_UNPLUG)
11045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (* bta_hh_cb.p_cback)(BTA_HH_VC_UNPLUG_EVT, (tBTA_HH *)&cbdata);
11055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
11065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
11075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
11085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        switch(p_data->api_sndcmd.t_type)
11105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
11115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case HID_TRANS_SET_PROTOCOL:
11125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* fall through */
11135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case HID_TRANS_GET_REPORT:
11145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* fall through */
11155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case HID_TRANS_SET_REPORT:
11165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* fall through */
11175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case HID_TRANS_GET_PROTOCOL:
11185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* fall through */
11195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case HID_TRANS_GET_IDLE:
11205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* fall through */
11215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case HID_TRANS_SET_IDLE:/* set w4_handsk event name for callback function use */
11225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_cb->w4_evt = event;
11235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
11245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case HID_TRANS_DATA:  /* output report */
11255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* fall through */
11265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case HID_TRANS_CONTROL:
11275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* no handshake event will be generated */
11285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* if VC_UNPLUG is issued, set flag */
11295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_data->api_sndcmd.param == BTA_HH_CTRL_VIRTUAL_CABLE_UNPLUG)
11305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_cb->vp = TRUE;
11315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
11335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* currently not expected */
11345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case HID_TRANS_DATAC:
11355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        default:
1136e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_DEBUG("bta_hh_write_dev_act:: cmd type = %d",
11375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            p_data->api_sndcmd.t_type);
11385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
11395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
11405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* if not control type transaction, notify PM for energy control */
11425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_data->api_sndcmd.t_type != HID_TRANS_CONTROL)
11435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
11445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* inform PM for mode change */
11455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_sys_busy(BTA_ID_HH, p_cb->app_id, p_cb->addr);
11465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_sys_idle(BTA_ID_HH, p_cb->app_id, p_cb->addr);
11475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
11485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if (p_data->api_sndcmd.param == BTA_HH_CTRL_SUSPEND)
11495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
11505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project			bta_sys_sco_close(BTA_ID_HH, p_cb->app_id, p_cb->addr);
11515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
11525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if (p_data->api_sndcmd.param == BTA_HH_CTRL_EXIT_SUSPEND)
11535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
11545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_sys_busy(BTA_ID_HH, p_cb->app_id, p_cb->addr);
11555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
11565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
11575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11582e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
11595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return;
11605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
11615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
11635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Static Function
11645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*****************************************************************************/
11655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
11665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_hh_cback
11685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      BTA HH callback function.
11705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
11735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
11752e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachstatic void bta_hh_cback (UINT8 dev_handle, BD_ADDR addr, UINT8 event,
11762e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                        UINT32 data, BT_HDR *pdata)
11775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
11785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16  sm_event = BTA_HH_INVALID_EVT;
11795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   xx = 0;
11805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_HH_DEBUG
1182e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("bta_hh_cback::HID_event [%s]", bta_hh_hid_event_name(event));
11835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
11845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (event)
11865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
11875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_HDEV_EVT_OPEN:
11885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        sm_event = BTA_HH_INT_OPEN_EVT;
11895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
11905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_HDEV_EVT_CLOSE:
11915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        sm_event = BTA_HH_INT_CLOSE_EVT;
11925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
11935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_HDEV_EVT_INTR_DATA:
11945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        sm_event = BTA_HH_INT_DATA_EVT;
11955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
11965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_HDEV_EVT_HANDSHAKE:
11975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        sm_event = BTA_HH_INT_HANDSK_EVT;
11985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
11995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_HDEV_EVT_CTRL_DATA:
12005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        sm_event = BTA_HH_INT_CTRL_DATA;
12015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
12025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_HDEV_EVT_RETRYING:
12035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
12045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_HDEV_EVT_INTR_DATC:
12055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_HDEV_EVT_CTRL_DATC:
12065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Unhandled events: Free buffer for DATAC */
1207cceb430489a70add1b996d54289867c17f4ac0fdPavlin Radoslavov        osi_free_and_reset((void **)&pdata);
12085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
12095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_HDEV_EVT_VC_UNPLUG:
1210ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        for (xx = 0; xx < BTA_HH_MAX_DEVICE; xx++)
12115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
12125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (bta_hh_cb.kdev[xx].hid_handle == dev_handle)
12135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
12145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project               bta_hh_cb.kdev[xx].vp = TRUE;
12155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project               break;
12165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
12175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
12185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
12195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
12205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1221717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov    if (sm_event != BTA_HH_INVALID_EVT) {
1222717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov        tBTA_HH_CBACK_DATA *p_buf =
1223717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov            (tBTA_HH_CBACK_DATA *)osi_malloc(sizeof(tBTA_HH_CBACK_DATA) +
1224717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov                                             sizeof(BT_HDR));
1225717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov        p_buf->hdr.event = sm_event;
12265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_buf->hdr.layer_specific = (UINT16)dev_handle;
1227717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov        p_buf->data = data;
12282e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        bdcpy(p_buf->addr, addr);
1229717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov        p_buf->p_data = pdata;
12305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_sys_sendmsg(p_buf);
12325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
12335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1234717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov
12355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
12365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_hh_get_trans_status
12385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      translate a handshake result code into BTA HH
12405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  status code
12415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
12435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTA_HH_STATUS bta_hh_get_trans_status(UINT32 result)
12445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
12455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch(result)
12465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
12475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_PAR_HANDSHAKE_RSP_SUCCESS :                /*   (0) */
12485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return BTA_HH_OK;
12495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_PAR_HANDSHAKE_RSP_NOT_READY :              /*   (1) */
12505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_PAR_HANDSHAKE_RSP_ERR_INVALID_REP_ID:      /*   (2) */
12515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_PAR_HANDSHAKE_RSP_ERR_UNSUPPORTED_REQ :    /*   (3) */
12525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_PAR_HANDSHAKE_RSP_ERR_INVALID_PARAM :      /*   (4) */
12535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (tBTA_HH_STATUS)result;
12545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_PAR_HANDSHAKE_RSP_ERR_UNKNOWN :            /*   (14) */
12555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_PAR_HANDSHAKE_RSP_ERR_FATAL  :             /*   (15) */
12565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    default:
12575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return BTA_HH_HS_ERROR;
12585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
12595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
12605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
12615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
12625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Debug Functions
12635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*****************************************************************************/
12645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (defined BTA_HH_DEBUG && BTA_HH_DEBUG == TRUE)
12665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic char* bta_hh_get_w4_event(UINT16 event)
12675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
12685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (event)
12695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
12705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTA_HH_GET_RPT_EVT:
12715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return "BTA_HH_GET_RPT_EVT";
12725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTA_HH_SET_RPT_EVT:
12735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return "BTA_HH_SET_RPT_EVT";
12745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTA_HH_GET_PROTO_EVT:
12755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return "BTA_HH_GET_PROTO_EVT";
12765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTA_HH_SET_PROTO_EVT:
12775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return "BTA_HH_SET_PROTO_EVT";
12785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTA_HH_GET_IDLE_EVT:
12795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return "BTA_HH_GET_IDLE_EVT";
12805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTA_HH_SET_IDLE_EVT:
12815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return "BTA_HH_SET_IDLE_EVT";
12825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTA_HH_OPEN_EVT:
12835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return "BTA_HH_OPEN_EVT";
12845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    default:
12855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return "Unknown event";
12865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
12875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
12895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic char * bta_hh_hid_event_name(UINT16 event)
12915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
12925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (event)
12935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
12945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_HDEV_EVT_OPEN:
12955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return "HID_HDEV_EVT_OPEN";
12965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_HDEV_EVT_CLOSE:
12975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return "HID_HDEV_EVT_CLOSE";
12985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_HDEV_EVT_RETRYING:
12995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return "HID_HDEV_EVT_RETRYING";
13005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_HDEV_EVT_INTR_DATA:
13015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return "HID_HDEV_EVT_INTR_DATA";
13025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_HDEV_EVT_INTR_DATC:
13035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return "HID_HDEV_EVT_INTR_DATC";
13045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_HDEV_EVT_CTRL_DATA:
13055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return "HID_HDEV_EVT_CTRL_DATA";
13065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_HDEV_EVT_CTRL_DATC:
13075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return "HID_HDEV_EVT_CTRL_DATC";
13085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_HDEV_EVT_HANDSHAKE:
13095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return "HID_HDEV_EVT_HANDSHAKE";
13105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_HDEV_EVT_VC_UNPLUG:
13115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return "HID_HDEV_EVT_VC_UNPLUG";
13125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    default:
13135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return "Unknown HID event";
13145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
13155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
13165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
13175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* BTA_HH_INCLUDED */
13185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1319