15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Copyright (C) 2009-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 * Filename: btif_hh.c 225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Description: HID Host Profile Bluetooth Interface 245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ***********************************************************************************/ 27db554581079863974af8e1289646f5deea6fc044Marie Janssen 2849120dc867c7818511b5afec461dfc97d17eef58Marie Janssen#define LOG_TAG "bt_btif_hh" 2949120dc867c7818511b5afec461dfc97d17eef58Marie Janssen 3049a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen#include "btif_hh.h" 3149a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen 3278bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov#include <assert.h> 335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <stdio.h> 345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <stdlib.h> 355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <errno.h> 365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h> 37d30195cbf09735da593e186c4c99cce6232b072eArman Uguray#include <unistd.h> 385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_api.h" 405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btif_common.h" 41db554581079863974af8e1289646f5deea6fc044Marie Janssen#include "btif_storage.h" 42db554581079863974af8e1289646f5deea6fc044Marie Janssen#include "btif_util.h" 43258c2538e3b62a8cdb403f2730c45d721e5292b4Pavlin Radoslavov#include "bt_common.h" 445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "l2c_api.h" 4544802768c447ab480d4227b3a852a97d923b816dSharvil Nanavati#include "osi/include/log.h" 465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTIF_HH_APP_ID_MI 0x01 485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTIF_HH_APP_ID_KB 0x02 495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 50390c94dc0f9deee917f52caaf3f8bb9f79aa98b4Ganesh Ganapathi Batta#define COD_HID_KEYBOARD 0x0540 51390c94dc0f9deee917f52caaf3f8bb9f79aa98b4Ganesh Ganapathi Batta#define COD_HID_POINTING 0x0580 52390c94dc0f9deee917f52caaf3f8bb9f79aa98b4Ganesh Ganapathi Batta#define COD_HID_COMBO 0x05C0 535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define KEYSTATE_FILEPATH "/data/misc/bluedroid/bt_hh_ks" //keep this in sync with HID host jni 555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define HID_REPORT_CAPSLOCK 0x39 575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define HID_REPORT_NUMLOCK 0x53 585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define HID_REPORT_SCROLLLOCK 0x47 595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project//For Apple Magic Mouse 615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define MAGICMOUSE_VENDOR_ID 0x05ac 625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define MAGICMOUSE_PRODUCT_ID 0x030d 635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define LOGITECH_KB_MX5500_VENDOR_ID 0x046D 655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define LOGITECH_KB_MX5500_PRODUCT_ID 0xB30B 665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6778bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavovextern fixed_queue_t *btu_general_alarm_queue; 685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern const int BT_UID; 695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern const int BT_GID; 705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic int btif_hh_keylockstates=0; //The current key state of each key 715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTIF_HH_ID_1 0 735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTIF_HH_DEV_DISCONNECTED 3 745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7578bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov#define BTIF_TIMEOUT_VUP_MS (3 * 1000) 7633af35c49731bc8e305c862c8e9f3e42a1ab0dc9Ganesh Ganapathi Batta 775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifndef BTUI_HH_SECURITY 785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTUI_HH_SECURITY (BTA_SEC_AUTHENTICATE | BTA_SEC_ENCRYPT) 795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifndef BTUI_HH_MOUSE_SECURITY 825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTUI_HH_MOUSE_SECURITY (BTA_SEC_NONE) 835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* HH request events */ 865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projecttypedef enum 875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTIF_HH_CONNECT_REQ_EVT = 0, 895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTIF_HH_DISCONNECT_REQ_EVT, 905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTIF_HH_VUP_REQ_EVT 915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} btif_hh_req_evt_t; 925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/************************************************************************************ 945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Constants & Macros 955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project************************************************************************************/ 965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTIF_HH_SERVICES (BTA_HID_SERVICE_MASK) 975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/************************************************************************************ 995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Local type definitions 1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project************************************************************************************/ 1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projecttypedef struct hid_kb_list 1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 product_id; 1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 version_id; 1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project char* kb_name; 1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} tHID_KB_LIST; 1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/************************************************************************************ 1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Static variables 1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project************************************************************************************/ 1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectbtif_hh_cb_t btif_hh_cb; 1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic bthh_callbacks_t *bt_hh_callbacks = NULL; 1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* List of HID keyboards for which the NUMLOCK state needs to be 1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * turned ON by default. Add devices to this list to apply the 1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * NUMLOCK state toggle on fpr first connect.*/ 1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tHID_KB_LIST hid_kb_numlock_on_list[] = 1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project {LOGITECH_KB_MX5500_PRODUCT_ID, 1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project LOGITECH_KB_MX5500_VENDOR_ID, 1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project "Logitech MX5500 Keyboard"} 1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define CHECK_BTHH_INIT() if (bt_hh_callbacks == NULL)\ 1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project {\ 128e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_WARNING("BTHH: %s: BTHH not initialized", __FUNCTION__);\ 1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BT_STATUS_NOT_READY;\ 1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project }\ 1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else\ 1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project {\ 133e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_EVENT("BTHH: %s", __FUNCTION__);\ 1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/************************************************************************************ 1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Static functions 1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project************************************************************************************/ 1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/************************************************************************************ 1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Externs 1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project************************************************************************************/ 1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern void bta_hh_co_destroy(int fd); 1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern void bta_hh_co_write(int fd, UINT8* rpt, UINT16 len); 1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern bt_status_t btif_dm_remove_bond(const bt_bdaddr_t *bd_addr); 1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern void bta_hh_co_send_hid_info(btif_hh_device_t *p_dev, char *dev_name, UINT16 vendor_id, 1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 product_id, UINT16 version, UINT8 ctry_code, 1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int dscp_len, UINT8 *p_dscp); 1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern BOOLEAN check_cod(const bt_bdaddr_t *remote_bdaddr, uint32_t cod); 1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern void btif_dm_cb_remove_bond(bt_bdaddr_t *bd_addr); 151fecf606348a0751e0be30e376c9817195afe68caAjay Panickerextern BOOLEAN check_cod_hid(const bt_bdaddr_t *remote_bdaddr); 1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern int scru_ascii_2_hex(char *p_ascii, int len, UINT8 *p_hex); 153a9eb25c8c01e70613bace21b23a06bd9a10871b1Kim Schulzextern void btif_dm_hh_open_failed(bt_bdaddr_t *bdaddr); 1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Local Function prototypes 1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*****************************************************************************/ 1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void set_keylockstate(int keymask, BOOLEAN isSet); 1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void toggle_os_keylockstates(int fd, int changedkeystates); 1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void sync_lockstate_on_connect(btif_hh_device_t *p_dev); 1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project//static void hh_update_keyboard_lockstates(btif_hh_device_t *p_dev); 16278bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavovvoid btif_hh_timer_timeout(void *data); 1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/************************************************************************************ 1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Functions 1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project************************************************************************************/ 1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic int get_keylockstates() 1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return btif_hh_keylockstates; 1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void set_keylockstate(int keymask, BOOLEAN isSet) 1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(isSet) 1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_hh_keylockstates |= keymask; 1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function toggle_os_keylockstates 1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Function to toggle the keyboard lock states managed by the linux. 1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** This function is used in by two call paths 1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** (1) if the lock state change occurred from an onscreen keyboard, 1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** this function is called to update the lock state maintained 1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for the HID keyboard(s) 1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** (2) if a HID keyboard is disconnected and reconnected, 1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** this function is called to update the lock state maintained 1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for the HID keyboard(s) 1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void toggle_os_keylockstates(int fd, int changedlockstates) 1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 196e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_EVENT("%s: fd = %d, changedlockstates = 0x%x", 1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project __FUNCTION__, fd, changedlockstates); 1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 hidreport[9]; 1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int reportIndex; 2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(hidreport,0,9); 2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project hidreport[0]=1; 2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project reportIndex=4; 2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (changedlockstates & BTIF_HH_KEYSTATE_MASK_CAPSLOCK) { 205e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_DEBUG("%s Setting CAPSLOCK", __FUNCTION__); 2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project hidreport[reportIndex++] = (UINT8)HID_REPORT_CAPSLOCK; 2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (changedlockstates & BTIF_HH_KEYSTATE_MASK_NUMLOCK) { 210e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_DEBUG("%s Setting NUMLOCK", __FUNCTION__); 2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project hidreport[reportIndex++] = (UINT8)HID_REPORT_NUMLOCK; 2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (changedlockstates & BTIF_HH_KEYSTATE_MASK_SCROLLLOCK) { 215e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_DEBUG("%s Setting SCROLLLOCK", __FUNCTION__); 2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project hidreport[reportIndex++] = (UINT8) HID_REPORT_SCROLLLOCK; 2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 219e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_DEBUG("Writing hidreport #1 to os: "\ 2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project "%s: %x %x %x", __FUNCTION__, 2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project hidreport[0], hidreport[1], hidreport[2]); 222e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_DEBUG("%s: %x %x %x", __FUNCTION__, 2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project hidreport[3], hidreport[4], hidreport[5]); 224e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_DEBUG("%s: %x %x %x", __FUNCTION__, 2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project hidreport[6], hidreport[7], hidreport[8]); 2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_co_write(fd , hidreport, sizeof(hidreport)); 2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project usleep(200000); 2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(hidreport,0,9); 2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project hidreport[0]=1; 230e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_DEBUG("Writing hidreport #2 to os: "\ 2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project "%s: %x %x %x", __FUNCTION__, 2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project hidreport[0], hidreport[1], hidreport[2]); 233e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_DEBUG("%s: %x %x %x", __FUNCTION__, 2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project hidreport[3], hidreport[4], hidreport[5]); 235e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_DEBUG("%s: %x %x %x ", __FUNCTION__, 2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project hidreport[6], hidreport[7], hidreport[8]); 2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_co_write(fd , hidreport, sizeof(hidreport)); 2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 242be6d58f35e66b9e57cf4978be68840cbc8ac2fc9Mike J. Chen** Function create_pbuf 243be6d58f35e66b9e57cf4978be68840cbc8ac2fc9Mike J. Chen** 244be6d58f35e66b9e57cf4978be68840cbc8ac2fc9Mike J. Chen** Description Helper function to create p_buf for send_data or set_report 245be6d58f35e66b9e57cf4978be68840cbc8ac2fc9Mike J. Chen** 246be6d58f35e66b9e57cf4978be68840cbc8ac2fc9Mike J. Chen*******************************************************************************/ 247be6d58f35e66b9e57cf4978be68840cbc8ac2fc9Mike J. Chenstatic BT_HDR *create_pbuf(UINT16 len, UINT8 *data) 248be6d58f35e66b9e57cf4978be68840cbc8ac2fc9Mike J. Chen{ 249abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov BT_HDR* p_buf = osi_malloc(len + BTA_HH_MIN_OFFSET + sizeof(BT_HDR)); 2505fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov UINT8* pbuf_data; 251be6d58f35e66b9e57cf4978be68840cbc8ac2fc9Mike J. Chen 2525fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov p_buf->len = len; 2535fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov p_buf->offset = BTA_HH_MIN_OFFSET; 254be6d58f35e66b9e57cf4978be68840cbc8ac2fc9Mike J. Chen 2555fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov pbuf_data = (UINT8 *)(p_buf + 1) + p_buf->offset; 2565fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov memcpy(pbuf_data, data, len); 257be6d58f35e66b9e57cf4978be68840cbc8ac2fc9Mike J. Chen 258be6d58f35e66b9e57cf4978be68840cbc8ac2fc9Mike J. Chen return p_buf; 259be6d58f35e66b9e57cf4978be68840cbc8ac2fc9Mike J. Chen} 260be6d58f35e66b9e57cf4978be68840cbc8ac2fc9Mike J. Chen 261be6d58f35e66b9e57cf4978be68840cbc8ac2fc9Mike J. Chen/******************************************************************************* 262be6d58f35e66b9e57cf4978be68840cbc8ac2fc9Mike J. Chen** 2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function update_keyboard_lockstates 2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Sends a report to the keyboard to set the lock states of keys 2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void update_keyboard_lockstates(btif_hh_device_t *p_dev) 2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 len = 2; /* reportid + 1 byte report*/ 2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BD_ADDR* bda; 272be6d58f35e66b9e57cf4978be68840cbc8ac2fc9Mike J. Chen BT_HDR* p_buf; 273be6d58f35e66b9e57cf4978be68840cbc8ac2fc9Mike J. Chen UINT8 data[] = {0x01, /* report id */ 274be6d58f35e66b9e57cf4978be68840cbc8ac2fc9Mike J. Chen btif_hh_keylockstates}; /* keystate */ 2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Set report for other keyboards */ 277e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_EVENT("%s: setting report on dev_handle %d to 0x%x", 2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project __FUNCTION__, p_dev->dev_handle, btif_hh_keylockstates); 2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Get SetReport buffer */ 281be6d58f35e66b9e57cf4978be68840cbc8ac2fc9Mike J. Chen p_buf = create_pbuf(len, data); 282be6d58f35e66b9e57cf4978be68840cbc8ac2fc9Mike J. Chen if (p_buf != NULL) { 283be6d58f35e66b9e57cf4978be68840cbc8ac2fc9Mike J. Chen p_buf->layer_specific = BTA_HH_RPTT_OUTPUT; 2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bda = (BD_ADDR*) (&p_dev->bd_addr); 285be6d58f35e66b9e57cf4978be68840cbc8ac2fc9Mike J. Chen BTA_HhSendData(p_dev->dev_handle, *bda, p_buf); 2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function sync_lockstate_on_connect 2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Function to update the keyboard lock states managed by the OS 2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** when a HID keyboard is connected or disconnected and reconnected 2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void sync_lockstate_on_connect(btif_hh_device_t *p_dev) 2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int keylockstates; 3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 301e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_EVENT("%s: Syncing keyboard lock states after "\ 3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project "reconnect...",__FUNCTION__); 3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /*If the device is connected, update keyboard state */ 3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project update_keyboard_lockstates(p_dev); 3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /*Check if the lockstate of caps,scroll,num is set. 3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project If so, send a report to the kernel 3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project so the lockstate is in sync */ 3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project keylockstates = get_keylockstates(); 3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (keylockstates) 3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 312e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_DEBUG("%s: Sending hid report to kernel "\ 3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project "indicating lock key state 0x%x",__FUNCTION__, 3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project keylockstates); 3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project usleep(200000); 3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project toggle_os_keylockstates(p_dev->fd, keylockstates); 3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 320e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_DEBUG("%s: NOT sending hid report to kernel "\ 3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project "indicating lock key state 0x%x",__FUNCTION__, 3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project keylockstates); 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 btif_hh_find_connected_dev_by_handle 3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Return the connected device pointer of the specified device handle 3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Device entry pointer in the device table 3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectbtif_hh_device_t *btif_hh_find_connected_dev_by_handle(UINT8 handle) 3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 i; 3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < BTIF_HH_MAX_HID; i++) { 3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btif_hh_cb.devices[i].dev_status == BTHH_CONN_STATE_CONNECTED && 3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_hh_cb.devices[i].dev_handle == handle) 3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return &btif_hh_cb.devices[i]; 3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return NULL; 3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btif_hh_find_dev_by_bda 3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Return the device pointer of the specified bt_bdaddr_t. 3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Device entry pointer in the device table 3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic btif_hh_device_t *btif_hh_find_dev_by_bda(bt_bdaddr_t *bd_addr) 3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 i; 3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < BTIF_HH_MAX_HID; i++) { 3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btif_hh_cb.devices[i].dev_status != BTHH_CONN_STATE_UNKNOWN && 3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcmp(&(btif_hh_cb.devices[i].bd_addr), bd_addr, BD_ADDR_LEN) == 0) 3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return &btif_hh_cb.devices[i]; 3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return NULL; 3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btif_hh_find_connected_dev_by_bda 3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Return the connected device pointer of the specified bt_bdaddr_t. 3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Device entry pointer in the device table 3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic btif_hh_device_t *btif_hh_find_connected_dev_by_bda(bt_bdaddr_t *bd_addr) 3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 i; 3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < BTIF_HH_MAX_HID; i++) { 3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btif_hh_cb.devices[i].dev_status == BTHH_CONN_STATE_CONNECTED && 3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcmp(&(btif_hh_cb.devices[i].bd_addr), bd_addr, BD_ADDR_LEN) == 0) 3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return &btif_hh_cb.devices[i]; 3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return NULL; 3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 39133af35c49731bc8e305c862c8e9f3e42a1ab0dc9Ganesh Ganapathi Batta** Function btif_hh_stop_vup_timer 39233af35c49731bc8e305c862c8e9f3e42a1ab0dc9Ganesh Ganapathi Batta** 39333af35c49731bc8e305c862c8e9f3e42a1ab0dc9Ganesh Ganapathi Batta** Description stop vitual unplug timer 39433af35c49731bc8e305c862c8e9f3e42a1ab0dc9Ganesh Ganapathi Batta** 39533af35c49731bc8e305c862c8e9f3e42a1ab0dc9Ganesh Ganapathi Batta** Returns void 39633af35c49731bc8e305c862c8e9f3e42a1ab0dc9Ganesh Ganapathi Batta*******************************************************************************/ 39733af35c49731bc8e305c862c8e9f3e42a1ab0dc9Ganesh Ganapathi Battavoid btif_hh_stop_vup_timer(bt_bdaddr_t *bd_addr) 39833af35c49731bc8e305c862c8e9f3e42a1ab0dc9Ganesh Ganapathi Batta{ 39978bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov btif_hh_device_t *p_dev = btif_hh_find_connected_dev_by_bda(bd_addr); 40078bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov 40178bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov if (p_dev != NULL) { 40278bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov BTIF_TRACE_DEBUG("stop VUP timer"); 40378bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov alarm_free(p_dev->vup_timer); 40478bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov p_dev->vup_timer = NULL; 40533af35c49731bc8e305c862c8e9f3e42a1ab0dc9Ganesh Ganapathi Batta } 40633af35c49731bc8e305c862c8e9f3e42a1ab0dc9Ganesh Ganapathi Batta} 40733af35c49731bc8e305c862c8e9f3e42a1ab0dc9Ganesh Ganapathi Batta/******************************************************************************* 40833af35c49731bc8e305c862c8e9f3e42a1ab0dc9Ganesh Ganapathi Batta** 40933af35c49731bc8e305c862c8e9f3e42a1ab0dc9Ganesh Ganapathi Batta** Function btif_hh_start_vup_timer 41033af35c49731bc8e305c862c8e9f3e42a1ab0dc9Ganesh Ganapathi Batta** 41133af35c49731bc8e305c862c8e9f3e42a1ab0dc9Ganesh Ganapathi Batta** Description start virtual unplug timer 41233af35c49731bc8e305c862c8e9f3e42a1ab0dc9Ganesh Ganapathi Batta** 41333af35c49731bc8e305c862c8e9f3e42a1ab0dc9Ganesh Ganapathi Batta** Returns void 41433af35c49731bc8e305c862c8e9f3e42a1ab0dc9Ganesh Ganapathi Batta*******************************************************************************/ 41533af35c49731bc8e305c862c8e9f3e42a1ab0dc9Ganesh Ganapathi Battavoid btif_hh_start_vup_timer(bt_bdaddr_t *bd_addr) 41633af35c49731bc8e305c862c8e9f3e42a1ab0dc9Ganesh Ganapathi Batta{ 41778bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov BTIF_TRACE_DEBUG("%s", __func__); 41833af35c49731bc8e305c862c8e9f3e42a1ab0dc9Ganesh Ganapathi Batta 41978bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov btif_hh_device_t *p_dev = btif_hh_find_connected_dev_by_bda(bd_addr); 42078bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov assert(p_dev != NULL); 42133af35c49731bc8e305c862c8e9f3e42a1ab0dc9Ganesh Ganapathi Batta 42278bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov alarm_free(p_dev->vup_timer); 42378bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov p_dev->vup_timer = alarm_new("btif_hh.vup_timer"); 42478bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov alarm_set_on_queue(p_dev->vup_timer, BTIF_TIMEOUT_VUP_MS, 42578bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov btif_hh_timer_timeout, p_dev, 42678bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov btu_general_alarm_queue); 42733af35c49731bc8e305c862c8e9f3e42a1ab0dc9Ganesh Ganapathi Batta} 42833af35c49731bc8e305c862c8e9f3e42a1ab0dc9Ganesh Ganapathi Batta 42933af35c49731bc8e305c862c8e9f3e42a1ab0dc9Ganesh Ganapathi Batta/******************************************************************************* 43033af35c49731bc8e305c862c8e9f3e42a1ab0dc9Ganesh Ganapathi Batta** 4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btif_hh_add_added_dev 4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Add a new device to the added device list. 4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if add successfully, otherwise FALSE. 4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btif_hh_add_added_dev(bt_bdaddr_t bda, tBTA_HH_ATTR_MASK attr_mask) 4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i; 4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < BTIF_HH_MAX_ADDED_DEV; i++) { 4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (memcmp(&(btif_hh_cb.added_devices[i].bd_addr), &bda, BD_ADDR_LEN) == 0) { 442e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_WARNING(" Device %02X:%02X:%02X:%02X:%02X:%02X already added", 4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bda.address[0], bda.address[1], bda.address[2], bda.address[3], bda.address[4], bda.address[5]); 4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return FALSE; 4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < BTIF_HH_MAX_ADDED_DEV; i++) { 4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btif_hh_cb.added_devices[i].bd_addr.address[0] == 0 && 4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_hh_cb.added_devices[i].bd_addr.address[1] == 0 && 4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_hh_cb.added_devices[i].bd_addr.address[2] == 0 && 4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_hh_cb.added_devices[i].bd_addr.address[3] == 0 && 4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_hh_cb.added_devices[i].bd_addr.address[4] == 0 && 4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_hh_cb.added_devices[i].bd_addr.address[5] == 0) 4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 455e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_WARNING(" Added device %02X:%02X:%02X:%02X:%02X:%02X", 4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bda.address[0], bda.address[1], bda.address[2], bda.address[3], bda.address[4], bda.address[5]); 4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(&(btif_hh_cb.added_devices[i].bd_addr), &bda, BD_ADDR_LEN); 4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_hh_cb.added_devices[i].dev_handle = BTA_HH_INVALID_HANDLE; 4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_hh_cb.added_devices[i].attr_mask = attr_mask; 4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return TRUE; 4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 464e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_WARNING("%s: Error, out of space to add device",__FUNCTION__); 4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return FALSE; 4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function btif_hh_remove_device 4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description Remove an added device from the stack. 4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns void 4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btif_hh_remove_device(bt_bdaddr_t bd_addr) 4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i; 4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_hh_device_t *p_dev; 4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_hh_added_device_t *p_added_dev; 4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 482db554581079863974af8e1289646f5deea6fc044Marie Janssen LOG_INFO(LOG_TAG, "%s: bda = %02x:%02x:%02x:%02x:%02x:%02x", __FUNCTION__, 4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bd_addr.address[0], bd_addr.address[1], bd_addr.address[2], bd_addr.address[3], bd_addr.address[4], bd_addr.address[5]); 4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < BTIF_HH_MAX_ADDED_DEV; i++) { 4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_added_dev = &btif_hh_cb.added_devices[i]; 4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (memcmp(&(p_added_dev->bd_addr),&bd_addr, 6) == 0) { 4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_HhRemoveDev(p_added_dev->dev_handle); 4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_storage_remove_hid_info(&(p_added_dev->bd_addr)); 4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(&(p_added_dev->bd_addr), 0, 6); 4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_added_dev->dev_handle = BTA_HH_INVALID_HANDLE; 4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev = btif_hh_find_dev_by_bda(&bd_addr); 4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev == NULL) { 498e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_WARNING(" Oops, can't find device [%02x:%02x:%02x:%02x:%02x:%02x]", 4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bd_addr.address[0], bd_addr.address[1], bd_addr.address[2], bd_addr.address[3], bd_addr.address[4], bd_addr.address[5]); 5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 50303c26931a463dd079bda26bfd19f323743f57f3eZhihai Xu /* need to notify up-layer device is disconnected to avoid state out of sync with up-layer */ 50403c26931a463dd079bda26bfd19f323743f57f3eZhihai Xu HAL_CBACK(bt_hh_callbacks, connection_state_cb, &(p_dev->bd_addr), BTHH_CONN_STATE_DISCONNECTED); 50503c26931a463dd079bda26bfd19f323743f57f3eZhihai Xu 5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev->dev_status = BTHH_CONN_STATE_UNKNOWN; 5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev->dev_handle = BTA_HH_INVALID_HANDLE; 5088c24123f9897991d228865c7eec35e33569e46bbAndre Eisenbach p_dev->ready_for_data = FALSE; 5098c24123f9897991d228865c7eec35e33569e46bbAndre Eisenbach 5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btif_hh_cb.device_num > 0) { 5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_hh_cb.device_num--; 5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else { 514e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_WARNING("%s: device_num = 0", __FUNCTION__); 5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 516689d66b6559dcb3a0ad7f6cc33b6129e50910253The Android Open Source Project 517689d66b6559dcb3a0ad7f6cc33b6129e50910253The Android Open Source Project p_dev->hh_keep_polling = 0; 518689d66b6559dcb3a0ad7f6cc33b6129e50910253The Android Open Source Project p_dev->hh_poll_thread_id = -1; 519e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_DEBUG("%s: uhid fd = %d", __FUNCTION__, p_dev->fd); 5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev->fd >= 0) { 5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_co_destroy(p_dev->fd); 5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev->fd = -1; 5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btif_hh_copy_hid_info(tBTA_HH_DEV_DSCP_INFO* dest , tBTA_HH_DEV_DSCP_INFO* src) 5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project dest->descriptor.dl_len = 0; 5295fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov if (src->descriptor.dl_len > 0) { 5305fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov dest->descriptor.dsc_list = (UINT8 *)osi_malloc(src->descriptor.dl_len); 5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(dest->descriptor.dsc_list, src->descriptor.dsc_list, src->descriptor.dl_len); 5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project dest->descriptor.dl_len = src->descriptor.dl_len; 5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project dest->vendor_id = src->vendor_id; 5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project dest->product_id = src->product_id; 5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project dest->version = src->version; 5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project dest->ctry_code = src->ctry_code; 5388029dc8f0332d1135aa93e8e5daa46e3eb7b2500Hemant Gupta dest->ssr_max_latency = src->ssr_max_latency; 5398029dc8f0332d1135aa93e8e5daa46e3eb7b2500Hemant Gupta dest->ssr_min_tout = src->ssr_min_tout; 5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return TRUE; 5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btif_hh_virtual_unplug 5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Virtual unplug initiated from the BTIF thread context 5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Special handling for HID mouse- 5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectbt_status_t btif_hh_virtual_unplug(bt_bdaddr_t *bd_addr) 5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 556e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_DEBUG("%s", __FUNCTION__); 5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_hh_device_t *p_dev; 5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project char bd_str[18]; 5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sprintf(bd_str, "%02X:%02X:%02X:%02X:%02X:%02X", 5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bd_addr->address[0], bd_addr->address[1], bd_addr->address[2], bd_addr->address[3], 5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bd_addr->address[4], bd_addr->address[5]); 5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev = btif_hh_find_dev_by_bda(bd_addr); 5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_dev != NULL) && (p_dev->dev_status == BTHH_CONN_STATE_CONNECTED) 5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (p_dev->attr_mask & HID_VIRTUAL_CABLE)) 5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 566e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_DEBUG("%s Sending BTA_HH_CTRL_VIRTUAL_CABLE_UNPLUG", __FUNCTION__); 56733af35c49731bc8e305c862c8e9f3e42a1ab0dc9Ganesh Ganapathi Batta /* start the timer */ 56833af35c49731bc8e305c862c8e9f3e42a1ab0dc9Ganesh Ganapathi Batta btif_hh_start_vup_timer(bd_addr); 569390c94dc0f9deee917f52caaf3f8bb9f79aa98b4Ganesh Ganapathi Batta p_dev->local_vup = TRUE; 5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_HhSendCtrl(p_dev->dev_handle, BTA_HH_CTRL_VIRTUAL_CABLE_UNPLUG); 5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BT_STATUS_SUCCESS; 5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 575e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_ERROR("%s: Error, device %s not opened.", __FUNCTION__, bd_str); 5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BT_STATUS_FAIL; 5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btif_hh_connect 5835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description connection initiated from the BTIF thread context 5855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns int status 5875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectbt_status_t btif_hh_connect(bt_bdaddr_t *bd_addr) 5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_hh_device_t *dev; 5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_hh_added_device_t *added_dev = NULL; 5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project char bda_str[20]; 5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i; 5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BD_ADDR *bda = (BD_ADDR*)bd_addr; 5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CHECK_BTHH_INIT(); 5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project dev = btif_hh_find_dev_by_bda(bd_addr); 599e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_DEBUG("Connect _hh"); 6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sprintf(bda_str, "%02X:%02X:%02X:%02X:%02X:%02X", 6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bda)[0], (*bda)[1], (*bda)[2], (*bda)[3], (*bda)[4], (*bda)[5]); 6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (dev == NULL && btif_hh_cb.device_num >= BTIF_HH_MAX_HID) { 6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // No space for more HID device now. 604e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_WARNING("%s: Error, exceeded the maximum supported HID device number %d", 6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project __FUNCTION__, BTIF_HH_MAX_HID); 6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BT_STATUS_FAIL; 6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < BTIF_HH_MAX_ADDED_DEV; i++) { 6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (memcmp(&(btif_hh_cb.added_devices[i].bd_addr), bd_addr, BD_ADDR_LEN) == 0) { 6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project added_dev = &btif_hh_cb.added_devices[i]; 612e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_WARNING("%s: Device %s already added, attr_mask = 0x%x", 6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project __FUNCTION__, bda_str, added_dev->attr_mask); 6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (added_dev != NULL) { 6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (added_dev->dev_handle == BTA_HH_INVALID_HANDLE) { 6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // No space for more HID device now. 620e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_ERROR("%s: Error, device %s added but addition failed", __FUNCTION__, bda_str); 6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(&(added_dev->bd_addr), 0, 6); 6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project added_dev->dev_handle = BTA_HH_INVALID_HANDLE; 6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BT_STATUS_FAIL; 6245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 626ebb1d755818704a662f7ea8ae3cc1b5593d582d8Priti Aghera 6270bcf0c6e6b5b09b9bc7f856f739e57321120f67bHemant Gupta /* Not checking the NORMALLY_Connectible flags from sdp record, and anyways sending this 6280bcf0c6e6b5b09b9bc7f856f739e57321120f67bHemant Gupta request from host, for subsequent user initiated connection. If the remote is not in 6290bcf0c6e6b5b09b9bc7f856f739e57321120f67bHemant Gupta pagescan mode, we will do 2 retries to connect before giving up */ 6300bcf0c6e6b5b09b9bc7f856f739e57321120f67bHemant Gupta tBTA_SEC sec_mask = BTUI_HH_SECURITY; 6310bcf0c6e6b5b09b9bc7f856f739e57321120f67bHemant Gupta btif_hh_cb.status = BTIF_HH_DEV_CONNECTING; 6320bcf0c6e6b5b09b9bc7f856f739e57321120f67bHemant Gupta BTA_HhOpen(*bda, BTA_HH_PROTO_RPT_MODE, sec_mask); 633ebb1d755818704a662f7ea8ae3cc1b5593d582d8Priti Aghera 6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project HAL_CBACK(bt_hh_callbacks, connection_state_cb, bd_addr, BTHH_CONN_STATE_CONNECTING); 6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BT_STATUS_SUCCESS; 6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btif_hh_disconnect 6415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description disconnection initiated from the BTIF thread context 6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btif_hh_disconnect(bt_bdaddr_t *bd_addr) 6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_hh_device_t *p_dev; 6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev = btif_hh_find_connected_dev_by_bda(bd_addr); 6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev != NULL) 6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_HhClose(p_dev->dev_handle); 6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 657e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_DEBUG("%s-- Error: device not connected:",__FUNCTION__); 6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 660689d66b6559dcb3a0ad7f6cc33b6129e50910253The Android Open Source Project/******************************************************************************* 661689d66b6559dcb3a0ad7f6cc33b6129e50910253The Android Open Source Project** 662689d66b6559dcb3a0ad7f6cc33b6129e50910253The Android Open Source Project** Function btif_btif_hh_setreport 663689d66b6559dcb3a0ad7f6cc33b6129e50910253The Android Open Source Project** 664689d66b6559dcb3a0ad7f6cc33b6129e50910253The Android Open Source Project** Description setreport initiated from the BTIF thread context 665689d66b6559dcb3a0ad7f6cc33b6129e50910253The Android Open Source Project** 666689d66b6559dcb3a0ad7f6cc33b6129e50910253The Android Open Source Project** Returns void 667689d66b6559dcb3a0ad7f6cc33b6129e50910253The Android Open Source Project** 668689d66b6559dcb3a0ad7f6cc33b6129e50910253The Android Open Source Project*******************************************************************************/ 669689d66b6559dcb3a0ad7f6cc33b6129e50910253The Android Open Source Projectvoid btif_hh_setreport(btif_hh_device_t *p_dev, bthh_report_type_t r_type, UINT16 size, 670689d66b6559dcb3a0ad7f6cc33b6129e50910253The Android Open Source Project UINT8* report) 671689d66b6559dcb3a0ad7f6cc33b6129e50910253The Android Open Source Project{ 672be6d58f35e66b9e57cf4978be68840cbc8ac2fc9Mike J. Chen BT_HDR* p_buf = create_pbuf(size, report); 673be6d58f35e66b9e57cf4978be68840cbc8ac2fc9Mike J. Chen if (p_buf == NULL) { 674e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("%s: Error, failed to allocate RPT buffer, size = %d", __FUNCTION__, size); 675689d66b6559dcb3a0ad7f6cc33b6129e50910253The Android Open Source Project return; 676689d66b6559dcb3a0ad7f6cc33b6129e50910253The Android Open Source Project } 677be6d58f35e66b9e57cf4978be68840cbc8ac2fc9Mike J. Chen BTA_HhSetReport(p_dev->dev_handle, r_type, p_buf); 678689d66b6559dcb3a0ad7f6cc33b6129e50910253The Android Open Source Project} 679689d66b6559dcb3a0ad7f6cc33b6129e50910253The Android Open Source Project 6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Section name (Group of functions) 6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*****************************************************************************/ 6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 6855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** btif hh api functions (no context switch) 6875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*****************************************************************************/ 6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btif_hh_upstreams_evt 6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Executes HH UPSTREAMS events in btif context 6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 6975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_hh_upstreams_evt(UINT16 event, char* p_param) 7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_HH *p_data = (tBTA_HH *)p_param; 7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_hh_device_t *p_dev = NULL; 7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i; 7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int len, tmplen; 7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 706e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_DEBUG("%s: event=%s", __FUNCTION__, dump_hh_event(event)); 7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (event) 7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_ENABLE_EVT: 711e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_DEBUG("%s: BTA_HH_ENABLE_EVT: status =%d",__FUNCTION__, p_data->status); 7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_data->status == BTA_HH_OK) { 7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_hh_cb.status = BTIF_HH_ENABLED; 714e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_DEBUG("%s--Loading added devices",__FUNCTION__); 7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Add hid descriptors for already bonded hid devices*/ 7165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_storage_load_bonded_hid_info(); 7175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else { 7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_hh_cb.status = BTIF_HH_DISABLED; 720e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_WARNING("BTA_HH_ENABLE_EVT: Error, HH enabling failed, status = %d", p_data->status); 7215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_DISABLE_EVT: 7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_hh_cb.status = BTIF_HH_DISABLED; 7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_data->status == BTA_HH_OK) { 7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i; 72878bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov // Clear the control block 72978bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov for (i = 0; i < BTIF_HH_MAX_HID; i++) { 73078bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov alarm_free(btif_hh_cb.devices[i].vup_timer); 73178bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov } 7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(&btif_hh_cb, 0, sizeof(btif_hh_cb)); 73378bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov for (i = 0; i < BTIF_HH_MAX_HID; i++) { 7345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_hh_cb.devices[i].dev_status = BTHH_CONN_STATE_UNKNOWN; 7355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 738e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_WARNING("BTA_HH_DISABLE_EVT: Error, HH disabling failed, status = %d", p_data->status); 7395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 7405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_OPEN_EVT: 742e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_WARNING("%s: BTA_HH_OPN_EVT: handle=%d, status =%d",__FUNCTION__, p_data->conn.handle, p_data->conn.status); 7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_data->conn.status == BTA_HH_OK) { 7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev = btif_hh_find_connected_dev_by_handle(p_data->conn.handle); 7455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev == NULL) { 746e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_WARNING("BTA_HH_OPEN_EVT: Error, cannot find device with handle %d", p_data->conn.handle); 7475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_hh_cb.status = BTIF_HH_DEV_DISCONNECTED; 7485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // The connect request must come from device side and exceeded the connected 7495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // HID device number. 7505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_HhClose(p_data->conn.handle); 7515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project HAL_CBACK(bt_hh_callbacks, connection_state_cb, (bt_bdaddr_t*) &p_data->conn.bda,BTHH_CONN_STATE_DISCONNECTED); 7525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (p_dev->fd < 0) { 754e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_WARNING("BTA_HH_OPEN_EVT: Error, failed to find the uhid driver..."); 7555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(&(p_dev->bd_addr), p_data->conn.bda, BD_ADDR_LEN); 7565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project //remove the connection and then try again to reconnect from the mouse side to recover 7575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_hh_cb.status = BTIF_HH_DEV_DISCONNECTED; 7585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_HhClose(p_data->conn.handle); 7595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else { 761e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_WARNING("BTA_HH_OPEN_EVT: Found device...Getting dscp info for handle ... %d",p_data->conn.handle); 7625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(&(p_dev->bd_addr), p_data->conn.bda, BD_ADDR_LEN); 7635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_hh_cb.status = BTIF_HH_DEV_CONNECTED; 764689d66b6559dcb3a0ad7f6cc33b6129e50910253The Android Open Source Project // Send set_idle if the peer_device is a keyboard 765689d66b6559dcb3a0ad7f6cc33b6129e50910253The Android Open Source Project if (check_cod((bt_bdaddr_t*)p_data->conn.bda, COD_HID_KEYBOARD )|| 766689d66b6559dcb3a0ad7f6cc33b6129e50910253The Android Open Source Project check_cod((bt_bdaddr_t*)p_data->conn.bda, COD_HID_COMBO)) 767689d66b6559dcb3a0ad7f6cc33b6129e50910253The Android Open Source Project BTA_HhSetIdle(p_data->conn.handle, 0); 7685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_hh_cb.p_curr_dev = btif_hh_find_connected_dev_by_handle(p_data->conn.handle); 7695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_HhGetDscpInfo(p_data->conn.handle); 7705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev->dev_status = BTHH_CONN_STATE_CONNECTED; 7715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project HAL_CBACK(bt_hh_callbacks, connection_state_cb,&(p_dev->bd_addr), p_dev->dev_status); 7725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else { 7755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bt_bdaddr_t *bdaddr = (bt_bdaddr_t*)p_data->conn.bda; 776a9eb25c8c01e70613bace21b23a06bd9a10871b1Kim Schulz btif_dm_hh_open_failed(bdaddr); 77738798e1b7cc7873aa849c3c7c58902f713d909beHemant Gupta p_dev = btif_hh_find_dev_by_bda(bdaddr); 77838798e1b7cc7873aa849c3c7c58902f713d909beHemant Gupta if (p_dev != NULL) { 77978bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov btif_hh_stop_vup_timer(&(p_dev->bd_addr)); 78038798e1b7cc7873aa849c3c7c58902f713d909beHemant Gupta if (p_dev->fd >= 0) { 78138798e1b7cc7873aa849c3c7c58902f713d909beHemant Gupta bta_hh_co_destroy(p_dev->fd); 78238798e1b7cc7873aa849c3c7c58902f713d909beHemant Gupta p_dev->fd = -1; 78338798e1b7cc7873aa849c3c7c58902f713d909beHemant Gupta } 78438798e1b7cc7873aa849c3c7c58902f713d909beHemant Gupta p_dev->dev_status = BTHH_CONN_STATE_DISCONNECTED; 78538798e1b7cc7873aa849c3c7c58902f713d909beHemant Gupta } 7865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project HAL_CBACK(bt_hh_callbacks, connection_state_cb, (bt_bdaddr_t*) &p_data->conn.bda,BTHH_CONN_STATE_DISCONNECTED); 7875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_hh_cb.status = BTIF_HH_DEV_DISCONNECTED; 7885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 79038798e1b7cc7873aa849c3c7c58902f713d909beHemant Gupta 7915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_CLOSE_EVT: 792e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_DEBUG("BTA_HH_CLOSE_EVT: status = %d, handle = %d", 7935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->dev_status.status, p_data->dev_status.handle); 7945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev = btif_hh_find_connected_dev_by_handle(p_data->dev_status.handle); 7955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev != NULL) { 79637cf570429128f88012b72bdedd354341a43a3bbHemant Gupta BTIF_TRACE_DEBUG("%s: uhid fd=%d local_vup=%d", __func__, p_dev->fd, p_dev->local_vup); 79778bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov btif_hh_stop_vup_timer(&(p_dev->bd_addr)); 79837cf570429128f88012b72bdedd354341a43a3bbHemant Gupta /* If this is a locally initiated VUP, remove the bond as ACL got 79937cf570429128f88012b72bdedd354341a43a3bbHemant Gupta * disconnected while VUP being processed. 80037cf570429128f88012b72bdedd354341a43a3bbHemant Gupta */ 80137cf570429128f88012b72bdedd354341a43a3bbHemant Gupta if (p_dev->local_vup) 80237cf570429128f88012b72bdedd354341a43a3bbHemant Gupta { 80337cf570429128f88012b72bdedd354341a43a3bbHemant Gupta p_dev->local_vup = FALSE; 80437cf570429128f88012b72bdedd354341a43a3bbHemant Gupta BTA_DmRemoveDevice((UINT8 *)p_dev->bd_addr.address); 80537cf570429128f88012b72bdedd354341a43a3bbHemant Gupta } 80637cf570429128f88012b72bdedd354341a43a3bbHemant Gupta 80737cf570429128f88012b72bdedd354341a43a3bbHemant Gupta btif_hh_cb.status = BTIF_HH_DEV_DISCONNECTED; 80837cf570429128f88012b72bdedd354341a43a3bbHemant Gupta p_dev->dev_status = BTHH_CONN_STATE_DISCONNECTED; 80937cf570429128f88012b72bdedd354341a43a3bbHemant Gupta 81038798e1b7cc7873aa849c3c7c58902f713d909beHemant Gupta if (p_dev->fd >= 0) { 81138798e1b7cc7873aa849c3c7c58902f713d909beHemant Gupta bta_hh_co_destroy(p_dev->fd); 81238798e1b7cc7873aa849c3c7c58902f713d909beHemant Gupta p_dev->fd = -1; 81333af35c49731bc8e305c862c8e9f3e42a1ab0dc9Ganesh Ganapathi Batta } 8145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project HAL_CBACK(bt_hh_callbacks, connection_state_cb,&(p_dev->bd_addr), p_dev->dev_status); 8155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else { 817e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_WARNING("Error: cannot find device with handle %d", p_data->dev_status.handle); 8185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 82038798e1b7cc7873aa849c3c7c58902f713d909beHemant Gupta 821b46d9b899f5e28929c8530cb99d023c93e5d5cb8Mike J. Chen case BTA_HH_GET_RPT_EVT: { 822b46d9b899f5e28929c8530cb99d023c93e5d5cb8Mike J. Chen BT_HDR *hdr = p_data->hs_data.rsp_data.p_rpt_data; 823b46d9b899f5e28929c8530cb99d023c93e5d5cb8Mike J. Chen UINT8 *data = NULL; 824b46d9b899f5e28929c8530cb99d023c93e5d5cb8Mike J. Chen UINT16 len = 0; 825b46d9b899f5e28929c8530cb99d023c93e5d5cb8Mike J. Chen 826e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_DEBUG("BTA_HH_GET_RPT_EVT: status = %d, handle = %d", 8275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->hs_data.status, p_data->hs_data.handle); 828b46d9b899f5e28929c8530cb99d023c93e5d5cb8Mike J. Chen p_dev = btif_hh_find_connected_dev_by_handle(p_data->hs_data.handle); 829b46d9b899f5e28929c8530cb99d023c93e5d5cb8Mike J. Chen if (p_dev) { 830f691897800e086b6caf238ee78d560526e69c67dMike J. Chen /* p_rpt_data is NULL in HANDSHAKE response case */ 831f691897800e086b6caf238ee78d560526e69c67dMike J. Chen if (hdr) { 832f691897800e086b6caf238ee78d560526e69c67dMike J. Chen data = (UINT8 *)(hdr + 1) + hdr->offset; 833f691897800e086b6caf238ee78d560526e69c67dMike J. Chen len = hdr->len; 834f691897800e086b6caf238ee78d560526e69c67dMike J. Chen HAL_CBACK(bt_hh_callbacks, get_report_cb, 835f691897800e086b6caf238ee78d560526e69c67dMike J. Chen (bt_bdaddr_t*) &(p_dev->bd_addr), 836f691897800e086b6caf238ee78d560526e69c67dMike J. Chen (bthh_status_t) p_data->hs_data.status, data, len); 837f691897800e086b6caf238ee78d560526e69c67dMike J. Chen } else { 838f691897800e086b6caf238ee78d560526e69c67dMike J. Chen HAL_CBACK(bt_hh_callbacks, handshake_cb, 839f691897800e086b6caf238ee78d560526e69c67dMike J. Chen (bt_bdaddr_t*) &(p_dev->bd_addr), 840f691897800e086b6caf238ee78d560526e69c67dMike J. Chen (bthh_status_t) p_data->hs_data.status); 841f691897800e086b6caf238ee78d560526e69c67dMike J. Chen } 842b46d9b899f5e28929c8530cb99d023c93e5d5cb8Mike J. Chen } else { 843e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_WARNING("Error: cannot find device with handle %d", p_data->hs_data.handle); 844b46d9b899f5e28929c8530cb99d023c93e5d5cb8Mike J. Chen } 8455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 846b46d9b899f5e28929c8530cb99d023c93e5d5cb8Mike J. Chen } 84738798e1b7cc7873aa849c3c7c58902f713d909beHemant Gupta 8485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_SET_RPT_EVT: 849e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_DEBUG("BTA_HH_SET_RPT_EVT: status = %d, handle = %d", 8505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->dev_status.status, p_data->dev_status.handle); 851f691897800e086b6caf238ee78d560526e69c67dMike J. Chen p_dev = btif_hh_find_connected_dev_by_handle(p_data->dev_status.handle); 852f691897800e086b6caf238ee78d560526e69c67dMike J. Chen if (p_dev != NULL) { 853f691897800e086b6caf238ee78d560526e69c67dMike J. Chen HAL_CBACK(bt_hh_callbacks, handshake_cb, 854f691897800e086b6caf238ee78d560526e69c67dMike J. Chen (bt_bdaddr_t*) &(p_dev->bd_addr), 855f691897800e086b6caf238ee78d560526e69c67dMike J. Chen (bthh_status_t) p_data->hs_data.status); 856f691897800e086b6caf238ee78d560526e69c67dMike J. Chen } 8575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_GET_PROTO_EVT: 8605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev = btif_hh_find_connected_dev_by_handle(p_data->dev_status.handle); 861e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_WARNING("BTA_HH_GET_PROTO_EVT: status = %d, handle = %d, proto = [%d], %s", 8625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->hs_data.status, p_data->hs_data.handle, 8635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->hs_data.rsp_data.proto_mode, 8645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_data->hs_data.rsp_data.proto_mode == BTA_HH_PROTO_RPT_MODE) ? "Report Mode" : 8655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_data->hs_data.rsp_data.proto_mode == BTA_HH_PROTO_BOOT_MODE) ? "Boot Mode" : "Unsupported"); 866f691897800e086b6caf238ee78d560526e69c67dMike J. Chen if (p_data->hs_data.rsp_data.proto_mode != BTA_HH_PROTO_UNKNOWN) { 867f691897800e086b6caf238ee78d560526e69c67dMike J. Chen HAL_CBACK(bt_hh_callbacks, protocol_mode_cb, 868f691897800e086b6caf238ee78d560526e69c67dMike J. Chen (bt_bdaddr_t*) &(p_dev->bd_addr), 869f691897800e086b6caf238ee78d560526e69c67dMike J. Chen (bthh_status_t)p_data->hs_data.status, 870f691897800e086b6caf238ee78d560526e69c67dMike J. Chen (bthh_protocol_mode_t) p_data->hs_data.rsp_data.proto_mode); 871f691897800e086b6caf238ee78d560526e69c67dMike J. Chen } else { 872f691897800e086b6caf238ee78d560526e69c67dMike J. Chen HAL_CBACK(bt_hh_callbacks, handshake_cb, 873f691897800e086b6caf238ee78d560526e69c67dMike J. Chen (bt_bdaddr_t*) &(p_dev->bd_addr), 874f691897800e086b6caf238ee78d560526e69c67dMike J. Chen (bthh_status_t)p_data->hs_data.status); 875f691897800e086b6caf238ee78d560526e69c67dMike J. Chen } 8765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_SET_PROTO_EVT: 879e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_DEBUG("BTA_HH_SET_PROTO_EVT: status = %d, handle = %d", 8805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->dev_status.status, p_data->dev_status.handle); 881f691897800e086b6caf238ee78d560526e69c67dMike J. Chen p_dev = btif_hh_find_connected_dev_by_handle(p_data->dev_status.handle); 882f691897800e086b6caf238ee78d560526e69c67dMike J. Chen if (p_dev) { 883f691897800e086b6caf238ee78d560526e69c67dMike J. Chen HAL_CBACK(bt_hh_callbacks, handshake_cb, 884f691897800e086b6caf238ee78d560526e69c67dMike J. Chen (bt_bdaddr_t*)&(p_dev->bd_addr), 885f691897800e086b6caf238ee78d560526e69c67dMike J. Chen (bthh_status_t)p_data->hs_data.status); 886f691897800e086b6caf238ee78d560526e69c67dMike J. Chen } 8875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_GET_IDLE_EVT: 890e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_DEBUG("BTA_HH_GET_IDLE_EVT: handle = %d, status = %d, rate = %d", 8915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->hs_data.handle, p_data->hs_data.status, 8925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->hs_data.rsp_data.idle_rate); 8935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_SET_IDLE_EVT: 896e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_DEBUG("BTA_HH_SET_IDLE_EVT: status = %d, handle = %d", 8975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->dev_status.status, p_data->dev_status.handle); 8985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_GET_DSCP_EVT: 901433fe016392c7ae003033530f1b3994f2ddad313Chaojing Sun len = p_data->dscp_info.descriptor.dl_len; 902433fe016392c7ae003033530f1b3994f2ddad313Chaojing Sun BTIF_TRACE_DEBUG("BTA_HH_GET_DSCP_EVT: len = %d", len); 9035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev = btif_hh_cb.p_curr_dev; 9045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev == NULL) { 905e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_ERROR("BTA_HH_GET_DSCP_EVT: No HID device is currently connected"); 9065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 9075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev->fd < 0) { 909db554581079863974af8e1289646f5deea6fc044Marie Janssen LOG_ERROR(LOG_TAG, "BTA_HH_GET_DSCP_EVT: Error, failed to find the uhid driver..."); 9105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 9115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project char *cached_name = NULL; 9140b93f5ce4df14aa3d3100a8f9609a1c7ea4cdbd9Zhihai Xu bt_bdname_t bdname; 9150b93f5ce4df14aa3d3100a8f9609a1c7ea4cdbd9Zhihai Xu bt_property_t prop_name; 9160b93f5ce4df14aa3d3100a8f9609a1c7ea4cdbd9Zhihai Xu BTIF_STORAGE_FILL_PROPERTY(&prop_name, BT_PROPERTY_BDNAME, 9170b93f5ce4df14aa3d3100a8f9609a1c7ea4cdbd9Zhihai Xu sizeof(bt_bdname_t), &bdname); 9180b93f5ce4df14aa3d3100a8f9609a1c7ea4cdbd9Zhihai Xu if (btif_storage_get_remote_device_property( 9190b93f5ce4df14aa3d3100a8f9609a1c7ea4cdbd9Zhihai Xu &p_dev->bd_addr, &prop_name) == BT_STATUS_SUCCESS) 9200b93f5ce4df14aa3d3100a8f9609a1c7ea4cdbd9Zhihai Xu { 9210b93f5ce4df14aa3d3100a8f9609a1c7ea4cdbd9Zhihai Xu cached_name = (char *)bdname.name; 9220b93f5ce4df14aa3d3100a8f9609a1c7ea4cdbd9Zhihai Xu } 9230b93f5ce4df14aa3d3100a8f9609a1c7ea4cdbd9Zhihai Xu else 9240b93f5ce4df14aa3d3100a8f9609a1c7ea4cdbd9Zhihai Xu { 9250b93f5ce4df14aa3d3100a8f9609a1c7ea4cdbd9Zhihai Xu cached_name = "Bluetooth HID"; 9265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 928e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_WARNING("%s: name = %s", __FUNCTION__, cached_name); 9295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_hh_co_send_hid_info(p_dev, cached_name, 9305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->dscp_info.vendor_id, p_data->dscp_info.product_id, 9315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->dscp_info.version, p_data->dscp_info.ctry_code, 9325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project len, p_data->dscp_info.descriptor.dsc_list); 9335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btif_hh_add_added_dev(p_dev->bd_addr, p_dev->attr_mask)) { 9345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BD_ADDR bda; 9355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdcpy(bda, p_dev->bd_addr.address); 9365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_HH_DEV_DSCP_INFO dscp_info; 9375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bt_status_t ret; 9385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdcpy(bda, p_dev->bd_addr.address); 9395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_hh_copy_hid_info(&dscp_info, &p_data->dscp_info); 940e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_DEBUG("BTA_HH_GET_DSCP_EVT:bda = %02x:%02x:%02x:%02x:%02x:%02x", 94133af35c49731bc8e305c862c8e9f3e42a1ab0dc9Ganesh Ganapathi Batta p_dev->bd_addr.address[0], p_dev->bd_addr.address[1], 94233af35c49731bc8e305c862c8e9f3e42a1ab0dc9Ganesh Ganapathi Batta p_dev->bd_addr.address[2],p_dev->bd_addr.address[3], 94333af35c49731bc8e305c862c8e9f3e42a1ab0dc9Ganesh Ganapathi Batta p_dev->bd_addr.address[4], p_dev->bd_addr.address[5]); 9445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_HhAddDev(bda, p_dev->attr_mask,p_dev->sub_class,p_dev->app_id, dscp_info); 9455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // write hid info to nvram 9465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ret = btif_storage_add_hid_device_info(&(p_dev->bd_addr), p_dev->attr_mask,p_dev->sub_class,p_dev->app_id, 9475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->dscp_info.vendor_id, p_data->dscp_info.product_id, 9485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->dscp_info.version, p_data->dscp_info.ctry_code, 9498a82348c04109cb85e3c0b676dd1c7c5cb461c24Adam Hampson p_data->dscp_info.ssr_max_latency, p_data->dscp_info.ssr_min_tout, 9505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project len, p_data->dscp_info.descriptor.dsc_list); 9515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ASSERTC(ret == BT_STATUS_SUCCESS, "storing hid info failed", ret); 953e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_WARNING("BTA_HH_GET_DSCP_EVT: Called add device"); 9545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project //Free buffer created for dscp_info; 9565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (dscp_info.descriptor.dl_len >0 && dscp_info.descriptor.dsc_list != NULL) 9575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 958abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov osi_free_and_reset((void **)&dscp_info.descriptor.dsc_list); 95920524d393e8b3bea4c573f7980cd843500b0e6a4Pavlin Radoslavov dscp_info.descriptor.dl_len = 0; 9605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else { 9635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project //Device already added. 964e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_WARNING("%s: Device already added ",__FUNCTION__); 9655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /*Sync HID Keyboard lockstates */ 9675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tmplen = sizeof(hid_kb_numlock_on_list) 9685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project / sizeof(tHID_KB_LIST); 9695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for(i = 0; i< tmplen; i++) 9705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_data->dscp_info.vendor_id 9725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project == hid_kb_numlock_on_list[i].version_id && 9735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->dscp_info.product_id 9745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project == hid_kb_numlock_on_list[i].product_id) 9755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 976e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_DEBUG("%s() idx[%d] Enabling "\ 9775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project "NUMLOCK for device :: %s", __FUNCTION__, 9785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project i, hid_kb_numlock_on_list[i].kb_name); 9795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Enable NUMLOCK by default so that numeric 9805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project keys work from first keyboard connect */ 9815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project set_keylockstate(BTIF_HH_KEYSTATE_MASK_NUMLOCK, 9825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project TRUE); 9835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sync_lockstate_on_connect(p_dev); 9845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* End Sync HID Keyboard lockstates */ 9855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 9865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 9905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_ADD_DEV_EVT: 992e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_WARNING("BTA_HH_ADD_DEV_EVT: status = %d, handle = %d",p_data->dev_info.status, p_data->dev_info.handle); 9935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i; 9945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < BTIF_HH_MAX_ADDED_DEV; i++) { 9955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (memcmp(btif_hh_cb.added_devices[i].bd_addr.address, p_data->dev_info.bda, 6) == 0) { 9965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_data->dev_info.status == BTA_HH_OK) { 9975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_hh_cb.added_devices[i].dev_handle = p_data->dev_info.handle; 9985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else { 10005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(btif_hh_cb.added_devices[i].bd_addr.address, 0, 6); 10015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_hh_cb.added_devices[i].dev_handle = BTA_HH_INVALID_HANDLE; 10025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 10045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 10075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_RMV_DEV_EVT: 1008e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_DEBUG("BTA_HH_RMV_DEV_EVT: status = %d, handle = %d", 10095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->dev_info.status, p_data->dev_info.handle); 1010e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_DEBUG("BTA_HH_RMV_DEV_EVT:bda = %02x:%02x:%02x:%02x:%02x:%02x", 10115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->dev_info.bda[0], p_data->dev_info.bda[1], p_data->dev_info.bda[2], 10125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->dev_info.bda[3], p_data->dev_info.bda[4], p_data->dev_info.bda[5]); 10135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 10145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_VC_UNPLUG_EVT: 1016e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_DEBUG("BTA_HH_VC_UNPLUG_EVT: status = %d, handle = %d", 10175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->dev_status.status, p_data->dev_status.handle); 10185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev = btif_hh_find_connected_dev_by_handle(p_data->dev_status.handle); 10195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_hh_cb.status = BTIF_HH_DEV_DISCONNECTED; 10205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev != NULL) { 1021e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_DEBUG("BTA_HH_VC_UNPLUG_EVT:bda = %02x:%02x:%02x:%02x:%02x:%02x", 102233af35c49731bc8e305c862c8e9f3e42a1ab0dc9Ganesh Ganapathi Batta p_dev->bd_addr.address[0], p_dev->bd_addr.address[1], 102333af35c49731bc8e305c862c8e9f3e42a1ab0dc9Ganesh Ganapathi Batta p_dev->bd_addr.address[2],p_dev->bd_addr.address[3], 102433af35c49731bc8e305c862c8e9f3e42a1ab0dc9Ganesh Ganapathi Batta p_dev->bd_addr.address[4], p_dev->bd_addr.address[5]); 102533af35c49731bc8e305c862c8e9f3e42a1ab0dc9Ganesh Ganapathi Batta /* Stop the VUP timer */ 102678bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov btif_hh_stop_vup_timer(&(p_dev->bd_addr)); 10275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev->dev_status = BTHH_CONN_STATE_DISCONNECTED; 1028e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_DEBUG("%s---Sending connection state change", __FUNCTION__); 10295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project HAL_CBACK(bt_hh_callbacks, connection_state_cb,&(p_dev->bd_addr), p_dev->dev_status); 1030e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_DEBUG("%s---Removing HID bond", __FUNCTION__); 1031390c94dc0f9deee917f52caaf3f8bb9f79aa98b4Ganesh Ganapathi Batta /* If it is locally initiated VUP or remote device has its major COD as 1032390c94dc0f9deee917f52caaf3f8bb9f79aa98b4Ganesh Ganapathi Batta Peripheral removed the bond.*/ 1033fecf606348a0751e0be30e376c9817195afe68caAjay Panicker if (p_dev->local_vup || check_cod_hid(&(p_dev->bd_addr))) 1034390c94dc0f9deee917f52caaf3f8bb9f79aa98b4Ganesh Ganapathi Batta { 1035390c94dc0f9deee917f52caaf3f8bb9f79aa98b4Ganesh Ganapathi Batta p_dev->local_vup = FALSE; 1036390c94dc0f9deee917f52caaf3f8bb9f79aa98b4Ganesh Ganapathi Batta BTA_DmRemoveDevice((UINT8 *)p_dev->bd_addr.address); 1037390c94dc0f9deee917f52caaf3f8bb9f79aa98b4Ganesh Ganapathi Batta } 1038390c94dc0f9deee917f52caaf3f8bb9f79aa98b4Ganesh Ganapathi Batta else 1039390c94dc0f9deee917f52caaf3f8bb9f79aa98b4Ganesh Ganapathi Batta btif_hh_remove_device(p_dev->bd_addr); 104033af35c49731bc8e305c862c8e9f3e42a1ab0dc9Ganesh Ganapathi Batta HAL_CBACK(bt_hh_callbacks, virtual_unplug_cb,&(p_dev->bd_addr), 104133af35c49731bc8e305c862c8e9f3e42a1ab0dc9Ganesh Ganapathi Batta p_data->dev_status.status); 10425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 10445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_HH_API_ERR_EVT : 1046db554581079863974af8e1289646f5deea6fc044Marie Janssen LOG_INFO(LOG_TAG, "BTA_HH API_ERR"); 10475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 10485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 1050e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_WARNING("%s: Unhandled event: %d", __FUNCTION__, event); 10515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 10525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 10545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 10565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bte_hh_evt 10585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Switches context from BTE to BTIF for all HH events 10605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 10625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 10645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bte_hh_evt(tBTA_HH_EVT event, tBTA_HH *p_data) 10665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 10675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bt_status_t status; 10685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int param_len = 0; 10695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (BTA_HH_ENABLE_EVT == event) 10715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project param_len = sizeof(tBTA_HH_STATUS); 10725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (BTA_HH_OPEN_EVT == event) 10735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project param_len = sizeof(tBTA_HH_CONN); 10745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (BTA_HH_DISABLE_EVT == event) 10755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project param_len = sizeof(tBTA_HH_STATUS); 10765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (BTA_HH_CLOSE_EVT == event) 10775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project param_len = sizeof(tBTA_HH_CBDATA); 10785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (BTA_HH_GET_DSCP_EVT == event) 10795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project param_len = sizeof(tBTA_HH_DEV_DSCP_INFO); 10805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if ((BTA_HH_GET_PROTO_EVT == event) || (BTA_HH_GET_RPT_EVT == event)|| (BTA_HH_GET_IDLE_EVT == event)) 10815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project param_len = sizeof(tBTA_HH_HSDATA); 10825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if ((BTA_HH_SET_PROTO_EVT == event) || (BTA_HH_SET_RPT_EVT == event) || (BTA_HH_VC_UNPLUG_EVT == event) || (BTA_HH_SET_IDLE_EVT == event)) 10835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project param_len = sizeof(tBTA_HH_CBDATA); 10845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if ((BTA_HH_ADD_DEV_EVT == event) || (BTA_HH_RMV_DEV_EVT == event) ) 10855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project param_len = sizeof(tBTA_HH_DEV_INFO); 10865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (BTA_HH_API_ERR_EVT == event) 10875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project param_len = 0; 10885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* switch context to btif task context (copy full union size for convenience) */ 10895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = btif_transfer_context(btif_hh_upstreams_evt, (uint16_t)event, (void*)p_data, param_len, NULL); 10905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* catch any failed context transfers */ 10925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ASSERTC(status == BT_STATUS_SUCCESS, "context transfer failed", status); 10935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 10945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 10965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btif_hh_handle_evt 10985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Switches context for immediate callback 11005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 11025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 11045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_hh_handle_evt(UINT16 event, char *p_param) 11065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 11075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bt_bdaddr_t *bd_addr = (bt_bdaddr_t*)p_param; 1108e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_EVENT("%s: event=%d", __FUNCTION__, event); 11095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int ret; 11105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch(event) 11115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTIF_HH_CONNECT_REQ_EVT: 11135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ret = btif_hh_connect(bd_addr); 11155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(ret == BT_STATUS_SUCCESS) 11165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project HAL_CBACK(bt_hh_callbacks, connection_state_cb,bd_addr,BTHH_CONN_STATE_CONNECTING); 11185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 11205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project HAL_CBACK(bt_hh_callbacks, connection_state_cb,bd_addr,BTHH_CONN_STATE_DISCONNECTED); 11215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 11235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTIF_HH_DISCONNECT_REQ_EVT: 11255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1126e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_EVENT("%s: event=%d", __FUNCTION__, event); 11275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_hh_disconnect(bd_addr); 11285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project HAL_CBACK(bt_hh_callbacks, connection_state_cb,bd_addr,BTHH_CONN_STATE_DISCONNECTING); 11295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 11315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTIF_HH_VUP_REQ_EVT: 11335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1134e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_EVENT("%s: event=%d", __FUNCTION__, event); 11355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ret = btif_hh_virtual_unplug(bd_addr); 11365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 11385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 11405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1141e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_WARNING("%s : Unknown event 0x%x", __FUNCTION__, event); 11425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 11445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 11465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 114733af35c49731bc8e305c862c8e9f3e42a1ab0dc9Ganesh Ganapathi Batta/******************************************************************************* 114833af35c49731bc8e305c862c8e9f3e42a1ab0dc9Ganesh Ganapathi Batta** 114978bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov** Function btif_hh_timer_timeout 115033af35c49731bc8e305c862c8e9f3e42a1ab0dc9Ganesh Ganapathi Batta** 115133af35c49731bc8e305c862c8e9f3e42a1ab0dc9Ganesh Ganapathi Batta** Description Process timer timeout 115233af35c49731bc8e305c862c8e9f3e42a1ab0dc9Ganesh Ganapathi Batta** 115333af35c49731bc8e305c862c8e9f3e42a1ab0dc9Ganesh Ganapathi Batta** Returns void 115433af35c49731bc8e305c862c8e9f3e42a1ab0dc9Ganesh Ganapathi Batta*******************************************************************************/ 115578bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavovvoid btif_hh_timer_timeout(void *data) 115633af35c49731bc8e305c862c8e9f3e42a1ab0dc9Ganesh Ganapathi Batta{ 115778bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov btif_hh_device_t *p_dev = (btif_hh_device_t *)data; 115878bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov tBTA_HH_EVT event = BTA_HH_VC_UNPLUG_EVT; 115933af35c49731bc8e305c862c8e9f3e42a1ab0dc9Ganesh Ganapathi Batta tBTA_HH p_data; 116078bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov int param_len = sizeof(tBTA_HH_CBDATA); 116133af35c49731bc8e305c862c8e9f3e42a1ab0dc9Ganesh Ganapathi Batta 116278bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov BTIF_TRACE_DEBUG("%s", __func__); 116378bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov if (p_dev->dev_status != BTHH_CONN_STATE_CONNECTED) 116478bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov return; 116533af35c49731bc8e305c862c8e9f3e42a1ab0dc9Ganesh Ganapathi Batta 116678bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov memset(&p_data, 0, sizeof(tBTA_HH)); 116778bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov p_data.dev_status.status = BTHH_ERR; 116878bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov p_data.dev_status.handle = p_dev->dev_handle; 116933af35c49731bc8e305c862c8e9f3e42a1ab0dc9Ganesh Ganapathi Batta 117078bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov /* switch context to btif task context */ 117178bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov btif_transfer_context(btif_hh_upstreams_evt, (uint16_t)event, 117278bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov (char *)&p_data, param_len, NULL); 117333af35c49731bc8e305c862c8e9f3e42a1ab0dc9Ganesh Ganapathi Batta} 11745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 11765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btif_hh_init 11785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description initializes the hh interface 11805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns bt_status_t 11825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 11845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic bt_status_t init( bthh_callbacks_t* callbacks ) 11855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 11865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 i; 1187e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_EVENT("%s", __FUNCTION__); 11885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bt_hh_callbacks = callbacks; 11905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(&btif_hh_cb, 0, sizeof(btif_hh_cb)); 11915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < BTIF_HH_MAX_HID; i++){ 11925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_hh_cb.devices[i].dev_status = BTHH_CONN_STATE_UNKNOWN; 11935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Invoke the enable service API to the core to set the appropriate service_id */ 11955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_enable_service(BTA_HID_SERVICE_ID); 11965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BT_STATUS_SUCCESS; 11975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 11985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 12005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function connect 12025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description connect to hid device 12045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns bt_status_t 12065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 12085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic bt_status_t connect( bt_bdaddr_t *bd_addr) 12095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 12105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(btif_hh_cb.status != BTIF_HH_DEV_CONNECTING) 12115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_transfer_context(btif_hh_handle_evt, BTIF_HH_CONNECT_REQ_EVT, 12135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (char*)bd_addr, sizeof(bt_bdaddr_t), NULL); 12145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BT_STATUS_SUCCESS; 12155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 12175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BT_STATUS_BUSY; 12185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 12195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 12215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function disconnect 12235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description disconnect from hid device 12255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns bt_status_t 12275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 12295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic bt_status_t disconnect( bt_bdaddr_t *bd_addr ) 12305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 12315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CHECK_BTHH_INIT(); 12325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_hh_device_t *p_dev; 12335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btif_hh_cb.status == BTIF_HH_DISABLED) 12355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1236e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_WARNING("%s: Error, HH status = %d", __FUNCTION__, btif_hh_cb.status); 12375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BT_STATUS_FAIL; 12385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev = btif_hh_find_connected_dev_by_bda(bd_addr); 12405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev != NULL) 12415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return btif_transfer_context(btif_hh_handle_evt, BTIF_HH_DISCONNECT_REQ_EVT, 12435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (char*)bd_addr, sizeof(bt_bdaddr_t), NULL); 12445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 12465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1247e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_WARNING("%s: Error, device not opened.", __FUNCTION__); 12485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BT_STATUS_FAIL; 12495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 12515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 12535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function virtual_unplug 12555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Virtual UnPlug (VUP) the specified HID device. 12575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns bt_status_t 12595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 12615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic bt_status_t virtual_unplug (bt_bdaddr_t *bd_addr) 12625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 12635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CHECK_BTHH_INIT(); 12645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_hh_device_t *p_dev; 12655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project char bd_str[18]; 12665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sprintf(bd_str, "%02X:%02X:%02X:%02X:%02X:%02X", 12675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bd_addr->address[0], bd_addr->address[1], bd_addr->address[2], bd_addr->address[3], 12685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bd_addr->address[4], bd_addr->address[5]); 12695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btif_hh_cb.status == BTIF_HH_DISABLED) 12705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1271e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_ERROR("%s: Error, HH status = %d", __FUNCTION__, btif_hh_cb.status); 12725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BT_STATUS_FAIL; 12735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev = btif_hh_find_dev_by_bda(bd_addr); 12755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_dev) 12765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1277e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_ERROR("%s: Error, device %s not opened.", __FUNCTION__, bd_str); 12785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BT_STATUS_FAIL; 12795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_transfer_context(btif_hh_handle_evt, BTIF_HH_VUP_REQ_EVT, 12815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (char*)bd_addr, sizeof(bt_bdaddr_t), NULL); 12825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BT_STATUS_SUCCESS; 12835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 12845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 12865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function set_info 12885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Set the HID device descriptor for the specified HID device. 12905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns bt_status_t 12925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 12945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic bt_status_t set_info (bt_bdaddr_t *bd_addr, bthh_hid_info_t hid_info ) 12955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 12965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CHECK_BTHH_INIT(); 12975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_HH_DEV_DSCP_INFO dscp_info; 12985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BD_ADDR* bda = (BD_ADDR*) bd_addr; 12995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1300e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_DEBUG("addr = %02X:%02X:%02X:%02X:%02X:%02X", 13015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bda)[0], (*bda)[1], (*bda)[2], (*bda)[3], (*bda)[4], (*bda)[5]); 1302e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_DEBUG("%s: sub_class = 0x%02x, app_id = %d, vendor_id = 0x%04x, " 13035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project "product_id = 0x%04x, version= 0x%04x", 13045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project __FUNCTION__, hid_info.sub_class, 13055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project hid_info.app_id, hid_info.vendor_id, hid_info.product_id, 13065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project hid_info.version); 13075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btif_hh_cb.status == BTIF_HH_DISABLED) 13095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1310e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_ERROR("%s: Error, HH status = %d", __FUNCTION__, btif_hh_cb.status); 13115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BT_STATUS_FAIL; 13125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project dscp_info.vendor_id = hid_info.vendor_id; 13155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project dscp_info.product_id = hid_info.product_id; 13165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project dscp_info.version = hid_info.version; 13175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project dscp_info.ctry_code = hid_info.ctry_code; 13185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project dscp_info.descriptor.dl_len = hid_info.dl_len; 13205fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov dscp_info.descriptor.dsc_list = (UINT8 *)osi_malloc(dscp_info.descriptor.dl_len); 13215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(dscp_info.descriptor.dsc_list, &(hid_info.dsc_list), hid_info.dl_len); 13225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btif_hh_add_added_dev(*bd_addr, hid_info.attr_mask)) 13245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_HhAddDev(*bda, hid_info.attr_mask, hid_info.sub_class, 13265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project hid_info.app_id, dscp_info); 13275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1329abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov osi_free_and_reset((void **)&dscp_info.descriptor.dsc_list); 13305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BT_STATUS_SUCCESS; 13325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 13335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 13355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function get_protocol 13375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Get the HID proto mode. 13395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns bt_status_t 13415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 13435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic bt_status_t get_protocol (bt_bdaddr_t *bd_addr, bthh_protocol_mode_t protocolMode) 13445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 13455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CHECK_BTHH_INIT(); 13465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_hh_device_t *p_dev; 13475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BD_ADDR* bda = (BD_ADDR*) bd_addr; 13485cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(protocolMode); 13495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1350e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_DEBUG(" addr = %02X:%02X:%02X:%02X:%02X:%02X", 13515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bda)[0], (*bda)[1], (*bda)[2], (*bda)[3], (*bda)[4], (*bda)[5]); 13525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btif_hh_cb.status == BTIF_HH_DISABLED) { 1354e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_ERROR("%s: Error, HH status = %d", __FUNCTION__, btif_hh_cb.status); 13555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BT_STATUS_FAIL; 13565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev = btif_hh_find_connected_dev_by_bda(bd_addr); 13595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev != NULL) { 1360b46d9b899f5e28929c8530cb99d023c93e5d5cb8Mike J. Chen 13615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_HhGetProtoMode(p_dev->dev_handle); 13625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else { 13645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BT_STATUS_FAIL; 13655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BT_STATUS_SUCCESS; 13675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 13685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 13705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function set_protocol 13725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Set the HID proto mode. 13745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns bt_status_t 13765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 13785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic bt_status_t set_protocol (bt_bdaddr_t *bd_addr, bthh_protocol_mode_t protocolMode) 13795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 13805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CHECK_BTHH_INIT(); 13815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_hh_device_t *p_dev; 13825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 proto_mode = protocolMode; 13835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BD_ADDR* bda = (BD_ADDR*) bd_addr; 13845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1385e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_DEBUG("%s:proto_mode = %d", __FUNCTION__,protocolMode); 13865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1387e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_DEBUG("addr = %02X:%02X:%02X:%02X:%02X:%02X", 13885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bda)[0], (*bda)[1], (*bda)[2], (*bda)[3], (*bda)[4], (*bda)[5]); 13895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btif_hh_cb.status == BTIF_HH_DISABLED) { 1391e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_ERROR("%s: Error, HH status = %d", __FUNCTION__, btif_hh_cb.status); 13925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BT_STATUS_FAIL; 13935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev = btif_hh_find_connected_dev_by_bda(bd_addr); 13965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev == NULL) { 1397e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_WARNING(" Error, device %02X:%02X:%02X:%02X:%02X:%02X not opened.", 13985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bda)[0], (*bda)[1], (*bda)[2], (*bda)[3], (*bda)[4], (*bda)[5]); 13995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BT_STATUS_FAIL; 14005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (protocolMode != BTA_HH_PROTO_RPT_MODE && protocolMode != BTA_HH_PROTO_BOOT_MODE) { 1402180b9725ee4f5d342b72d5f718762db64201e8b8Pavlin Radoslavov BTIF_TRACE_WARNING("%s: Error, device proto_mode = %d.", __func__, proto_mode); 14035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BT_STATUS_FAIL; 14045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else { 14065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_HhSetProtoMode(p_dev->dev_handle, protocolMode); 14075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BT_STATUS_SUCCESS; 14105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 14115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 14135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function get_report 14155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Send a GET_REPORT to HID device. 14175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns bt_status_t 14195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 14215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic bt_status_t get_report (bt_bdaddr_t *bd_addr, bthh_report_type_t reportType, uint8_t reportId, int bufferSize) 14225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 14235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CHECK_BTHH_INIT(); 14245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_hh_device_t *p_dev; 14255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BD_ADDR* bda = (BD_ADDR*) bd_addr; 14265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1427180b9725ee4f5d342b72d5f718762db64201e8b8Pavlin Radoslavov BTIF_TRACE_DEBUG("%s: r_type = %d, rpt_id = %d, buf_size = %d", __func__, 14285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project reportType, reportId, bufferSize); 14295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1430e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_DEBUG("addr = %02X:%02X:%02X:%02X:%02X:%02X", 14315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bda)[0], (*bda)[1], (*bda)[2], (*bda)[3], (*bda)[4], (*bda)[5]); 14325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btif_hh_cb.status == BTIF_HH_DISABLED) { 1434e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_ERROR("%s: Error, HH status = %d", __FUNCTION__, btif_hh_cb.status); 14355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BT_STATUS_FAIL; 14365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev = btif_hh_find_connected_dev_by_bda(bd_addr); 14395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev == NULL) { 1440180b9725ee4f5d342b72d5f718762db64201e8b8Pavlin Radoslavov BTIF_TRACE_ERROR("%s: Error, device %02X:%02X:%02X:%02X:%02X:%02X not opened.", __func__, 14415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bda)[0], (*bda)[1], (*bda)[2], (*bda)[3], (*bda)[4], (*bda)[5]); 14425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BT_STATUS_FAIL; 14435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if ( ((int) reportType) <= BTA_HH_RPTT_RESRV || ((int) reportType) > BTA_HH_RPTT_FEATURE) { 1445e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_ERROR(" Error, device %02X:%02X:%02X:%02X:%02X:%02X not opened.", 14465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bda)[0], (*bda)[1], (*bda)[2], (*bda)[3], (*bda)[4], (*bda)[5]); 14475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BT_STATUS_FAIL; 14485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else { 14505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_HhGetReport(p_dev->dev_handle, reportType, 14515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project reportId, bufferSize); 14525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BT_STATUS_SUCCESS; 14555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 14565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 14585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function set_report 14605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Send a SET_REPORT to HID device. 14625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns bt_status_t 14645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 14665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic bt_status_t set_report (bt_bdaddr_t *bd_addr, bthh_report_type_t reportType, char* report) 14675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 14685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CHECK_BTHH_INIT(); 14695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_hh_device_t *p_dev; 14705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BD_ADDR* bda = (BD_ADDR*) bd_addr; 14715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1472e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_DEBUG("%s:reportType = %d", __FUNCTION__,reportType); 14735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1474e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_DEBUG("addr = %02X:%02X:%02X:%02X:%02X:%02X", 14755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bda)[0], (*bda)[1], (*bda)[2], (*bda)[3], (*bda)[4], (*bda)[5]); 14765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btif_hh_cb.status == BTIF_HH_DISABLED) { 1478e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_ERROR("%s: Error, HH status = %d", __FUNCTION__, btif_hh_cb.status); 14795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BT_STATUS_FAIL; 14805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev = btif_hh_find_connected_dev_by_bda(bd_addr); 14835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev == NULL) { 1484180b9725ee4f5d342b72d5f718762db64201e8b8Pavlin Radoslavov BTIF_TRACE_ERROR("%s: Error, device %02X:%02X:%02X:%02X:%02X:%02X not opened.", __func__, 14855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bda)[0], (*bda)[1], (*bda)[2], (*bda)[3], (*bda)[4], (*bda)[5]); 14865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BT_STATUS_FAIL; 14875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if ( ( (int) reportType) <= BTA_HH_RPTT_RESRV || ( (int) reportType) > BTA_HH_RPTT_FEATURE) { 1489e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_ERROR(" Error, device %02X:%02X:%02X:%02X:%02X:%02X not opened.", 14905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bda)[0], (*bda)[1], (*bda)[2], (*bda)[3], (*bda)[4], (*bda)[5]); 14915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BT_STATUS_FAIL; 14925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else { 14945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int hex_bytes_filled; 14955fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov size_t len = (strlen(report) + 1) / 2; 14965fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov UINT8 *hexbuf = osi_calloc(len); 1497f11d21fa60be8a2cd072968bf5e1bb23ce5caabfZhihai Xu 14985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Build a SetReport data buffer */ 14995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project //TODO 15005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project hex_bytes_filled = ascii_2_hex(report, len, hexbuf); 1501db554581079863974af8e1289646f5deea6fc044Marie Janssen LOG_INFO(LOG_TAG, "Hex bytes filled, hex value: %d", hex_bytes_filled); 15025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (hex_bytes_filled) { 1503be6d58f35e66b9e57cf4978be68840cbc8ac2fc9Mike J. Chen BT_HDR* p_buf = create_pbuf(hex_bytes_filled, hexbuf); 1504be6d58f35e66b9e57cf4978be68840cbc8ac2fc9Mike J. Chen if (p_buf == NULL) { 1505e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_ERROR("%s: Error, failed to allocate RPT buffer, len = %d", 1506be6d58f35e66b9e57cf4978be68840cbc8ac2fc9Mike J. Chen __FUNCTION__, hex_bytes_filled); 1507abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov osi_free(hexbuf); 1508be6d58f35e66b9e57cf4978be68840cbc8ac2fc9Mike J. Chen return BT_STATUS_FAIL; 1509be6d58f35e66b9e57cf4978be68840cbc8ac2fc9Mike J. Chen } 1510be6d58f35e66b9e57cf4978be68840cbc8ac2fc9Mike J. Chen BTA_HhSetReport(p_dev->dev_handle, reportType, p_buf); 1511abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov osi_free(hexbuf); 1512f11d21fa60be8a2cd072968bf5e1bb23ce5caabfZhihai Xu return BT_STATUS_SUCCESS; 15135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1514abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov osi_free(hexbuf); 1515f11d21fa60be8a2cd072968bf5e1bb23ce5caabfZhihai Xu return BT_STATUS_FAIL; 15165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 15185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 15205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function send_data 15225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Send a SEND_DATA to HID device. 15245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns bt_status_t 15265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 15285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic bt_status_t send_data (bt_bdaddr_t *bd_addr, char* data) 15295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 15305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CHECK_BTHH_INIT(); 15315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_hh_device_t *p_dev; 15325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BD_ADDR* bda = (BD_ADDR*) bd_addr; 15335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1534e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_DEBUG("%s", __FUNCTION__); 15355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1536e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_DEBUG("addr = %02X:%02X:%02X:%02X:%02X:%02X", 15375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bda)[0], (*bda)[1], (*bda)[2], (*bda)[3], (*bda)[4], (*bda)[5]); 15385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btif_hh_cb.status == BTIF_HH_DISABLED) { 1540e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_ERROR("%s: Error, HH status = %d", __FUNCTION__, btif_hh_cb.status); 15415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BT_STATUS_FAIL; 15425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev = btif_hh_find_connected_dev_by_bda(bd_addr); 15455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev == NULL) { 1546180b9725ee4f5d342b72d5f718762db64201e8b8Pavlin Radoslavov BTIF_TRACE_ERROR("%s: Error, device %02X:%02X:%02X:%02X:%02X:%02X not opened.", __func__, 15475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bda)[0], (*bda)[1], (*bda)[2], (*bda)[3], (*bda)[4], (*bda)[5]); 15485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BT_STATUS_FAIL; 15495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else { 15525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int hex_bytes_filled; 15535fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov size_t len = (strlen(data) + 1) / 2; 15545fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov UINT8 *hexbuf = osi_calloc(len); 1555ad7a6009746430da82ad7d8ee4a4784db7087ae4Hemant Gupta 1556ad7a6009746430da82ad7d8ee4a4784db7087ae4Hemant Gupta /* Build a SendData data buffer */ 15575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project hex_bytes_filled = ascii_2_hex(data, len, hexbuf); 1558e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_ERROR("Hex bytes filled, hex value: %d, %d", hex_bytes_filled, len); 15595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (hex_bytes_filled) { 1561be6d58f35e66b9e57cf4978be68840cbc8ac2fc9Mike J. Chen BT_HDR* p_buf = create_pbuf(hex_bytes_filled, hexbuf); 1562be6d58f35e66b9e57cf4978be68840cbc8ac2fc9Mike J. Chen if (p_buf == NULL) { 1563e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_ERROR("%s: Error, failed to allocate RPT buffer, len = %d", 1564be6d58f35e66b9e57cf4978be68840cbc8ac2fc9Mike J. Chen __FUNCTION__, hex_bytes_filled); 1565abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov osi_free(hexbuf); 1566be6d58f35e66b9e57cf4978be68840cbc8ac2fc9Mike J. Chen return BT_STATUS_FAIL; 1567be6d58f35e66b9e57cf4978be68840cbc8ac2fc9Mike J. Chen } 1568be6d58f35e66b9e57cf4978be68840cbc8ac2fc9Mike J. Chen p_buf->layer_specific = BTA_HH_RPTT_OUTPUT; 1569be6d58f35e66b9e57cf4978be68840cbc8ac2fc9Mike J. Chen BTA_HhSendData(p_dev->dev_handle, *bda, p_buf); 1570abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov osi_free(hexbuf); 15715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BT_STATUS_SUCCESS; 15725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1573abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov osi_free(hexbuf); 1574ad7a6009746430da82ad7d8ee4a4784db7087ae4Hemant Gupta return BT_STATUS_FAIL; 15755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 15775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 15795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function cleanup 15815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Closes the HH interface 15835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns bt_status_t 15855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 15875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void cleanup( void ) 15885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1589e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_EVENT("%s", __FUNCTION__); 15905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_hh_device_t *p_dev; 15915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i; 15925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btif_hh_cb.status == BTIF_HH_DISABLED) { 1593e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_WARNING("%s: HH disabling or disabled already, status = %d", __FUNCTION__, btif_hh_cb.status); 15945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 15955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_hh_cb.status = BTIF_HH_DISABLING; 15975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < BTIF_HH_MAX_HID; i++) { 15985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev = &btif_hh_cb.devices[i]; 15995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev->dev_status != BTHH_CONN_STATE_UNKNOWN && p_dev->fd >= 0) { 1600e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_DEBUG("%s: Closing uhid fd = %d", __FUNCTION__, p_dev->fd); 160138798e1b7cc7873aa849c3c7c58902f713d909beHemant Gupta if (p_dev->fd >= 0) { 160238798e1b7cc7873aa849c3c7c58902f713d909beHemant Gupta bta_hh_co_destroy(p_dev->fd); 160338798e1b7cc7873aa849c3c7c58902f713d909beHemant Gupta p_dev->fd = -1; 160438798e1b7cc7873aa849c3c7c58902f713d909beHemant Gupta } 1605689d66b6559dcb3a0ad7f6cc33b6129e50910253The Android Open Source Project p_dev->hh_keep_polling = 0; 1606689d66b6559dcb3a0ad7f6cc33b6129e50910253The Android Open Source Project p_dev->hh_poll_thread_id = -1; 16075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bt_hh_callbacks) 16115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_disable_service(BTA_HID_SERVICE_ID); 16135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bt_hh_callbacks = NULL; 16145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 16175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic const bthh_interface_t bthhInterface = { 1619ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta sizeof(bthhInterface), 16205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project init, 16215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project connect, 16225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project disconnect, 16235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project virtual_unplug, 16245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project set_info, 16255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project get_protocol, 16265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project set_protocol, 16275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// get_idle_time, 16285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// set_idle_time, 16295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project get_report, 16305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project set_report, 16315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project send_data, 16325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cleanup, 16335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 16345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 16365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btif_hh_execute_service 16385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Initializes/Shuts down the service 16405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns BT_STATUS_SUCCESS on success, BT_STATUS_FAIL otherwise 16425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 16445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectbt_status_t btif_hh_execute_service(BOOLEAN b_enable) 16455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 16465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (b_enable) 16475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Enable and register with BTA-HH */ 1649d79fb192585822a76b833403dfc61468d225d0b3Priti Aghera BTA_HhEnable(BTUI_HH_SECURITY, bte_hh_evt); 16505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else { 16525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Disable HH */ 16535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_HhDisable(); 16545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BT_STATUS_SUCCESS; 16565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 16575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 16595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btif_hh_get_interface 16615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Get the hh callback interface 16635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns bthh_interface_t 16655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 16675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst bthh_interface_t *btif_hh_get_interface() 16685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1669e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_EVENT("%s", __FUNCTION__); 16705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return &bthhInterface; 16715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1672