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 31cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson#include "bta_hh_co.h" 32cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson#include "bta_hh_int.h" 335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_sys.h" 345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_api.h" 355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "l2c_api.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/***************************************************************************** 448af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Local Function prototypes 458af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ****************************************************************************/ 469e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowskistatic void bta_hh_cback(uint8_t dev_handle, const RawAddress& addr, 47011a61951975849b23a10d2be87e5268008d3407Jakub Pawlowski uint8_t event, uint32_t data, BT_HDR* pdata); 48e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssenstatic tBTA_HH_STATUS bta_hh_get_trans_status(uint32_t result); 495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 50e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 51e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssenstatic const char* bta_hh_get_w4_event(uint16_t event); 52cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic const char* bta_hh_hid_event_name(uint16_t event); 535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 568af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Action Functions 578af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ****************************************************************************/ 585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 598af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 608af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_hh_api_enable 618af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 628af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Perform necessary operations to enable HID host. 638af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 648af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 658af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 668af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 678af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 68cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_hh_api_enable(tBTA_HH_DATA* p_data) { 69cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_HH_STATUS status = BTA_HH_ERR; 70cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint8_t xx; 715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 72cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* initialize BTE HID */ 73cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson HID_HostInit(); 745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 75cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson memset(&bta_hh_cb, 0, sizeof(tBTA_HH_CB)); 765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 77cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson HID_HostSetSecurityLevel("", p_data->api_enable.sec_mask); 785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 79cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* Register with L2CAP */ 80cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (HID_HostRegister(bta_hh_cback) == HID_SUCCESS) { 81cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* store parameters */ 82cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_hh_cb.p_cback = p_data->api_enable.p_cback; 83ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 84cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson status = BTA_HH_OK; 85cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* initialize device CB */ 86cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson for (xx = 0; xx < BTA_HH_MAX_DEVICE; xx++) { 87cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_hh_cb.kdev[xx].state = BTA_HH_IDLE_ST; 88cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_hh_cb.kdev[xx].hid_handle = BTA_HH_INVALID_HANDLE; 89cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_hh_cb.kdev[xx].index = xx; 905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 92cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* initialize control block map */ 93cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson for (xx = 0; xx < BTA_HH_MAX_KNOWN; xx++) 94cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_hh_cb.cb_index[xx] = BTA_HH_IDX_INVALID; 95cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 96cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 972e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if (BTA_HH_LE_INCLUDED == TRUE) 98cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (status == BTA_HH_OK) { 99cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_hh_le_enable(); 100cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else 1012e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif 102cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* signal BTA call back event */ 103cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (*bta_hh_cb.p_cback)(BTA_HH_ENABLE_EVT, (tBTA_HH*)&status); 1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1068af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1078af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_hh_api_disable 1088af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1098af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Perform necessary operations to disable HID host. 1108af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1118af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1128af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 1138af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1148af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 115cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_hh_api_disable(void) { 116cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint8_t xx; 117cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 118cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* service is not enabled */ 119cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_hh_cb.p_cback == NULL) return; 120cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 121cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* no live connection, signal DISC_CMPL_EVT directly */ 122cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (!bta_hh_cb.cnt_num) { 123cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_hh_disc_cmpl(); 124cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else /* otherwise, disconnect all live connections */ 125cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson { 126cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_hh_cb.w4_disable = true; 127cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 128cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson for (xx = 0; xx < BTA_HH_MAX_DEVICE; xx++) { 129cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* send API_CLOSE event to every connected device */ 130cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_hh_cb.kdev[xx].state == BTA_HH_CONN_ST) { 131cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* disconnect all connected devices */ 132cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_hh_sm_execute(&bta_hh_cb.kdev[xx], BTA_HH_API_CLOSE_EVT, NULL); 133cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 135cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 137cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return; 1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1418af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1428af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_hh_disc_cmpl 1438af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1448af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description All connections have been closed, disable service. 1458af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1468af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1478af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 1488af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1498af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 150cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_hh_disc_cmpl(void) { 151d628a0695e73973e0bd54dd026bfed900b69f804Myles Watson#if (BTA_HH_LE_INCLUDED == TRUE) 152cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson HID_HostDeregister(); 153cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_hh_le_deregister(); 154d628a0695e73973e0bd54dd026bfed900b69f804Myles Watson#else 155cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_HH_STATUS status = BTA_HH_OK; 1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 157cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* Deregister with lower layer */ 158cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (HID_HostDeregister() != HID_SUCCESS) status = BTA_HH_ERR; 1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 160cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_hh_cleanup_disable(status); 1614540f59bc447dc2b7b31a3e974b74a60b2417e7dVenkatRaghavan VijayaRaghavan#endif 1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 163ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1658af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1668af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_hh_sdp_cback 1678af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1688af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description SDP callback function. 1698af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1708af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 1718af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1728af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 173e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssenstatic void bta_hh_sdp_cback(uint16_t result, uint16_t attr_mask, 174cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tHID_DEV_SDP_INFO* sdp_rec) { 175cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_HH_DEV_CB* p_cb = bta_hh_cb.p_cur; 176cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint8_t hdl = 0; 177cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_HH_STATUS status = BTA_HH_ERR_SDP; 178cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 179cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* make sure sdp succeeded and hh has not been disabled */ 180cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if ((result == SDP_SUCCESS) && (p_cb != NULL)) { 181cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* security is required for the connection, add attr_mask bit*/ 182cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_cb->sec_mask) attr_mask |= HID_SEC_REQUIRED; 1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 184e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 18514d08604848a430871d30853894add7a3facee7bjruthe APPL_TRACE_EVENT("%s: p_cb: %d result 0x%02x, attr_mask 0x%02x, handle %x", 18614d08604848a430871d30853894add7a3facee7bjruthe __func__, p_cb, result, attr_mask, p_cb->hid_handle); 1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 189cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* check to see type of device is supported , and should not been added 190cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * before */ 191cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_hh_tod_spt(p_cb, sdp_rec->sub_class)) { 192cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* if not added before */ 193cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_cb->hid_handle == BTA_HH_INVALID_HANDLE) { 194cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* add device/update attr_mask information */ 195cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (HID_HostAddDev(p_cb->addr, attr_mask, &hdl) == HID_SUCCESS) { 196cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson status = BTA_HH_OK; 197cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* update cb_index[] map */ 198cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_hh_cb.cb_index[hdl] = p_cb->index; 199cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else { 200cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_cb->app_id = 0; 2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 202cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else { 203cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson hdl = p_cb->hid_handle; 204cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 205cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* else : incoming connection after SDP should update the SDP information 206cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * as well */ 2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 208cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_cb->app_id != 0) { 209cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* update cb information with attr_mask, dscp_info etc. */ 210cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_hh_add_device_to_list(p_cb, hdl, attr_mask, &sdp_rec->dscp_info, 211cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson sdp_rec->sub_class, sdp_rec->ssr_max_latency, 212cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson sdp_rec->ssr_min_tout, p_cb->app_id); 2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 214cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_cb->dscp_info.ctry_code = sdp_rec->ctry_code; 2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 216cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson status = BTA_HH_OK; 217cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 218cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 219cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else /* type of device is not supported */ 220cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson status = BTA_HH_ERR_TOD_UNSPT; 221cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 222cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 223cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* free disc_db when SDP is completed */ 224cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson osi_free_and_reset((void**)&bta_hh_cb.p_disc_db); 225cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 226cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* send SDP_CMPL_EVT into state machine */ 227cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_hh_sm_execute(p_cb, BTA_HH_SDP_CMPL_EVT, (tBTA_HH_DATA*)&status); 228cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 229cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return; 2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2328af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 2338af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_hh_di_sdp_cback 2348af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 2358af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description SDP DI callback function. 2368af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 2378af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 2388af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 2398af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 240cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_hh_di_sdp_cback(uint16_t result) { 241cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_HH_DEV_CB* p_cb = bta_hh_cb.p_cur; 242cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_HH_STATUS status = BTA_HH_ERR_SDP; 243cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tSDP_DI_GET_RECORD di_rec; 244cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tHID_STATUS ret; 245e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 24614d08604848a430871d30853894add7a3facee7bjruthe APPL_TRACE_EVENT("%s: p_cb: %d result 0x%02x", __func__, p_cb, result); 2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2482e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 249cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* if DI record does not exist on remote device, vendor_id in 25014d08604848a430871d30853894add7a3facee7bjruthe * tBTA_HH_DEV_DSCP_INFO will be set to 0xffff and we will allow the 25114d08604848a430871d30853894add7a3facee7bjruthe * connection to go through. Spec mandates that DI record be set, but many 25214d08604848a430871d30853894add7a3facee7bjruthe * HID devices do not set this. So for IOP purposes, we allow the connection 25314d08604848a430871d30853894add7a3facee7bjruthe * to go through and update the DI record to invalid DI entry. 25414d08604848a430871d30853894add7a3facee7bjruthe */ 255cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (((result == SDP_SUCCESS) || (result == SDP_NO_RECS_MATCH)) && 256cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (p_cb != NULL)) { 257cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (result == SDP_SUCCESS && 258cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson SDP_GetNumDiRecords(bta_hh_cb.p_disc_db) != 0) { 259cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* always update information with primary DI record */ 260cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (SDP_GetDiRecord(1, &di_rec, bta_hh_cb.p_disc_db) == SDP_SUCCESS) { 261cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_hh_update_di_info(p_cb, di_rec.rec.vendor, di_rec.rec.product, 262cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson di_rec.rec.version, 0); 263cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 264cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 265cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else /* no DI recrod available */ 2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 267cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_hh_update_di_info(p_cb, BTA_HH_VENDOR_ID_INVALID, 0, 0, 0); 268cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 270f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen ret = HID_HostGetSDPRecord(p_cb->addr, bta_hh_cb.p_disc_db, 271f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen p_bta_hh_cfg->sdp_db_size, bta_hh_sdp_cback); 272f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen if (ret == HID_SUCCESS) { 273cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson status = BTA_HH_OK; 274cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else { 275e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 27614d08604848a430871d30853894add7a3facee7bjruthe APPL_TRACE_DEBUG("%s: HID_HostGetSDPRecord failed: Status 0x%2x", 27714d08604848a430871d30853894add7a3facee7bjruthe __func__, ret); 2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 280cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 282cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (status != BTA_HH_OK) { 283cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson osi_free_and_reset((void**)&bta_hh_cb.p_disc_db); 284cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* send SDP_CMPL_EVT into state machine */ 285cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_hh_sm_execute(p_cb, BTA_HH_SDP_CMPL_EVT, (tBTA_HH_DATA*)&status); 286cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 287cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return; 2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2918af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 2928af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_hh_start_sdp 2938af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 2948af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Start SDP service search, and obtain necessary SDP records. 2958af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Only one SDP service search request is allowed at the same 2968af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * time. For every BTA_HhOpen API call, do SDP first unless SDP 2978af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * has been done previously. 2988af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 2998af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 3008af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 3018af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 302cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_hh_start_sdp(tBTA_HH_DEV_CB* p_cb, tBTA_HH_DATA* p_data) { 303cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_HH_STATUS status = BTA_HH_ERR_SDP; 304cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint8_t hdl; 3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 306cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_cb->sec_mask = p_data->api_conn.sec_mask; 307cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_cb->mode = p_data->api_conn.mode; 308cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_hh_cb.p_cur = p_cb; 3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3102e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if (BTA_HH_LE_INCLUDED == TRUE) 311cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_hh_is_le_device(p_cb, p_data->api_conn.bd_addr)) { 312cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_hh_le_open_conn(p_cb, p_data->api_conn.bd_addr); 313cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return; 314cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 3152e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif 3162e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 317cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* if previously virtually cabled device, skip SDP */ 318cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_cb->app_id) { 319cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson status = BTA_HH_OK; 320e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 32114d08604848a430871d30853894add7a3facee7bjruthe APPL_TRACE_DEBUG("%s: skip SDP for known devices", __func__); 3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 323cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_cb->hid_handle == BTA_HH_INVALID_HANDLE) { 324cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (HID_HostAddDev(p_cb->addr, p_cb->attr_mask, &hdl) == HID_SUCCESS) { 325cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* update device CB with newly register device handle */ 326cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_hh_add_device_to_list(p_cb, hdl, p_cb->attr_mask, NULL, 327cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_cb->sub_class, 328cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_cb->dscp_info.ssr_max_latency, 329cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_cb->dscp_info.ssr_min_tout, p_cb->app_id); 330cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* update cb_index[] map */ 331cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_hh_cb.cb_index[hdl] = p_cb->index; 332cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else 333cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson status = BTA_HH_ERR_NO_RES; 3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 335cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_hh_sm_execute(p_cb, BTA_HH_SDP_CMPL_EVT, (tBTA_HH_DATA*)&status); 336cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 337cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return; 338cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 339cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* GetSDPRecord. at one time only one SDP precedure can be active */ 340cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson else if (!bta_hh_cb.p_disc_db) { 341cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_hh_cb.p_disc_db = 342cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (tSDP_DISCOVERY_DB*)osi_malloc(p_bta_hh_cfg->sdp_db_size); 343cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_hh_cb.p_cur = p_cb; 344cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* do DI discovery first */ 345135b7f68e4404872b9c5541146702c079e987877Jakub Pawlowski if (SDP_DiDiscover(p_data->api_conn.bd_addr, bta_hh_cb.p_disc_db, 346135b7f68e4404872b9c5541146702c079e987877Jakub Pawlowski p_bta_hh_cfg->sdp_db_size, 347cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_hh_di_sdp_cback) != SDP_SUCCESS) { 348e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 34914d08604848a430871d30853894add7a3facee7bjruthe APPL_TRACE_DEBUG("%s: SDP_DiDiscover failed: Status 0x%2X", __func__, 35014d08604848a430871d30853894add7a3facee7bjruthe status); 3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 352cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson status = BTA_HH_ERR_SDP; 353cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson osi_free_and_reset((void**)&bta_hh_cb.p_disc_db); 354cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else { 355cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson status = BTA_HH_OK; 3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 357cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else if (bta_hh_cb.p_disc_db) { 358cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* It is possible that there is incoming/outgoing collision case. DUT 359cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * initiated 360cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * HID connection at same time remote has connected L2CAP for HID control, 361cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * so SDP would be in progress, when this flow reaches here. Just do nothing 362cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * when the code reaches here, and ongoing SDP completion or failure will 363cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * handle this case. 364cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson */ 365cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG("%s: ignoring as SDP already in progress", __func__); 3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 367cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 368cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 369cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (status != BTA_HH_OK) 370cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_hh_sm_execute(p_cb, BTA_HH_SDP_CMPL_EVT, (tBTA_HH_DATA*)&status); 3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 372cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return; 3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3758af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 3768af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_hh_sdp_cmpl 3778af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 3781baaae3f34a667058e7f0c5f778357d98320cf38Myles Watson * Description When SDP completes, initiate a connection or report an error 3791baaae3f34a667058e7f0c5f778357d98320cf38Myles Watson * depending on the SDP result. 3808af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 3818af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 3828af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 3838af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 3848af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 385cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_hh_sdp_cmpl(tBTA_HH_DEV_CB* p_cb, tBTA_HH_DATA* p_data) { 386cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_HH_CONN conn_dat; 387cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_HH_STATUS status = p_data->status; 3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 389e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 39014d08604848a430871d30853894add7a3facee7bjruthe APPL_TRACE_DEBUG("%s: status 0x%2X", __func__, p_data->status); 3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 393cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* initialize call back data */ 394cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson memset((void*)&conn_dat, 0, sizeof(tBTA_HH_CONN)); 395cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson conn_dat.handle = p_cb->hid_handle; 396011a61951975849b23a10d2be87e5268008d3407Jakub Pawlowski conn_dat.bda = p_cb->addr; 397cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 398cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* if SDP compl success */ 399cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (status == BTA_HH_OK) { 400cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* not incoming connection doing SDP, initiate a HID connection */ 401cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (!p_cb->incoming_conn) { 402cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tHID_STATUS ret; 403cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* set security level */ 404cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson HID_HostSetSecurityLevel("", p_cb->sec_mask); 405cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 406cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* open HID connection */ 407cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson ret = HID_HostOpenDev(p_cb->hid_handle); 408cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG("%s: HID_HostOpenDev returned=%d", __func__, ret); 409cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (ret == HID_SUCCESS || ret == HID_ERR_ALREADY_CONN) { 410cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson status = BTA_HH_OK; 411cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else if (ret == HID_ERR_CONN_IN_PROCESS) { 412cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* Connection already in progress, return from here, SDP 413cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * will be performed after connection is completed. 414cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson */ 415cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG("%s: connection already in progress", __func__); 416cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return; 417cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else { 418e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 419cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG("%s: HID_HostOpenDev failed: Status 0x%2X", __func__, 420cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson ret); 4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 422cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* open fail, remove device from management device list */ 423cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson HID_HostRemoveDev(p_cb->hid_handle); 424cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson status = BTA_HH_ERR; 425cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 426cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else /* incoming connection SDP finish */ 4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 428cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_hh_sm_execute(p_cb, BTA_HH_OPEN_CMPL_EVT, NULL); 429cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 430cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 431cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 432cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (status != BTA_HH_OK) { 433cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* Check if this was incoming connection request from an unknown device 43414d08604848a430871d30853894add7a3facee7bjruthe * and connection failed due to missing HID Device SDP UUID 43514d08604848a430871d30853894add7a3facee7bjruthe * In above condition, disconnect the link as well as remove the 43614d08604848a430871d30853894add7a3facee7bjruthe * device from list of HID devices 43714d08604848a430871d30853894add7a3facee7bjruthe */ 438cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if ((status == BTA_HH_ERR_SDP) && (p_cb->incoming_conn) && 439cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (p_cb->app_id == 0)) { 44014d08604848a430871d30853894add7a3facee7bjruthe APPL_TRACE_DEBUG("%s: SDP failed for incoming conn :hndl %d", __func__, 441cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_cb->incoming_hid_handle); 442cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson HID_HostRemoveDev(p_cb->incoming_hid_handle); 443cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 444cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson conn_dat.status = status; 445cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (*bta_hh_cb.p_cback)(BTA_HH_OPEN_EVT, (tBTA_HH*)&conn_dat); 4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 447cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* move state machine W4_CONN ->IDLE */ 448cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_hh_sm_execute(p_cb, BTA_HH_API_CLOSE_EVT, NULL); 4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 450cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* if this is an outgoing connection to an unknown device, clean up cb */ 451cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_cb->app_id == 0 && !p_cb->incoming_conn) { 452cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* clean up device control block */ 453cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_hh_clean_up_kdev(p_cb); 454cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 455e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 456cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_hh_trace_dev_db(); 4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 458cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 459cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return; 4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4638af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 4648af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_hh_api_disc_act 4658af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 4668af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description HID Host initiate a disconnection. 4678af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 4688af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 4698af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 4708af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 4718af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 472cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_hh_api_disc_act(tBTA_HH_DEV_CB* p_cb, tBTA_HH_DATA* p_data) { 473cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_HH_CBDATA disc_dat; 474cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tHID_STATUS status; 4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 476e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_LE_INCLUDED == TRUE) 477cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_cb->is_le_device) 478cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_hh_le_api_disc_act(p_cb); 479cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson else 4802e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif 481cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson { 482cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* found an active connection */ 483cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson disc_dat.handle = 484cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_data ? (uint8_t)p_data->hdr.layer_specific : p_cb->hid_handle; 485cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson disc_dat.status = BTA_HH_ERR; 4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 487cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson status = HID_HostCloseDev(disc_dat.handle); 4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 489cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (status) (*bta_hh_cb.p_cback)(BTA_HH_CLOSE_EVT, (tBTA_HH*)&disc_dat); 490cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 4912e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 492cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return; 4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4958af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 4968af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_hh_open_cmpl_act 4978af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 4988af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description HID host connection completed 4998af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 5008af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 5018af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 5028af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 5038af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 504cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_hh_open_cmpl_act(tBTA_HH_DEV_CB* p_cb, tBTA_HH_DATA* p_data) { 505cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_HH_CONN conn; 506cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint8_t dev_handle = 507cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_data ? (uint8_t)p_data->hid_cback.hdr.layer_specific : p_cb->hid_handle; 5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 509cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson memset((void*)&conn, 0, sizeof(tBTA_HH_CONN)); 510cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson conn.handle = dev_handle; 511011a61951975849b23a10d2be87e5268008d3407Jakub Pawlowski conn.bda = p_cb->addr; 5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 513cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* increase connection number */ 514cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_hh_cb.cnt_num++; 5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 516cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* initialize device driver */ 517cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_hh_co_open(p_cb->hid_handle, p_cb->sub_class, p_cb->attr_mask, 518cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_cb->app_id); 5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5202e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if (BTA_HH_LE_INCLUDED == TRUE) 521cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson conn.status = p_cb->status; 522cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson conn.le_hid = p_cb->is_le_device; 523cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson conn.scps_supported = p_cb->scps_supported; 5242e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 525cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (!p_cb->is_le_device) 5262e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif 527cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson { 528cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* inform role manager */ 529c752e135d66f80c0b2efc35292ab8ddfd8227d61Jakub Pawlowski bta_sys_conn_open(BTA_ID_HH, p_cb->app_id, p_cb->addr); 530cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 531cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* set protocol mode when not default report mode */ 532cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_cb->mode != BTA_HH_PROTO_RPT_MODE 5332e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if (BTA_HH_LE_INCLUDED == TRUE) 534cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson && !p_cb->is_le_device 5352e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif 536cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson ) { 537cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if ((HID_HostWriteDev(dev_handle, HID_TRANS_SET_PROTOCOL, 538cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson HID_PAR_PROTOCOL_BOOT_MODE, 0, 0, NULL)) != 539cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson HID_SUCCESS) { 540cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* HID connection is up, while SET_PROTO fail */ 541cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson conn.status = BTA_HH_ERR_PROTO; 542cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (*bta_hh_cb.p_cback)(BTA_HH_OPEN_EVT, (tBTA_HH*)&conn); 543cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else { 544cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson conn.status = BTA_HH_OK; 545cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_cb->w4_evt = BTA_HH_OPEN_EVT; 5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 547cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else 548cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (*bta_hh_cb.p_cback)(BTA_HH_OPEN_EVT, (tBTA_HH*)&conn); 5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 550cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_cb->incoming_conn = false; 551cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_cb->incoming_hid_handle = BTA_HH_INVALID_HANDLE; 5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5548af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 5558af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_hh_open_act 5568af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 5578af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description HID host receive HID_OPEN_EVT . 5588af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 5598af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 5608af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 5618af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 5628af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 563cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_hh_open_act(tBTA_HH_DEV_CB* p_cb, tBTA_HH_DATA* p_data) { 564cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_HH_API_CONN conn_data; 5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 566cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint8_t dev_handle = 567cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_data ? (uint8_t)p_data->hid_cback.hdr.layer_specific : p_cb->hid_handle; 5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 569e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 57014d08604848a430871d30853894add7a3facee7bjruthe APPL_TRACE_EVENT("%s: Device[%d] connected", __func__, dev_handle); 5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 573cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* SDP has been done */ 574cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_cb->app_id != 0) { 575cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_hh_sm_execute(p_cb, BTA_HH_OPEN_CMPL_EVT, p_data); 576cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else 577cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* app_id == 0 indicates an incoming conenction request arrives without SDP 57814d08604848a430871d30853894add7a3facee7bjruthe * performed, do it first 57914d08604848a430871d30853894add7a3facee7bjruthe */ 580cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson { 581cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_cb->incoming_conn = true; 582cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* store the handle here in case sdp fails - need to disconnect */ 583cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_cb->incoming_hid_handle = dev_handle; 584cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 585cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson memset(&conn_data, 0, sizeof(tBTA_HH_API_CONN)); 586011a61951975849b23a10d2be87e5268008d3407Jakub Pawlowski conn_data.bd_addr = p_cb->addr; 587cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_hh_start_sdp(p_cb, (tBTA_HH_DATA*)&conn_data); 588cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 589cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 590cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return; 5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5948af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 5958af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_hh_data_act 5968af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 5978af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description HID Host process a data report 5988af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 5998af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 6008af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 6018af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 6028af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 603cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_hh_data_act(tBTA_HH_DEV_CB* p_cb, tBTA_HH_DATA* p_data) { 604cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BT_HDR* pdata = p_data->hid_cback.p_data; 605cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint8_t* p_rpt = (uint8_t*)(pdata + 1) + pdata->offset; 6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 607cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_hh_co_data((uint8_t)p_data->hid_cback.hdr.layer_specific, p_rpt, 608cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson pdata->len, p_cb->mode, p_cb->sub_class, 609cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_cb->dscp_info.ctry_code, p_cb->addr, p_cb->app_id); 6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 611cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson osi_free_and_reset((void**)&pdata); 6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6158af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 6168af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_hh_handsk_act 6178af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 618f11e42b1c2a1c185bf83b1d08e033c4e5aec54c2Ajay Panicker * Description HID Host process a handshake acknoledgement. 6198af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 6208af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 6218af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 6228af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 6238af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 624cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_hh_handsk_act(tBTA_HH_DEV_CB* p_cb, tBTA_HH_DATA* p_data) { 625cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_HH_CBDATA cback_data; 626cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_HH_HSDATA hs_data; 627cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_HH_CONN conn; 6285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 629e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 630cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG("HANDSHAKE received for: event = %s data= %d", 631cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_hh_get_w4_event(p_cb->w4_evt), p_data->hid_cback.data); 6325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 634cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson memset(&hs_data, 0, sizeof(tBTA_HH_HSDATA)); 635cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson memset(&cback_data, 0, sizeof(tBTA_HH_CBDATA)); 6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 637cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson switch (p_cb->w4_evt) { 638cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* GET_ transsaction, handshake indicate unsupported request */ 639cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson case BTA_HH_GET_PROTO_EVT: 640cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson hs_data.rsp_data.proto_mode = BTA_HH_PROTO_UNKNOWN; 641cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* fall through */ 642cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson case BTA_HH_GET_RPT_EVT: 643cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson case BTA_HH_GET_IDLE_EVT: 644cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson hs_data.handle = p_cb->hid_handle; 645cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* if handshake gives an OK code for these transaction, fill in UNSUPT */ 646f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen hs_data.status = bta_hh_get_trans_status(p_data->hid_cback.data); 647f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen if (hs_data.status == BTA_HH_OK) hs_data.status = BTA_HH_HS_TRANS_NOT_SPT; 648f11e42b1c2a1c185bf83b1d08e033c4e5aec54c2Ajay Panicker 649cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (*bta_hh_cb.p_cback)(p_cb->w4_evt, (tBTA_HH*)&hs_data); 650cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_cb->w4_evt = 0; 651cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson break; 652cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 653cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* acknoledgement from HID device for SET_ transaction */ 654cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson case BTA_HH_SET_RPT_EVT: 655cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson case BTA_HH_SET_PROTO_EVT: 656cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson case BTA_HH_SET_IDLE_EVT: 657cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson cback_data.handle = p_cb->hid_handle; 658cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson cback_data.status = bta_hh_get_trans_status(p_data->hid_cback.data); 659cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (*bta_hh_cb.p_cback)(p_cb->w4_evt, (tBTA_HH*)&cback_data); 660cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_cb->w4_evt = 0; 661cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson break; 662cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 663cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* SET_PROTOCOL when open connection */ 664cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson case BTA_HH_OPEN_EVT: 665cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson conn.status = p_data->hid_cback.data ? BTA_HH_ERR_PROTO : BTA_HH_OK; 666cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson conn.handle = p_cb->hid_handle; 667011a61951975849b23a10d2be87e5268008d3407Jakub Pawlowski conn.bda = p_cb->addr; 668cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (*bta_hh_cb.p_cback)(p_cb->w4_evt, (tBTA_HH*)&conn); 669e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 670cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_hh_trace_dev_db(); 6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 672cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_cb->w4_evt = 0; 673cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson break; 6745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 675cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson default: 676cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* unknow transaction handshake response */ 677cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG("unknown transaction type"); 678cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson break; 679cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 680cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 681cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* transaction achknoledgement received, inform PM for mode change */ 682c752e135d66f80c0b2efc35292ab8ddfd8227d61Jakub Pawlowski bta_sys_idle(BTA_ID_HH, p_cb->app_id, p_cb->addr); 683cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return; 6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6868af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 6878af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_hh_ctrl_dat_act 6888af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 6898af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description HID Host process a data report from control channel. 6908af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 6918af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 6928af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 6938af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 6948af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 695cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_hh_ctrl_dat_act(tBTA_HH_DEV_CB* p_cb, tBTA_HH_DATA* p_data) { 696cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BT_HDR* pdata = p_data->hid_cback.p_data; 697cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint8_t* data = (uint8_t*)(pdata + 1) + pdata->offset; 698cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_HH_HSDATA hs_data; 6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 700e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 701cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG("Ctrl DATA received w4: event[%s]", 702cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_hh_get_w4_event(p_cb->w4_evt)); 7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 704cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson hs_data.status = BTA_HH_OK; 705cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson hs_data.handle = p_cb->hid_handle; 7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 707cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson switch (p_cb->w4_evt) { 7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_GET_IDLE_EVT: 709cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson hs_data.rsp_data.idle_rate = *data; 710cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson break; 7115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_GET_RPT_EVT: 712cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson hs_data.rsp_data.p_rpt_data = pdata; 713cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson break; 7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_GET_PROTO_EVT: 715cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* match up BTE/BTA report/boot mode def*/ 716cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson hs_data.rsp_data.proto_mode = ((*data) == HID_PAR_PROTOCOL_REPORT) 717cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson ? BTA_HH_PROTO_RPT_MODE 718cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson : BTA_HH_PROTO_BOOT_MODE; 719e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 720cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG("GET_PROTOCOL Mode = [%s]", 721cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (hs_data.rsp_data.proto_mode == BTA_HH_PROTO_RPT_MODE) 722cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson ? "Report" 723cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson : "Boot"); 7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 725cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson break; 7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* should not expect control DATA for SET_ transaction */ 7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_SET_PROTO_EVT: 728cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* fall through */ 7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_SET_RPT_EVT: 730cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* fall through */ 731cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson case BTA_HH_SET_IDLE_EVT: 732cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* fall through */ 7335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 734e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 735cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG("invalid transaction type for DATA payload: 4_evt[%s]", 736cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_hh_get_w4_event(p_cb->w4_evt)); 7375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 738cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson break; 739cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 7405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 741cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* inform PM for mode change */ 742c752e135d66f80c0b2efc35292ab8ddfd8227d61Jakub Pawlowski bta_sys_busy(BTA_ID_HH, p_cb->app_id, p_cb->addr); 743c752e135d66f80c0b2efc35292ab8ddfd8227d61Jakub Pawlowski bta_sys_idle(BTA_ID_HH, p_cb->app_id, p_cb->addr); 7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 745cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (*bta_hh_cb.p_cback)(p_cb->w4_evt, (tBTA_HH*)&hs_data); 7465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 747cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_cb->w4_evt = 0; 748cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson osi_free_and_reset((void**)&pdata); 7495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 7528af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 7538af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_hh_open_failure 7548af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 755cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * Description report HID open failure when at wait for connection state 7561baaae3f34a667058e7f0c5f778357d98320cf38Myles Watson * and receive device close event. 7578af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 7588af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 7598af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 7608af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 7618af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 762cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_hh_open_failure(tBTA_HH_DEV_CB* p_cb, tBTA_HH_DATA* p_data) { 763cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_HH_CONN conn_dat; 764cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint32_t reason = p_data->hid_cback.data; /* Reason for closing (32-bit) */ 7652e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 766cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson memset(&conn_dat, 0, sizeof(tBTA_HH_CONN)); 767cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson conn_dat.handle = p_cb->hid_handle; 768cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson conn_dat.status = 769cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (reason == HID_ERR_AUTH_FAILED) ? BTA_HH_ERR_AUTH_FAILED : BTA_HH_ERR; 770011a61951975849b23a10d2be87e5268008d3407Jakub Pawlowski conn_dat.bda = p_cb->addr; 771cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson HID_HostCloseDev(p_cb->hid_handle); 7722e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 773cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* Report OPEN fail event */ 774cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (*bta_hh_cb.p_cback)(BTA_HH_OPEN_EVT, (tBTA_HH*)&conn_dat); 7752e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 776e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 777cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_hh_trace_dev_db(); 7782e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif 779cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* clean up control block, but retain SDP info and device handle */ 780cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_cb->vp = false; 781cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_cb->w4_evt = 0; 782cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 783cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* if no connection is active and HH disable is signaled, disable service */ 784cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_hh_cb.cnt_num == 0 && bta_hh_cb.w4_disable) { 785cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_hh_disc_cmpl(); 786cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 787cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 788cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* Error in opening hid connection, reset flags */ 789cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_cb->incoming_conn = false; 790cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_cb->incoming_hid_handle = BTA_HH_INVALID_HANDLE; 7912e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach} 7922e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 7932e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/******************************************************************************* 7948af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 7958af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_hh_close_act 7968af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 7978af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description HID Host process a close event 7988af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 7998af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 8008af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 8018af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 8028af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 803cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_hh_close_act(tBTA_HH_DEV_CB* p_cb, tBTA_HH_DATA* p_data) { 804cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_HH_CONN conn_dat; 805cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_HH_CBDATA disc_dat = {BTA_HH_OK, 0}; 806cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint32_t reason = p_data->hid_cback.data; /* Reason for closing (32-bit) */ 807cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 808cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* if HID_HDEV_EVT_VC_UNPLUG was received, report BTA_HH_VC_UNPLUG_EVT */ 809cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint16_t event = p_cb->vp ? BTA_HH_VC_UNPLUG_EVT : BTA_HH_CLOSE_EVT; 810cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 811cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson disc_dat.handle = p_cb->hid_handle; 812cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson disc_dat.status = p_data->hid_cback.data; 813cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 814cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* Check reason for closing */ 815cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if ((reason & (HID_L2CAP_CONN_FAIL | 816cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson HID_L2CAP_REQ_FAIL)) || /* Failure to initialize connection 817cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (page timeout or l2cap error) */ 818cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (reason == 819cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson HID_ERR_AUTH_FAILED) || /* Authenication error (while initiating) */ 820cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (reason == HID_ERR_L2CAP_FAILED)) /* Failure creating l2cap connection */ 821cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson { 822cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* Failure in opening connection */ 823cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson conn_dat.handle = p_cb->hid_handle; 824cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson conn_dat.status = 825cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (reason == HID_ERR_AUTH_FAILED) ? BTA_HH_ERR_AUTH_FAILED : BTA_HH_ERR; 826011a61951975849b23a10d2be87e5268008d3407Jakub Pawlowski conn_dat.bda = p_cb->addr; 827cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson HID_HostCloseDev(p_cb->hid_handle); 8285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 829cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* Report OPEN fail event */ 830cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (*bta_hh_cb.p_cback)(BTA_HH_OPEN_EVT, (tBTA_HH*)&conn_dat); 8315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 832e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 833cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_hh_trace_dev_db(); 8345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 835cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return; 836cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 837cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* otherwise report CLOSE/VC_UNPLUG event */ 838cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson else { 839cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* finaliza device driver */ 840cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_hh_co_close(p_cb->hid_handle, p_cb->app_id); 841cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* inform role manager */ 842c752e135d66f80c0b2efc35292ab8ddfd8227d61Jakub Pawlowski bta_sys_conn_close(BTA_ID_HH, p_cb->app_id, p_cb->addr); 843cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* update total conn number */ 844cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_hh_cb.cnt_num--; 845cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 846cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (disc_dat.status) disc_dat.status = BTA_HH_ERR; 847cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 848cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (*bta_hh_cb.p_cback)(event, (tBTA_HH*)&disc_dat); 849cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 850cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* if virtually unplug, remove device */ 851cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_cb->vp) { 852cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson HID_HostRemoveDev(p_cb->hid_handle); 853cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_hh_clean_up_kdev(p_cb); 8545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 856e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 857cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_hh_trace_dev_db(); 8585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 859cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 8605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 861cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* clean up control block, but retain SDP info and device handle */ 862cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_cb->vp = false; 863cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_cb->w4_evt = 0; 8645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 865cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* if no connection is active and HH disable is signaled, disable service */ 866cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_hh_cb.cnt_num == 0 && bta_hh_cb.w4_disable) { 867cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_hh_disc_cmpl(); 868cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 8695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 870cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return; 8715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 8748af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 8758af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_hh_get_dscp_act 8768af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 8778af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Get device report descriptor 8788af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 8798af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 8808af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 8818af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 8828af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 883cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_hh_get_dscp_act(tBTA_HH_DEV_CB* p_cb, 884cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson UNUSED_ATTR tBTA_HH_DATA* p_data) { 8852e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if (BTA_HH_LE_INCLUDED == TRUE) 886cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_cb->is_le_device) { 887cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_hh_le_get_dscp_act(p_cb); 888cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else 8892e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif 890cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (*bta_hh_cb.p_cback)(BTA_HH_GET_DSCP_EVT, (tBTA_HH*)&p_cb->dscp_info); 8915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 8948af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 8958af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_hh_maint_dev_act 8968af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 8978af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description HID Host maintain device list. 8988af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 8998af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 9008af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 9018af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 9028af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 903cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_hh_maint_dev_act(tBTA_HH_DEV_CB* p_cb, tBTA_HH_DATA* p_data) { 904cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_HH_MAINT_DEV* p_dev_info = &p_data->api_maintdev; 905cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_HH_DEV_INFO dev_info; 906cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint8_t dev_handle; 907cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 908cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson dev_info.status = BTA_HH_ERR; 909cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson dev_info.handle = BTA_HH_INVALID_HANDLE; 910cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 911cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson switch (p_dev_info->sub_event) { 912cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson case BTA_HH_ADD_DEV_EVT: /* add a device */ 913011a61951975849b23a10d2be87e5268008d3407Jakub Pawlowski dev_info.bda = p_dev_info->bda; 914cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* initialize callback data */ 915cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_cb->hid_handle == BTA_HH_INVALID_HANDLE) { 9162e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if (BTA_HH_LE_INCLUDED == TRUE) 917cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_hh_is_le_device(p_cb, p_data->api_conn.bd_addr)) { 918cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson dev_info.handle = bta_hh_le_add_device(p_cb, p_dev_info); 919cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson dev_info.status = BTA_HH_OK; 920cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else 9212e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif 9222e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 923cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (HID_HostAddDev(p_dev_info->bda, p_dev_info->attr_mask, 924cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson &dev_handle) == HID_SUCCESS) { 925cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson dev_info.handle = dev_handle; 926cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson dev_info.status = BTA_HH_OK; 9275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 928e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_LE_INCLUDED == TRUE) 929cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* update DI information */ 930cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_hh_update_di_info(p_cb, p_dev_info->dscp_info.vendor_id, 931cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_dev_info->dscp_info.product_id, 932cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_dev_info->dscp_info.version, 933cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_dev_info->dscp_info.flag); 9342e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#else 935cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_hh_update_di_info(p_cb, p_dev_info->dscp_info.vendor_id, 936cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_dev_info->dscp_info.product_id, 937cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_dev_info->dscp_info.version, 0); 9385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9392e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif 940cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* add to BTA device list */ 941cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_hh_add_device_to_list( 942cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_cb, dev_handle, p_dev_info->attr_mask, 943cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson &p_dev_info->dscp_info.descriptor, p_dev_info->sub_class, 944cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_dev_info->dscp_info.ssr_max_latency, 945cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_dev_info->dscp_info.ssr_min_tout, p_dev_info->app_id); 946cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* update cb_index[] map */ 947cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_hh_cb.cb_index[dev_handle] = p_cb->index; 9485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 949cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else /* device already been added */ 950cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson { 951cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson dev_info.handle = p_cb->hid_handle; 952cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson dev_info.status = BTA_HH_OK; 953cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 954e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 955cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_hh_trace_dev_db(); 9565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 9575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 958cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson break; 959cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson case BTA_HH_RMV_DEV_EVT: /* remove device */ 960cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson dev_info.handle = (uint8_t)p_dev_info->hdr.layer_specific; 961011a61951975849b23a10d2be87e5268008d3407Jakub Pawlowski dev_info.bda = p_cb->addr; 962ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 963e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_LE_INCLUDED == TRUE) 964cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_cb->is_le_device) { 965cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_hh_le_remove_dev_bg_conn(p_cb); 966cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_hh_sm_execute(p_cb, BTA_HH_API_CLOSE_EVT, NULL); 967cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_hh_clean_up_kdev(p_cb); 968cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else 9692e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif 970cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson { 971cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (HID_HostRemoveDev(dev_info.handle) == HID_SUCCESS) { 972cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson dev_info.status = BTA_HH_OK; 973cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 974cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* remove from known device list in BTA */ 975cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_hh_clean_up_kdev(p_cb); 9765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 977cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 978cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson break; 9795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 981cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG("invalid command"); 982cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson break; 983cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 9845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 985cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (*bta_hh_cb.p_cback)(p_dev_info->sub_event, (tBTA_HH*)&dev_info); 9865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 9875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 9888af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 9898af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_hh_write_dev_act 9908af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 9918af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Write device action. can be SET/GET/DATA transaction. 9928af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 9938af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 9948af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 9958af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 996cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_hh_write_dev_act(tBTA_HH_DEV_CB* p_cb, tBTA_HH_DATA* p_data) { 997cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_HH_CBDATA cbdata = {BTA_HH_OK, 0}; 998cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint16_t event = (p_data->api_sndcmd.t_type - BTA_HH_FST_BTE_TRANS_EVT) + 999cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTA_HH_FST_TRANS_CB_EVT; 10005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1001e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_LE_INCLUDED == TRUE) 1002cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_cb->is_le_device) 1003cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_hh_le_write_dev_act(p_cb, p_data); 1004cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson else 10052e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif 1006cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson { 10072e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 10085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cbdata.handle = p_cb->hid_handle; 10095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* match up BTE/BTA report/boot mode def */ 1011cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_data->api_sndcmd.t_type == HID_TRANS_SET_PROTOCOL) { 1012cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_data->api_sndcmd.param = 1013cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (p_data->api_sndcmd.param == BTA_HH_PROTO_RPT_MODE) 1014cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson ? HID_PAR_PROTOCOL_REPORT 1015cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson : HID_PAR_PROTOCOL_BOOT_MODE; 10165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1018cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (HID_HostWriteDev(p_cb->hid_handle, p_data->api_sndcmd.t_type, 1019cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_data->api_sndcmd.param, p_data->api_sndcmd.data, 1020cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_data->api_sndcmd.rpt_id, 1021cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_data->api_sndcmd.p_data) != HID_SUCCESS) { 1022cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_ERROR("HID_HostWriteDev Error "); 1023cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson cbdata.status = BTA_HH_ERR; 1024cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 1025cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_data->api_sndcmd.t_type != HID_TRANS_CONTROL && 1026cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_data->api_sndcmd.t_type != HID_TRANS_DATA) 1027cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (*bta_hh_cb.p_cback)(event, (tBTA_HH*)&cbdata); 1028cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson else if (p_data->api_sndcmd.param == BTA_HH_CTRL_VIRTUAL_CABLE_UNPLUG) 1029cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (*bta_hh_cb.p_cback)(BTA_HH_VC_UNPLUG_EVT, (tBTA_HH*)&cbdata); 1030cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else { 1031cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson switch (p_data->api_sndcmd.t_type) { 10325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_TRANS_SET_PROTOCOL: 1033cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* fall through */ 10345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_TRANS_GET_REPORT: 1035cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* fall through */ 10365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_TRANS_SET_REPORT: 1037cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* fall through */ 10385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_TRANS_GET_PROTOCOL: 1039cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* fall through */ 10405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_TRANS_GET_IDLE: 1041cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* fall through */ 1042cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson case HID_TRANS_SET_IDLE: /* set w4_handsk event name for callback 1043cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson function use */ 1044cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_cb->w4_evt = event; 1045cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson break; 1046cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson case HID_TRANS_DATA: /* output report */ 1047cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* fall through */ 10485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_TRANS_CONTROL: 1049cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* no handshake event will be generated */ 1050cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* if VC_UNPLUG is issued, set flag */ 1051cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_data->api_sndcmd.param == BTA_HH_CTRL_VIRTUAL_CABLE_UNPLUG) 1052cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_cb->vp = true; 10535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1054cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson break; 10555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* currently not expected */ 10565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_TRANS_DATAC: 10575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 105814d08604848a430871d30853894add7a3facee7bjruthe APPL_TRACE_DEBUG("%s: cmd type = %d", __func__, 1059cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_data->api_sndcmd.t_type); 1060cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson break; 1061cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 1062cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 1063cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* if not control type transaction, notify PM for energy control */ 1064cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_data->api_sndcmd.t_type != HID_TRANS_CONTROL) { 1065cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* inform PM for mode change */ 1066c752e135d66f80c0b2efc35292ab8ddfd8227d61Jakub Pawlowski bta_sys_busy(BTA_ID_HH, p_cb->app_id, p_cb->addr); 1067c752e135d66f80c0b2efc35292ab8ddfd8227d61Jakub Pawlowski bta_sys_idle(BTA_ID_HH, p_cb->app_id, p_cb->addr); 1068cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else if (p_data->api_sndcmd.param == BTA_HH_CTRL_SUSPEND) { 1069c752e135d66f80c0b2efc35292ab8ddfd8227d61Jakub Pawlowski bta_sys_sco_close(BTA_ID_HH, p_cb->app_id, p_cb->addr); 1070cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else if (p_data->api_sndcmd.param == BTA_HH_CTRL_EXIT_SUSPEND) { 1071c752e135d66f80c0b2efc35292ab8ddfd8227d61Jakub Pawlowski bta_sys_busy(BTA_ID_HH, p_cb->app_id, p_cb->addr); 1072cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 10732e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 1074cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 1075cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return; 10765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 10775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 10798af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Static Function 10808af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ****************************************************************************/ 10815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 10828af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 10838af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_hh_cback 10848af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 10858af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description BTA HH callback function. 10868af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 10878af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 10888af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 10898af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 10908af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 10919e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowskistatic void bta_hh_cback(uint8_t dev_handle, const RawAddress& addr, 1092011a61951975849b23a10d2be87e5268008d3407Jakub Pawlowski uint8_t event, uint32_t data, BT_HDR* pdata) { 1093cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint16_t sm_event = BTA_HH_INVALID_EVT; 1094cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint8_t xx = 0; 10955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1096e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 109714d08604848a430871d30853894add7a3facee7bjruthe APPL_TRACE_DEBUG("%s::HID_event [%s]", __func__, 1098cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_hh_hid_event_name(event)); 10995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 11005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1101cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson switch (event) { 11025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_HDEV_EVT_OPEN: 1103cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson sm_event = BTA_HH_INT_OPEN_EVT; 1104cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson break; 11055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_HDEV_EVT_CLOSE: 1106cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson sm_event = BTA_HH_INT_CLOSE_EVT; 1107cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson break; 11085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_HDEV_EVT_INTR_DATA: 1109cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson sm_event = BTA_HH_INT_DATA_EVT; 1110cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson break; 11115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_HDEV_EVT_HANDSHAKE: 1112cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson sm_event = BTA_HH_INT_HANDSK_EVT; 1113cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson break; 11145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_HDEV_EVT_CTRL_DATA: 1115cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson sm_event = BTA_HH_INT_CTRL_DATA; 1116cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson break; 11175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_HDEV_EVT_RETRYING: 1118cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson break; 11195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_HDEV_EVT_INTR_DATC: 11205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_HDEV_EVT_CTRL_DATC: 1121cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* Unhandled events: Free buffer for DATAC */ 1122cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson osi_free_and_reset((void**)&pdata); 1123cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson break; 11245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_HDEV_EVT_VC_UNPLUG: 1125cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson for (xx = 0; xx < BTA_HH_MAX_DEVICE; xx++) { 1126cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_hh_cb.kdev[xx].hid_handle == dev_handle) { 1127cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_hh_cb.kdev[xx].vp = true; 1128cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson break; 11295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1130cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 1131cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson break; 1132cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 1133cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 1134cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (sm_event != BTA_HH_INVALID_EVT) { 1135cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_HH_CBACK_DATA* p_buf = (tBTA_HH_CBACK_DATA*)osi_malloc( 1136cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson sizeof(tBTA_HH_CBACK_DATA) + sizeof(BT_HDR)); 1137cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_buf->hdr.event = sm_event; 1138cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_buf->hdr.layer_specific = (uint16_t)dev_handle; 1139cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_buf->data = data; 1140011a61951975849b23a10d2be87e5268008d3407Jakub Pawlowski p_buf->addr = addr; 1141cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_buf->p_data = pdata; 1142cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 1143cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_sys_sendmsg(p_buf); 1144cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 11455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1146717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov 11475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 11488af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 11498af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_hh_get_trans_status 11508af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 11518af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description translate a handshake result code into BTA HH 11528af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * status code 11538af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 11548af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 1155cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic tBTA_HH_STATUS bta_hh_get_trans_status(uint32_t result) { 1156cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson switch (result) { 1157cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson case HID_PAR_HANDSHAKE_RSP_SUCCESS: /* (0) */ 1158cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return BTA_HH_OK; 1159cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson case HID_PAR_HANDSHAKE_RSP_NOT_READY: /* (1) */ 1160cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson case HID_PAR_HANDSHAKE_RSP_ERR_INVALID_REP_ID: /* (2) */ 1161cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson case HID_PAR_HANDSHAKE_RSP_ERR_UNSUPPORTED_REQ: /* (3) */ 1162cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson case HID_PAR_HANDSHAKE_RSP_ERR_INVALID_PARAM: /* (4) */ 1163cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return (tBTA_HH_STATUS)result; 1164cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson case HID_PAR_HANDSHAKE_RSP_ERR_UNKNOWN: /* (14) */ 1165cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson case HID_PAR_HANDSHAKE_RSP_ERR_FATAL: /* (15) */ 11665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 1167cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return BTA_HH_HS_ERROR; 1168cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson break; 1169cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 11705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 11715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 11728af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Debug Functions 11738af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ****************************************************************************/ 11745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1175e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 1176cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic const char* bta_hh_get_w4_event(uint16_t event) { 1177cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson switch (event) { 11785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_GET_RPT_EVT: 1179cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return "BTA_HH_GET_RPT_EVT"; 11805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_SET_RPT_EVT: 1181cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return "BTA_HH_SET_RPT_EVT"; 11825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_GET_PROTO_EVT: 1183cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return "BTA_HH_GET_PROTO_EVT"; 11845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_SET_PROTO_EVT: 1185cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return "BTA_HH_SET_PROTO_EVT"; 11865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_GET_IDLE_EVT: 1187cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return "BTA_HH_GET_IDLE_EVT"; 11885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_SET_IDLE_EVT: 1189cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return "BTA_HH_SET_IDLE_EVT"; 11905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_OPEN_EVT: 1191cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return "BTA_HH_OPEN_EVT"; 11925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 1193cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return "Unknown event"; 1194cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 11955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 11965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1197cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic const char* bta_hh_hid_event_name(uint16_t event) { 1198cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson switch (event) { 11995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_HDEV_EVT_OPEN: 1200cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return "HID_HDEV_EVT_OPEN"; 12015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_HDEV_EVT_CLOSE: 1202cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return "HID_HDEV_EVT_CLOSE"; 12035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_HDEV_EVT_RETRYING: 1204cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return "HID_HDEV_EVT_RETRYING"; 12055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_HDEV_EVT_INTR_DATA: 1206cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return "HID_HDEV_EVT_INTR_DATA"; 12075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_HDEV_EVT_INTR_DATC: 1208cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return "HID_HDEV_EVT_INTR_DATC"; 12095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_HDEV_EVT_CTRL_DATA: 1210cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return "HID_HDEV_EVT_CTRL_DATA"; 12115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_HDEV_EVT_CTRL_DATC: 1212cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return "HID_HDEV_EVT_CTRL_DATC"; 12135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_HDEV_EVT_HANDSHAKE: 1214cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return "HID_HDEV_EVT_HANDSHAKE"; 12155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_HDEV_EVT_VC_UNPLUG: 1216cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return "HID_HDEV_EVT_VC_UNPLUG"; 12175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 1218cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return "Unknown HID event"; 1219cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 12205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 12215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 12225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* BTA_HH_INCLUDED */ 1223