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