bta_hh_act.cc revision d628a0695e73973e0bd54dd026bfed900b69f804
15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Copyright (C) 2005-2012 Broadcom Corporation 45738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 55738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 65738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * you may not use this file except in compliance with the License. 75738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * You may obtain a copy of the License at: 85738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 95738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * See the License for the specific language governing permissions and 155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * limitations under the License. 165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * This file contains the HID host action functions. 225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_target.h" 265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 27e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_INCLUDED == TRUE) 285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h> 305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_sys.h" 325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_api.h" 335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "l2c_api.h" 345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_hh_int.h" 355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_hh_co.h" 365cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen#include "utl.h" 375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Constants 405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*****************************************************************************/ 415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Local Function prototypes 455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*****************************************************************************/ 46e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssenstatic void bta_hh_cback (uint8_t dev_handle, BD_ADDR addr, uint8_t event, 47e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen uint32_t data, BT_HDR *pdata); 48e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssenstatic tBTA_HH_STATUS bta_hh_get_trans_status(uint32_t result); 495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 50e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 51e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssenstatic const char* bta_hh_get_w4_event(uint16_t event); 52e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssenstatic const char * bta_hh_hid_event_name(uint16_t event); 535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Action Functions 575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*****************************************************************************/ 585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_hh_api_enable 615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Perform necessary operations to enable HID host. 635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_api_enable(tBTA_HH_DATA *p_data) 695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_HH_STATUS status = BTA_HH_ERR; 71e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen uint8_t xx; 725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* initialize BTE HID */ 745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project HID_HostInit(); 755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(&bta_hh_cb, 0, sizeof(tBTA_HH_CB)); 775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project HID_HostSetSecurityLevel("", p_data->api_enable.sec_mask); 795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Register with L2CAP */ 815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( HID_HostRegister (bta_hh_cback) == HID_SUCCESS) 825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* store parameters */ 845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_cb.p_cback = p_data->api_enable.p_cback; 855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = BTA_HH_OK; 875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* initialize device CB */ 88ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta for (xx = 0; xx < BTA_HH_MAX_DEVICE; xx ++) 895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_cb.kdev[xx].state = BTA_HH_IDLE_ST; 915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_cb.kdev[xx].hid_handle = BTA_HH_INVALID_HANDLE; 925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_cb.kdev[xx].index = xx; 935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 94ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 95ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* initialize control block map */ 96ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta for (xx = 0; xx < BTA_HH_MAX_KNOWN; xx ++) 97ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta bta_hh_cb.cb_index[xx] = BTA_HH_IDX_INVALID; 985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1002e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if (BTA_HH_LE_INCLUDED == TRUE) 1012e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (status == BTA_HH_OK) 1022e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 1032e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_enable(); 1042e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 1052e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach else 1062e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif 107ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* signal BTA call back event */ 108ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta (* bta_hh_cb.p_cback)(BTA_HH_ENABLE_EVT, (tBTA_HH *)&status); 1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_hh_api_disable 1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Perform necessary operations to disable HID host. 1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_api_disable(void) 1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 122e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen uint8_t xx; 1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* service is not enabled */ 1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_hh_cb.p_cback == NULL) 1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* no live connection, signal DISC_CMPL_EVT directly */ 1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!bta_hh_cb.cnt_num) 1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_disc_cmpl(); 1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else /* otherwise, disconnect all live connections */ 1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 135e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen bta_hh_cb.w4_disable = true; 1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 137ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta for(xx = 0; xx < BTA_HH_MAX_DEVICE; xx ++) 1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send API_CLOSE event to every connected device */ 1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( bta_hh_cb.kdev[xx].state == BTA_HH_CONN_ST ) 1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* disconnect all connected devices */ 1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_sm_execute(&bta_hh_cb.kdev[xx], 1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_HH_API_CLOSE_EVT, 1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project NULL); 1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_hh_disc_cmpl 1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description All connections have been closed, disable service. 1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_disc_cmpl(void) 1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 165d628a0695e73973e0bd54dd026bfed900b69f804Myles Watson#if (BTA_HH_LE_INCLUDED == TRUE) 166d628a0695e73973e0bd54dd026bfed900b69f804Myles Watson HID_HostDeregister(); 167d628a0695e73973e0bd54dd026bfed900b69f804Myles Watson bta_hh_le_deregister(); 168d628a0695e73973e0bd54dd026bfed900b69f804Myles Watson#else 1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_HH_STATUS status = BTA_HH_OK; 1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Deregister with lower layer */ 1724540f59bc447dc2b7b31a3e974b74a60b2417e7dVenkatRaghavan VijayaRaghavan if (HID_HostDeregister() != HID_SUCCESS) 1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = BTA_HH_ERR; 1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 175ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta bta_hh_cleanup_disable(status); 1764540f59bc447dc2b7b31a3e974b74a60b2417e7dVenkatRaghavan VijayaRaghavan#endif 1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 178ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_hh_sdp_cback 1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description SDP callback function. 1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 188e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssenstatic void bta_hh_sdp_cback(uint16_t result, uint16_t attr_mask, 1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tHID_DEV_SDP_INFO *sdp_rec ) 1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_HH_DEV_CB *p_cb = bta_hh_cb.p_cur; 192e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen uint8_t hdl = 0; 1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_HH_STATUS status = BTA_HH_ERR_SDP; 1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 195ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* make sure sdp succeeded and hh has not been disabled */ 196ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if ((result == SDP_SUCCESS) && (p_cb != NULL)) 1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* security is required for the connection, add attr_mask bit*/ 1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cb->sec_mask) 2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project attr_mask |= HID_SEC_REQUIRED; 2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 202e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 203e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_EVENT("bta_hh_sdp_cback: p_cb: %d result 0x%02x, \ 2042e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach attr_mask 0x%02x, handle %x", \ 2052e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_cb, result, attr_mask,p_cb->hid_handle); 2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* check to see type of device is supported , and should not been added before */ 2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_hh_tod_spt(p_cb, sdp_rec->sub_class)) 2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if not added before */ 2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cb->hid_handle == BTA_HH_INVALID_HANDLE) 2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* add device/update attr_mask information */ 2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(HID_HostAddDev (p_cb->addr, attr_mask, &hdl) == HID_SUCCESS) 2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = BTA_HH_OK; 2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* update cb_index[] map */ 2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_cb.cb_index[hdl] = p_cb->index; 2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->app_id = 0; 2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2259628abf10efe5df159f7ad4c192c3ef89fd7731cZhihai Xu } 2262a2701cdddac0859a95e58aec542742c450145b9Kim Schulz else 2272a2701cdddac0859a95e58aec542742c450145b9Kim Schulz { 2282a2701cdddac0859a95e58aec542742c450145b9Kim Schulz hdl = p_cb->hid_handle; 2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* else : incoming connection after SDP should update the SDP information as well */ 2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cb->app_id != 0) 2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* update cb information with attr_mask, dscp_info etc. */ 2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_add_device_to_list(p_cb, hdl, attr_mask, 2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project &sdp_rec->dscp_info, 2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sdp_rec->sub_class, 2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sdp_rec->ssr_max_latency, 2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sdp_rec->ssr_min_tout, 2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->app_id); 2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->dscp_info.ctry_code = sdp_rec->ctry_code; 2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = BTA_HH_OK; 2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else /* type of device is not supported */ 2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = BTA_HH_ERR_TOD_UNSPT; 2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* free disc_db when SDP is completed */ 253cceb430489a70add1b996d54289867c17f4ac0fdPavlin Radoslavov osi_free_and_reset((void **)&bta_hh_cb.p_disc_db); 2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send SDP_CMPL_EVT into state machine */ 2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_sm_execute(p_cb, BTA_HH_SDP_CMPL_EVT, (tBTA_HH_DATA *)&status); 2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_hh_di_sdp_cback 2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description SDP DI callback function. 2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 269e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssenstatic void bta_hh_di_sdp_cback(uint16_t result) 2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_HH_DEV_CB *p_cb = bta_hh_cb.p_cur; 2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_HH_STATUS status = BTA_HH_ERR_SDP; 2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSDP_DI_GET_RECORD di_rec; 2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tHID_STATUS ret; 275e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 276e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_EVENT("bta_hh_di_sdp_cback: p_cb: %d result 0x%02x", p_cb, result); 2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2782e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if DI record does not exist on remote device, vendor_id in tBTA_HH_DEV_DSCP_INFO will be 2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * set to 0xffff and we will allow the connection to go through. Spec mandates that DI 2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * record be set, but many HID devices do not set this. So for IOP purposes, we allow the 2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * connection to go through and update the DI record to invalid DI entry.*/ 283ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (((result == SDP_SUCCESS) || (result == SDP_NO_RECS_MATCH)) && (p_cb != NULL)) 2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(result == SDP_SUCCESS && SDP_GetNumDiRecords(bta_hh_cb.p_disc_db) != 0) 2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* always update information with primary DI record */ 2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (SDP_GetDiRecord(1, &di_rec, bta_hh_cb.p_disc_db) == SDP_SUCCESS) 2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 290ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta bta_hh_update_di_info(p_cb, di_rec.rec.vendor, di_rec.rec.product, di_rec.rec.version, 0); 2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else /* no DI recrod available */ 2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 296ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta bta_hh_update_di_info(p_cb, BTA_HH_VENDOR_ID_INVALID, 0, 0, 0); 2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((ret = HID_HostGetSDPRecord(p_cb->addr, 3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_cb.p_disc_db, 3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bta_hh_cfg->sdp_db_size, 3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_sdp_cback)) == HID_SUCCESS) 3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = BTA_HH_OK; 3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 308e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 309e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG ("bta_hh_di_sdp_cback: HID_HostGetSDPRecord failed: Status 0x%2x", 3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ret); 3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 31620524d393e8b3bea4c573f7980cd843500b0e6a4Pavlin Radoslavov if (status != BTA_HH_OK) { 317cceb430489a70add1b996d54289867c17f4ac0fdPavlin Radoslavov osi_free_and_reset((void **)&bta_hh_cb.p_disc_db); 3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send SDP_CMPL_EVT into state machine */ 3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_sm_execute(p_cb, BTA_HH_SDP_CMPL_EVT, (tBTA_HH_DATA *)&status); 3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_hh_start_sdp 3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Start SDP service search, and obtain necessary SDP records. 3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Only one SDP service search request is allowed at the same 3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** time. For every BTA_HhOpen API call, do SDP first unless SDP 3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** has been done previously. 3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_start_sdp(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data) 3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_HH_STATUS status = BTA_HH_ERR_SDP; 341e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen uint8_t hdl; 3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->sec_mask = p_data->api_conn.sec_mask; 3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->mode = p_data->api_conn.mode; 345ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta bta_hh_cb.p_cur = p_cb; 3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3472e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if (BTA_HH_LE_INCLUDED == TRUE) 3482e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (bta_hh_is_le_device(p_cb, p_data->api_conn.bd_addr)) 3492e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 3502e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_open_conn(p_cb, p_data->api_conn.bd_addr); 3512e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach return; 3522e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 3532e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif 3542e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if previously virtually cabled device, skip SDP */ 3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cb->app_id) 3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = BTA_HH_OK; 359e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 360e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_hh_start_sdp:: skip SDP for known devices"); 3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cb->hid_handle == BTA_HH_INVALID_HANDLE) 3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3642e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (HID_HostAddDev (p_cb->addr, p_cb->attr_mask, &hdl) \ 3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project == HID_SUCCESS) 3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* update device CB with newly register device handle */ 3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_add_device_to_list(p_cb, hdl, p_cb->attr_mask, NULL, 3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->sub_class, 3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->dscp_info.ssr_max_latency, 3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->dscp_info.ssr_min_tout, 3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->app_id); 3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* update cb_index[] map */ 3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_cb.cb_index[hdl] = p_cb->index; 3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 377ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta status = BTA_HH_ERR_NO_RES; 3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_sm_execute(p_cb, BTA_HH_SDP_CMPL_EVT, (tBTA_HH_DATA *)&status); 3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* GetSDPRecord. at one time only one SDP precedure can be active */ 3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (!bta_hh_cb.p_disc_db) 3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 386717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov bta_hh_cb.p_disc_db = (tSDP_DISCOVERY_DB *)osi_malloc(p_bta_hh_cfg->sdp_db_size); 387717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov bta_hh_cb.p_cur = p_cb; 388717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov /* do DI discovery first */ 389717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov if (SDP_DiDiscover(p_data->api_conn.bd_addr, 390717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov bta_hh_cb.p_disc_db, 391717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov p_bta_hh_cfg->sdp_db_size, 392717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov bta_hh_di_sdp_cback) != SDP_SUCCESS) { 393e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 394717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov APPL_TRACE_DEBUG("bta_hh_start_sdp: SDP_DiDiscover failed: \ 3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project Status 0x%2X",status); 3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 397717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov status = BTA_HH_ERR_SDP; 398717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov osi_free_and_reset((void **)&bta_hh_cb.p_disc_db); 399717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov } else { 400717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov status = BTA_HH_OK; 4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 402556b78b577f7476d29a8a210a8354707a54fc80aHemant Gupta } else if (bta_hh_cb.p_disc_db) { 403556b78b577f7476d29a8a210a8354707a54fc80aHemant Gupta /* It is possible that there is incoming/outgoing collision case. DUT initiated 404556b78b577f7476d29a8a210a8354707a54fc80aHemant Gupta * HID connection at same time remote has connected L2CAP for HID control, 405556b78b577f7476d29a8a210a8354707a54fc80aHemant Gupta * so SDP would be in progress, when this flow reaches here. Just do nothing 406556b78b577f7476d29a8a210a8354707a54fc80aHemant Gupta * when the code reaches here, and ongoing SDP completion or failure will handle this case. 407556b78b577f7476d29a8a210a8354707a54fc80aHemant Gupta */ 408556b78b577f7476d29a8a210a8354707a54fc80aHemant Gupta APPL_TRACE_DEBUG("%s: ignoring as SDP already in progress", __func__); 409556b78b577f7476d29a8a210a8354707a54fc80aHemant Gupta return; 4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status != BTA_HH_OK) 4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_sm_execute(p_cb, BTA_HH_SDP_CMPL_EVT, (tBTA_HH_DATA *)&status); 4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_hh_sdp_cmpl 4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description When SDP completed, initiate a connection or report error depend 4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** on SDP result. 4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_sdp_cmpl(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data) 4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_HH_CONN conn_dat; 4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_HH_STATUS status = p_data->status; 4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 434e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 435e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG ("bta_hh_sdp_cmpl: status 0x%2X",p_data->status); 4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* initialize call back data */ 4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset((void *)&conn_dat, 0, sizeof(tBTA_HH_CONN)); 4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project conn_dat.handle = p_cb->hid_handle; 4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdcpy(conn_dat.bda, p_cb->addr); 4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if SDP compl success */ 4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( status == BTA_HH_OK) 4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* not incoming connection doing SDP, initiate a HID connection */ 4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_cb->incoming_conn) 4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tHID_STATUS ret; 4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* set security level */ 4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project HID_HostSetSecurityLevel("", p_cb->sec_mask); 4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* open HID connection */ 454891723a42851285ec7e6c2f616a405611789da6bHemant Gupta ret = HID_HostOpenDev (p_cb->hid_handle); 455891723a42851285ec7e6c2f616a405611789da6bHemant Gupta APPL_TRACE_DEBUG ("%s: HID_HostOpenDev returned=%d", __func__, ret); 456891723a42851285ec7e6c2f616a405611789da6bHemant Gupta if (ret == HID_SUCCESS || ret == HID_ERR_ALREADY_CONN) 457891723a42851285ec7e6c2f616a405611789da6bHemant Gupta { 458891723a42851285ec7e6c2f616a405611789da6bHemant Gupta status = BTA_HH_OK; 459891723a42851285ec7e6c2f616a405611789da6bHemant Gupta } 460891723a42851285ec7e6c2f616a405611789da6bHemant Gupta else if (ret == HID_ERR_CONN_IN_PROCESS) 461891723a42851285ec7e6c2f616a405611789da6bHemant Gupta { 462891723a42851285ec7e6c2f616a405611789da6bHemant Gupta /* Connection already in progress, return from here, SDP 463891723a42851285ec7e6c2f616a405611789da6bHemant Gupta * will be performed after connection is completed. 464891723a42851285ec7e6c2f616a405611789da6bHemant Gupta */ 465891723a42851285ec7e6c2f616a405611789da6bHemant Gupta APPL_TRACE_DEBUG ("%s: connection already in progress", __func__); 466891723a42851285ec7e6c2f616a405611789da6bHemant Gupta return; 467891723a42851285ec7e6c2f616a405611789da6bHemant Gupta } 468891723a42851285ec7e6c2f616a405611789da6bHemant Gupta else 4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 470e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 471891723a42851285ec7e6c2f616a405611789da6bHemant Gupta APPL_TRACE_DEBUG ("%s: HID_HostOpenDev failed: Status 0x%2X", __func__, ret); 4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* open fail, remove device from management device list */ 4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project HID_HostRemoveDev( p_cb->hid_handle); 4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = BTA_HH_ERR; 4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else /* incoming connection SDP finish */ 4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_sm_execute(p_cb, BTA_HH_OPEN_CMPL_EVT, NULL); 4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status != BTA_HH_OK) 4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4862e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* Check if this was incoming connection request from an unknown device 4872e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach **and connection failed due to missing HID Device SDP UUID 4882e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach **In above condition, disconnect the link as well as remove the 4892e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach **device from list of HID devices*/ 4902e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if ((status == BTA_HH_ERR_SDP) && 4912e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach (p_cb->incoming_conn) &&(p_cb->app_id == 0)) 4922e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 493e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG ("bta_hh_sdp_cmpl:SDP failed for incoming conn :hndl %d", 4942e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_cb->incoming_hid_handle); 4952e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach HID_HostRemoveDev( p_cb->incoming_hid_handle); 4962e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project conn_dat.status = status; 4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (* bta_hh_cb.p_cback)(BTA_HH_OPEN_EVT, (tBTA_HH *)&conn_dat); 4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* move state machine W4_CONN ->IDLE */ 5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_sm_execute(p_cb, BTA_HH_API_CLOSE_EVT, NULL); 5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if this is an outgoing connection to an unknown device, clean up cb */ 5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cb->app_id == 0 && !p_cb->incoming_conn) 5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* clean up device control block */ 5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_clean_up_kdev(p_cb); 5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 509e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_trace_dev_db(); 5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_hh_api_disc_act 5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description HID Host initiate a disconnection. 5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_api_disc_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data) 5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_HH_CBDATA disc_dat; 5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tHID_STATUS status; 5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 531e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_LE_INCLUDED == TRUE) 5322e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_cb->is_le_device) 5332e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_api_disc_act(p_cb); 5342e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach else 5352e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif 5362e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 5372e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* found an active connection */ 538e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen disc_dat.handle = p_data ?(uint8_t)p_data->hdr.layer_specific :p_cb->hid_handle; 5392e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach disc_dat.status = BTA_HH_ERR; 5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5412e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach status = HID_HostCloseDev(disc_dat.handle); 5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5432e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (status) 5442e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach (* bta_hh_cb.p_cback)(BTA_HH_CLOSE_EVT, (tBTA_HH *)&disc_dat); 5452e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 5482e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_hh_open_cmpl_act 5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description HID host connection completed 5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_open_cmpl_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data) 5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_HH_CONN conn ; 563e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen uint8_t dev_handle = p_data ? (uint8_t)p_data->hid_cback.hdr.layer_specific : \ 5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->hid_handle; 5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset((void *)&conn, 0, sizeof (tBTA_HH_CONN)); 5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project conn.handle = dev_handle; 5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdcpy(conn.bda, p_cb->addr); 5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* increase connection number */ 5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_cb.cnt_num ++; 5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* initialize device driver */ 5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_co_open(p_cb->hid_handle, p_cb->sub_class, 575ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_cb->attr_mask, p_cb->app_id); 5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5772e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if (BTA_HH_LE_INCLUDED == TRUE) 5782e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach conn.status = p_cb->status; 5792e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach conn.le_hid = p_cb->is_le_device; 5802e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach conn.scps_supported = p_cb->scps_supported; 5812e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 5822e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (!p_cb->is_le_device) 5832e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif 5842e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 5852e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* inform role manager */ 5862e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_sys_conn_open( BTA_ID_HH ,p_cb->app_id, p_cb->addr); 5872e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* set protocol mode when not default report mode */ 5892e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if ( p_cb->mode != BTA_HH_PROTO_RPT_MODE 5902e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if (BTA_HH_LE_INCLUDED == TRUE) 5912e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach && !p_cb->is_le_device 5922e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif 5932e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach ) 5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((HID_HostWriteDev(dev_handle, 5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project HID_TRANS_SET_PROTOCOL, HID_PAR_PROTOCOL_BOOT_MODE, 5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 0, 5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 0, NULL)) != HID_SUCCESS) 5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* HID connection is up, while SET_PROTO fail */ 6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project conn.status = BTA_HH_ERR_PROTO; 6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (* bta_hh_cb.p_cback)(BTA_HH_OPEN_EVT, (tBTA_HH *)&conn); 6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project conn.status = BTA_HH_OK; 6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->w4_evt = BTA_HH_OPEN_EVT; 6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (* bta_hh_cb.p_cback)(BTA_HH_OPEN_EVT, (tBTA_HH *)&conn); 6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 613e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen p_cb->incoming_conn = false; 6142e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_cb->incoming_hid_handle = BTA_HH_INVALID_HANDLE; 6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_hh_open_act 6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description HID host receive HID_OPEN_EVT . 6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 6275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_open_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data) 6285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_HH_API_CONN conn_data; 6305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 631e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen uint8_t dev_handle = p_data ? (uint8_t)p_data->hid_cback.hdr.layer_specific : \ 6325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->hid_handle; 6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 634e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 635e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_EVENT ("bta_hh_open_act: Device[%d] connected", dev_handle); 6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* SDP has been done */ 6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cb->app_id != 0) 6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_sm_execute(p_cb, BTA_HH_OPEN_CMPL_EVT, p_data); 6425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* app_id == 0 indicates an incoming conenction request arrives without SDP 6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project performed, do it first */ 6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 647e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen p_cb->incoming_conn = true; 6482e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* store the handle here in case sdp fails - need to disconnect */ 6492e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_cb->incoming_hid_handle = dev_handle; 6505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(&conn_data, 0, sizeof(tBTA_HH_API_CONN)); 6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdcpy(conn_data.bd_addr, p_cb->addr); 6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_start_sdp(p_cb, (tBTA_HH_DATA *)&conn_data); 6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_hh_data_act 6635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description HID Host process a data report 6655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 6705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_data_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA * p_data) 6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_HDR *pdata = p_data->hid_cback.p_data; 673e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen uint8_t *p_rpt = (uint8_t *)(pdata + 1) + pdata->offset; 6745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 675e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen bta_hh_co_data((uint8_t)p_data->hid_cback.hdr.layer_specific, p_rpt, pdata->len, 6765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->mode, p_cb->sub_class, p_cb->dscp_info.ctry_code, p_cb->addr, p_cb->app_id); 6775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 678cceb430489a70add1b996d54289867c17f4ac0fdPavlin Radoslavov osi_free_and_reset((void **)&pdata); 6795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_hh_handsk_act 6855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description HID Host process a handshake acknoledgement. 6875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 6925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_handsk_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA * p_data) 6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_HH_CBDATA cback_data ; 6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_HH_HSDATA hs_data; 6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_HH_CONN conn ; 6975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 698e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 699e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("HANDSHAKE received for: event = %s data= %d", 7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_get_w4_event(p_cb->w4_evt), p_data->hid_cback.data); 7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(&hs_data, 0, sizeof(tBTA_HH_HSDATA)); 7042e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach memset(&cback_data, 0, sizeof(tBTA_HH_CBDATA)); 7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (p_cb->w4_evt) 7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* GET_ transsaction, handshake indicate unsupported request */ 7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_GET_PROTO_EVT: 7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project hs_data.rsp_data.proto_mode = BTA_HH_PROTO_UNKNOWN; 7115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* fall through */ 7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_GET_RPT_EVT: 7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_GET_IDLE_EVT : 7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project hs_data.handle = p_cb->hid_handle; 7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if handshake gives an OK code for these transaction, fill in UNSUPT */ 7165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((hs_data.status = bta_hh_get_trans_status(p_data->hid_cback.data)) == BTA_HH_OK) 7175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project hs_data.status = BTA_HH_HS_TRANS_NOT_SPT; 7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (* bta_hh_cb.p_cback)(p_cb->w4_evt, (tBTA_HH *)&hs_data); 7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->w4_evt = 0; 7215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* acknoledgement from HID device for SET_ transaction */ 7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_SET_RPT_EVT: 7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_SET_PROTO_EVT: 7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_SET_IDLE_EVT : 7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cback_data.handle = p_cb->hid_handle; 7285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cback_data.status = bta_hh_get_trans_status(p_data->hid_cback.data); 7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (* bta_hh_cb.p_cback)(p_cb->w4_evt, (tBTA_HH *)&cback_data); 7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->w4_evt = 0; 7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* SET_PROTOCOL when open connection */ 7345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_OPEN_EVT: 7355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project conn.status =p_data->hid_cback.data ? BTA_HH_ERR_PROTO: BTA_HH_OK; 7365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project conn.handle = p_cb->hid_handle; 7375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdcpy(conn.bda, p_cb->addr); 7385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (* bta_hh_cb.p_cback)(p_cb->w4_evt, (tBTA_HH *)&conn); 739e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 7405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_trace_dev_db(); 7415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 7425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->w4_evt = 0; 7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 7465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* unknow transaction handshake response */ 747e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("unknown transaction type"); 7485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 7495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* transaction achknoledgement received, inform PM for mode change */ 7525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_idle(BTA_ID_HH, p_cb->app_id, p_cb->addr); 7535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 7545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 7565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_hh_ctrl_dat_act 7585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description HID Host process a data report from control channel. 7605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 7635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 7655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_ctrl_dat_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA * p_data) 7665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_HDR *pdata = p_data->hid_cback.p_data; 768e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen uint8_t *data = (uint8_t *)(pdata + 1) + pdata->offset; 7695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_HH_HSDATA hs_data; 7705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 771e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 772e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("Ctrl DATA received w4: event[%s]", 7735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_get_w4_event(p_cb->w4_evt)); 7745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 7755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project hs_data.status = BTA_HH_OK; 7765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project hs_data.handle = p_cb->hid_handle; 7775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (p_cb->w4_evt) 7795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_GET_IDLE_EVT: 7815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project hs_data.rsp_data.idle_rate = *data; 7825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 7835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_GET_RPT_EVT: 7845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project hs_data.rsp_data.p_rpt_data = pdata; 7855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 7865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_GET_PROTO_EVT: 7875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* match up BTE/BTA report/boot mode def*/ 7885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project hs_data.rsp_data.proto_mode = ((*data) == HID_PAR_PROTOCOL_REPORT)? \ 7895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_HH_PROTO_RPT_MODE : BTA_HH_PROTO_BOOT_MODE; 790e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 791e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("GET_PROTOCOL Mode = [%s]", 7925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (hs_data.rsp_data.proto_mode == BTA_HH_PROTO_RPT_MODE)? "Report" : "Boot"); 7935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 7945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 7955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* should not expect control DATA for SET_ transaction */ 7965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_SET_PROTO_EVT: 7975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* fall through */ 7985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_SET_RPT_EVT: 7995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* fall through */ 8005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_SET_IDLE_EVT : 8015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* fall through */ 8025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 803e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 804e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("invalid transaction type for DATA payload: 4_evt[%s]", 8055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_get_w4_event(p_cb->w4_evt)); 8065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 8075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* inform PM for mode change */ 8115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_busy(BTA_ID_HH, p_cb->app_id, p_cb->addr); 8125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_idle(BTA_ID_HH, p_cb->app_id, p_cb->addr); 8135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (* bta_hh_cb.p_cback)(p_cb->w4_evt, (tBTA_HH *)&hs_data); 8155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->w4_evt = 0; 817cceb430489a70add1b996d54289867c17f4ac0fdPavlin Radoslavov osi_free_and_reset((void **)&pdata); 8185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 8225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8232e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function bta_hh_open_failure 8242e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 8252e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description report HID open failure when at wait for connection state and receive 8262e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** device close event. 8272e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 8282e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 8292e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Returns void 8302e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 8312e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/ 8322e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_open_failure(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data) 8332e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{ 8342e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBTA_HH_CONN conn_dat ; 835e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen uint32_t reason = p_data->hid_cback.data; /* Reason for closing (32-bit) */ 8362e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 8372e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach memset(&conn_dat, 0, sizeof(tBTA_HH_CONN)); 8382e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach conn_dat.handle = p_cb->hid_handle; 8392e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach conn_dat.status = (reason == HID_ERR_AUTH_FAILED) ? 8402e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach BTA_HH_ERR_AUTH_FAILED : BTA_HH_ERR; 8412e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bdcpy(conn_dat.bda, p_cb->addr); 8422e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach HID_HostCloseDev(p_cb->hid_handle); 8432e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 8442e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* Report OPEN fail event */ 8452e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach (*bta_hh_cb.p_cback)(BTA_HH_OPEN_EVT, (tBTA_HH *)&conn_dat); 8462e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 847e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 8482e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_trace_dev_db(); 8492e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif 8502e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* clean up control block, but retain SDP info and device handle */ 851e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen p_cb->vp = false; 8522e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_cb->w4_evt = 0; 8532e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 8542e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* if no connection is active and HH disable is signaled, disable service */ 8552e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (bta_hh_cb.cnt_num == 0 && bta_hh_cb.w4_disable) 8562e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 8572e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_disc_cmpl(); 8582e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 8592e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 860891723a42851285ec7e6c2f616a405611789da6bHemant Gupta /* Error in opening hid connection, reset flags */ 861e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen p_cb->incoming_conn = false; 862891723a42851285ec7e6c2f616a405611789da6bHemant Gupta p_cb->incoming_hid_handle = BTA_HH_INVALID_HANDLE; 8632e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach} 8642e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 8652e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/******************************************************************************* 8662e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 8675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_hh_close_act 8685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description HID Host process a close event 8705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 8735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 8755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_close_act (tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data) 8765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 8775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_HH_CONN conn_dat ; 8785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_HH_CBDATA disc_dat = {BTA_HH_OK, 0}; 879e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen uint32_t reason = p_data->hid_cback.data; /* Reason for closing (32-bit) */ 8805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if HID_HDEV_EVT_VC_UNPLUG was received, report BTA_HH_VC_UNPLUG_EVT */ 882e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen uint16_t event = p_cb->vp ? BTA_HH_VC_UNPLUG_EVT : BTA_HH_CLOSE_EVT; 8835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project disc_dat.handle = p_cb->hid_handle; 8855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project disc_dat.status = p_data->hid_cback.data; 8865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check reason for closing */ 8885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((reason & (HID_L2CAP_CONN_FAIL|HID_L2CAP_REQ_FAIL)) || /* Failure to initialize connection (page timeout or l2cap error) */ 8895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (reason == HID_ERR_AUTH_FAILED) || /* Authenication error (while initiating) */ 8905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (reason == HID_ERR_L2CAP_FAILED)) /* Failure creating l2cap connection */ 8915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Failure in opening connection */ 8935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project conn_dat.handle = p_cb->hid_handle; 8945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project conn_dat.status = (reason == HID_ERR_AUTH_FAILED) ? BTA_HH_ERR_AUTH_FAILED : BTA_HH_ERR; 8955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdcpy(conn_dat.bda, p_cb->addr); 8965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project HID_HostCloseDev(p_cb->hid_handle); 8975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Report OPEN fail event */ 8995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bta_hh_cb.p_cback)(BTA_HH_OPEN_EVT, (tBTA_HH *)&conn_dat); 9005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 901e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 9025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_trace_dev_db(); 9035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 9045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 9055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* otherwise report CLOSE/VC_UNPLUG event */ 9075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 9085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* finaliza device driver */ 9105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_co_close(p_cb->hid_handle, p_cb->app_id); 9115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* inform role manager */ 9125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_conn_close( BTA_ID_HH ,p_cb->app_id, p_cb->addr); 9135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* update total conn number */ 9145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_cb.cnt_num --; 9155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (disc_dat.status) 9175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project disc_dat.status = BTA_HH_ERR; 9185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bta_hh_cb.p_cback)(event, (tBTA_HH *)&disc_dat); 9205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if virtually unplug, remove device */ 9225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cb->vp ) 9235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project HID_HostRemoveDev( p_cb->hid_handle); 9255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_clean_up_kdev(p_cb); 9265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 928e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 9295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_trace_dev_db(); 9305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 9315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* clean up control block, but retain SDP info and device handle */ 934e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen p_cb->vp = false; 9355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->w4_evt = 0; 9365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if no connection is active and HH disable is signaled, disable service */ 9385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_hh_cb.cnt_num == 0 && bta_hh_cb.w4_disable) 9395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_disc_cmpl(); 9415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 9445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 9455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 9475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_hh_get_dscp_act 9495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Get device report descriptor 9515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 9545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 956d35a648d39710bbc5ac59f8add85166455af5af7Myles Watsonvoid bta_hh_get_dscp_act(tBTA_HH_DEV_CB *p_cb, 957d35a648d39710bbc5ac59f8add85166455af5af7Myles Watson UNUSED_ATTR tBTA_HH_DATA *p_data) 9585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 9595cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen 9602e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if (BTA_HH_LE_INCLUDED == TRUE) 9612e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_cb->is_le_device) 9622e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 9632e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_get_dscp_act(p_cb); 9642e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 9652e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach else 9662e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif 9675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bta_hh_cb.p_cback)(BTA_HH_GET_DSCP_EVT, (tBTA_HH *)&p_cb->dscp_info); 9685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 9695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 9715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_hh_maint_dev_act 9735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description HID Host maintain device list. 9755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 9785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 9805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_maint_dev_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data) 9815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 9825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_HH_MAINT_DEV *p_dev_info = &p_data->api_maintdev; 9835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_HH_DEV_INFO dev_info ; 984e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen uint8_t dev_handle; 9855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project dev_info.status = BTA_HH_ERR; 9875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project dev_info.handle = BTA_HH_INVALID_HANDLE; 9885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (p_dev_info->sub_event) 9905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_ADD_DEV_EVT: /* add a device */ 9925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdcpy(dev_info.bda, p_dev_info->bda); 9935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* initialize callback data */ 9945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cb->hid_handle == BTA_HH_INVALID_HANDLE) 9955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9962e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if (BTA_HH_LE_INCLUDED == TRUE) 9972e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (bta_hh_is_le_device(p_cb, p_data->api_conn.bd_addr)) 9982e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 9992e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach dev_info.handle = bta_hh_le_add_device(p_cb, p_dev_info); 10002e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach dev_info.status = BTA_HH_OK; 10012e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 10022e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach else 10032e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif 10042e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 10055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (HID_HostAddDev(p_dev_info->bda, p_dev_info->attr_mask, &dev_handle)\ 10065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project == HID_SUCCESS) 10075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project dev_info.handle = dev_handle; 10095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project dev_info.status = BTA_HH_OK; 10105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1011e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_LE_INCLUDED == TRUE) 10125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* update DI information */ 10135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_update_di_info(p_cb, 10145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_info->dscp_info.vendor_id, 10155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_info->dscp_info.product_id, 1016ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_dev_info->dscp_info.version, 10172e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_dev_info->dscp_info.flag); 10182e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#else 10192e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_update_di_info(p_cb, 10202e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_dev_info->dscp_info.vendor_id, 10212e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_dev_info->dscp_info.product_id, 10222e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_dev_info->dscp_info.version, 1023ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 0); 10245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10252e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif 10265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* add to BTA device list */ 10275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_add_device_to_list(p_cb, dev_handle, 10285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_info->attr_mask, 10295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project &p_dev_info->dscp_info.descriptor, 10305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_info->sub_class, 10315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_info->dscp_info.ssr_max_latency, 10325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_info->dscp_info.ssr_min_tout, 10335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_info->app_id); 10345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* update cb_index[] map */ 10355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_cb.cb_index[dev_handle] = p_cb->index; 10365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else /* device already been added */ 10395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project dev_info.handle = p_cb->hid_handle; 10415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project dev_info.status = BTA_HH_OK; 10425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1043e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 10445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_trace_dev_db(); 10455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 10465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1047ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta break; 10485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_RMV_DEV_EVT: /* remove device */ 1049e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen dev_info.handle = (uint8_t)p_dev_info->hdr.layer_specific; 10505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdcpy(dev_info.bda, p_cb->addr); 1051ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1052e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_LE_INCLUDED == TRUE) 10532e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_cb->is_le_device) 10542e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 10552e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_remove_dev_bg_conn(p_cb); 10562e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_sm_execute(p_cb, BTA_HH_API_CLOSE_EVT, NULL); 10572e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_clean_up_kdev(p_cb); 10582e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 10592e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach else 10602e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif 10615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(HID_HostRemoveDev( dev_info.handle ) == HID_SUCCESS) 10635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project dev_info.status = BTA_HH_OK; 10655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* remove from known device list in BTA */ 10675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_clean_up_kdev(p_cb); 10685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 10715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 1073e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("invalid command"); 10745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 10755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (* bta_hh_cb.p_cback)(p_dev_info->sub_event, (tBTA_HH *)&dev_info); 10785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 10795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 10805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_hh_write_dev_act 10825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Write device action. can be SET/GET/DATA transaction. 10845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 10865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 10885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_write_dev_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data) 10895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 10905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_HH_CBDATA cbdata = {BTA_HH_OK, 0}; 1091e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen uint16_t event = (p_data->api_sndcmd.t_type - BTA_HH_FST_BTE_TRANS_EVT) + 10925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_HH_FST_TRANS_CB_EVT; 10935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1094e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_LE_INCLUDED == TRUE) 10952e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_cb->is_le_device) 10962e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_write_dev_act(p_cb, p_data); 10972e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach else 10982e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif 10992e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 11002e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 11015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cbdata.handle = p_cb->hid_handle; 11025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* match up BTE/BTA report/boot mode def */ 11045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_data->api_sndcmd.t_type == HID_TRANS_SET_PROTOCOL) 11055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->api_sndcmd.param = ( p_data->api_sndcmd.param == BTA_HH_PROTO_RPT_MODE) ?\ 11075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project HID_PAR_PROTOCOL_REPORT :HID_PAR_PROTOCOL_BOOT_MODE; 11085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (HID_HostWriteDev (p_cb->hid_handle, 11115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->api_sndcmd.t_type, 11125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->api_sndcmd.param, 11135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->api_sndcmd.data, 11145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->api_sndcmd.rpt_id, 11155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->api_sndcmd.p_data) != HID_SUCCESS) 11165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1117e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("HID_HostWriteDev Error "); 11185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cbdata.status = BTA_HH_ERR; 11195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_data->api_sndcmd.t_type != HID_TRANS_CONTROL && 11215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->api_sndcmd.t_type != HID_TRANS_DATA) 11225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (* bta_hh_cb.p_cback)(event, (tBTA_HH *)&cbdata); 11235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (p_data->api_sndcmd.param == BTA_HH_CTRL_VIRTUAL_CABLE_UNPLUG) 11245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (* bta_hh_cb.p_cback)(BTA_HH_VC_UNPLUG_EVT, (tBTA_HH *)&cbdata); 11255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 11275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch(p_data->api_sndcmd.t_type) 11305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_TRANS_SET_PROTOCOL: 11325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* fall through */ 11335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_TRANS_GET_REPORT: 11345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* fall through */ 11355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_TRANS_SET_REPORT: 11365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* fall through */ 11375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_TRANS_GET_PROTOCOL: 11385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* fall through */ 11395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_TRANS_GET_IDLE: 11405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* fall through */ 11415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_TRANS_SET_IDLE:/* set w4_handsk event name for callback function use */ 11425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->w4_evt = event; 11435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 11445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_TRANS_DATA: /* output report */ 11455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* fall through */ 11465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_TRANS_CONTROL: 11475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* no handshake event will be generated */ 11485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if VC_UNPLUG is issued, set flag */ 11495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_data->api_sndcmd.param == BTA_HH_CTRL_VIRTUAL_CABLE_UNPLUG) 1150e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen p_cb->vp = true; 11515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 11535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* currently not expected */ 11545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_TRANS_DATAC: 11555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 1156e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_hh_write_dev_act:: cmd type = %d", 11575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->api_sndcmd.t_type); 11585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 11595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if not control type transaction, notify PM for energy control */ 11625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_data->api_sndcmd.t_type != HID_TRANS_CONTROL) 11635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* inform PM for mode change */ 11655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_busy(BTA_ID_HH, p_cb->app_id, p_cb->addr); 11665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_idle(BTA_ID_HH, p_cb->app_id, p_cb->addr); 11675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (p_data->api_sndcmd.param == BTA_HH_CTRL_SUSPEND) 11695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_sco_close(BTA_ID_HH, p_cb->app_id, p_cb->addr); 11715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (p_data->api_sndcmd.param == BTA_HH_CTRL_EXIT_SUSPEND) 11735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_busy(BTA_ID_HH, p_cb->app_id, p_cb->addr); 11755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11782e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 11795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 11805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 11815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 11835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Static Function 11845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*****************************************************************************/ 11855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 11865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_hh_cback 11885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description BTA HH callback function. 11905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 11935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1195e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssenstatic void bta_hh_cback (uint8_t dev_handle, BD_ADDR addr, uint8_t event, 1196e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen uint32_t data, BT_HDR *pdata) 11975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1198e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen uint16_t sm_event = BTA_HH_INVALID_EVT; 1199e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen uint8_t xx = 0; 12005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1201e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 1202e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_hh_cback::HID_event [%s]", bta_hh_hid_event_name(event)); 12035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 12045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (event) 12065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_HDEV_EVT_OPEN: 12085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sm_event = BTA_HH_INT_OPEN_EVT; 12095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 12105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_HDEV_EVT_CLOSE: 12115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sm_event = BTA_HH_INT_CLOSE_EVT; 12125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 12135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_HDEV_EVT_INTR_DATA: 12145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sm_event = BTA_HH_INT_DATA_EVT; 12155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 12165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_HDEV_EVT_HANDSHAKE: 12175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sm_event = BTA_HH_INT_HANDSK_EVT; 12185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 12195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_HDEV_EVT_CTRL_DATA: 12205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sm_event = BTA_HH_INT_CTRL_DATA; 12215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 12225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_HDEV_EVT_RETRYING: 12235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 12245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_HDEV_EVT_INTR_DATC: 12255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_HDEV_EVT_CTRL_DATC: 12265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Unhandled events: Free buffer for DATAC */ 1227cceb430489a70add1b996d54289867c17f4ac0fdPavlin Radoslavov osi_free_and_reset((void **)&pdata); 12285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 12295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_HDEV_EVT_VC_UNPLUG: 1230ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta for (xx = 0; xx < BTA_HH_MAX_DEVICE; xx++) 12315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_hh_cb.kdev[xx].hid_handle == dev_handle) 12335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1234e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen bta_hh_cb.kdev[xx].vp = true; 12355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 12365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 12395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1241717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov if (sm_event != BTA_HH_INVALID_EVT) { 1242717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov tBTA_HH_CBACK_DATA *p_buf = 1243717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov (tBTA_HH_CBACK_DATA *)osi_malloc(sizeof(tBTA_HH_CBACK_DATA) + 1244717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov sizeof(BT_HDR)); 1245717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov p_buf->hdr.event = sm_event; 1246e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen p_buf->hdr.layer_specific = (uint16_t)dev_handle; 1247717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov p_buf->data = data; 12482e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bdcpy(p_buf->addr, addr); 1249717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov p_buf->p_data = pdata; 12505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_sendmsg(p_buf); 12525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1254717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov 12555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 12565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_hh_get_trans_status 12585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description translate a handshake result code into BTA HH 12605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** status code 12615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1263e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssenstatic tBTA_HH_STATUS bta_hh_get_trans_status(uint32_t result) 12645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 12655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch(result) 12665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_PAR_HANDSHAKE_RSP_SUCCESS : /* (0) */ 12685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BTA_HH_OK; 12695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_PAR_HANDSHAKE_RSP_NOT_READY : /* (1) */ 12705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_PAR_HANDSHAKE_RSP_ERR_INVALID_REP_ID: /* (2) */ 12715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_PAR_HANDSHAKE_RSP_ERR_UNSUPPORTED_REQ : /* (3) */ 12725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_PAR_HANDSHAKE_RSP_ERR_INVALID_PARAM : /* (4) */ 12735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (tBTA_HH_STATUS)result; 12745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_PAR_HANDSHAKE_RSP_ERR_UNKNOWN : /* (14) */ 12755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_PAR_HANDSHAKE_RSP_ERR_FATAL : /* (15) */ 12765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 12775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BTA_HH_HS_ERROR; 12785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 12795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 12815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 12825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Debug Functions 12835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*****************************************************************************/ 12845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1285e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE) 1286e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssenstatic const char* bta_hh_get_w4_event(uint16_t event) 12875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 12885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (event) 12895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_GET_RPT_EVT: 12915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "BTA_HH_GET_RPT_EVT"; 12925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_SET_RPT_EVT: 12935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "BTA_HH_SET_RPT_EVT"; 12945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_GET_PROTO_EVT: 12955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "BTA_HH_GET_PROTO_EVT"; 12965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_SET_PROTO_EVT: 12975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "BTA_HH_SET_PROTO_EVT"; 12985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_GET_IDLE_EVT: 12995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "BTA_HH_GET_IDLE_EVT"; 13005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_SET_IDLE_EVT: 13015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "BTA_HH_SET_IDLE_EVT"; 13025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_OPEN_EVT: 13035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "BTA_HH_OPEN_EVT"; 13045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 13055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "Unknown event"; 13065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 13095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1310e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssenstatic const char * bta_hh_hid_event_name(uint16_t event) 13115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 13125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (event) 13135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_HDEV_EVT_OPEN: 13155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "HID_HDEV_EVT_OPEN"; 13165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_HDEV_EVT_CLOSE: 13175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "HID_HDEV_EVT_CLOSE"; 13185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_HDEV_EVT_RETRYING: 13195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "HID_HDEV_EVT_RETRYING"; 13205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_HDEV_EVT_INTR_DATA: 13215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "HID_HDEV_EVT_INTR_DATA"; 13225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_HDEV_EVT_INTR_DATC: 13235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "HID_HDEV_EVT_INTR_DATC"; 13245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_HDEV_EVT_CTRL_DATA: 13255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "HID_HDEV_EVT_CTRL_DATA"; 13265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_HDEV_EVT_CTRL_DATC: 13275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "HID_HDEV_EVT_CTRL_DATC"; 13285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_HDEV_EVT_HANDSHAKE: 13295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "HID_HDEV_EVT_HANDSHAKE"; 13305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_HDEV_EVT_VC_UNPLUG: 13315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "HID_HDEV_EVT_VC_UNPLUG"; 13325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 13335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "Unknown HID event"; 13345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 13365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 13375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* BTA_HH_INCLUDED */ 13385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1339