bta_hh_act.cc revision 4540f59bc447dc2b7b31a3e974b74a60b2417e7d
15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Copyright (C) 2005-2012 Broadcom Corporation 45738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 55738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 65738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * you may not use this file except in compliance with the License. 75738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * You may obtain a copy of the License at: 85738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 95738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * See the License for the specific language governing permissions and 155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * limitations under the License. 165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * This file contains the HID host action functions. 225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_target.h" 265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if defined(BTA_HH_INCLUDED) && (BTA_HH_INCLUDED == TRUE) 285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h> 305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_sys.h" 325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_api.h" 335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "l2c_api.h" 345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_hh_int.h" 355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_hh_co.h" 365cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen#include "utl.h" 375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Constants 405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*****************************************************************************/ 415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Local Function prototypes 455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*****************************************************************************/ 462e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachstatic void bta_hh_cback (UINT8 dev_handle, BD_ADDR addr, UINT8 event, 472e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach UINT32 data, BT_HDR *pdata); 485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTA_HH_STATUS bta_hh_get_trans_status(UINT32 result); 495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_HH_DEBUG 515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic char* bta_hh_get_w4_event(UINT16 event); 525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic char * bta_hh_hid_event_name(UINT16 event); 535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Action Functions 575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*****************************************************************************/ 585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_hh_api_enable 615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Perform necessary operations to enable HID host. 635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_api_enable(tBTA_HH_DATA *p_data) 695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_HH_STATUS status = BTA_HH_ERR; 715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 xx; 725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* initialize BTE HID */ 745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project HID_HostInit(); 755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(&bta_hh_cb, 0, sizeof(tBTA_HH_CB)); 775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project HID_HostSetSecurityLevel("", p_data->api_enable.sec_mask); 795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Register with L2CAP */ 815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( HID_HostRegister (bta_hh_cback) == HID_SUCCESS) 825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* store parameters */ 845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_cb.p_cback = p_data->api_enable.p_cback; 855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = BTA_HH_OK; 875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* initialize device CB */ 88ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta for (xx = 0; xx < BTA_HH_MAX_DEVICE; xx ++) 895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_cb.kdev[xx].state = BTA_HH_IDLE_ST; 915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_cb.kdev[xx].hid_handle = BTA_HH_INVALID_HANDLE; 925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_cb.kdev[xx].index = xx; 935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 94ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 95ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* initialize control block map */ 96ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta for (xx = 0; xx < BTA_HH_MAX_KNOWN; xx ++) 97ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta bta_hh_cb.cb_index[xx] = BTA_HH_IDX_INVALID; 985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1002e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if (BTA_HH_LE_INCLUDED == TRUE) 1012e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (status == BTA_HH_OK) 1022e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 1032e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_enable(); 1042e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 1052e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach else 1062e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif 107ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* signal BTA call back event */ 108ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta (* bta_hh_cb.p_cback)(BTA_HH_ENABLE_EVT, (tBTA_HH *)&status); 1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_hh_api_disable 1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Perform necessary operations to disable HID host. 1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_api_disable(void) 1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 xx; 1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* service is not enabled */ 1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_hh_cb.p_cback == NULL) 1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* no live connection, signal DISC_CMPL_EVT directly */ 1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!bta_hh_cb.cnt_num) 1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_disc_cmpl(); 1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else /* otherwise, disconnect all live connections */ 1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_cb.w4_disable = TRUE; 1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 137ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta for(xx = 0; xx < BTA_HH_MAX_DEVICE; xx ++) 1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send API_CLOSE event to every connected device */ 1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( bta_hh_cb.kdev[xx].state == BTA_HH_CONN_ST ) 1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* disconnect all connected devices */ 1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_sm_execute(&bta_hh_cb.kdev[xx], 1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_HH_API_CLOSE_EVT, 1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project NULL); 1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_hh_disc_cmpl 1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description All connections have been closed, disable service. 1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_disc_cmpl(void) 1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_HH_STATUS status = BTA_HH_OK; 1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Deregister with lower layer */ 1684540f59bc447dc2b7b31a3e974b74a60b2417e7dVenkatRaghavan VijayaRaghavan if (HID_HostDeregister() != HID_SUCCESS) 1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = BTA_HH_ERR; 1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1712e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if (BTA_HH_LE_INCLUDED == TRUE) 1722e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_deregister(); 1734540f59bc447dc2b7b31a3e974b74a60b2417e7dVenkatRaghavan VijayaRaghavan UNUSED(status); 1744540f59bc447dc2b7b31a3e974b74a60b2417e7dVenkatRaghavan VijayaRaghavan#else 175ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta bta_hh_cleanup_disable(status); 1764540f59bc447dc2b7b31a3e974b74a60b2417e7dVenkatRaghavan VijayaRaghavan#endif 1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 178ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_hh_sdp_cback 1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description SDP callback function. 1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_hh_sdp_cback(UINT16 result, UINT16 attr_mask, 1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tHID_DEV_SDP_INFO *sdp_rec ) 1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_HH_DEV_CB *p_cb = bta_hh_cb.p_cur; 1924540f59bc447dc2b7b31a3e974b74a60b2417e7dVenkatRaghavan VijayaRaghavan UINT8 hdl = 0; 1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_HH_STATUS status = BTA_HH_ERR_SDP; 1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 195ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* make sure sdp succeeded and hh has not been disabled */ 196ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if ((result == SDP_SUCCESS) && (p_cb != NULL)) 1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* security is required for the connection, add attr_mask bit*/ 1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cb->sec_mask) 2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project attr_mask |= HID_SEC_REQUIRED; 2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_HH_DEBUG 203e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_EVENT("bta_hh_sdp_cback: p_cb: %d result 0x%02x, \ 2042e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach attr_mask 0x%02x, handle %x", \ 2052e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_cb, result, attr_mask,p_cb->hid_handle); 2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* check to see type of device is supported , and should not been added before */ 2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_hh_tod_spt(p_cb, sdp_rec->sub_class)) 2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if not added before */ 2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cb->hid_handle == BTA_HH_INVALID_HANDLE) 2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* add device/update attr_mask information */ 2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(HID_HostAddDev (p_cb->addr, attr_mask, &hdl) == HID_SUCCESS) 2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = BTA_HH_OK; 2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* update cb_index[] map */ 2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_cb.cb_index[hdl] = p_cb->index; 2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->app_id = 0; 2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2259628abf10efe5df159f7ad4c192c3ef89fd7731cZhihai Xu } 2262a2701cdddac0859a95e58aec542742c450145b9Kim Schulz else 2272a2701cdddac0859a95e58aec542742c450145b9Kim Schulz { 2282a2701cdddac0859a95e58aec542742c450145b9Kim Schulz hdl = p_cb->hid_handle; 2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* else : incoming connection after SDP should update the SDP information as well */ 2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cb->app_id != 0) 2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* update cb information with attr_mask, dscp_info etc. */ 2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_add_device_to_list(p_cb, hdl, attr_mask, 2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project &sdp_rec->dscp_info, 2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sdp_rec->sub_class, 2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sdp_rec->ssr_max_latency, 2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sdp_rec->ssr_min_tout, 2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->app_id); 2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->dscp_info.ctry_code = sdp_rec->ctry_code; 2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = BTA_HH_OK; 2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else /* type of device is not supported */ 2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = BTA_HH_ERR_TOD_UNSPT; 2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* free disc_db when SDP is completed */ 2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project utl_freebuf((void **)&bta_hh_cb.p_disc_db); 2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send SDP_CMPL_EVT into state machine */ 2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_sm_execute(p_cb, BTA_HH_SDP_CMPL_EVT, (tBTA_HH_DATA *)&status); 2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_hh_di_sdp_cback 2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description SDP DI callback function. 2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_hh_di_sdp_cback(UINT16 result) 2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_HH_DEV_CB *p_cb = bta_hh_cb.p_cur; 2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_HH_STATUS status = BTA_HH_ERR_SDP; 2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSDP_DI_GET_RECORD di_rec; 2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tHID_STATUS ret; 2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_HH_DEBUG 276e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_EVENT("bta_hh_di_sdp_cback: p_cb: %d result 0x%02x", p_cb, result); 2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2782e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if DI record does not exist on remote device, vendor_id in tBTA_HH_DEV_DSCP_INFO will be 2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * set to 0xffff and we will allow the connection to go through. Spec mandates that DI 2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * record be set, but many HID devices do not set this. So for IOP purposes, we allow the 2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * connection to go through and update the DI record to invalid DI entry.*/ 283ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (((result == SDP_SUCCESS) || (result == SDP_NO_RECS_MATCH)) && (p_cb != NULL)) 2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(result == SDP_SUCCESS && SDP_GetNumDiRecords(bta_hh_cb.p_disc_db) != 0) 2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* always update information with primary DI record */ 2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (SDP_GetDiRecord(1, &di_rec, bta_hh_cb.p_disc_db) == SDP_SUCCESS) 2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 290ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta bta_hh_update_di_info(p_cb, di_rec.rec.vendor, di_rec.rec.product, di_rec.rec.version, 0); 2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else /* no DI recrod available */ 2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 296ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta bta_hh_update_di_info(p_cb, BTA_HH_VENDOR_ID_INVALID, 0, 0, 0); 2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((ret = HID_HostGetSDPRecord(p_cb->addr, 3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_cb.p_disc_db, 3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bta_hh_cfg->sdp_db_size, 3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_sdp_cback)) == HID_SUCCESS) 3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = BTA_HH_OK; 3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_HH_DEBUG 309e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG ("bta_hh_di_sdp_cback: HID_HostGetSDPRecord failed: Status 0x%2x", 3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ret); 3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status != BTA_HH_OK) 3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project utl_freebuf((void **)&bta_hh_cb.p_disc_db); 3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send SDP_CMPL_EVT into state machine */ 3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_sm_execute(p_cb, BTA_HH_SDP_CMPL_EVT, (tBTA_HH_DATA *)&status); 3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 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** 3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_hh_start_sdp 3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Start SDP service search, and obtain necessary SDP records. 3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Only one SDP service search request is allowed at the same 3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** time. For every BTA_HhOpen API call, do SDP first unless SDP 3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** has been done previously. 3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_start_sdp(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data) 3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_HH_STATUS status = BTA_HH_ERR_SDP; 3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 hdl; 3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->sec_mask = p_data->api_conn.sec_mask; 3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->mode = p_data->api_conn.mode; 346ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta bta_hh_cb.p_cur = p_cb; 3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3482e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if (BTA_HH_LE_INCLUDED == TRUE) 3492e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (bta_hh_is_le_device(p_cb, p_data->api_conn.bd_addr)) 3502e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 3512e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_open_conn(p_cb, p_data->api_conn.bd_addr); 3522e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach return; 3532e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 3542e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif 3552e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if previously virtually cabled device, skip SDP */ 3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cb->app_id) 3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = BTA_HH_OK; 3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_HH_DEBUG 361e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_hh_start_sdp:: skip SDP for known devices"); 3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cb->hid_handle == BTA_HH_INVALID_HANDLE) 3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3652e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (HID_HostAddDev (p_cb->addr, p_cb->attr_mask, &hdl) \ 3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project == HID_SUCCESS) 3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* update device CB with newly register device handle */ 3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_add_device_to_list(p_cb, hdl, p_cb->attr_mask, NULL, 3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->sub_class, 3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->dscp_info.ssr_max_latency, 3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->dscp_info.ssr_min_tout, 3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->app_id); 3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* update cb_index[] map */ 3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_cb.cb_index[hdl] = p_cb->index; 3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 378ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta status = BTA_HH_ERR_NO_RES; 3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_sm_execute(p_cb, BTA_HH_SDP_CMPL_EVT, (tBTA_HH_DATA *)&status); 3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* GetSDPRecord. at one time only one SDP precedure can be active */ 3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (!bta_hh_cb.p_disc_db) 3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_cb.p_disc_db = (tSDP_DISCOVERY_DB *) GKI_getbuf(p_bta_hh_cfg->sdp_db_size); 3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_hh_cb.p_disc_db == NULL) 3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = BTA_HH_ERR_NO_RES; 3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_cb.p_cur = p_cb; 3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* do DI discovery first */ 3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (SDP_DiDiscover(p_data->api_conn.bd_addr, 3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_cb.p_disc_db, 3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bta_hh_cfg->sdp_db_size, 4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_di_sdp_cback) != SDP_SUCCESS) 4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_HH_DEBUG 403e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG ("bta_hh_start_sdp: SDP_DiDiscover failed: \ 4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project Status 0x%2X",status); 4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = BTA_HH_ERR_SDP; 4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project utl_freebuf((void **)&bta_hh_cb.p_disc_db); 4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = BTA_HH_OK; 4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status != BTA_HH_OK) 4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_sm_execute(p_cb, BTA_HH_SDP_CMPL_EVT, (tBTA_HH_DATA *)&status); 4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_hh_sdp_cmpl 4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description When SDP completed, initiate a connection or report error depend 4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** on SDP result. 4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_sdp_cmpl(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data) 4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_HH_CONN conn_dat; 4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_HH_STATUS status = p_data->status; 4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_HH_DEBUG 437e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG ("bta_hh_sdp_cmpl: status 0x%2X",p_data->status); 4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* initialize call back data */ 4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset((void *)&conn_dat, 0, sizeof(tBTA_HH_CONN)); 4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project conn_dat.handle = p_cb->hid_handle; 4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdcpy(conn_dat.bda, p_cb->addr); 4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if SDP compl success */ 4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( status == BTA_HH_OK) 4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* not incoming connection doing SDP, initiate a HID connection */ 4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_cb->incoming_conn) 4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tHID_STATUS ret; 4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* set security level */ 4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project HID_HostSetSecurityLevel("", p_cb->sec_mask); 4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* open HID connection */ 4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((ret = HID_HostOpenDev (p_cb->hid_handle)) != HID_SUCCESS) 4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_HH_DEBUG 459e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG ("bta_hh_sdp_cmpl: HID_HostOpenDev failed: \ 4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project Status 0x%2X",ret); 4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* open fail, remove device from management device list */ 4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project HID_HostRemoveDev( p_cb->hid_handle); 4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = BTA_HH_ERR; 4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = BTA_HH_OK; 4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else /* incoming connection SDP finish */ 4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_sm_execute(p_cb, BTA_HH_OPEN_CMPL_EVT, NULL); 4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status != BTA_HH_OK) 4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4792e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* Check if this was incoming connection request from an unknown device 4802e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach **and connection failed due to missing HID Device SDP UUID 4812e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach **In above condition, disconnect the link as well as remove the 4822e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach **device from list of HID devices*/ 4832e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if ((status == BTA_HH_ERR_SDP) && 4842e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach (p_cb->incoming_conn) &&(p_cb->app_id == 0)) 4852e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 486e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG ("bta_hh_sdp_cmpl:SDP failed for incoming conn :hndl %d", 4872e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_cb->incoming_hid_handle); 4882e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach HID_HostRemoveDev( p_cb->incoming_hid_handle); 4892e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project conn_dat.status = status; 4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (* bta_hh_cb.p_cback)(BTA_HH_OPEN_EVT, (tBTA_HH *)&conn_dat); 4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* move state machine W4_CONN ->IDLE */ 4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_sm_execute(p_cb, BTA_HH_API_CLOSE_EVT, NULL); 4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if this is an outgoing connection to an unknown device, clean up cb */ 4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cb->app_id == 0 && !p_cb->incoming_conn) 4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* clean up device control block */ 5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_clean_up_kdev(p_cb); 5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_HH_DEBUG 5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_trace_dev_db(); 5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_hh_api_disc_act 5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description HID Host initiate a disconnection. 5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_api_disc_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data) 5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_HH_CBDATA disc_dat; 5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tHID_STATUS status; 5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5242e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if BTA_HH_LE_INCLUDED == TRUE 5252e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_cb->is_le_device) 5262e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_api_disc_act(p_cb); 5272e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach else 5282e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif 5292e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 5302e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* found an active connection */ 5312e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach disc_dat.handle = p_data ?(UINT8)p_data->hdr.layer_specific :p_cb->hid_handle; 5322e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach disc_dat.status = BTA_HH_ERR; 5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5342e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach status = HID_HostCloseDev(disc_dat.handle); 5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5362e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (status) 5372e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach (* bta_hh_cb.p_cback)(BTA_HH_CLOSE_EVT, (tBTA_HH *)&disc_dat); 5382e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 5412e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_hh_open_cmpl_act 5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description HID host connection completed 5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_open_cmpl_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data) 5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_HH_CONN conn ; 5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 dev_handle = p_data ? (UINT8)p_data->hid_cback.hdr.layer_specific : \ 5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->hid_handle; 5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset((void *)&conn, 0, sizeof (tBTA_HH_CONN)); 5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project conn.handle = dev_handle; 5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdcpy(conn.bda, p_cb->addr); 5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* increase connection number */ 5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_cb.cnt_num ++; 5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* initialize device driver */ 5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_co_open(p_cb->hid_handle, p_cb->sub_class, 568ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_cb->attr_mask, p_cb->app_id); 5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5702e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if (BTA_HH_LE_INCLUDED == TRUE) 5712e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach conn.status = p_cb->status; 5722e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach conn.le_hid = p_cb->is_le_device; 5732e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach conn.scps_supported = p_cb->scps_supported; 5742e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 5752e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (!p_cb->is_le_device) 5762e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif 5772e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 5782e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* inform role manager */ 5792e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_sys_conn_open( BTA_ID_HH ,p_cb->app_id, p_cb->addr); 5802e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* set protocol mode when not default report mode */ 5822e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if ( p_cb->mode != BTA_HH_PROTO_RPT_MODE 5832e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if (BTA_HH_LE_INCLUDED == TRUE) 5842e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach && !p_cb->is_le_device 5852e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif 5862e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach ) 5875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((HID_HostWriteDev(dev_handle, 5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project HID_TRANS_SET_PROTOCOL, HID_PAR_PROTOCOL_BOOT_MODE, 5905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 0, 5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 0, NULL)) != HID_SUCCESS) 5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* HID connection is up, while SET_PROTO fail */ 5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project conn.status = BTA_HH_ERR_PROTO; 5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (* bta_hh_cb.p_cback)(BTA_HH_OPEN_EVT, (tBTA_HH *)&conn); 5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project conn.status = BTA_HH_OK; 6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->w4_evt = BTA_HH_OPEN_EVT; 6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (* bta_hh_cb.p_cback)(BTA_HH_OPEN_EVT, (tBTA_HH *)&conn); 6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->incoming_conn = FALSE; 6072e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_cb->incoming_hid_handle = BTA_HH_INVALID_HANDLE; 6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_hh_open_act 6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description HID host receive HID_OPEN_EVT . 6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_open_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data) 6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_HH_API_CONN conn_data; 6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 dev_handle = p_data ? (UINT8)p_data->hid_cback.hdr.layer_specific : \ 6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->hid_handle; 6265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6272e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if BTA_HH_DEBUG 628e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_EVENT ("bta_hh_open_act: Device[%d] connected", dev_handle); 6295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 6305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* SDP has been done */ 6325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cb->app_id != 0) 6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_sm_execute(p_cb, BTA_HH_OPEN_CMPL_EVT, p_data); 6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* app_id == 0 indicates an incoming conenction request arrives without SDP 6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project performed, do it first */ 6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->incoming_conn = TRUE; 6412e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* store the handle here in case sdp fails - need to disconnect */ 6422e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_cb->incoming_hid_handle = dev_handle; 6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(&conn_data, 0, sizeof(tBTA_HH_API_CONN)); 6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdcpy(conn_data.bd_addr, p_cb->addr); 6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_start_sdp(p_cb, (tBTA_HH_DATA *)&conn_data); 6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 6505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_hh_data_act 6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description HID Host process a data report 6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 6635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_data_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA * p_data) 6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_HDR *pdata = p_data->hid_cback.p_data; 6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p_rpt = (UINT8 *)(pdata + 1) + pdata->offset; 6675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_co_data((UINT8)p_data->hid_cback.hdr.layer_specific, p_rpt, pdata->len, 6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->mode, p_cb->sub_class, p_cb->dscp_info.ctry_code, p_cb->addr, p_cb->app_id); 6705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project utl_freebuf((void **)&pdata); 6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_hh_handsk_act 6785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description HID Host process a handshake acknoledgement. 6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 6855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_handsk_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA * p_data) 6865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_HH_CBDATA cback_data ; 6885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_HH_HSDATA hs_data; 6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_HH_CONN conn ; 6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_HH_DEBUG 692e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("HANDSHAKE received for: event = %s data= %d", 6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_get_w4_event(p_cb->w4_evt), p_data->hid_cback.data); 6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(&hs_data, 0, sizeof(tBTA_HH_HSDATA)); 6972e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach memset(&cback_data, 0, sizeof(tBTA_HH_CBDATA)); 6985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (p_cb->w4_evt) 7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* GET_ transsaction, handshake indicate unsupported request */ 7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_GET_PROTO_EVT: 7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project hs_data.rsp_data.proto_mode = BTA_HH_PROTO_UNKNOWN; 7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* fall through */ 7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_GET_RPT_EVT: 7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_GET_IDLE_EVT : 7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project hs_data.handle = p_cb->hid_handle; 7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if handshake gives an OK code for these transaction, fill in UNSUPT */ 7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((hs_data.status = bta_hh_get_trans_status(p_data->hid_cback.data)) == BTA_HH_OK) 7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project hs_data.status = BTA_HH_HS_TRANS_NOT_SPT; 7115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (* bta_hh_cb.p_cback)(p_cb->w4_evt, (tBTA_HH *)&hs_data); 7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->w4_evt = 0; 7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* acknoledgement from HID device for SET_ transaction */ 7175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_SET_RPT_EVT: 7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_SET_PROTO_EVT: 7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_SET_IDLE_EVT : 7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cback_data.handle = p_cb->hid_handle; 7215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cback_data.status = bta_hh_get_trans_status(p_data->hid_cback.data); 7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (* bta_hh_cb.p_cback)(p_cb->w4_evt, (tBTA_HH *)&cback_data); 7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->w4_evt = 0; 7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* SET_PROTOCOL when open connection */ 7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_OPEN_EVT: 7285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project conn.status =p_data->hid_cback.data ? BTA_HH_ERR_PROTO: BTA_HH_OK; 7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project conn.handle = p_cb->hid_handle; 7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdcpy(conn.bda, p_cb->addr); 7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (* bta_hh_cb.p_cback)(p_cb->w4_evt, (tBTA_HH *)&conn); 7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_HH_DEBUG 7335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_trace_dev_db(); 7345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 7355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->w4_evt = 0; 7365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 7375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 7395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* unknow transaction handshake response */ 740e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("unknown transaction type"); 7415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 7425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* transaction achknoledgement received, inform PM for mode change */ 7455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_idle(BTA_ID_HH, p_cb->app_id, p_cb->addr); 7465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 7475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 7495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_hh_ctrl_dat_act 7515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description HID Host process a data report from control channel. 7535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 7565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 7585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_ctrl_dat_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA * p_data) 7595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_HDR *pdata = p_data->hid_cback.p_data; 7615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *data = (UINT8 *)(pdata + 1) + pdata->offset; 7625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_HH_HSDATA hs_data; 7635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_HH_DEBUG 765e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("Ctrl DATA received w4: event[%s]", 7665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_get_w4_event(p_cb->w4_evt)); 7675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 7685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project hs_data.status = BTA_HH_OK; 7695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project hs_data.handle = p_cb->hid_handle; 7705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (p_cb->w4_evt) 7725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_GET_IDLE_EVT: 7745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project hs_data.rsp_data.idle_rate = *data; 7755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 7765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_GET_RPT_EVT: 7775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project hs_data.rsp_data.p_rpt_data = pdata; 7785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 7795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_GET_PROTO_EVT: 7805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* match up BTE/BTA report/boot mode def*/ 7815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project hs_data.rsp_data.proto_mode = ((*data) == HID_PAR_PROTOCOL_REPORT)? \ 7825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_HH_PROTO_RPT_MODE : BTA_HH_PROTO_BOOT_MODE; 7835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_HH_DEBUG 784e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("GET_PROTOCOL Mode = [%s]", 7855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (hs_data.rsp_data.proto_mode == BTA_HH_PROTO_RPT_MODE)? "Report" : "Boot"); 7865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 7875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 7885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* should not expect control DATA for SET_ transaction */ 7895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_SET_PROTO_EVT: 7905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* fall through */ 7915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_SET_RPT_EVT: 7925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* fall through */ 7935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_SET_IDLE_EVT : 7945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* fall through */ 7955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 7965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_HH_DEBUG 797e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("invalid transaction type for DATA payload: 4_evt[%s]", 7985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_get_w4_event(p_cb->w4_evt)); 7995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 8005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* inform PM for mode change */ 8045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_busy(BTA_ID_HH, p_cb->app_id, p_cb->addr); 8055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_idle(BTA_ID_HH, p_cb->app_id, p_cb->addr); 8065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (* bta_hh_cb.p_cback)(p_cb->w4_evt, (tBTA_HH *)&hs_data); 8085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->w4_evt = 0; 8105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project utl_freebuf((void **)&pdata); 8115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 8155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8162e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function bta_hh_open_failure 8172e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 8182e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description report HID open failure when at wait for connection state and receive 8192e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** device close event. 8202e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 8212e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 8222e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Returns void 8232e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 8242e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/ 8252e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_open_failure(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data) 8262e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{ 8272e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBTA_HH_CONN conn_dat ; 8282e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach UINT32 reason = p_data->hid_cback.data; /* Reason for closing (32-bit) */ 8292e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 8302e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach memset(&conn_dat, 0, sizeof(tBTA_HH_CONN)); 8312e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach conn_dat.handle = p_cb->hid_handle; 8322e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach conn_dat.status = (reason == HID_ERR_AUTH_FAILED) ? 8332e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach BTA_HH_ERR_AUTH_FAILED : BTA_HH_ERR; 8342e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bdcpy(conn_dat.bda, p_cb->addr); 8352e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach HID_HostCloseDev(p_cb->hid_handle); 8362e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 8372e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* Report OPEN fail event */ 8382e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach (*bta_hh_cb.p_cback)(BTA_HH_OPEN_EVT, (tBTA_HH *)&conn_dat); 8392e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 8402e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if BTA_HH_DEBUG 8412e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_trace_dev_db(); 8422e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif 8432e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* clean up control block, but retain SDP info and device handle */ 8442e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_cb->vp = FALSE; 8452e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_cb->w4_evt = 0; 8462e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 8472e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* if no connection is active and HH disable is signaled, disable service */ 8482e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (bta_hh_cb.cnt_num == 0 && bta_hh_cb.w4_disable) 8492e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 8502e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_disc_cmpl(); 8512e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 8522e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 8532e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach} 8542e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 8552e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/******************************************************************************* 8562e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 8575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_hh_close_act 8585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description HID Host process a close event 8605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 8635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 8655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_close_act (tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data) 8665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 8675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_HH_CONN conn_dat ; 8685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_HH_CBDATA disc_dat = {BTA_HH_OK, 0}; 8695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 reason = p_data->hid_cback.data; /* Reason for closing (32-bit) */ 8705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if HID_HDEV_EVT_VC_UNPLUG was received, report BTA_HH_VC_UNPLUG_EVT */ 8725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 event = p_cb->vp ? BTA_HH_VC_UNPLUG_EVT : BTA_HH_CLOSE_EVT; 8735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project disc_dat.handle = p_cb->hid_handle; 8755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project disc_dat.status = p_data->hid_cback.data; 8765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check reason for closing */ 8785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((reason & (HID_L2CAP_CONN_FAIL|HID_L2CAP_REQ_FAIL)) || /* Failure to initialize connection (page timeout or l2cap error) */ 8795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (reason == HID_ERR_AUTH_FAILED) || /* Authenication error (while initiating) */ 8805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (reason == HID_ERR_L2CAP_FAILED)) /* Failure creating l2cap connection */ 8815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Failure in opening connection */ 8835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project conn_dat.handle = p_cb->hid_handle; 8845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project conn_dat.status = (reason == HID_ERR_AUTH_FAILED) ? BTA_HH_ERR_AUTH_FAILED : BTA_HH_ERR; 8855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdcpy(conn_dat.bda, p_cb->addr); 8865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project HID_HostCloseDev(p_cb->hid_handle); 8875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Report OPEN fail event */ 8895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bta_hh_cb.p_cback)(BTA_HH_OPEN_EVT, (tBTA_HH *)&conn_dat); 8905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_HH_DEBUG 8925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_trace_dev_db(); 8935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 8945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 8955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* otherwise report CLOSE/VC_UNPLUG event */ 8975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 8985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* finaliza device driver */ 9005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_co_close(p_cb->hid_handle, p_cb->app_id); 9015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* inform role manager */ 9025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_conn_close( BTA_ID_HH ,p_cb->app_id, p_cb->addr); 9035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* update total conn number */ 9045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_cb.cnt_num --; 9055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (disc_dat.status) 9075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project disc_dat.status = BTA_HH_ERR; 9085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bta_hh_cb.p_cback)(event, (tBTA_HH *)&disc_dat); 9105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if virtually unplug, remove device */ 9125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cb->vp ) 9135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project HID_HostRemoveDev( p_cb->hid_handle); 9155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_clean_up_kdev(p_cb); 9165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_HH_DEBUG 9195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_trace_dev_db(); 9205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 9215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* clean up control block, but retain SDP info and device handle */ 9245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->vp = FALSE; 9255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->w4_evt = 0; 9265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if no connection is active and HH disable is signaled, disable service */ 9285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_hh_cb.cnt_num == 0 && bta_hh_cb.w4_disable) 9295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_disc_cmpl(); 9315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 9345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 9355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 9375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_hh_get_dscp_act 9395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Get device report descriptor 9415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 9445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 9465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_get_dscp_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data) 9475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 9485cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_data); 9495cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen 9502e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if (BTA_HH_LE_INCLUDED == TRUE) 9512e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_cb->is_le_device) 9522e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 9532e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_get_dscp_act(p_cb); 9542e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 9552e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach else 9562e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif 9575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bta_hh_cb.p_cback)(BTA_HH_GET_DSCP_EVT, (tBTA_HH *)&p_cb->dscp_info); 9585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 9595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 9615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_hh_maint_dev_act 9635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description HID Host maintain device list. 9655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 9685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 9705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_maint_dev_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data) 9715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 9725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_HH_MAINT_DEV *p_dev_info = &p_data->api_maintdev; 9735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_HH_DEV_INFO dev_info ; 9745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 dev_handle; 9755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project dev_info.status = BTA_HH_ERR; 9775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project dev_info.handle = BTA_HH_INVALID_HANDLE; 9785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (p_dev_info->sub_event) 9805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_ADD_DEV_EVT: /* add a device */ 9825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdcpy(dev_info.bda, p_dev_info->bda); 9835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* initialize callback data */ 9845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cb->hid_handle == BTA_HH_INVALID_HANDLE) 9855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9862e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if (BTA_HH_LE_INCLUDED == TRUE) 9872e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (bta_hh_is_le_device(p_cb, p_data->api_conn.bd_addr)) 9882e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 9892e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach dev_info.handle = bta_hh_le_add_device(p_cb, p_dev_info); 9902e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach dev_info.status = BTA_HH_OK; 9912e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 9922e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach else 9932e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif 9942e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 9955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (HID_HostAddDev(p_dev_info->bda, p_dev_info->attr_mask, &dev_handle)\ 9965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project == HID_SUCCESS) 9975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project dev_info.handle = dev_handle; 9995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project dev_info.status = BTA_HH_OK; 10005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10012e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if (defined BTA_HH_LE_INCLUDED && BTA_HH_LE_INCLUDED == TRUE) 10025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* update DI information */ 10035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_update_di_info(p_cb, 10045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_info->dscp_info.vendor_id, 10055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_info->dscp_info.product_id, 1006ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_dev_info->dscp_info.version, 10072e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_dev_info->dscp_info.flag); 10082e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#else 10092e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_update_di_info(p_cb, 10102e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_dev_info->dscp_info.vendor_id, 10112e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_dev_info->dscp_info.product_id, 10122e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_dev_info->dscp_info.version, 1013ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 0); 10145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10152e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif 10165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* add to BTA device list */ 10175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_add_device_to_list(p_cb, dev_handle, 10185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_info->attr_mask, 10195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project &p_dev_info->dscp_info.descriptor, 10205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_info->sub_class, 10215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_info->dscp_info.ssr_max_latency, 10225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_info->dscp_info.ssr_min_tout, 10235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_info->app_id); 10245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* update cb_index[] map */ 10255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_cb.cb_index[dev_handle] = p_cb->index; 10265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else /* device already been added */ 10295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project dev_info.handle = p_cb->hid_handle; 10315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project dev_info.status = BTA_HH_OK; 10325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_HH_DEBUG 10345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_trace_dev_db(); 10355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 10365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1037ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta break; 10385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_RMV_DEV_EVT: /* remove device */ 10395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project dev_info.handle = (UINT8)p_dev_info->hdr.layer_specific; 10405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdcpy(dev_info.bda, p_cb->addr); 1041ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 10422e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if BTA_HH_LE_INCLUDED == TRUE 10432e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_cb->is_le_device) 10442e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 10452e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_remove_dev_bg_conn(p_cb); 10462e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_sm_execute(p_cb, BTA_HH_API_CLOSE_EVT, NULL); 10472e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_clean_up_kdev(p_cb); 10482e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 10492e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach else 10502e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif 10515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(HID_HostRemoveDev( dev_info.handle ) == HID_SUCCESS) 10535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project dev_info.status = BTA_HH_OK; 10555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* remove from known device list in BTA */ 10575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_clean_up_kdev(p_cb); 10585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 10615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 1063e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("invalid command"); 10645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 10655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (* bta_hh_cb.p_cback)(p_dev_info->sub_event, (tBTA_HH *)&dev_info); 10685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 10695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 10705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_hh_write_dev_act 10725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Write device action. can be SET/GET/DATA transaction. 10745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 10765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 10785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_write_dev_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data) 10795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 10805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_HH_CBDATA cbdata = {BTA_HH_OK, 0}; 10815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 event = (p_data->api_sndcmd.t_type - BTA_HH_FST_BTE_TRANS_EVT) + 10825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_HH_FST_TRANS_CB_EVT; 10835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10842e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if BTA_HH_LE_INCLUDED == TRUE 10852e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_cb->is_le_device) 10862e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_write_dev_act(p_cb, p_data); 10872e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach else 10882e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif 10892e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 10902e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 10915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cbdata.handle = p_cb->hid_handle; 10925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* match up BTE/BTA report/boot mode def */ 10945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_data->api_sndcmd.t_type == HID_TRANS_SET_PROTOCOL) 10955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->api_sndcmd.param = ( p_data->api_sndcmd.param == BTA_HH_PROTO_RPT_MODE) ?\ 10975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project HID_PAR_PROTOCOL_REPORT :HID_PAR_PROTOCOL_BOOT_MODE; 10985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (HID_HostWriteDev (p_cb->hid_handle, 11015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->api_sndcmd.t_type, 11025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->api_sndcmd.param, 11035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->api_sndcmd.data, 11045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->api_sndcmd.rpt_id, 11055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->api_sndcmd.p_data) != HID_SUCCESS) 11065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1107e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("HID_HostWriteDev Error "); 11085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cbdata.status = BTA_HH_ERR; 11095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_data->api_sndcmd.t_type != HID_TRANS_CONTROL && 11115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->api_sndcmd.t_type != HID_TRANS_DATA) 11125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (* bta_hh_cb.p_cback)(event, (tBTA_HH *)&cbdata); 11135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (p_data->api_sndcmd.param == BTA_HH_CTRL_VIRTUAL_CABLE_UNPLUG) 11145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (* bta_hh_cb.p_cback)(BTA_HH_VC_UNPLUG_EVT, (tBTA_HH *)&cbdata); 11155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 11175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch(p_data->api_sndcmd.t_type) 11205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_TRANS_SET_PROTOCOL: 11225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* fall through */ 11235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_TRANS_GET_REPORT: 11245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* fall through */ 11255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_TRANS_SET_REPORT: 11265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* fall through */ 11275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_TRANS_GET_PROTOCOL: 11285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* fall through */ 11295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_TRANS_GET_IDLE: 11305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* fall through */ 11315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_TRANS_SET_IDLE:/* set w4_handsk event name for callback function use */ 11325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->w4_evt = event; 11335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 11345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_TRANS_DATA: /* output report */ 11355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* fall through */ 11365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_TRANS_CONTROL: 11375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* no handshake event will be generated */ 11385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if VC_UNPLUG is issued, set flag */ 11395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_data->api_sndcmd.param == BTA_HH_CTRL_VIRTUAL_CABLE_UNPLUG) 11405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->vp = TRUE; 11415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 11435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* currently not expected */ 11445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_TRANS_DATAC: 11455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 1146e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_hh_write_dev_act:: cmd type = %d", 11475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->api_sndcmd.t_type); 11485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 11495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if not control type transaction, notify PM for energy control */ 11525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_data->api_sndcmd.t_type != HID_TRANS_CONTROL) 11535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* inform PM for mode change */ 11555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_busy(BTA_ID_HH, p_cb->app_id, p_cb->addr); 11565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_idle(BTA_ID_HH, p_cb->app_id, p_cb->addr); 11575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (p_data->api_sndcmd.param == BTA_HH_CTRL_SUSPEND) 11595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_sco_close(BTA_ID_HH, p_cb->app_id, p_cb->addr); 11615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (p_data->api_sndcmd.param == BTA_HH_CTRL_EXIT_SUSPEND) 11635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_busy(BTA_ID_HH, p_cb->app_id, p_cb->addr); 11655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11682e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 11695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 11705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 11715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 11735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Static Function 11745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*****************************************************************************/ 11755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 11765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_hh_cback 11785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description BTA HH callback function. 11805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 11835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 11852e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachstatic void bta_hh_cback (UINT8 dev_handle, BD_ADDR addr, UINT8 event, 11862e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach UINT32 data, BT_HDR *pdata) 11875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 11885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_HH_CBACK_DATA *p_buf = NULL; 11895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 sm_event = BTA_HH_INVALID_EVT; 11905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 xx = 0; 11915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_HH_DEBUG 1193e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_hh_cback::HID_event [%s]", bta_hh_hid_event_name(event)); 11945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 11955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (event) 11975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_HDEV_EVT_OPEN: 11995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sm_event = BTA_HH_INT_OPEN_EVT; 12005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 12015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_HDEV_EVT_CLOSE: 12025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sm_event = BTA_HH_INT_CLOSE_EVT; 12035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 12045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_HDEV_EVT_INTR_DATA: 12055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sm_event = BTA_HH_INT_DATA_EVT; 12065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 12075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_HDEV_EVT_HANDSHAKE: 12085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sm_event = BTA_HH_INT_HANDSK_EVT; 12095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 12105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_HDEV_EVT_CTRL_DATA: 12115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sm_event = BTA_HH_INT_CTRL_DATA; 12125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 12135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_HDEV_EVT_RETRYING: 12145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 12155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_HDEV_EVT_INTR_DATC: 12165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_HDEV_EVT_CTRL_DATC: 12175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Unhandled events: Free buffer for DATAC */ 12185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project utl_freebuf((void **)&pdata); 12195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 12205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_HDEV_EVT_VC_UNPLUG: 1221ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta for (xx = 0; xx < BTA_HH_MAX_DEVICE; xx++) 12225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_hh_cb.kdev[xx].hid_handle == dev_handle) 12245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_cb.kdev[xx].vp = TRUE; 12265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 12275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 12305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (sm_event != BTA_HH_INVALID_EVT && 12335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_buf = (tBTA_HH_CBACK_DATA *)GKI_getbuf(sizeof(tBTA_HH_CBACK_DATA) + 12345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sizeof(BT_HDR))) != NULL) 12355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->hdr.event = sm_event; 12375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->hdr.layer_specific = (UINT16)dev_handle; 12385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->data = data; 12392e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bdcpy(p_buf->addr, addr); 12405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->p_data = pdata; 12415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_sendmsg(p_buf); 12435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 12465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 12475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_hh_get_trans_status 12495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description translate a handshake result code into BTA HH 12515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** status code 12525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 12545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTA_HH_STATUS bta_hh_get_trans_status(UINT32 result) 12555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 12565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch(result) 12575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_PAR_HANDSHAKE_RSP_SUCCESS : /* (0) */ 12595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BTA_HH_OK; 12605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_PAR_HANDSHAKE_RSP_NOT_READY : /* (1) */ 12615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_PAR_HANDSHAKE_RSP_ERR_INVALID_REP_ID: /* (2) */ 12625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_PAR_HANDSHAKE_RSP_ERR_UNSUPPORTED_REQ : /* (3) */ 12635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_PAR_HANDSHAKE_RSP_ERR_INVALID_PARAM : /* (4) */ 12645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (tBTA_HH_STATUS)result; 12655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_PAR_HANDSHAKE_RSP_ERR_UNKNOWN : /* (14) */ 12665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_PAR_HANDSHAKE_RSP_ERR_FATAL : /* (15) */ 12675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 12685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BTA_HH_HS_ERROR; 12695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 12705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 12725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 12735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Debug Functions 12745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*****************************************************************************/ 12755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (defined BTA_HH_DEBUG && BTA_HH_DEBUG == TRUE) 12775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic char* bta_hh_get_w4_event(UINT16 event) 12785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 12795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (event) 12805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_GET_RPT_EVT: 12825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "BTA_HH_GET_RPT_EVT"; 12835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_SET_RPT_EVT: 12845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "BTA_HH_SET_RPT_EVT"; 12855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_GET_PROTO_EVT: 12865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "BTA_HH_GET_PROTO_EVT"; 12875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_SET_PROTO_EVT: 12885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "BTA_HH_SET_PROTO_EVT"; 12895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_GET_IDLE_EVT: 12905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "BTA_HH_GET_IDLE_EVT"; 12915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_SET_IDLE_EVT: 12925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "BTA_HH_SET_IDLE_EVT"; 12935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_OPEN_EVT: 12945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "BTA_HH_OPEN_EVT"; 12955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 12965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "Unknown event"; 12975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 13005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic char * bta_hh_hid_event_name(UINT16 event) 13025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 13035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (event) 13045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_HDEV_EVT_OPEN: 13065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "HID_HDEV_EVT_OPEN"; 13075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_HDEV_EVT_CLOSE: 13085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "HID_HDEV_EVT_CLOSE"; 13095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_HDEV_EVT_RETRYING: 13105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "HID_HDEV_EVT_RETRYING"; 13115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_HDEV_EVT_INTR_DATA: 13125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "HID_HDEV_EVT_INTR_DATA"; 13135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_HDEV_EVT_INTR_DATC: 13145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "HID_HDEV_EVT_INTR_DATC"; 13155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_HDEV_EVT_CTRL_DATA: 13165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "HID_HDEV_EVT_CTRL_DATA"; 13175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_HDEV_EVT_CTRL_DATC: 13185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "HID_HDEV_EVT_CTRL_DATC"; 13195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_HDEV_EVT_HANDSHAKE: 13205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "HID_HDEV_EVT_HANDSHAKE"; 13215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_HDEV_EVT_VC_UNPLUG: 13225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "HID_HDEV_EVT_VC_UNPLUG"; 13235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 13245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "Unknown HID event"; 13255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 13275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 13285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* BTA_HH_INCLUDED */ 13295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1330