bta_hh_act.cc revision d628a0695e73973e0bd54dd026bfed900b69f804
15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************
25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Copyright (C) 2005-2012 Broadcom Corporation
45738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
55738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Licensed under the Apache License, Version 2.0 (the "License");
65738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  you may not use this file except in compliance with the License.
75738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  You may obtain a copy of the License at:
85738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
95738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  http://www.apache.org/licenses/LICENSE-2.0
105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  See the License for the specific language governing permissions and
155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  limitations under the License.
165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/
185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
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
27e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (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*****************************************************************************/
46e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssenstatic void bta_hh_cback (uint8_t dev_handle, BD_ADDR addr, uint8_t event,
47e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen                            uint32_t data, BT_HDR *pdata);
48e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssenstatic tBTA_HH_STATUS bta_hh_get_trans_status(uint32_t result);
495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
50e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE)
51e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssenstatic const char* bta_hh_get_w4_event(uint16_t event);
52e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssenstatic const char * bta_hh_hid_event_name(uint16_t 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;
71e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen    uint8_t               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{
122e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen    uint8_t 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    {
135e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen        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{
165d628a0695e73973e0bd54dd026bfed900b69f804Myles Watson#if (BTA_HH_LE_INCLUDED == TRUE)
166d628a0695e73973e0bd54dd026bfed900b69f804Myles Watson    HID_HostDeregister();
167d628a0695e73973e0bd54dd026bfed900b69f804Myles Watson    bta_hh_le_deregister();
168d628a0695e73973e0bd54dd026bfed900b69f804Myles Watson#else
1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_HH_STATUS  status = BTA_HH_OK;
1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Deregister with lower layer */
1724540f59bc447dc2b7b31a3e974b74a60b2417e7dVenkatRaghavan VijayaRaghavan    if (HID_HostDeregister() != HID_SUCCESS)
1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        status = BTA_HH_ERR;
1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
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*******************************************************************************/
188e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssenstatic void bta_hh_sdp_cback(uint16_t result, uint16_t 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;
192e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen    uint8_t              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
202e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE)
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*******************************************************************************/
269e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssenstatic void bta_hh_di_sdp_cback(uint16_t 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;
275e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE)
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        {
308e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE)
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;
341e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen    uint8_t                   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;
359e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE)
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) {
393e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE)
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        }
402556b78b577f7476d29a8a210a8354707a54fc80aHemant Gupta    } else if (bta_hh_cb.p_disc_db) {
403556b78b577f7476d29a8a210a8354707a54fc80aHemant Gupta        /* It is possible that there is incoming/outgoing collision case. DUT initiated
404556b78b577f7476d29a8a210a8354707a54fc80aHemant Gupta         * HID connection at same time remote has connected L2CAP for HID control,
405556b78b577f7476d29a8a210a8354707a54fc80aHemant Gupta         * so SDP would be in progress, when this flow reaches here. Just do nothing
406556b78b577f7476d29a8a210a8354707a54fc80aHemant Gupta         * when the code reaches here, and ongoing SDP completion or failure will handle this case.
407556b78b577f7476d29a8a210a8354707a54fc80aHemant Gupta         */
408556b78b577f7476d29a8a210a8354707a54fc80aHemant Gupta        APPL_TRACE_DEBUG("%s: ignoring as SDP already in progress", __func__);
409556b78b577f7476d29a8a210a8354707a54fc80aHemant Gupta        return;
4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (status != BTA_HH_OK)
4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_hh_sm_execute(p_cb, BTA_HH_SDP_CMPL_EVT, (tBTA_HH_DATA *)&status);
4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return;
4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_hh_sdp_cmpl
4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      When SDP completed, initiate a connection or report error depend
4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  on SDP result.
4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_sdp_cmpl(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data)
4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_HH_CONN            conn_dat;
4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_HH_STATUS          status = p_data->status;
4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
434e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE)
435e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG ("bta_hh_sdp_cmpl:  status 0x%2X",p_data->status);
4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* initialize call back data */
4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset((void *)&conn_dat, 0, sizeof(tBTA_HH_CONN));
4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    conn_dat.handle = p_cb->hid_handle;
4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bdcpy(conn_dat.bda, p_cb->addr);
4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if SDP compl success */
4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( status == BTA_HH_OK)
4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* not incoming connection doing SDP, initiate a HID connection */
4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!p_cb->incoming_conn)
4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            tHID_STATUS ret;
4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* set security level */
4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            HID_HostSetSecurityLevel("", p_cb->sec_mask);
4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* open HID connection */
454891723a42851285ec7e6c2f616a405611789da6bHemant Gupta            ret = HID_HostOpenDev (p_cb->hid_handle);
455891723a42851285ec7e6c2f616a405611789da6bHemant Gupta            APPL_TRACE_DEBUG ("%s: HID_HostOpenDev returned=%d", __func__, ret);
456891723a42851285ec7e6c2f616a405611789da6bHemant Gupta            if (ret == HID_SUCCESS || ret == HID_ERR_ALREADY_CONN)
457891723a42851285ec7e6c2f616a405611789da6bHemant Gupta            {
458891723a42851285ec7e6c2f616a405611789da6bHemant Gupta                status = BTA_HH_OK;
459891723a42851285ec7e6c2f616a405611789da6bHemant Gupta            }
460891723a42851285ec7e6c2f616a405611789da6bHemant Gupta            else if (ret == HID_ERR_CONN_IN_PROCESS)
461891723a42851285ec7e6c2f616a405611789da6bHemant Gupta            {
462891723a42851285ec7e6c2f616a405611789da6bHemant Gupta                /* Connection already in progress, return from here, SDP
463891723a42851285ec7e6c2f616a405611789da6bHemant Gupta                 * will be performed after connection is completed.
464891723a42851285ec7e6c2f616a405611789da6bHemant Gupta                 */
465891723a42851285ec7e6c2f616a405611789da6bHemant Gupta                APPL_TRACE_DEBUG ("%s: connection already in progress", __func__);
466891723a42851285ec7e6c2f616a405611789da6bHemant Gupta                return;
467891723a42851285ec7e6c2f616a405611789da6bHemant Gupta            }
468891723a42851285ec7e6c2f616a405611789da6bHemant Gupta            else
4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
470e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE)
471891723a42851285ec7e6c2f616a405611789da6bHemant Gupta                APPL_TRACE_DEBUG ("%s: HID_HostOpenDev failed: Status 0x%2X", __func__, ret);
4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* open fail, remove device from management device list */
4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                HID_HostRemoveDev( p_cb->hid_handle);
4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                status = BTA_HH_ERR;
4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else /* incoming connection SDP finish */
4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_hh_sm_execute(p_cb, BTA_HH_OPEN_CMPL_EVT, NULL);
4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (status != BTA_HH_OK)
4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4862e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        /* Check if this was incoming connection request  from an unknown device
4872e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach           **and connection failed due to missing HID Device SDP UUID
4882e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach           **In above condition, disconnect the link as well as remove the
4892e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach           **device from list of HID devices*/
4902e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        if ((status == BTA_HH_ERR_SDP) &&
4912e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach           (p_cb->incoming_conn) &&(p_cb->app_id == 0))
4922e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        {
493e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_DEBUG ("bta_hh_sdp_cmpl:SDP failed for  incoming conn :hndl %d",
4942e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                p_cb->incoming_hid_handle);
4952e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            HID_HostRemoveDev( p_cb->incoming_hid_handle);
4962e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        }
4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        conn_dat.status = status;
4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (* bta_hh_cb.p_cback)(BTA_HH_OPEN_EVT, (tBTA_HH *)&conn_dat);
4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* move state machine W4_CONN ->IDLE */
5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_hh_sm_execute(p_cb, BTA_HH_API_CLOSE_EVT, NULL);
5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* if this is an outgoing connection to an unknown device, clean up cb */
5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_cb->app_id == 0 && !p_cb->incoming_conn)
5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* clean up device control block */
5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_hh_clean_up_kdev(p_cb);
5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
509e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE)
5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_hh_trace_dev_db();
5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return;
5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_hh_api_disc_act
5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      HID Host initiate a disconnection.
5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_api_disc_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data)
5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_HH_CBDATA    disc_dat;
5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tHID_STATUS     status;
5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
531e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_LE_INCLUDED == TRUE)
5322e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (p_cb->is_le_device)
5332e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        bta_hh_le_api_disc_act(p_cb);
5342e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    else
5352e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif
5362e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
5372e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        /* found an active connection */
538e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen        disc_dat.handle = p_data ?(uint8_t)p_data->hdr.layer_specific :p_cb->hid_handle;
5392e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        disc_dat.status = BTA_HH_ERR;
5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5412e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        status = HID_HostCloseDev(disc_dat.handle);
5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5432e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        if (status)
5442e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            (* bta_hh_cb.p_cback)(BTA_HH_CLOSE_EVT, (tBTA_HH *)&disc_dat);
5452e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return;
5482e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_hh_open_cmpl_act
5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      HID host connection completed
5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_open_cmpl_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data)
5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_HH_CONN        conn ;
563e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen    uint8_t   dev_handle = p_data ? (uint8_t)p_data->hid_cback.hdr.layer_specific : \
5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        p_cb->hid_handle;
5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset((void *)&conn, 0, sizeof (tBTA_HH_CONN));
5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    conn.handle = dev_handle;
5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bdcpy(conn.bda, p_cb->addr);
5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* increase connection number */
5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_hh_cb.cnt_num ++;
5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* initialize device driver */
5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_hh_co_open(p_cb->hid_handle, p_cb->sub_class,
575ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                       p_cb->attr_mask,  p_cb->app_id);
5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5772e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if (BTA_HH_LE_INCLUDED == TRUE)
5782e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    conn.status = p_cb->status;
5792e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    conn.le_hid = p_cb->is_le_device;
5802e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    conn.scps_supported = p_cb->scps_supported;
5812e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
5822e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (!p_cb->is_le_device)
5832e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif
5842e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
5852e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        /* inform role manager */
5862e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        bta_sys_conn_open( BTA_ID_HH ,p_cb->app_id, p_cb->addr);
5872e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* set protocol mode when not default report mode */
5892e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if ( p_cb->mode != BTA_HH_PROTO_RPT_MODE
5902e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if (BTA_HH_LE_INCLUDED == TRUE)
5912e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach         && !p_cb->is_le_device
5922e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif
5932e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        )
5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((HID_HostWriteDev(dev_handle,
5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                              HID_TRANS_SET_PROTOCOL, HID_PAR_PROTOCOL_BOOT_MODE,
5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                              0,
5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                              0, NULL)) != HID_SUCCESS)
5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* HID connection is up, while SET_PROTO fail */
6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            conn.status = BTA_HH_ERR_PROTO;
6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (* bta_hh_cb.p_cback)(BTA_HH_OPEN_EVT, (tBTA_HH *)&conn);
6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            conn.status = BTA_HH_OK;
6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_cb->w4_evt = BTA_HH_OPEN_EVT;
6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (* bta_hh_cb.p_cback)(BTA_HH_OPEN_EVT, (tBTA_HH *)&conn);
6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
613e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen    p_cb->incoming_conn = false;
6142e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    p_cb->incoming_hid_handle = BTA_HH_INVALID_HANDLE;
6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_hh_open_act
6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      HID host receive HID_OPEN_EVT .
6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
6275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_open_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data)
6285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_HH_API_CONN    conn_data;
6305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
631e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen    uint8_t   dev_handle = p_data ? (uint8_t)p_data->hid_cback.hdr.layer_specific : \
6325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        p_cb->hid_handle;
6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
634e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE)
635e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_EVENT ("bta_hh_open_act:  Device[%d] connected", dev_handle);
6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* SDP has been done */
6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_cb->app_id != 0)
6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_hh_sm_execute(p_cb, BTA_HH_OPEN_CMPL_EVT, p_data);
6425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /*  app_id == 0 indicates an incoming conenction request arrives without SDP
6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        performed, do it first */
6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
647e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen        p_cb->incoming_conn = true;
6482e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        /* store the handle here in case sdp fails - need to disconnect */
6492e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        p_cb->incoming_hid_handle = dev_handle;
6505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memset(&conn_data, 0, sizeof(tBTA_HH_API_CONN));
6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bdcpy(conn_data.bd_addr, p_cb->addr);
6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_hh_start_sdp(p_cb, (tBTA_HH_DATA *)&conn_data);
6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return;
6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_hh_data_act
6635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      HID Host process a data report
6655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
6705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_data_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA * p_data)
6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR  *pdata = p_data->hid_cback.p_data;
673e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen    uint8_t   *p_rpt = (uint8_t *)(pdata + 1) + pdata->offset;
6745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
675e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen    bta_hh_co_data((uint8_t)p_data->hid_cback.hdr.layer_specific, p_rpt, pdata->len,
6765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_cb->mode, p_cb->sub_class, p_cb->dscp_info.ctry_code, p_cb->addr, p_cb->app_id);
6775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
678cceb430489a70add1b996d54289867c17f4ac0fdPavlin Radoslavov    osi_free_and_reset((void **)&pdata);
6795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_hh_handsk_act
6855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      HID Host process a handshake acknoledgement.
6875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
6925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_handsk_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA * p_data)
6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_HH_CBDATA  cback_data ;
6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_HH_HSDATA  hs_data;
6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_HH_CONN    conn ;
6975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
698e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE)
699e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("HANDSHAKE received for: event = %s data= %d",
7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_hh_get_w4_event(p_cb->w4_evt), p_data->hid_cback.data);
7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset(&hs_data, 0, sizeof(tBTA_HH_HSDATA));
7042e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    memset(&cback_data, 0, sizeof(tBTA_HH_CBDATA));
7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (p_cb->w4_evt)
7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* GET_ transsaction, handshake indicate unsupported request */
7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_HH_GET_PROTO_EVT:
7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            hs_data.rsp_data.proto_mode = BTA_HH_PROTO_UNKNOWN;
7115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* fall through */
7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_HH_GET_RPT_EVT:
7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_HH_GET_IDLE_EVT :
7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            hs_data.handle = p_cb->hid_handle;
7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* if handshake gives an OK code for these transaction, fill in UNSUPT */
7165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ((hs_data.status = bta_hh_get_trans_status(p_data->hid_cback.data)) == BTA_HH_OK)
7175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 hs_data.status = BTA_HH_HS_TRANS_NOT_SPT;
7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (* bta_hh_cb.p_cback)(p_cb->w4_evt, (tBTA_HH *)&hs_data);
7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_cb->w4_evt = 0;
7215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* acknoledgement from HID device for SET_ transaction */
7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_HH_SET_RPT_EVT:
7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_HH_SET_PROTO_EVT:
7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_HH_SET_IDLE_EVT :
7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            cback_data.handle  = p_cb->hid_handle;
7285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            cback_data.status = bta_hh_get_trans_status(p_data->hid_cback.data);
7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (* bta_hh_cb.p_cback)(p_cb->w4_evt, (tBTA_HH *)&cback_data);
7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_cb->w4_evt = 0;
7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* SET_PROTOCOL when open connection */
7345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_HH_OPEN_EVT:
7355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            conn.status =p_data->hid_cback.data ? BTA_HH_ERR_PROTO: BTA_HH_OK;
7365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            conn.handle = p_cb->hid_handle;
7375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bdcpy(conn.bda, p_cb->addr);
7385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (* bta_hh_cb.p_cback)(p_cb->w4_evt, (tBTA_HH *)&conn);
739e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE)
7405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_hh_trace_dev_db();
7415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
7425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_cb->w4_evt = 0;
7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        default:
7465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* unknow transaction handshake response */
747e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_DEBUG("unknown transaction type");
7485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
7495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* transaction achknoledgement received, inform PM for mode change */
7525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_sys_idle(BTA_ID_HH, p_cb->app_id, p_cb->addr);
7535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return;
7545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
7565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_hh_ctrl_dat_act
7585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      HID Host process a data report from control channel.
7605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
7635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
7655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_ctrl_dat_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA * p_data)
7665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR          *pdata = p_data->hid_cback.p_data;
768e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen    uint8_t           *data = (uint8_t *)(pdata + 1) + pdata->offset;
7695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_HH_HSDATA    hs_data;
7705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
771e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE)
772e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("Ctrl DATA received w4: event[%s]",
7735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        bta_hh_get_w4_event(p_cb->w4_evt));
7745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
7755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    hs_data.status  = BTA_HH_OK;
7765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    hs_data.handle  = p_cb->hid_handle;
7775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (p_cb->w4_evt)
7795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTA_HH_GET_IDLE_EVT:
7815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        hs_data.rsp_data.idle_rate = *data;
7825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
7835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTA_HH_GET_RPT_EVT:
7845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        hs_data.rsp_data.p_rpt_data = pdata;
7855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
7865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTA_HH_GET_PROTO_EVT:
7875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* match up BTE/BTA report/boot mode def*/
7885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        hs_data.rsp_data.proto_mode = ((*data) == HID_PAR_PROTOCOL_REPORT)? \
7895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    BTA_HH_PROTO_RPT_MODE : BTA_HH_PROTO_BOOT_MODE;
790e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE)
791e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_DEBUG("GET_PROTOCOL Mode = [%s]",
7925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (hs_data.rsp_data.proto_mode == BTA_HH_PROTO_RPT_MODE)? "Report" : "Boot");
7935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
7945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
7955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* should not expect control DATA for SET_ transaction */
7965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTA_HH_SET_PROTO_EVT:
7975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* fall through */
7985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTA_HH_SET_RPT_EVT:
7995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* fall through */
8005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTA_HH_SET_IDLE_EVT :
8015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* fall through */
8025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    default:
803e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE)
804e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_DEBUG("invalid  transaction type for DATA payload: 4_evt[%s]",
8055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        bta_hh_get_w4_event(p_cb->w4_evt));
8065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
8075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
8085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* inform PM for mode change */
8115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_sys_busy(BTA_ID_HH, p_cb->app_id, p_cb->addr);
8125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_sys_idle(BTA_ID_HH, p_cb->app_id, p_cb->addr);
8135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    (* bta_hh_cb.p_cback)(p_cb->w4_evt, (tBTA_HH *)&hs_data);
8155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cb->w4_evt = 0;
817cceb430489a70add1b996d54289867c17f4ac0fdPavlin Radoslavov    osi_free_and_reset((void **)&pdata);
8185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
8205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
8225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8232e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         bta_hh_open_failure
8242e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
8252e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      report HID open failure when at wait for connection state and receive
8262e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**                  device close event.
8272e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
8282e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
8292e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Returns          void
8302e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
8312e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
8322e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_open_failure(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data)
8332e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
8342e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tBTA_HH_CONN            conn_dat ;
835e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen    uint32_t                  reason = p_data->hid_cback.data;    /* Reason for closing (32-bit) */
8362e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
8372e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    memset(&conn_dat, 0, sizeof(tBTA_HH_CONN));
8382e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach     conn_dat.handle = p_cb->hid_handle;
8392e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach     conn_dat.status = (reason == HID_ERR_AUTH_FAILED) ?
8402e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                    BTA_HH_ERR_AUTH_FAILED : BTA_HH_ERR;
8412e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach     bdcpy(conn_dat.bda, p_cb->addr);
8422e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach     HID_HostCloseDev(p_cb->hid_handle);
8432e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
8442e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach     /* Report OPEN fail event */
8452e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach     (*bta_hh_cb.p_cback)(BTA_HH_OPEN_EVT, (tBTA_HH *)&conn_dat);
8462e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
847e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE)
8482e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    bta_hh_trace_dev_db();
8492e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif
8502e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    /* clean up control block, but retain SDP info and device handle */
851e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen    p_cb->vp            = false;
8522e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    p_cb->w4_evt        = 0;
8532e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
8542e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    /* if no connection is active and HH disable is signaled, disable service */
8552e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (bta_hh_cb.cnt_num == 0 && bta_hh_cb.w4_disable)
8562e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
8572e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        bta_hh_disc_cmpl();
8582e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
8592e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
860891723a42851285ec7e6c2f616a405611789da6bHemant Gupta    /* Error in opening hid connection, reset flags */
861e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen    p_cb->incoming_conn = false;
862891723a42851285ec7e6c2f616a405611789da6bHemant Gupta    p_cb->incoming_hid_handle = BTA_HH_INVALID_HANDLE;
8632e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
8642e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
8652e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
8662e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
8675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_hh_close_act
8685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      HID Host process a close event
8705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
8735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
8755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_close_act (tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data)
8765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
8775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_HH_CONN            conn_dat ;
8785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_HH_CBDATA          disc_dat = {BTA_HH_OK, 0};
879e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen    uint32_t                  reason = p_data->hid_cback.data;    /* Reason for closing (32-bit) */
8805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if HID_HDEV_EVT_VC_UNPLUG was received, report BTA_HH_VC_UNPLUG_EVT */
882e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen    uint16_t     event = p_cb->vp ? BTA_HH_VC_UNPLUG_EVT : BTA_HH_CLOSE_EVT;
8835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    disc_dat.handle = p_cb->hid_handle;
8855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    disc_dat.status = p_data->hid_cback.data;
8865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Check reason for closing */
8885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((reason & (HID_L2CAP_CONN_FAIL|HID_L2CAP_REQ_FAIL)) ||  /* Failure to initialize connection (page timeout or l2cap error) */
8895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (reason == HID_ERR_AUTH_FAILED) ||                      /* Authenication error (while initiating) */
8905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (reason == HID_ERR_L2CAP_FAILED))                       /* Failure creating l2cap connection */
8915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
8925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Failure in opening connection */
8935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        conn_dat.handle = p_cb->hid_handle;
8945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        conn_dat.status = (reason == HID_ERR_AUTH_FAILED) ? BTA_HH_ERR_AUTH_FAILED : BTA_HH_ERR;
8955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bdcpy(conn_dat.bda, p_cb->addr);
8965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        HID_HostCloseDev(p_cb->hid_handle);
8975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Report OPEN fail event */
8995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*bta_hh_cb.p_cback)(BTA_HH_OPEN_EVT, (tBTA_HH *)&conn_dat);
9005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
901e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE)
9025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_hh_trace_dev_db();
9035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
9045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
9055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* otherwise report CLOSE/VC_UNPLUG event */
9075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
9085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
9095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* finaliza device driver */
9105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_hh_co_close(p_cb->hid_handle, p_cb->app_id);
9115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* inform role manager */
9125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_sys_conn_close( BTA_ID_HH ,p_cb->app_id, p_cb->addr);
9135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* update total conn number */
9145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_hh_cb.cnt_num --;
9155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (disc_dat.status)
9175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            disc_dat.status = BTA_HH_ERR;
9185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*bta_hh_cb.p_cback)(event, (tBTA_HH *)&disc_dat);
9205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* if virtually unplug, remove device */
9225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_cb->vp )
9235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
9245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            HID_HostRemoveDev( p_cb->hid_handle);
9255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_hh_clean_up_kdev(p_cb);
9265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
9275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
928e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE)
9295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_hh_trace_dev_db();
9305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
9315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* clean up control block, but retain SDP info and device handle */
934e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen    p_cb->vp            = false;
9355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cb->w4_evt        = 0;
9365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if no connection is active and HH disable is signaled, disable service */
9385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (bta_hh_cb.cnt_num == 0 && bta_hh_cb.w4_disable)
9395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
9405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_hh_disc_cmpl();
9415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return;
9445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
9455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
9475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_hh_get_dscp_act
9495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Get device report descriptor
9515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
9545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
956d35a648d39710bbc5ac59f8add85166455af5af7Myles Watsonvoid bta_hh_get_dscp_act(tBTA_HH_DEV_CB *p_cb,
957d35a648d39710bbc5ac59f8add85166455af5af7Myles Watson                         UNUSED_ATTR tBTA_HH_DATA *p_data)
9585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
9595cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen
9602e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if (BTA_HH_LE_INCLUDED == TRUE)
9612e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (p_cb->is_le_device)
9622e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
9632e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        bta_hh_le_get_dscp_act(p_cb);
9642e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
9652e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    else
9662e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif
9675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    (*bta_hh_cb.p_cback)(BTA_HH_GET_DSCP_EVT, (tBTA_HH *)&p_cb->dscp_info);
9685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
9695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
9715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_hh_maint_dev_act
9735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      HID Host maintain device list.
9755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
9785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
9805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_maint_dev_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data)
9815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
9825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_HH_MAINT_DEV       *p_dev_info = &p_data->api_maintdev;
9835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_HH_DEV_INFO        dev_info ;
984e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen    uint8_t                   dev_handle;
9855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    dev_info.status = BTA_HH_ERR;
9875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    dev_info.handle = BTA_HH_INVALID_HANDLE;
9885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (p_dev_info->sub_event)
9905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
9915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTA_HH_ADD_DEV_EVT:    /* add a device */
9925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bdcpy(dev_info.bda, p_dev_info->bda);
9935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* initialize callback data */
9945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_cb->hid_handle == BTA_HH_INVALID_HANDLE)
9955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
9962e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if (BTA_HH_LE_INCLUDED == TRUE)
9972e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            if (bta_hh_is_le_device(p_cb, p_data->api_conn.bd_addr))
9982e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            {
9992e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                dev_info.handle   = bta_hh_le_add_device(p_cb, p_dev_info);
10002e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                dev_info.status   = BTA_HH_OK;
10012e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            }
10022e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            else
10032e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif
10042e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
10055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (HID_HostAddDev(p_dev_info->bda, p_dev_info->attr_mask, &dev_handle)\
10065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            == HID_SUCCESS)
10075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
10085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                dev_info.handle   = dev_handle;
10095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                dev_info.status   = BTA_HH_OK;
10105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1011e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_LE_INCLUDED == TRUE)
10125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* update DI information */
10135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_hh_update_di_info(p_cb,
10145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                      p_dev_info->dscp_info.vendor_id,
10155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                      p_dev_info->dscp_info.product_id,
1016ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                                      p_dev_info->dscp_info.version,
10172e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                      p_dev_info->dscp_info.flag);
10182e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#else
10192e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                bta_hh_update_di_info(p_cb,
10202e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                      p_dev_info->dscp_info.vendor_id,
10212e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                      p_dev_info->dscp_info.product_id,
10222e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                      p_dev_info->dscp_info.version,
1023ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                                      0);
10245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10252e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif
10265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* add to BTA device list */
10275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_hh_add_device_to_list(p_cb, dev_handle,
10285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                          p_dev_info->attr_mask,
10295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                          &p_dev_info->dscp_info.descriptor,
10305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                          p_dev_info->sub_class,
10315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                          p_dev_info->dscp_info.ssr_max_latency,
10325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                          p_dev_info->dscp_info.ssr_min_tout,
10335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                          p_dev_info->app_id);
10345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* update cb_index[] map */
10355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_hh_cb.cb_index[dev_handle] = p_cb->index;
10365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
10375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
10385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else    /* device already been added */
10395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
10405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            dev_info.handle = p_cb->hid_handle;
10415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            dev_info.status = BTA_HH_OK;
10425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
1043e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE)
10445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_hh_trace_dev_db();
10455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
10465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1047ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        break;
10485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTA_HH_RMV_DEV_EVT:    /* remove device */
1049e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen        dev_info.handle = (uint8_t)p_dev_info->hdr.layer_specific;
10505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bdcpy(dev_info.bda, p_cb->addr);
1051ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
1052e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_LE_INCLUDED == TRUE)
10532e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        if (p_cb->is_le_device)
10542e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        {
10552e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            bta_hh_le_remove_dev_bg_conn(p_cb);
10562e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            bta_hh_sm_execute(p_cb, BTA_HH_API_CLOSE_EVT, NULL);
10572e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            bta_hh_clean_up_kdev(p_cb);
10582e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        }
10592e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        else
10602e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif
10615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
10625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if(HID_HostRemoveDev( dev_info.handle ) == HID_SUCCESS)
10635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
10645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                dev_info.status  = BTA_HH_OK;
10655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* remove from known device list in BTA */
10675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_hh_clean_up_kdev(p_cb);
10685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
10695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
10705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
10715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    default:
1073e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_DEBUG("invalid command");
10745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
10755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    (* bta_hh_cb.p_cback)(p_dev_info->sub_event, (tBTA_HH *)&dev_info);
10785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
10795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
10805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_hh_write_dev_act
10825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Write device action. can be SET/GET/DATA transaction.
10845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
10865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
10885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_write_dev_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data)
10895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
10905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_HH_CBDATA     cbdata = {BTA_HH_OK, 0};
1091e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen    uint16_t  event = (p_data->api_sndcmd.t_type - BTA_HH_FST_BTE_TRANS_EVT) +
10925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        BTA_HH_FST_TRANS_CB_EVT;
10935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1094e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_LE_INCLUDED == TRUE)
10952e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (p_cb->is_le_device)
10962e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        bta_hh_le_write_dev_act(p_cb, p_data);
10972e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    else
10982e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif
10992e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
11002e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
11015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cbdata.handle = p_cb->hid_handle;
11025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* match up BTE/BTA report/boot mode def */
11045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_data->api_sndcmd.t_type == HID_TRANS_SET_PROTOCOL)
11055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
11065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_data->api_sndcmd.param = ( p_data->api_sndcmd.param == BTA_HH_PROTO_RPT_MODE) ?\
11075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        HID_PAR_PROTOCOL_REPORT :HID_PAR_PROTOCOL_BOOT_MODE;
11085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
11095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (HID_HostWriteDev (p_cb->hid_handle,
11115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                       p_data->api_sndcmd.t_type,
11125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                       p_data->api_sndcmd.param,
11135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                       p_data->api_sndcmd.data,
11145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                       p_data->api_sndcmd.rpt_id,
11155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                       p_data->api_sndcmd.p_data) != HID_SUCCESS)
11165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1117e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_ERROR("HID_HostWriteDev Error ");
11185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        cbdata.status = BTA_HH_ERR;
11195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_data->api_sndcmd.t_type != HID_TRANS_CONTROL &&
11215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_data->api_sndcmd.t_type != HID_TRANS_DATA)
11225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (* bta_hh_cb.p_cback)(event, (tBTA_HH *)&cbdata);
11235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if (p_data->api_sndcmd.param == BTA_HH_CTRL_VIRTUAL_CABLE_UNPLUG)
11245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (* bta_hh_cb.p_cback)(BTA_HH_VC_UNPLUG_EVT, (tBTA_HH *)&cbdata);
11255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
11265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
11275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
11285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        switch(p_data->api_sndcmd.t_type)
11305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
11315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case HID_TRANS_SET_PROTOCOL:
11325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* fall through */
11335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case HID_TRANS_GET_REPORT:
11345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* fall through */
11355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case HID_TRANS_SET_REPORT:
11365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* fall through */
11375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case HID_TRANS_GET_PROTOCOL:
11385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* fall through */
11395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case HID_TRANS_GET_IDLE:
11405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* fall through */
11415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case HID_TRANS_SET_IDLE:/* set w4_handsk event name for callback function use */
11425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_cb->w4_evt = event;
11435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
11445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case HID_TRANS_DATA:  /* output report */
11455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* fall through */
11465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case HID_TRANS_CONTROL:
11475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* no handshake event will be generated */
11485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* if VC_UNPLUG is issued, set flag */
11495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_data->api_sndcmd.param == BTA_HH_CTRL_VIRTUAL_CABLE_UNPLUG)
1150e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen                p_cb->vp = true;
11515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
11535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* currently not expected */
11545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case HID_TRANS_DATAC:
11555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        default:
1156e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_DEBUG("bta_hh_write_dev_act:: cmd type = %d",
11575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            p_data->api_sndcmd.t_type);
11585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
11595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
11605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* if not control type transaction, notify PM for energy control */
11625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_data->api_sndcmd.t_type != HID_TRANS_CONTROL)
11635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
11645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* inform PM for mode change */
11655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_sys_busy(BTA_ID_HH, p_cb->app_id, p_cb->addr);
11665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_sys_idle(BTA_ID_HH, p_cb->app_id, p_cb->addr);
11675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
11685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if (p_data->api_sndcmd.param == BTA_HH_CTRL_SUSPEND)
11695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
11705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project			bta_sys_sco_close(BTA_ID_HH, p_cb->app_id, p_cb->addr);
11715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
11725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if (p_data->api_sndcmd.param == BTA_HH_CTRL_EXIT_SUSPEND)
11735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
11745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_sys_busy(BTA_ID_HH, p_cb->app_id, p_cb->addr);
11755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
11765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
11775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11782e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
11795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return;
11805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
11815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
11835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Static Function
11845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*****************************************************************************/
11855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
11865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_hh_cback
11885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      BTA HH callback function.
11905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
11935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1195e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssenstatic void bta_hh_cback (uint8_t dev_handle, BD_ADDR addr, uint8_t event,
1196e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen                        uint32_t data, BT_HDR *pdata)
11975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1198e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen    uint16_t  sm_event = BTA_HH_INVALID_EVT;
1199e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen    uint8_t   xx = 0;
12005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1201e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE)
1202e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("bta_hh_cback::HID_event [%s]", bta_hh_hid_event_name(event));
12035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
12045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (event)
12065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
12075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_HDEV_EVT_OPEN:
12085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        sm_event = BTA_HH_INT_OPEN_EVT;
12095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
12105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_HDEV_EVT_CLOSE:
12115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        sm_event = BTA_HH_INT_CLOSE_EVT;
12125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
12135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_HDEV_EVT_INTR_DATA:
12145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        sm_event = BTA_HH_INT_DATA_EVT;
12155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
12165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_HDEV_EVT_HANDSHAKE:
12175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        sm_event = BTA_HH_INT_HANDSK_EVT;
12185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
12195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_HDEV_EVT_CTRL_DATA:
12205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        sm_event = BTA_HH_INT_CTRL_DATA;
12215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
12225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_HDEV_EVT_RETRYING:
12235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
12245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_HDEV_EVT_INTR_DATC:
12255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_HDEV_EVT_CTRL_DATC:
12265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Unhandled events: Free buffer for DATAC */
1227cceb430489a70add1b996d54289867c17f4ac0fdPavlin Radoslavov        osi_free_and_reset((void **)&pdata);
12285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
12295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_HDEV_EVT_VC_UNPLUG:
1230ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        for (xx = 0; xx < BTA_HH_MAX_DEVICE; xx++)
12315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
12325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (bta_hh_cb.kdev[xx].hid_handle == dev_handle)
12335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
1234e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen               bta_hh_cb.kdev[xx].vp = true;
12355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project               break;
12365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
12375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
12385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
12395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
12405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1241717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov    if (sm_event != BTA_HH_INVALID_EVT) {
1242717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov        tBTA_HH_CBACK_DATA *p_buf =
1243717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov            (tBTA_HH_CBACK_DATA *)osi_malloc(sizeof(tBTA_HH_CBACK_DATA) +
1244717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov                                             sizeof(BT_HDR));
1245717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov        p_buf->hdr.event = sm_event;
1246e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen        p_buf->hdr.layer_specific = (uint16_t)dev_handle;
1247717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov        p_buf->data = data;
12482e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        bdcpy(p_buf->addr, addr);
1249717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov        p_buf->p_data = pdata;
12505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_sys_sendmsg(p_buf);
12525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
12535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1254717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov
12555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
12565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_hh_get_trans_status
12585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      translate a handshake result code into BTA HH
12605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  status code
12615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1263e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssenstatic tBTA_HH_STATUS bta_hh_get_trans_status(uint32_t result)
12645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
12655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch(result)
12665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
12675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_PAR_HANDSHAKE_RSP_SUCCESS :                /*   (0) */
12685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return BTA_HH_OK;
12695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_PAR_HANDSHAKE_RSP_NOT_READY :              /*   (1) */
12705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_PAR_HANDSHAKE_RSP_ERR_INVALID_REP_ID:      /*   (2) */
12715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_PAR_HANDSHAKE_RSP_ERR_UNSUPPORTED_REQ :    /*   (3) */
12725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_PAR_HANDSHAKE_RSP_ERR_INVALID_PARAM :      /*   (4) */
12735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (tBTA_HH_STATUS)result;
12745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_PAR_HANDSHAKE_RSP_ERR_UNKNOWN :            /*   (14) */
12755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_PAR_HANDSHAKE_RSP_ERR_FATAL  :             /*   (15) */
12765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    default:
12775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return BTA_HH_HS_ERROR;
12785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
12795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
12805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
12815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
12825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Debug Functions
12835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*****************************************************************************/
12845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1285e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE)
1286e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssenstatic const char* bta_hh_get_w4_event(uint16_t event)
12875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
12885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (event)
12895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
12905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTA_HH_GET_RPT_EVT:
12915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return "BTA_HH_GET_RPT_EVT";
12925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTA_HH_SET_RPT_EVT:
12935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return "BTA_HH_SET_RPT_EVT";
12945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTA_HH_GET_PROTO_EVT:
12955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return "BTA_HH_GET_PROTO_EVT";
12965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTA_HH_SET_PROTO_EVT:
12975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return "BTA_HH_SET_PROTO_EVT";
12985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTA_HH_GET_IDLE_EVT:
12995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return "BTA_HH_GET_IDLE_EVT";
13005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTA_HH_SET_IDLE_EVT:
13015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return "BTA_HH_SET_IDLE_EVT";
13025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTA_HH_OPEN_EVT:
13035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return "BTA_HH_OPEN_EVT";
13045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    default:
13055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return "Unknown event";
13065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
13075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
13095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1310e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssenstatic const char * bta_hh_hid_event_name(uint16_t event)
13115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
13125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (event)
13135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
13145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_HDEV_EVT_OPEN:
13155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return "HID_HDEV_EVT_OPEN";
13165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_HDEV_EVT_CLOSE:
13175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return "HID_HDEV_EVT_CLOSE";
13185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_HDEV_EVT_RETRYING:
13195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return "HID_HDEV_EVT_RETRYING";
13205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_HDEV_EVT_INTR_DATA:
13215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return "HID_HDEV_EVT_INTR_DATA";
13225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_HDEV_EVT_INTR_DATC:
13235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return "HID_HDEV_EVT_INTR_DATC";
13245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_HDEV_EVT_CTRL_DATA:
13255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return "HID_HDEV_EVT_CTRL_DATA";
13265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_HDEV_EVT_CTRL_DATC:
13275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return "HID_HDEV_EVT_CTRL_DATC";
13285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_HDEV_EVT_HANDSHAKE:
13295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return "HID_HDEV_EVT_HANDSHAKE";
13305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_HDEV_EVT_VC_UNPLUG:
13315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return "HID_HDEV_EVT_VC_UNPLUG";
13325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    default:
13335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return "Unknown HID event";
13345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
13355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
13365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
13375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* BTA_HH_INCLUDED */
13385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1339