bta_hh_act.cc revision 8af480e24549ba51a3f6858d9d9af504715e0bea
15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Copyright (C) 2005-2012 Broadcom Corporation 45738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 55738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 65738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * you may not use this file except in compliance with the License. 75738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * You may obtain a copy of the License at: 85738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 95738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * See the License for the specific language governing permissions and 155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * limitations under the License. 165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * This file contains the HID host action functions. 225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_target.h" 265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 27e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_INCLUDED == TRUE) 285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h> 305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_sys.h" 325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_api.h" 335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "l2c_api.h" 345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_hh_int.h" 355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_hh_co.h" 36d7ffd64accbd50a27289a388856e56244ccbb5daMyles Watson#include "osi/include/osi.h" 375cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen#include "utl.h" 385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 408af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Constants 418af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ****************************************************************************/ 425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 458af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Local Function prototypes 468af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ****************************************************************************/ 47e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssenstatic void bta_hh_cback (uint8_t dev_handle, BD_ADDR addr, uint8_t event, 48e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen uint32_t data, BT_HDR *pdata); 49e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssenstatic tBTA_HH_STATUS bta_hh_get_trans_status(uint32_t result); 505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 51e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 52e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssenstatic const char* bta_hh_get_w4_event(uint16_t event); 53e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssenstatic const char * bta_hh_hid_event_name(uint16_t event); 545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 578af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Action Functions 588af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ****************************************************************************/ 595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 608af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 618af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_hh_api_enable 628af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 638af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Perform necessary operations to enable HID host. 648af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 658af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 668af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 678af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 688af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_api_enable(tBTA_HH_DATA *p_data) 705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_HH_STATUS status = BTA_HH_ERR; 72e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen uint8_t xx; 735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* initialize BTE HID */ 755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project HID_HostInit(); 765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(&bta_hh_cb, 0, sizeof(tBTA_HH_CB)); 785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project HID_HostSetSecurityLevel("", p_data->api_enable.sec_mask); 805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Register with L2CAP */ 825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( HID_HostRegister (bta_hh_cback) == HID_SUCCESS) 835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* store parameters */ 855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_cb.p_cback = p_data->api_enable.p_cback; 865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = BTA_HH_OK; 885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* initialize device CB */ 89ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta for (xx = 0; xx < BTA_HH_MAX_DEVICE; xx ++) 905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_cb.kdev[xx].state = BTA_HH_IDLE_ST; 925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_cb.kdev[xx].hid_handle = BTA_HH_INVALID_HANDLE; 935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_cb.kdev[xx].index = xx; 945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 95ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 96ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* initialize control block map */ 97ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta for (xx = 0; xx < BTA_HH_MAX_KNOWN; xx ++) 98ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta bta_hh_cb.cb_index[xx] = BTA_HH_IDX_INVALID; 995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1012e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if (BTA_HH_LE_INCLUDED == TRUE) 1022e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (status == BTA_HH_OK) 1032e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 1042e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_enable(); 1052e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 1062e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach else 1072e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif 108ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* signal BTA call back event */ 109ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta (* bta_hh_cb.p_cback)(BTA_HH_ENABLE_EVT, (tBTA_HH *)&status); 1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1128af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1138af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_hh_api_disable 1148af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1158af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Perform necessary operations to disable HID host. 1168af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1178af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1188af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 1198af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1208af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_api_disable(void) 1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 123e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen uint8_t xx; 1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* service is not enabled */ 1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_hh_cb.p_cback == NULL) 1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* no live connection, signal DISC_CMPL_EVT directly */ 1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!bta_hh_cb.cnt_num) 1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_disc_cmpl(); 1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else /* otherwise, disconnect all live connections */ 1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 136e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen bta_hh_cb.w4_disable = true; 1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 138ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta for(xx = 0; xx < BTA_HH_MAX_DEVICE; xx ++) 1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send API_CLOSE event to every connected device */ 1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( bta_hh_cb.kdev[xx].state == BTA_HH_CONN_ST ) 1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* disconnect all connected devices */ 1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_sm_execute(&bta_hh_cb.kdev[xx], 1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_HH_API_CLOSE_EVT, 1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project NULL); 1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1558af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1568af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_hh_disc_cmpl 1578af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1588af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description All connections have been closed, disable service. 1598af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1608af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1618af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 1628af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1638af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_disc_cmpl(void) 1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 166d628a0695e73973e0bd54dd026bfed900b69f804Myles Watson#if (BTA_HH_LE_INCLUDED == TRUE) 167d628a0695e73973e0bd54dd026bfed900b69f804Myles Watson HID_HostDeregister(); 168d628a0695e73973e0bd54dd026bfed900b69f804Myles Watson bta_hh_le_deregister(); 169d628a0695e73973e0bd54dd026bfed900b69f804Myles Watson#else 1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_HH_STATUS status = BTA_HH_OK; 1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Deregister with lower layer */ 1734540f59bc447dc2b7b31a3e974b74a60b2417e7dVenkatRaghavan VijayaRaghavan if (HID_HostDeregister() != HID_SUCCESS) 1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = BTA_HH_ERR; 1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 176ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta bta_hh_cleanup_disable(status); 1774540f59bc447dc2b7b31a3e974b74a60b2417e7dVenkatRaghavan VijayaRaghavan#endif 1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 179ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1818af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1828af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_hh_sdp_cback 1838af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1848af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description SDP callback function. 1858af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1868af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 1878af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1888af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 189e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssenstatic void bta_hh_sdp_cback(uint16_t result, uint16_t attr_mask, 1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tHID_DEV_SDP_INFO *sdp_rec ) 1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_HH_DEV_CB *p_cb = bta_hh_cb.p_cur; 193e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen uint8_t hdl = 0; 1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_HH_STATUS status = BTA_HH_ERR_SDP; 1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 196ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* make sure sdp succeeded and hh has not been disabled */ 197ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if ((result == SDP_SUCCESS) && (p_cb != NULL)) 1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* security is required for the connection, add attr_mask bit*/ 2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cb->sec_mask) 2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project attr_mask |= HID_SEC_REQUIRED; 2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 203e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 204e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_EVENT("bta_hh_sdp_cback: p_cb: %d result 0x%02x, \ 2052e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach attr_mask 0x%02x, handle %x", \ 2062e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_cb, result, attr_mask,p_cb->hid_handle); 2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* check to see type of device is supported , and should not been added before */ 2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_hh_tod_spt(p_cb, sdp_rec->sub_class)) 2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if not added before */ 2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cb->hid_handle == BTA_HH_INVALID_HANDLE) 2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* add device/update attr_mask information */ 2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(HID_HostAddDev (p_cb->addr, attr_mask, &hdl) == HID_SUCCESS) 2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = BTA_HH_OK; 2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* update cb_index[] map */ 2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_cb.cb_index[hdl] = p_cb->index; 2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->app_id = 0; 2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2269628abf10efe5df159f7ad4c192c3ef89fd7731cZhihai Xu } 2272a2701cdddac0859a95e58aec542742c450145b9Kim Schulz else 2282a2701cdddac0859a95e58aec542742c450145b9Kim Schulz { 2292a2701cdddac0859a95e58aec542742c450145b9Kim Schulz hdl = p_cb->hid_handle; 2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* else : incoming connection after SDP should update the SDP information as well */ 2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cb->app_id != 0) 2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* update cb information with attr_mask, dscp_info etc. */ 2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_add_device_to_list(p_cb, hdl, attr_mask, 2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project &sdp_rec->dscp_info, 2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sdp_rec->sub_class, 2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sdp_rec->ssr_max_latency, 2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sdp_rec->ssr_min_tout, 2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->app_id); 2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->dscp_info.ctry_code = sdp_rec->ctry_code; 2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = BTA_HH_OK; 2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else /* type of device is not supported */ 2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = BTA_HH_ERR_TOD_UNSPT; 2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* free disc_db when SDP is completed */ 254cceb430489a70add1b996d54289867c17f4ac0fdPavlin Radoslavov osi_free_and_reset((void **)&bta_hh_cb.p_disc_db); 2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send SDP_CMPL_EVT into state machine */ 2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_sm_execute(p_cb, BTA_HH_SDP_CMPL_EVT, (tBTA_HH_DATA *)&status); 2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2628af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 2638af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_hh_di_sdp_cback 2648af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 2658af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description SDP DI callback function. 2668af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 2678af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 2688af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 2698af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 270e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssenstatic void bta_hh_di_sdp_cback(uint16_t result) 2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_HH_DEV_CB *p_cb = bta_hh_cb.p_cur; 2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_HH_STATUS status = BTA_HH_ERR_SDP; 2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSDP_DI_GET_RECORD di_rec; 2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tHID_STATUS ret; 276e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 277e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_EVENT("bta_hh_di_sdp_cback: p_cb: %d result 0x%02x", p_cb, result); 2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2792e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if DI record does not exist on remote device, vendor_id in tBTA_HH_DEV_DSCP_INFO will be 2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * set to 0xffff and we will allow the connection to go through. Spec mandates that DI 2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * record be set, but many HID devices do not set this. So for IOP purposes, we allow the 2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * connection to go through and update the DI record to invalid DI entry.*/ 284ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (((result == SDP_SUCCESS) || (result == SDP_NO_RECS_MATCH)) && (p_cb != NULL)) 2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(result == SDP_SUCCESS && SDP_GetNumDiRecords(bta_hh_cb.p_disc_db) != 0) 2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* always update information with primary DI record */ 2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (SDP_GetDiRecord(1, &di_rec, bta_hh_cb.p_disc_db) == SDP_SUCCESS) 2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 291ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta bta_hh_update_di_info(p_cb, di_rec.rec.vendor, di_rec.rec.product, di_rec.rec.version, 0); 2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else /* no DI recrod available */ 2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 297ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta bta_hh_update_di_info(p_cb, BTA_HH_VENDOR_ID_INVALID, 0, 0, 0); 2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((ret = HID_HostGetSDPRecord(p_cb->addr, 3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_cb.p_disc_db, 3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bta_hh_cfg->sdp_db_size, 3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_sdp_cback)) == HID_SUCCESS) 3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = BTA_HH_OK; 3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 309e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 310e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG ("bta_hh_di_sdp_cback: HID_HostGetSDPRecord failed: Status 0x%2x", 3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ret); 3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 31720524d393e8b3bea4c573f7980cd843500b0e6a4Pavlin Radoslavov if (status != BTA_HH_OK) { 318cceb430489a70add1b996d54289867c17f4ac0fdPavlin Radoslavov osi_free_and_reset((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/******************************************************************************* 3288af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 3298af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_hh_start_sdp 3308af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 3318af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Start SDP service search, and obtain necessary SDP records. 3328af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Only one SDP service search request is allowed at the same 3338af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * time. For every BTA_HhOpen API call, do SDP first unless SDP 3348af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * has been done previously. 3358af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 3368af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 3378af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 3388af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 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; 342e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen uint8_t 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; 360e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 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 { 387717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov bta_hh_cb.p_disc_db = (tSDP_DISCOVERY_DB *)osi_malloc(p_bta_hh_cfg->sdp_db_size); 388717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov bta_hh_cb.p_cur = p_cb; 389717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov /* do DI discovery first */ 390717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov if (SDP_DiDiscover(p_data->api_conn.bd_addr, 391717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov bta_hh_cb.p_disc_db, 392717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov p_bta_hh_cfg->sdp_db_size, 393717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov bta_hh_di_sdp_cback) != SDP_SUCCESS) { 394e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 395717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov APPL_TRACE_DEBUG("bta_hh_start_sdp: SDP_DiDiscover failed: \ 3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project Status 0x%2X",status); 3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 398717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov status = BTA_HH_ERR_SDP; 399717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov osi_free_and_reset((void **)&bta_hh_cb.p_disc_db); 400717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov } else { 401717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov status = BTA_HH_OK; 4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 403556b78b577f7476d29a8a210a8354707a54fc80aHemant Gupta } else if (bta_hh_cb.p_disc_db) { 404556b78b577f7476d29a8a210a8354707a54fc80aHemant Gupta /* It is possible that there is incoming/outgoing collision case. DUT initiated 405556b78b577f7476d29a8a210a8354707a54fc80aHemant Gupta * HID connection at same time remote has connected L2CAP for HID control, 406556b78b577f7476d29a8a210a8354707a54fc80aHemant Gupta * so SDP would be in progress, when this flow reaches here. Just do nothing 407556b78b577f7476d29a8a210a8354707a54fc80aHemant Gupta * when the code reaches here, and ongoing SDP completion or failure will handle this case. 408556b78b577f7476d29a8a210a8354707a54fc80aHemant Gupta */ 409556b78b577f7476d29a8a210a8354707a54fc80aHemant Gupta APPL_TRACE_DEBUG("%s: ignoring as SDP already in progress", __func__); 410556b78b577f7476d29a8a210a8354707a54fc80aHemant Gupta return; 4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status != BTA_HH_OK) 4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_sm_execute(p_cb, BTA_HH_SDP_CMPL_EVT, (tBTA_HH_DATA *)&status); 4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4208af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 4218af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_hh_sdp_cmpl 4228af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 4238af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description When SDP completed, initiate a connection or report error depend 4248af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * on SDP result. 4258af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 4268af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 4278af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 4288af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 4298af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_sdp_cmpl(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data) 4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_HH_CONN conn_dat; 4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_HH_STATUS status = p_data->status; 4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 435e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 436e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG ("bta_hh_sdp_cmpl: status 0x%2X",p_data->status); 4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* initialize call back data */ 4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset((void *)&conn_dat, 0, sizeof(tBTA_HH_CONN)); 4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project conn_dat.handle = p_cb->hid_handle; 4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdcpy(conn_dat.bda, p_cb->addr); 4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if SDP compl success */ 4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( status == BTA_HH_OK) 4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* not incoming connection doing SDP, initiate a HID connection */ 4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_cb->incoming_conn) 4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tHID_STATUS ret; 4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* set security level */ 4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project HID_HostSetSecurityLevel("", p_cb->sec_mask); 4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* open HID connection */ 455891723a42851285ec7e6c2f616a405611789da6bHemant Gupta ret = HID_HostOpenDev (p_cb->hid_handle); 456891723a42851285ec7e6c2f616a405611789da6bHemant Gupta APPL_TRACE_DEBUG ("%s: HID_HostOpenDev returned=%d", __func__, ret); 457891723a42851285ec7e6c2f616a405611789da6bHemant Gupta if (ret == HID_SUCCESS || ret == HID_ERR_ALREADY_CONN) 458891723a42851285ec7e6c2f616a405611789da6bHemant Gupta { 459891723a42851285ec7e6c2f616a405611789da6bHemant Gupta status = BTA_HH_OK; 460891723a42851285ec7e6c2f616a405611789da6bHemant Gupta } 461891723a42851285ec7e6c2f616a405611789da6bHemant Gupta else if (ret == HID_ERR_CONN_IN_PROCESS) 462891723a42851285ec7e6c2f616a405611789da6bHemant Gupta { 463891723a42851285ec7e6c2f616a405611789da6bHemant Gupta /* Connection already in progress, return from here, SDP 464891723a42851285ec7e6c2f616a405611789da6bHemant Gupta * will be performed after connection is completed. 465891723a42851285ec7e6c2f616a405611789da6bHemant Gupta */ 466891723a42851285ec7e6c2f616a405611789da6bHemant Gupta APPL_TRACE_DEBUG ("%s: connection already in progress", __func__); 467891723a42851285ec7e6c2f616a405611789da6bHemant Gupta return; 468891723a42851285ec7e6c2f616a405611789da6bHemant Gupta } 469891723a42851285ec7e6c2f616a405611789da6bHemant Gupta else 4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 471e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 472891723a42851285ec7e6c2f616a405611789da6bHemant Gupta APPL_TRACE_DEBUG ("%s: HID_HostOpenDev failed: Status 0x%2X", __func__, ret); 4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* open fail, remove device from management device list */ 4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project HID_HostRemoveDev( p_cb->hid_handle); 4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = BTA_HH_ERR; 4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else /* incoming connection SDP finish */ 4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_sm_execute(p_cb, BTA_HH_OPEN_CMPL_EVT, NULL); 4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status != BTA_HH_OK) 4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4872e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* Check if this was incoming connection request from an unknown device 4882e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach **and connection failed due to missing HID Device SDP UUID 4892e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach **In above condition, disconnect the link as well as remove the 4902e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach **device from list of HID devices*/ 4912e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if ((status == BTA_HH_ERR_SDP) && 4922e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach (p_cb->incoming_conn) &&(p_cb->app_id == 0)) 4932e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 494e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG ("bta_hh_sdp_cmpl:SDP failed for incoming conn :hndl %d", 4952e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_cb->incoming_hid_handle); 4962e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach HID_HostRemoveDev( p_cb->incoming_hid_handle); 4972e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project conn_dat.status = status; 4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (* bta_hh_cb.p_cback)(BTA_HH_OPEN_EVT, (tBTA_HH *)&conn_dat); 5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* move state machine W4_CONN ->IDLE */ 5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_sm_execute(p_cb, BTA_HH_API_CLOSE_EVT, NULL); 5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if this is an outgoing connection to an unknown device, clean up cb */ 5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cb->app_id == 0 && !p_cb->incoming_conn) 5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* clean up device control block */ 5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_clean_up_kdev(p_cb); 5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 510e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_trace_dev_db(); 5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5188af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 5198af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_hh_api_disc_act 5208af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 5218af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description HID Host initiate a disconnection. 5228af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 5238af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 5248af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 5258af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 5268af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_api_disc_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data) 5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_HH_CBDATA disc_dat; 5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tHID_STATUS status; 5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 532e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_LE_INCLUDED == TRUE) 5332e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_cb->is_le_device) 5342e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_api_disc_act(p_cb); 5352e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach else 5362e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif 5372e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 5382e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* found an active connection */ 539e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen disc_dat.handle = p_data ?(uint8_t)p_data->hdr.layer_specific :p_cb->hid_handle; 5402e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach disc_dat.status = BTA_HH_ERR; 5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5422e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach status = HID_HostCloseDev(disc_dat.handle); 5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5442e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (status) 5452e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach (* bta_hh_cb.p_cback)(BTA_HH_CLOSE_EVT, (tBTA_HH *)&disc_dat); 5462e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 5492e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5528af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 5538af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_hh_open_cmpl_act 5548af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 5558af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description HID host connection completed 5568af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 5578af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 5588af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 5598af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 5608af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_open_cmpl_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data) 5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_HH_CONN conn ; 564e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen uint8_t dev_handle = p_data ? (uint8_t)p_data->hid_cback.hdr.layer_specific : \ 5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->hid_handle; 5665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset((void *)&conn, 0, sizeof (tBTA_HH_CONN)); 5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project conn.handle = dev_handle; 5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdcpy(conn.bda, p_cb->addr); 5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* increase connection number */ 5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_cb.cnt_num ++; 5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* initialize device driver */ 5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_co_open(p_cb->hid_handle, p_cb->sub_class, 576ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_cb->attr_mask, p_cb->app_id); 5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5782e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if (BTA_HH_LE_INCLUDED == TRUE) 5792e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach conn.status = p_cb->status; 5802e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach conn.le_hid = p_cb->is_le_device; 5812e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach conn.scps_supported = p_cb->scps_supported; 5822e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 5832e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (!p_cb->is_le_device) 5842e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif 5852e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 5862e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* inform role manager */ 5872e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_sys_conn_open( BTA_ID_HH ,p_cb->app_id, p_cb->addr); 5882e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* set protocol mode when not default report mode */ 5902e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if ( p_cb->mode != BTA_HH_PROTO_RPT_MODE 5912e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if (BTA_HH_LE_INCLUDED == TRUE) 5922e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach && !p_cb->is_le_device 5932e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif 5942e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach ) 5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((HID_HostWriteDev(dev_handle, 5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project HID_TRANS_SET_PROTOCOL, HID_PAR_PROTOCOL_BOOT_MODE, 5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 0, 5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 0, NULL)) != HID_SUCCESS) 6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* HID connection is up, while SET_PROTO fail */ 6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project conn.status = BTA_HH_ERR_PROTO; 6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (* bta_hh_cb.p_cback)(BTA_HH_OPEN_EVT, (tBTA_HH *)&conn); 6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project conn.status = BTA_HH_OK; 6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->w4_evt = BTA_HH_OPEN_EVT; 6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (* bta_hh_cb.p_cback)(BTA_HH_OPEN_EVT, (tBTA_HH *)&conn); 6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 614e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen p_cb->incoming_conn = false; 6152e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_cb->incoming_hid_handle = BTA_HH_INVALID_HANDLE; 6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6198af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 6208af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_hh_open_act 6218af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 6228af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description HID host receive HID_OPEN_EVT . 6238af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 6248af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 6258af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 6268af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 6278af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 6285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_open_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data) 6295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_HH_API_CONN conn_data; 6315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 632e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen uint8_t dev_handle = p_data ? (uint8_t)p_data->hid_cback.hdr.layer_specific : \ 6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->hid_handle; 6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 635e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 636e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_EVENT ("bta_hh_open_act: Device[%d] connected", dev_handle); 6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* SDP has been done */ 6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cb->app_id != 0) 6415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_sm_execute(p_cb, BTA_HH_OPEN_CMPL_EVT, p_data); 6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* app_id == 0 indicates an incoming conenction request arrives without SDP 6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project performed, do it first */ 6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 648e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen p_cb->incoming_conn = true; 6492e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* store the handle here in case sdp fails - need to disconnect */ 6502e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_cb->incoming_hid_handle = dev_handle; 6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(&conn_data, 0, sizeof(tBTA_HH_API_CONN)); 6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdcpy(conn_data.bd_addr, p_cb->addr); 6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_start_sdp(p_cb, (tBTA_HH_DATA *)&conn_data); 6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6628af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 6638af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_hh_data_act 6648af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 6658af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description HID Host process a data report 6668af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 6678af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 6688af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 6698af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 6708af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_data_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA * p_data) 6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_HDR *pdata = p_data->hid_cback.p_data; 674e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen uint8_t *p_rpt = (uint8_t *)(pdata + 1) + pdata->offset; 6755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 676e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen bta_hh_co_data((uint8_t)p_data->hid_cback.hdr.layer_specific, p_rpt, pdata->len, 6775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->mode, p_cb->sub_class, p_cb->dscp_info.ctry_code, p_cb->addr, p_cb->app_id); 6785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 679cceb430489a70add1b996d54289867c17f4ac0fdPavlin Radoslavov osi_free_and_reset((void **)&pdata); 6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6848af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 6858af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_hh_handsk_act 6868af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 6878af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description HID Host process a handshake acknoledgement. 6888af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 6898af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 6908af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 6918af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 6928af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_handsk_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA * p_data) 6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_HH_CBDATA cback_data ; 6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_HH_HSDATA hs_data; 6975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_HH_CONN conn ; 6985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 699e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 700e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("HANDSHAKE received for: event = %s data= %d", 7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_get_w4_event(p_cb->w4_evt), p_data->hid_cback.data); 7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(&hs_data, 0, sizeof(tBTA_HH_HSDATA)); 7052e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach memset(&cback_data, 0, sizeof(tBTA_HH_CBDATA)); 7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (p_cb->w4_evt) 7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* GET_ transsaction, handshake indicate unsupported request */ 7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_GET_PROTO_EVT: 7115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project hs_data.rsp_data.proto_mode = BTA_HH_PROTO_UNKNOWN; 7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* fall through */ 7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_GET_RPT_EVT: 7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_GET_IDLE_EVT : 7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project hs_data.handle = p_cb->hid_handle; 7165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if handshake gives an OK code for these transaction, fill in UNSUPT */ 7175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((hs_data.status = bta_hh_get_trans_status(p_data->hid_cback.data)) == BTA_HH_OK) 7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project hs_data.status = BTA_HH_HS_TRANS_NOT_SPT; 7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (* bta_hh_cb.p_cback)(p_cb->w4_evt, (tBTA_HH *)&hs_data); 7215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->w4_evt = 0; 7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* acknoledgement from HID device for SET_ transaction */ 7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_SET_RPT_EVT: 7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_SET_PROTO_EVT: 7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_SET_IDLE_EVT : 7285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cback_data.handle = p_cb->hid_handle; 7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cback_data.status = bta_hh_get_trans_status(p_data->hid_cback.data); 7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (* bta_hh_cb.p_cback)(p_cb->w4_evt, (tBTA_HH *)&cback_data); 7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->w4_evt = 0; 7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 7335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* SET_PROTOCOL when open connection */ 7355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_OPEN_EVT: 7365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project conn.status =p_data->hid_cback.data ? BTA_HH_ERR_PROTO: BTA_HH_OK; 7375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project conn.handle = p_cb->hid_handle; 7385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdcpy(conn.bda, p_cb->addr); 7395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (* bta_hh_cb.p_cback)(p_cb->w4_evt, (tBTA_HH *)&conn); 740e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 7415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_trace_dev_db(); 7425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->w4_evt = 0; 7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 7455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 7475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* unknow transaction handshake response */ 748e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("unknown transaction type"); 7495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 7505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* transaction achknoledgement received, inform PM for mode change */ 7535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_idle(BTA_ID_HH, p_cb->app_id, p_cb->addr); 7545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 7555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 7578af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 7588af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_hh_ctrl_dat_act 7598af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 7608af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description HID Host process a data report from control channel. 7618af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 7628af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 7638af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 7648af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 7658af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 7665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_ctrl_dat_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA * p_data) 7675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_HDR *pdata = p_data->hid_cback.p_data; 769e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen uint8_t *data = (uint8_t *)(pdata + 1) + pdata->offset; 7705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_HH_HSDATA hs_data; 7715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 772e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 773e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("Ctrl DATA received w4: event[%s]", 7745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_get_w4_event(p_cb->w4_evt)); 7755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 7765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project hs_data.status = BTA_HH_OK; 7775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project hs_data.handle = p_cb->hid_handle; 7785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (p_cb->w4_evt) 7805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_GET_IDLE_EVT: 7825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project hs_data.rsp_data.idle_rate = *data; 7835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 7845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_GET_RPT_EVT: 7855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project hs_data.rsp_data.p_rpt_data = pdata; 7865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 7875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_GET_PROTO_EVT: 7885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* match up BTE/BTA report/boot mode def*/ 7895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project hs_data.rsp_data.proto_mode = ((*data) == HID_PAR_PROTOCOL_REPORT)? \ 7905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_HH_PROTO_RPT_MODE : BTA_HH_PROTO_BOOT_MODE; 791e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 792e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("GET_PROTOCOL Mode = [%s]", 7935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (hs_data.rsp_data.proto_mode == BTA_HH_PROTO_RPT_MODE)? "Report" : "Boot"); 7945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 7955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 7965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* should not expect control DATA for SET_ transaction */ 7975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_SET_PROTO_EVT: 7985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* fall through */ 7995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_SET_RPT_EVT: 8005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* fall through */ 8015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_SET_IDLE_EVT : 8025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* fall through */ 8035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 804e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 805e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("invalid transaction type for DATA payload: 4_evt[%s]", 8065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_get_w4_event(p_cb->w4_evt)); 8075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 8085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* inform PM for mode change */ 8125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_busy(BTA_ID_HH, p_cb->app_id, p_cb->addr); 8135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_idle(BTA_ID_HH, p_cb->app_id, p_cb->addr); 8145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (* bta_hh_cb.p_cback)(p_cb->w4_evt, (tBTA_HH *)&hs_data); 8165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->w4_evt = 0; 818cceb430489a70add1b996d54289867c17f4ac0fdPavlin Radoslavov osi_free_and_reset((void **)&pdata); 8195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 8238af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 8248af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_hh_open_failure 8258af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 8268af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description report HID open failure when at wait for connection state and receive 8278af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * device close event. 8288af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 8298af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 8308af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 8318af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 8328af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 8332e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_open_failure(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data) 8342e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{ 8352e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBTA_HH_CONN conn_dat ; 836e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen uint32_t reason = p_data->hid_cback.data; /* Reason for closing (32-bit) */ 8372e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 8382e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach memset(&conn_dat, 0, sizeof(tBTA_HH_CONN)); 8392e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach conn_dat.handle = p_cb->hid_handle; 8402e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach conn_dat.status = (reason == HID_ERR_AUTH_FAILED) ? 8412e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach BTA_HH_ERR_AUTH_FAILED : BTA_HH_ERR; 8422e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bdcpy(conn_dat.bda, p_cb->addr); 8432e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach HID_HostCloseDev(p_cb->hid_handle); 8442e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 8452e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* Report OPEN fail event */ 8462e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach (*bta_hh_cb.p_cback)(BTA_HH_OPEN_EVT, (tBTA_HH *)&conn_dat); 8472e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 848e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 8492e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_trace_dev_db(); 8502e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif 8512e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* clean up control block, but retain SDP info and device handle */ 852e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen p_cb->vp = false; 8532e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_cb->w4_evt = 0; 8542e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 8552e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* if no connection is active and HH disable is signaled, disable service */ 8562e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (bta_hh_cb.cnt_num == 0 && bta_hh_cb.w4_disable) 8572e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 8582e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_disc_cmpl(); 8592e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 8602e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 861891723a42851285ec7e6c2f616a405611789da6bHemant Gupta /* Error in opening hid connection, reset flags */ 862e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen p_cb->incoming_conn = false; 863891723a42851285ec7e6c2f616a405611789da6bHemant Gupta p_cb->incoming_hid_handle = BTA_HH_INVALID_HANDLE; 8642e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach} 8652e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 8662e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/******************************************************************************* 8678af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 8688af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_hh_close_act 8698af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 8708af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description HID Host process a close event 8718af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 8728af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 8738af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 8748af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 8758af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 8765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_close_act (tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data) 8775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 8785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_HH_CONN conn_dat ; 8795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_HH_CBDATA disc_dat = {BTA_HH_OK, 0}; 880e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen uint32_t reason = p_data->hid_cback.data; /* Reason for closing (32-bit) */ 8815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if HID_HDEV_EVT_VC_UNPLUG was received, report BTA_HH_VC_UNPLUG_EVT */ 883e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen uint16_t event = p_cb->vp ? BTA_HH_VC_UNPLUG_EVT : BTA_HH_CLOSE_EVT; 8845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project disc_dat.handle = p_cb->hid_handle; 8865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project disc_dat.status = p_data->hid_cback.data; 8875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check reason for closing */ 8895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((reason & (HID_L2CAP_CONN_FAIL|HID_L2CAP_REQ_FAIL)) || /* Failure to initialize connection (page timeout or l2cap error) */ 8905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (reason == HID_ERR_AUTH_FAILED) || /* Authenication error (while initiating) */ 8915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (reason == HID_ERR_L2CAP_FAILED)) /* Failure creating l2cap connection */ 8925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Failure in opening connection */ 8945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project conn_dat.handle = p_cb->hid_handle; 8955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project conn_dat.status = (reason == HID_ERR_AUTH_FAILED) ? BTA_HH_ERR_AUTH_FAILED : BTA_HH_ERR; 8965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdcpy(conn_dat.bda, p_cb->addr); 8975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project HID_HostCloseDev(p_cb->hid_handle); 8985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Report OPEN fail event */ 9005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bta_hh_cb.p_cback)(BTA_HH_OPEN_EVT, (tBTA_HH *)&conn_dat); 9015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 902e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 9035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_trace_dev_db(); 9045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 9055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 9065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* otherwise report CLOSE/VC_UNPLUG event */ 9085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 9095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* finaliza device driver */ 9115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_co_close(p_cb->hid_handle, p_cb->app_id); 9125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* inform role manager */ 9135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_conn_close( BTA_ID_HH ,p_cb->app_id, p_cb->addr); 9145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* update total conn number */ 9155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_cb.cnt_num --; 9165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (disc_dat.status) 9185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project disc_dat.status = BTA_HH_ERR; 9195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bta_hh_cb.p_cback)(event, (tBTA_HH *)&disc_dat); 9215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if virtually unplug, remove device */ 9235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cb->vp ) 9245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project HID_HostRemoveDev( p_cb->hid_handle); 9265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_clean_up_kdev(p_cb); 9275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 929e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 9305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_trace_dev_db(); 9315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 9325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* clean up control block, but retain SDP info and device handle */ 935e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen p_cb->vp = false; 9365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->w4_evt = 0; 9375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if no connection is active and HH disable is signaled, disable service */ 9395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_hh_cb.cnt_num == 0 && bta_hh_cb.w4_disable) 9405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_disc_cmpl(); 9425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 9455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 9465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 9488af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 9498af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_hh_get_dscp_act 9508af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 9518af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Get device report descriptor 9528af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 9538af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 9548af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 9558af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 9568af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 957d35a648d39710bbc5ac59f8add85166455af5af7Myles Watsonvoid bta_hh_get_dscp_act(tBTA_HH_DEV_CB *p_cb, 958d35a648d39710bbc5ac59f8add85166455af5af7Myles Watson UNUSED_ATTR tBTA_HH_DATA *p_data) 9595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 9605cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen 9612e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if (BTA_HH_LE_INCLUDED == TRUE) 9622e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_cb->is_le_device) 9632e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 9642e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_get_dscp_act(p_cb); 9652e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 9662e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach else 9672e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif 9685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bta_hh_cb.p_cback)(BTA_HH_GET_DSCP_EVT, (tBTA_HH *)&p_cb->dscp_info); 9695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 9705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 9728af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 9738af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_hh_maint_dev_act 9748af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 9758af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description HID Host maintain device list. 9768af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 9778af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 9788af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 9798af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 9808af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 9815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_maint_dev_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data) 9825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 9835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_HH_MAINT_DEV *p_dev_info = &p_data->api_maintdev; 9845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_HH_DEV_INFO dev_info ; 985e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen uint8_t dev_handle; 9865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project dev_info.status = BTA_HH_ERR; 9885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project dev_info.handle = BTA_HH_INVALID_HANDLE; 9895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (p_dev_info->sub_event) 9915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_ADD_DEV_EVT: /* add a device */ 9935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdcpy(dev_info.bda, p_dev_info->bda); 9945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* initialize callback data */ 9955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cb->hid_handle == BTA_HH_INVALID_HANDLE) 9965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9972e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if (BTA_HH_LE_INCLUDED == TRUE) 9982e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (bta_hh_is_le_device(p_cb, p_data->api_conn.bd_addr)) 9992e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 10002e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach dev_info.handle = bta_hh_le_add_device(p_cb, p_dev_info); 10012e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach dev_info.status = BTA_HH_OK; 10022e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 10032e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach else 10042e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif 10052e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 10065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (HID_HostAddDev(p_dev_info->bda, p_dev_info->attr_mask, &dev_handle)\ 10075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project == HID_SUCCESS) 10085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project dev_info.handle = dev_handle; 10105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project dev_info.status = BTA_HH_OK; 10115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1012e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_LE_INCLUDED == TRUE) 10135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* update DI information */ 10145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_update_di_info(p_cb, 10155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_info->dscp_info.vendor_id, 10165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_info->dscp_info.product_id, 1017ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_dev_info->dscp_info.version, 10182e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_dev_info->dscp_info.flag); 10192e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#else 10202e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_update_di_info(p_cb, 10212e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_dev_info->dscp_info.vendor_id, 10222e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_dev_info->dscp_info.product_id, 10232e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_dev_info->dscp_info.version, 1024ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 0); 10255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10262e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif 10275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* add to BTA device list */ 10285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_add_device_to_list(p_cb, dev_handle, 10295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_info->attr_mask, 10305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project &p_dev_info->dscp_info.descriptor, 10315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_info->sub_class, 10325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_info->dscp_info.ssr_max_latency, 10335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_info->dscp_info.ssr_min_tout, 10345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_info->app_id); 10355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* update cb_index[] map */ 10365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_cb.cb_index[dev_handle] = p_cb->index; 10375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else /* device already been added */ 10405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project dev_info.handle = p_cb->hid_handle; 10425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project dev_info.status = BTA_HH_OK; 10435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1044e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 10455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_trace_dev_db(); 10465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 10475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1048ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta break; 10495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_RMV_DEV_EVT: /* remove device */ 1050e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen dev_info.handle = (uint8_t)p_dev_info->hdr.layer_specific; 10515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdcpy(dev_info.bda, p_cb->addr); 1052ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1053e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_LE_INCLUDED == TRUE) 10542e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_cb->is_le_device) 10552e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 10562e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_remove_dev_bg_conn(p_cb); 10572e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_sm_execute(p_cb, BTA_HH_API_CLOSE_EVT, NULL); 10582e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_clean_up_kdev(p_cb); 10592e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 10602e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach else 10612e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif 10625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(HID_HostRemoveDev( dev_info.handle ) == HID_SUCCESS) 10645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project dev_info.status = BTA_HH_OK; 10665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* remove from known device list in BTA */ 10685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_clean_up_kdev(p_cb); 10695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 10725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 1074e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("invalid command"); 10755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 10765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (* bta_hh_cb.p_cback)(p_dev_info->sub_event, (tBTA_HH *)&dev_info); 10795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 10805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 10818af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 10828af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_hh_write_dev_act 10838af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 10848af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Write device action. can be SET/GET/DATA transaction. 10858af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 10868af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 10878af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 10888af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 10895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_write_dev_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data) 10905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 10915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_HH_CBDATA cbdata = {BTA_HH_OK, 0}; 1092e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen uint16_t event = (p_data->api_sndcmd.t_type - BTA_HH_FST_BTE_TRANS_EVT) + 10935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_HH_FST_TRANS_CB_EVT; 10945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1095e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_LE_INCLUDED == TRUE) 10962e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_cb->is_le_device) 10972e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_write_dev_act(p_cb, p_data); 10982e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach else 10992e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif 11002e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 11012e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 11025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cbdata.handle = p_cb->hid_handle; 11035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* match up BTE/BTA report/boot mode def */ 11055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_data->api_sndcmd.t_type == HID_TRANS_SET_PROTOCOL) 11065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->api_sndcmd.param = ( p_data->api_sndcmd.param == BTA_HH_PROTO_RPT_MODE) ?\ 11085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project HID_PAR_PROTOCOL_REPORT :HID_PAR_PROTOCOL_BOOT_MODE; 11095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (HID_HostWriteDev (p_cb->hid_handle, 11125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->api_sndcmd.t_type, 11135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->api_sndcmd.param, 11145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->api_sndcmd.data, 11155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->api_sndcmd.rpt_id, 11165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->api_sndcmd.p_data) != HID_SUCCESS) 11175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1118e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("HID_HostWriteDev Error "); 11195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cbdata.status = BTA_HH_ERR; 11205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_data->api_sndcmd.t_type != HID_TRANS_CONTROL && 11225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->api_sndcmd.t_type != HID_TRANS_DATA) 11235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (* bta_hh_cb.p_cback)(event, (tBTA_HH *)&cbdata); 11245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (p_data->api_sndcmd.param == BTA_HH_CTRL_VIRTUAL_CABLE_UNPLUG) 11255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (* bta_hh_cb.p_cback)(BTA_HH_VC_UNPLUG_EVT, (tBTA_HH *)&cbdata); 11265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 11285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch(p_data->api_sndcmd.t_type) 11315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_TRANS_SET_PROTOCOL: 11335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* fall through */ 11345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_TRANS_GET_REPORT: 11355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* fall through */ 11365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_TRANS_SET_REPORT: 11375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* fall through */ 11385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_TRANS_GET_PROTOCOL: 11395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* fall through */ 11405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_TRANS_GET_IDLE: 11415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* fall through */ 11425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_TRANS_SET_IDLE:/* set w4_handsk event name for callback function use */ 11435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->w4_evt = event; 11445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 11455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_TRANS_DATA: /* output report */ 11465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* fall through */ 11475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_TRANS_CONTROL: 11485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* no handshake event will be generated */ 11495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if VC_UNPLUG is issued, set flag */ 11505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_data->api_sndcmd.param == BTA_HH_CTRL_VIRTUAL_CABLE_UNPLUG) 1151e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen p_cb->vp = true; 11525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 11545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* currently not expected */ 11555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_TRANS_DATAC: 11565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 1157e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_hh_write_dev_act:: cmd type = %d", 11585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->api_sndcmd.t_type); 11595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 11605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if not control type transaction, notify PM for energy control */ 11635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_data->api_sndcmd.t_type != HID_TRANS_CONTROL) 11645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* inform PM for mode change */ 11665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_busy(BTA_ID_HH, p_cb->app_id, p_cb->addr); 11675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_idle(BTA_ID_HH, p_cb->app_id, p_cb->addr); 11685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (p_data->api_sndcmd.param == BTA_HH_CTRL_SUSPEND) 11705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_sco_close(BTA_ID_HH, p_cb->app_id, p_cb->addr); 11725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (p_data->api_sndcmd.param == BTA_HH_CTRL_EXIT_SUSPEND) 11745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_busy(BTA_ID_HH, p_cb->app_id, p_cb->addr); 11765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11792e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 11805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 11815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 11825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 11848af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Static Function 11858af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ****************************************************************************/ 11865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 11878af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 11888af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_hh_cback 11898af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 11908af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description BTA HH callback function. 11918af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 11928af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 11938af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 11948af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 11958af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 1196e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssenstatic void bta_hh_cback (uint8_t dev_handle, BD_ADDR addr, uint8_t event, 1197e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen uint32_t data, BT_HDR *pdata) 11985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1199e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen uint16_t sm_event = BTA_HH_INVALID_EVT; 1200e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen uint8_t xx = 0; 12015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1202e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 1203e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_hh_cback::HID_event [%s]", bta_hh_hid_event_name(event)); 12045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 12055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (event) 12075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_HDEV_EVT_OPEN: 12095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sm_event = BTA_HH_INT_OPEN_EVT; 12105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 12115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_HDEV_EVT_CLOSE: 12125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sm_event = BTA_HH_INT_CLOSE_EVT; 12135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 12145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_HDEV_EVT_INTR_DATA: 12155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sm_event = BTA_HH_INT_DATA_EVT; 12165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 12175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_HDEV_EVT_HANDSHAKE: 12185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sm_event = BTA_HH_INT_HANDSK_EVT; 12195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 12205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_HDEV_EVT_CTRL_DATA: 12215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sm_event = BTA_HH_INT_CTRL_DATA; 12225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 12235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_HDEV_EVT_RETRYING: 12245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 12255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_HDEV_EVT_INTR_DATC: 12265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_HDEV_EVT_CTRL_DATC: 12275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Unhandled events: Free buffer for DATAC */ 1228cceb430489a70add1b996d54289867c17f4ac0fdPavlin Radoslavov osi_free_and_reset((void **)&pdata); 12295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 12305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_HDEV_EVT_VC_UNPLUG: 1231ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta for (xx = 0; xx < BTA_HH_MAX_DEVICE; xx++) 12325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_hh_cb.kdev[xx].hid_handle == dev_handle) 12345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1235e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen bta_hh_cb.kdev[xx].vp = true; 12365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 12375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 12405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1242717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov if (sm_event != BTA_HH_INVALID_EVT) { 1243717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov tBTA_HH_CBACK_DATA *p_buf = 1244717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov (tBTA_HH_CBACK_DATA *)osi_malloc(sizeof(tBTA_HH_CBACK_DATA) + 1245717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov sizeof(BT_HDR)); 1246717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov p_buf->hdr.event = sm_event; 1247e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen p_buf->hdr.layer_specific = (uint16_t)dev_handle; 1248717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov p_buf->data = data; 12492e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bdcpy(p_buf->addr, addr); 1250717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov p_buf->p_data = pdata; 12515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_sendmsg(p_buf); 12535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1255717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov 12565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 12578af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 12588af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_hh_get_trans_status 12598af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 12608af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description translate a handshake result code into BTA HH 12618af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * status code 12628af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 12638af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 1264e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssenstatic tBTA_HH_STATUS bta_hh_get_trans_status(uint32_t result) 12655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 12665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch(result) 12675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_PAR_HANDSHAKE_RSP_SUCCESS : /* (0) */ 12695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BTA_HH_OK; 12705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_PAR_HANDSHAKE_RSP_NOT_READY : /* (1) */ 12715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_PAR_HANDSHAKE_RSP_ERR_INVALID_REP_ID: /* (2) */ 12725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_PAR_HANDSHAKE_RSP_ERR_UNSUPPORTED_REQ : /* (3) */ 12735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_PAR_HANDSHAKE_RSP_ERR_INVALID_PARAM : /* (4) */ 12745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (tBTA_HH_STATUS)result; 12755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_PAR_HANDSHAKE_RSP_ERR_UNKNOWN : /* (14) */ 12765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_PAR_HANDSHAKE_RSP_ERR_FATAL : /* (15) */ 12775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 12785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BTA_HH_HS_ERROR; 12795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 12805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 12825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 12838af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Debug Functions 12848af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ****************************************************************************/ 12855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1286e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 1287e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssenstatic const char* bta_hh_get_w4_event(uint16_t event) 12885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 12895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (event) 12905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_GET_RPT_EVT: 12925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "BTA_HH_GET_RPT_EVT"; 12935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_SET_RPT_EVT: 12945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "BTA_HH_SET_RPT_EVT"; 12955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_GET_PROTO_EVT: 12965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "BTA_HH_GET_PROTO_EVT"; 12975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_SET_PROTO_EVT: 12985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "BTA_HH_SET_PROTO_EVT"; 12995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_GET_IDLE_EVT: 13005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "BTA_HH_GET_IDLE_EVT"; 13015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_SET_IDLE_EVT: 13025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "BTA_HH_SET_IDLE_EVT"; 13035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_OPEN_EVT: 13045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "BTA_HH_OPEN_EVT"; 13055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 13065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "Unknown event"; 13075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 13105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1311e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssenstatic const char * bta_hh_hid_event_name(uint16_t event) 13125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 13135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (event) 13145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_HDEV_EVT_OPEN: 13165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "HID_HDEV_EVT_OPEN"; 13175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_HDEV_EVT_CLOSE: 13185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "HID_HDEV_EVT_CLOSE"; 13195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_HDEV_EVT_RETRYING: 13205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "HID_HDEV_EVT_RETRYING"; 13215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_HDEV_EVT_INTR_DATA: 13225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "HID_HDEV_EVT_INTR_DATA"; 13235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_HDEV_EVT_INTR_DATC: 13245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "HID_HDEV_EVT_INTR_DATC"; 13255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_HDEV_EVT_CTRL_DATA: 13265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "HID_HDEV_EVT_CTRL_DATA"; 13275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_HDEV_EVT_CTRL_DATC: 13285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "HID_HDEV_EVT_CTRL_DATC"; 13295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_HDEV_EVT_HANDSHAKE: 13305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "HID_HDEV_EVT_HANDSHAKE"; 13315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_HDEV_EVT_VC_UNPLUG: 13325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "HID_HDEV_EVT_VC_UNPLUG"; 13335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 13345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "Unknown HID event"; 13355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 13375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 13385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* BTA_HH_INCLUDED */ 13395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1340