15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************
25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Copyright (C) 2002-2012 Broadcom Corporation
45738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
55738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Licensed under the Apache License, Version 2.0 (the "License");
65738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  you may not use this file except in compliance with the License.
75738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  You may obtain a copy of the License at:
85738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
95738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  http://www.apache.org/licenses/LICENSE-2.0
105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  See the License for the specific language governing permissions and
155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  limitations under the License.
165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/
185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************
205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  This file contains the HID HOST API entry points
225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/
245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <stdlib.h>
265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h>
275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <stdio.h>
285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "gki.h"
305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_types.h"
315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "hiddefs.h"
325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "hidh_api.h"
335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "hidh_int.h"
345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_api.h"
355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btu.h"
362e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#include "btm_int.h"
375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if HID_DYNAMIC_MEMORY == FALSE
395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttHID_HOST_CTB   hh_cb;
405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void hidh_search_callback (UINT16 sdp_result);
435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         HID_HostGetSDPRecord
475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function reads the device SDP record
495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          tHID_STATUS
515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttHID_STATUS HID_HostGetSDPRecord ( BD_ADDR addr, tSDP_DISCOVERY_DB *p_db, UINT32 db_len,
545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                   tHID_HOST_SDP_CALLBACK *sdp_cback )
555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tSDP_UUID   uuid_list;
575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if( hh_cb.sdp_busy )
595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return HID_ERR_SDP_BUSY;
605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    uuid_list.len = 2;
625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    uuid_list.uu.uuid16 = UUID_SERVCLASS_HUMAN_INTERFACE;
635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    hh_cb.p_sdp_db = p_db;
655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    SDP_InitDiscoveryDb (p_db, db_len, 1, &uuid_list, 0, NULL);
665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (SDP_ServiceSearchRequest (addr, p_db, hidh_search_callback))
685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        hh_cb.sdp_cback = sdp_cback ;
705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        hh_cb.sdp_busy = TRUE;
715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return HID_SUCCESS;
725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return HID_ERR_NO_RESOURCES;
755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid hidh_get_str_attr( tSDP_DISC_REC *p_rec, UINT16 attr_id, UINT16 max_len, char *str )
785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tSDP_DISC_ATTR          *p_attr;
805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16                  name_len;
815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_attr = SDP_FindAttributeInRec(p_rec, attr_id)) != NULL)
835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if((name_len = SDP_DISC_ATTR_LEN(p_attr->attr_len_type)) < max_len )
855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memcpy( str, (char *) p_attr->attr_value.v.array, name_len );
875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            str[name_len] = '\0';
885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memcpy( str, (char *) p_attr->attr_value.v.array, max_len-1 );
92ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            str[max_len-1] = '\0';
935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        str[0] = '\0';
975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void hidh_search_callback (UINT16 sdp_result)
1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tSDP_DISCOVERY_DB       *p_db = hh_cb.p_sdp_db;
1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tSDP_DISC_REC           *p_rec;
1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tSDP_DISC_ATTR          *p_attr, *p_subattr1, *p_subattr2, *p_repdesc;
1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBT_UUID                hid_uuid;
1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tHID_DEV_SDP_INFO       *p_nvi = &hh_cb.sdp_rec;
1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16                  attr_mask = 0;
1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    hid_uuid.len       = LEN_UUID_16;
1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    hid_uuid.uu.uuid16 = UUID_SERVCLASS_HUMAN_INTERFACE;
1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    hh_cb.sdp_busy = FALSE;
1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (sdp_result != SDP_SUCCESS)
1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        hh_cb.sdp_cback(sdp_result, 0, NULL);
1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_rec = SDP_FindServiceUUIDInDb (p_db, &hid_uuid, NULL)) == NULL)
1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        hh_cb.sdp_cback(HID_SDP_NO_SERV_UUID, 0, NULL);
1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset (&hh_cb.sdp_rec, 0, sizeof( tHID_DEV_SDP_INFO ));
1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* First, verify the mandatory fields we care about */
1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (((p_attr = SDP_FindAttributeInRec (p_rec, ATTR_ID_HID_DESCRIPTOR_LIST)) == NULL)
1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project     || (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) != DATA_ELE_SEQ_DESC_TYPE)
1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project     || ((p_subattr1 = p_attr->attr_value.v.p_sub_attr) == NULL)
1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project     || (SDP_DISC_ATTR_TYPE(p_subattr1->attr_len_type) != DATA_ELE_SEQ_DESC_TYPE)
1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project     || ((p_subattr2 = p_subattr1->attr_value.v.p_sub_attr) == NULL)
1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project     || ((p_repdesc = p_subattr2->p_next_attr) == NULL)
1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project     || (SDP_DISC_ATTR_TYPE(p_repdesc->attr_len_type) != TEXT_STR_DESC_TYPE))
1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        hh_cb.sdp_cback(HID_SDP_MANDATORY_MISSING, 0, NULL);
1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_nvi->dscp_info.dl_len = SDP_DISC_ATTR_LEN(p_repdesc->attr_len_type)) != 0)
1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_nvi->dscp_info.dsc_list = (UINT8 *) &p_repdesc->attr_value;
1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (((p_attr = SDP_FindAttributeInRec (p_rec, ATTR_ID_HID_VIRTUAL_CABLE)) != NULL) &&
1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (p_attr->attr_value.v.u8) )
1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        attr_mask |= HID_VIRTUAL_CABLE;
1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (((p_attr = SDP_FindAttributeInRec (p_rec, ATTR_ID_HID_RECONNECT_INITIATE)) != NULL) &&
1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (p_attr->attr_value.v.u8) )
1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        attr_mask |= HID_RECONN_INIT;
1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (((p_attr = SDP_FindAttributeInRec (p_rec, ATTR_ID_HID_NORMALLY_CONNECTABLE)) != NULL) &&
1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (p_attr->attr_value.v.u8) )
1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        attr_mask |= HID_NORMALLY_CONNECTABLE;
1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (((p_attr = SDP_FindAttributeInRec (p_rec, ATTR_ID_HID_SDP_DISABLE)) != NULL)&&
1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (p_attr->attr_value.v.u8) )
1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        attr_mask |= HID_SDP_DISABLE;
1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (((p_attr = SDP_FindAttributeInRec (p_rec, ATTR_ID_HID_BATTERY_POWER)) != NULL)&&
1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (p_attr->attr_value.v.u8) )
1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        attr_mask |= HID_BATTERY_POWER;
1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (((p_attr = SDP_FindAttributeInRec (p_rec, ATTR_ID_HID_REMOTE_WAKE)) != NULL)&&
1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (p_attr->attr_value.v.u8) )
1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        attr_mask |= HID_REMOTE_WAKE;
1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    hidh_get_str_attr( p_rec, ATTR_ID_SERVICE_NAME, HID_MAX_SVC_NAME_LEN, p_nvi->svc_name );
1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    hidh_get_str_attr( p_rec, ATTR_ID_SERVICE_DESCRIPTION, HID_MAX_SVC_DESCR_LEN, p_nvi->svc_descr );
1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    hidh_get_str_attr( p_rec, ATTR_ID_PROVIDER_NAME, HID_MAX_PROV_NAME_LEN, p_nvi->prov_name );
1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (((p_attr = SDP_FindAttributeInRec (p_rec, ATTR_ID_HID_DEVICE_RELNUM)) != NULL))
1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_nvi->rel_num = p_attr->attr_value.v.u16;
1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (((p_attr = SDP_FindAttributeInRec (p_rec, ATTR_ID_HID_COUNTRY_CODE)) != NULL))
1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_nvi->ctry_code = p_attr->attr_value.v.u8;
1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (((p_attr = SDP_FindAttributeInRec (p_rec, ATTR_ID_HID_DEVICE_SUBCLASS)) != NULL))
1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_nvi->sub_class = p_attr->attr_value.v.u8;
1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (((p_attr = SDP_FindAttributeInRec (p_rec, ATTR_ID_HID_PARSER_VERSION)) != NULL))
2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_nvi->hpars_ver = p_attr->attr_value.v.u16;
2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (((p_attr = SDP_FindAttributeInRec (p_rec, ATTR_ID_HID_LINK_SUPERVISION_TO)) != NULL))
2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        attr_mask |= HID_SUP_TOUT_AVLBL;
2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_nvi->sup_timeout = p_attr->attr_value.v.u16;
2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (((p_attr = SDP_FindAttributeInRec (p_rec, ATTR_ID_HID_SSR_HOST_MAX_LAT)) != NULL))
2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        attr_mask |= HID_SSR_MAX_LATENCY;
2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_nvi->ssr_max_latency = p_attr->attr_value.v.u16;
2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_nvi->ssr_max_latency = HID_SSR_PARAM_INVALID;
2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (((p_attr = SDP_FindAttributeInRec (p_rec, ATTR_ID_HID_SSR_HOST_MIN_TOUT)) != NULL))
2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        attr_mask |= HID_SSR_MIN_TOUT;
2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_nvi->ssr_min_tout = p_attr->attr_value.v.u16;
2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
224ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        p_nvi->ssr_min_tout = HID_SSR_PARAM_INVALID;
2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    hh_cb.sdp_rec.p_sdp_layer_rec = p_rec;
2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    hh_cb.sdp_cback(SDP_SUCCESS, attr_mask, &hh_cb.sdp_rec);
2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         HID_HostInit
2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function initializes the control block and trace variable
2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid HID_HostInit (void)
2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset(&hh_cb, 0, sizeof(tHID_HOST_CTB));
2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if defined(HID_INITIAL_TRACE_LEVEL)
2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    hh_cb.trace_level = HID_INITIAL_TRACE_LEVEL;
2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    hh_cb.trace_level = BT_TRACE_LEVEL_NONE;
2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         HID_HostSetTraceLevel
2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function sets the trace level for HID Host. If called with
2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  a value of 0xFF, it simply reads the current trace level.
2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          the new (current) trace level
2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 HID_HostSetTraceLevel (UINT8 new_level)
2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (new_level != 0xFF)
2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        hh_cb.trace_level = new_level;
2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (hh_cb.trace_level);
2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         HID_HostRegister
2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function registers HID-Host with lower layers
2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          tHID_STATUS
2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttHID_STATUS HID_HostRegister (tHID_HOST_DEV_CALLBACK *dev_cback)
2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tHID_STATUS st;
2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if( hh_cb.reg_flag )
2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return HID_ERR_ALREADY_REGISTERED;
2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if( dev_cback == NULL )
2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return HID_ERR_INVALID_PARAM;
2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Register with L2CAP */
2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if( (st = hidh_conn_reg()) != HID_SUCCESS )
2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return st;
2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    hh_cb.callback = dev_cback ;
2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    hh_cb.reg_flag = TRUE;
2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (HID_SUCCESS);
2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         HID_HostDeregister
3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when the host is about power down.
3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          tHID_STATUS
3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttHID_STATUS HID_HostDeregister(void)
3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 i;
3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if( !hh_cb.reg_flag )
3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (HID_ERR_NOT_REGISTERED);
3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for( i=0; i<HID_HOST_MAX_DEVICES; i++ )
3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        HID_HostRemoveDev( i ) ;
3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    hidh_conn_dereg();
3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    hh_cb.reg_flag = FALSE;
3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (HID_SUCCESS) ;
3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         HID_HostAddDev
3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This is called so HID-host may manage this device.
3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          tHID_STATUS
3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttHID_STATUS HID_HostAddDev ( BD_ADDR addr, UINT16 attr_mask, UINT8 *handle )
3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int i;
3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Find an entry for this device in hh_cb.devices array */
3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if( !hh_cb.reg_flag )
3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (HID_ERR_NOT_REGISTERED);
3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for( i=0; i<HID_HOST_MAX_DEVICES; i++)
3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if((hh_cb.devices[i].in_use) &&
3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project           (!memcmp(addr, hh_cb.devices[i].addr, BD_ADDR_LEN)))
3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (i== HID_HOST_MAX_DEVICES )
3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        for( i=0; i<HID_HOST_MAX_DEVICES; i++)
3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if( !hh_cb.devices[i].in_use)
3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if( i==HID_HOST_MAX_DEVICES )
3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return HID_ERR_NO_RESOURCES;
3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!hh_cb.devices[i].in_use)
3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        hh_cb.devices[i].in_use = TRUE;
3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy( hh_cb.devices[i].addr, addr, sizeof( BD_ADDR ) ) ;
3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        hh_cb.devices[i].state = HID_DEV_NO_CONN;
3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        hh_cb.devices[i].conn_tries = 0 ;
3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3702e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (attr_mask != HID_ATTR_MASK_IGNORE)
3712e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        hh_cb.devices[i].attr_mask = attr_mask;
3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    *handle = i;
3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (HID_SUCCESS);
3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         HID_HostRemoveDev
3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This removes the device from list devices that host has to manage.
3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          tHID_STATUS
3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttHID_STATUS HID_HostRemoveDev ( UINT8 dev_handle )
3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if( !hh_cb.reg_flag )
3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (HID_ERR_NOT_REGISTERED);
3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if( (dev_handle >= HID_HOST_MAX_DEVICES) || (!hh_cb.devices[dev_handle].in_use) )
3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return HID_ERR_INVALID_PARAM;
3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    HID_HostCloseDev( dev_handle ) ;
3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    hh_cb.devices[dev_handle].in_use = FALSE;
3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    hh_cb.devices[dev_handle].conn.conn_state = HID_CONN_STATE_UNUSED;
3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    hh_cb.devices[dev_handle].conn.ctrl_cid = hh_cb.devices[dev_handle].conn.intr_cid = 0;
4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return HID_SUCCESS;
4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         HID_HostOpenDev
4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when the user wants to initiate a
4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  connection attempt to a device.
4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttHID_STATUS HID_HostOpenDev ( UINT8 dev_handle )
4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if( !hh_cb.reg_flag )
4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (HID_ERR_NOT_REGISTERED);
4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if( (dev_handle >= HID_HOST_MAX_DEVICES) || (!hh_cb.devices[dev_handle].in_use) )
4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return HID_ERR_INVALID_PARAM;
4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if( hh_cb.devices[dev_handle].state != HID_DEV_NO_CONN )
4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return HID_ERR_ALREADY_CONN;
4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    hh_cb.devices[dev_handle].conn_tries = 1;
4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return hidh_conn_initiate( dev_handle );
4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         HID_HostWriteDev
4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when the host has a report to send.
4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  report_id: is only used on GET_REPORT transaction if is specified.
4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                              only valid when it's a non-zero value.
4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttHID_STATUS HID_HostWriteDev( UINT8 dev_handle, UINT8 t_type,
4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                              UINT8 param, UINT16 data, UINT8 report_id, BT_HDR *pbuf  )
4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tHID_STATUS status = HID_SUCCESS;
4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if( !hh_cb.reg_flag )
4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
448d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati        HIDH_TRACE_ERROR("HID_ERR_NOT_REGISTERED");
4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        status = HID_ERR_NOT_REGISTERED;
4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if( (dev_handle >= HID_HOST_MAX_DEVICES) || (!hh_cb.devices[dev_handle].in_use) )
4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
454d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati        HIDH_TRACE_ERROR("HID_ERR_INVALID_PARAM");
4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        status = HID_ERR_INVALID_PARAM;
4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
458ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    else if( hh_cb.devices[dev_handle].state != HID_DEV_CONNECTED )
4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
460d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati        HIDH_TRACE_ERROR("HID_ERR_NO_CONNECTION dev_handle %d", dev_handle);
4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        status = HID_ERR_NO_CONNECTION;
4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (status != HID_SUCCESS)
4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (pbuf)
4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            GKI_freebuf ((void *)pbuf);
4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        status = hidh_conn_snd_data( dev_handle, t_type, param, data, report_id, pbuf ) ;
4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return status;
4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         HID_HostCloseDev
4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function disconnects the device.
4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttHID_STATUS HID_HostCloseDev( UINT8 dev_handle )
4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if( !hh_cb.reg_flag )
4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (HID_ERR_NOT_REGISTERED);
4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if( (dev_handle >= HID_HOST_MAX_DEVICES) || (!hh_cb.devices[dev_handle].in_use) )
4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return HID_ERR_INVALID_PARAM;
4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    hh_cb.devices[dev_handle].conn_tries = HID_HOST_MAX_CONN_RETRY+1;
4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_stop_timer( &(hh_cb.devices[dev_handle].conn.timer_entry) ) ;
4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if( hh_cb.devices[dev_handle].state != HID_DEV_CONNECTED )
4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return HID_ERR_NO_CONNECTION;
4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    hh_cb.devices[dev_handle].conn_tries = HID_HOST_MAX_CONN_RETRY+1;
4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return hidh_conn_disconnect( dev_handle );
5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttHID_STATUS HID_HostSetSecurityLevel( char serv_name[], UINT8 sec_lvl )
5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5042e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (!BTM_SetSecurityLevel (FALSE, serv_name, BTM_SEC_SERVICE_HIDH_SEC_CTRL,
5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                               sec_lvl, HID_PSM_CONTROL, BTM_SEC_PROTO_HID, HID_SEC_CHN))
5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
507d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati        HIDH_TRACE_ERROR ("Security Registration 1 failed");
5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (HID_ERR_NO_RESOURCES);
5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5112e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (!BTM_SetSecurityLevel (TRUE, serv_name, BTM_SEC_SERVICE_HIDH_SEC_CTRL,
5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                               sec_lvl, HID_PSM_CONTROL, BTM_SEC_PROTO_HID, HID_SEC_CHN))
5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
514d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati        HIDH_TRACE_ERROR ("Security Registration 2 failed");
5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (HID_ERR_NO_RESOURCES);
5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5182e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (!BTM_SetSecurityLevel (FALSE, serv_name, BTM_SEC_SERVICE_HIDH_NOSEC_CTRL,
5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                               BTM_SEC_NONE, HID_PSM_CONTROL, BTM_SEC_PROTO_HID, HID_NOSEC_CHN))
5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
521d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati        HIDH_TRACE_ERROR ("Security Registration 3 failed");
5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (HID_ERR_NO_RESOURCES);
5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5252e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (!BTM_SetSecurityLevel (TRUE, serv_name, BTM_SEC_SERVICE_HIDH_NOSEC_CTRL,
5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                               BTM_SEC_NONE, HID_PSM_CONTROL, BTM_SEC_PROTO_HID, HID_NOSEC_CHN))
5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
528d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati        HIDH_TRACE_ERROR ("Security Registration 4 failed");
5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (HID_ERR_NO_RESOURCES);
5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5322e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (!BTM_SetSecurityLevel (TRUE, serv_name, BTM_SEC_SERVICE_HIDH_INTR,
5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                               BTM_SEC_NONE, HID_PSM_INTERRUPT, BTM_SEC_PROTO_HID, 0))
5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
535d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati        HIDH_TRACE_ERROR ("Security Registration 5 failed");
5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (HID_ERR_NO_RESOURCES);
5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5392e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (!BTM_SetSecurityLevel (FALSE, serv_name, BTM_SEC_SERVICE_HIDH_INTR,
5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                               BTM_SEC_NONE, HID_PSM_INTERRUPT, BTM_SEC_PROTO_HID, 0))
5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
542d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati        HIDH_TRACE_ERROR ("Security Registration 6 failed");
5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (HID_ERR_NO_RESOURCES);
5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return( HID_SUCCESS );
5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5482e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
5492e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/******************************************************************************
5502e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
5512e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         hid_known_hid_device
5522e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
5532e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      check if this device is  of type HID Device
5542e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
5552e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Returns          TRUE if device is HID Device else FALSE
5562e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
5572e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
5582e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre EisenbachBOOLEAN hid_known_hid_device (BD_ADDR bd_addr)
5592e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
5602e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    UINT8 i;
5612e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tBTM_INQ_INFO *p_inq_info = BTM_InqDbRead(bd_addr);
5622e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
5632e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach     if ( !hh_cb.reg_flag )
5642e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        return FALSE;
5652e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
5662e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    /* First  check for class of device , if Inq DB has information about this device*/
5672e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (p_inq_info != NULL)
5682e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
5692e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        /* Check if remote major device class is of type BTM_COD_MAJOR_PERIPHERAL */
5702e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        if ((p_inq_info->results.dev_class[1] & BTM_COD_MAJOR_CLASS_MASK)
5712e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            == BTM_COD_MAJOR_PERIPHERAL )
5722e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        {
573d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati            HIDH_TRACE_DEBUG("hid_known_hid_device:dev found in InqDB & COD matches HID dev");
5742e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            return TRUE;
5752e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        }
5762e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
5772e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    else
5782e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
5792e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        /* Look for this device in security device DB */
5802e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        tBTM_SEC_DEV_REC  *p_dev_rec = btm_find_dev (bd_addr);
5812e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        if ((p_dev_rec != NULL) &&
5822e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            ((p_dev_rec->dev_class[1] & BTM_COD_MAJOR_CLASS_MASK) == BTM_COD_MAJOR_PERIPHERAL ))
5832e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        {
584d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati            HIDH_TRACE_DEBUG("hid_known_hid_device:dev found in SecDevDB & COD matches HID dev");
5852e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            return TRUE;
5862e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        }
5872e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
5882e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
5892e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    /* Find an entry for this device in hh_cb.devices array */
5902e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach     for ( i=0; i<HID_HOST_MAX_DEVICES; i++)
5912e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach     {
5922e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach         if ((hh_cb.devices[i].in_use) &&
5932e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            (memcmp(bd_addr, hh_cb.devices[i].addr, BD_ADDR_LEN) == 0))
5942e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach             return TRUE;
5952e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach     }
5962e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    /* Check if this device is marked as HID Device in IOP Dev */
597d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati    HIDH_TRACE_DEBUG("hid_known_hid_device:remote is not HID device");
5982e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    return FALSE;
5992e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
600