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"
365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if HID_DYNAMIC_MEMORY == FALSE
385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttHID_HOST_CTB   hh_cb;
395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void hidh_search_callback (UINT16 sdp_result);
425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         HID_HostGetSDPRecord
465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function reads the device SDP record
485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          tHID_STATUS
505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttHID_STATUS HID_HostGetSDPRecord ( BD_ADDR addr, tSDP_DISCOVERY_DB *p_db, UINT32 db_len,
535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                   tHID_HOST_SDP_CALLBACK *sdp_cback )
545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tSDP_UUID   uuid_list;
565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if( hh_cb.sdp_busy )
585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return HID_ERR_SDP_BUSY;
595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    uuid_list.len = 2;
615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    uuid_list.uu.uuid16 = UUID_SERVCLASS_HUMAN_INTERFACE;
625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    hh_cb.p_sdp_db = p_db;
645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    SDP_InitDiscoveryDb (p_db, db_len, 1, &uuid_list, 0, NULL);
655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (SDP_ServiceSearchRequest (addr, p_db, hidh_search_callback))
675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        hh_cb.sdp_cback = sdp_cback ;
695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        hh_cb.sdp_busy = TRUE;
705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return HID_SUCCESS;
715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return HID_ERR_NO_RESOURCES;
745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid hidh_get_str_attr( tSDP_DISC_REC *p_rec, UINT16 attr_id, UINT16 max_len, char *str )
775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tSDP_DISC_ATTR          *p_attr;
795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16                  name_len;
805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_attr = SDP_FindAttributeInRec(p_rec, attr_id)) != NULL)
825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if((name_len = SDP_DISC_ATTR_LEN(p_attr->attr_len_type)) < max_len )
845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memcpy( str, (char *) p_attr->attr_value.v.array, name_len );
865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            str[name_len] = '\0';
875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memcpy( str, (char *) p_attr->attr_value.v.array, max_len-1 );
91ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            str[max_len-1] = '\0';
925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        str[0] = '\0';
965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void hidh_search_callback (UINT16 sdp_result)
1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tSDP_DISCOVERY_DB       *p_db = hh_cb.p_sdp_db;
1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tSDP_DISC_REC           *p_rec;
1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tSDP_DISC_ATTR          *p_attr, *p_subattr1, *p_subattr2, *p_repdesc;
1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBT_UUID                hid_uuid;
1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tHID_DEV_SDP_INFO       *p_nvi = &hh_cb.sdp_rec;
1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16                  attr_mask = 0;
1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    hid_uuid.len       = LEN_UUID_16;
1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    hid_uuid.uu.uuid16 = UUID_SERVCLASS_HUMAN_INTERFACE;
1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    hh_cb.sdp_busy = FALSE;
1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (sdp_result != SDP_SUCCESS)
1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        hh_cb.sdp_cback(sdp_result, 0, NULL);
1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_rec = SDP_FindServiceUUIDInDb (p_db, &hid_uuid, NULL)) == NULL)
1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        hh_cb.sdp_cback(HID_SDP_NO_SERV_UUID, 0, NULL);
1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset (&hh_cb.sdp_rec, 0, sizeof( tHID_DEV_SDP_INFO ));
1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* First, verify the mandatory fields we care about */
1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (((p_attr = SDP_FindAttributeInRec (p_rec, ATTR_ID_HID_DESCRIPTOR_LIST)) == NULL)
1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project     || (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) != DATA_ELE_SEQ_DESC_TYPE)
1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project     || ((p_subattr1 = p_attr->attr_value.v.p_sub_attr) == NULL)
1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project     || (SDP_DISC_ATTR_TYPE(p_subattr1->attr_len_type) != DATA_ELE_SEQ_DESC_TYPE)
1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project     || ((p_subattr2 = p_subattr1->attr_value.v.p_sub_attr) == NULL)
1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project     || ((p_repdesc = p_subattr2->p_next_attr) == NULL)
1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project     || (SDP_DISC_ATTR_TYPE(p_repdesc->attr_len_type) != TEXT_STR_DESC_TYPE))
1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        hh_cb.sdp_cback(HID_SDP_MANDATORY_MISSING, 0, NULL);
1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_nvi->dscp_info.dl_len = SDP_DISC_ATTR_LEN(p_repdesc->attr_len_type)) != 0)
1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_nvi->dscp_info.dsc_list = (UINT8 *) &p_repdesc->attr_value;
1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (((p_attr = SDP_FindAttributeInRec (p_rec, ATTR_ID_HID_VIRTUAL_CABLE)) != NULL) &&
1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (p_attr->attr_value.v.u8) )
1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        attr_mask |= HID_VIRTUAL_CABLE;
1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (((p_attr = SDP_FindAttributeInRec (p_rec, ATTR_ID_HID_RECONNECT_INITIATE)) != NULL) &&
1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (p_attr->attr_value.v.u8) )
1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        attr_mask |= HID_RECONN_INIT;
1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (((p_attr = SDP_FindAttributeInRec (p_rec, ATTR_ID_HID_NORMALLY_CONNECTABLE)) != NULL) &&
1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (p_attr->attr_value.v.u8) )
1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        attr_mask |= HID_NORMALLY_CONNECTABLE;
1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (((p_attr = SDP_FindAttributeInRec (p_rec, ATTR_ID_HID_SDP_DISABLE)) != NULL)&&
1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (p_attr->attr_value.v.u8) )
1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        attr_mask |= HID_SDP_DISABLE;
1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (((p_attr = SDP_FindAttributeInRec (p_rec, ATTR_ID_HID_BATTERY_POWER)) != NULL)&&
1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (p_attr->attr_value.v.u8) )
1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        attr_mask |= HID_BATTERY_POWER;
1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (((p_attr = SDP_FindAttributeInRec (p_rec, ATTR_ID_HID_REMOTE_WAKE)) != NULL)&&
1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (p_attr->attr_value.v.u8) )
1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        attr_mask |= HID_REMOTE_WAKE;
1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    hidh_get_str_attr( p_rec, ATTR_ID_SERVICE_NAME, HID_MAX_SVC_NAME_LEN, p_nvi->svc_name );
1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    hidh_get_str_attr( p_rec, ATTR_ID_SERVICE_DESCRIPTION, HID_MAX_SVC_DESCR_LEN, p_nvi->svc_descr );
1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    hidh_get_str_attr( p_rec, ATTR_ID_PROVIDER_NAME, HID_MAX_PROV_NAME_LEN, p_nvi->prov_name );
1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (((p_attr = SDP_FindAttributeInRec (p_rec, ATTR_ID_HID_DEVICE_RELNUM)) != NULL))
1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_nvi->rel_num = p_attr->attr_value.v.u16;
1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (((p_attr = SDP_FindAttributeInRec (p_rec, ATTR_ID_HID_COUNTRY_CODE)) != NULL))
1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_nvi->ctry_code = p_attr->attr_value.v.u8;
1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (((p_attr = SDP_FindAttributeInRec (p_rec, ATTR_ID_HID_DEVICE_SUBCLASS)) != NULL))
1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_nvi->sub_class = p_attr->attr_value.v.u8;
1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (((p_attr = SDP_FindAttributeInRec (p_rec, ATTR_ID_HID_PARSER_VERSION)) != NULL))
1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_nvi->hpars_ver = p_attr->attr_value.v.u16;
2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (((p_attr = SDP_FindAttributeInRec (p_rec, ATTR_ID_HID_LINK_SUPERVISION_TO)) != NULL))
2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        attr_mask |= HID_SUP_TOUT_AVLBL;
2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_nvi->sup_timeout = p_attr->attr_value.v.u16;
2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (((p_attr = SDP_FindAttributeInRec (p_rec, ATTR_ID_HID_SSR_HOST_MAX_LAT)) != NULL))
2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        attr_mask |= HID_SSR_MAX_LATENCY;
2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_nvi->ssr_max_latency = p_attr->attr_value.v.u16;
2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_nvi->ssr_max_latency = HID_SSR_PARAM_INVALID;
2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (((p_attr = SDP_FindAttributeInRec (p_rec, ATTR_ID_HID_SSR_HOST_MIN_TOUT)) != NULL))
2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        attr_mask |= HID_SSR_MIN_TOUT;
2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_nvi->ssr_min_tout = p_attr->attr_value.v.u16;
2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
223ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        p_nvi->ssr_min_tout = HID_SSR_PARAM_INVALID;
2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    hh_cb.sdp_rec.p_sdp_layer_rec = p_rec;
2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    hh_cb.sdp_cback(SDP_SUCCESS, attr_mask, &hh_cb.sdp_rec);
2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
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** Function         HID_HostInit
2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function initializes the control block and trace variable
2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid HID_HostInit (void)
2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset(&hh_cb, 0, sizeof(tHID_HOST_CTB));
2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if defined(HID_INITIAL_TRACE_LEVEL)
2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    hh_cb.trace_level = HID_INITIAL_TRACE_LEVEL;
2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    hh_cb.trace_level = BT_TRACE_LEVEL_NONE;
2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         HID_HostSetTraceLevel
2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function sets the trace level for HID Host. If called with
2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  a value of 0xFF, it simply reads the current trace level.
2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          the new (current) trace level
2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 HID_HostSetTraceLevel (UINT8 new_level)
2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (new_level != 0xFF)
2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        hh_cb.trace_level = new_level;
2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (hh_cb.trace_level);
2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         HID_HostRegister
2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function registers HID-Host with lower layers
2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          tHID_STATUS
2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttHID_STATUS HID_HostRegister (tHID_HOST_DEV_CALLBACK *dev_cback)
2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tHID_STATUS st;
2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if( hh_cb.reg_flag )
2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return HID_ERR_ALREADY_REGISTERED;
2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if( dev_cback == NULL )
2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return HID_ERR_INVALID_PARAM;
2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Register with L2CAP */
2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if( (st = hidh_conn_reg()) != HID_SUCCESS )
2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return st;
2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    hh_cb.callback = dev_cback ;
2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    hh_cb.reg_flag = TRUE;
2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (HID_SUCCESS);
2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         HID_HostDeregister
3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when the host is about power down.
3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          tHID_STATUS
3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttHID_STATUS HID_HostDeregister(void)
3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 i;
3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if( !hh_cb.reg_flag )
3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (HID_ERR_NOT_REGISTERED);
3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for( i=0; i<HID_HOST_MAX_DEVICES; i++ )
3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        HID_HostRemoveDev( i ) ;
3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    hidh_conn_dereg();
3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    hh_cb.reg_flag = FALSE;
3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (HID_SUCCESS) ;
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         HID_HostAddDev
3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This is called so HID-host may manage this device.
3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          tHID_STATUS
3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttHID_STATUS HID_HostAddDev ( BD_ADDR addr, UINT16 attr_mask, UINT8 *handle )
3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int i;
3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Find an entry for this device in hh_cb.devices array */
3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
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
3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    hh_cb.devices[i].attr_mask = attr_mask;
3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    *handle = i;
3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (HID_SUCCESS);
3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
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** Function         HID_HostRemoveDev
3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This removes the device from list devices that host has to manage.
3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          tHID_STATUS
3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttHID_STATUS HID_HostRemoveDev ( UINT8 dev_handle )
3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if( !hh_cb.reg_flag )
3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (HID_ERR_NOT_REGISTERED);
3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if( (dev_handle >= HID_HOST_MAX_DEVICES) || (!hh_cb.devices[dev_handle].in_use) )
3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return HID_ERR_INVALID_PARAM;
3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    HID_HostCloseDev( dev_handle ) ;
3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    hh_cb.devices[dev_handle].in_use = FALSE;
3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    hh_cb.devices[dev_handle].conn.conn_state = HID_CONN_STATE_UNUSED;
3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    hh_cb.devices[dev_handle].conn.ctrl_cid = hh_cb.devices[dev_handle].conn.intr_cid = 0;
3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return HID_SUCCESS;
4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         HID_HostOpenDev
4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when the user wants to initiate a
4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  connection attempt to a device.
4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttHID_STATUS HID_HostOpenDev ( UINT8 dev_handle )
4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if( !hh_cb.reg_flag )
4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (HID_ERR_NOT_REGISTERED);
4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if( (dev_handle >= HID_HOST_MAX_DEVICES) || (!hh_cb.devices[dev_handle].in_use) )
4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return HID_ERR_INVALID_PARAM;
4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if( hh_cb.devices[dev_handle].state != HID_DEV_NO_CONN )
4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return HID_ERR_ALREADY_CONN;
4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    hh_cb.devices[dev_handle].conn_tries = 1;
4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return hidh_conn_initiate( dev_handle );
4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         HID_HostWriteDev
4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when the host has a report to send.
4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  report_id: is only used on GET_REPORT transaction if is specified.
4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                              only valid when it's a non-zero value.
4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttHID_STATUS HID_HostWriteDev( UINT8 dev_handle, UINT8 t_type,
4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                              UINT8 param, UINT16 data, UINT8 report_id, BT_HDR *pbuf  )
4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tHID_STATUS status = HID_SUCCESS;
4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if( !hh_cb.reg_flag )
4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        HIDH_TRACE_ERROR0("HID_ERR_NOT_REGISTERED");
4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        status = HID_ERR_NOT_REGISTERED;
4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if( (dev_handle >= HID_HOST_MAX_DEVICES) || (!hh_cb.devices[dev_handle].in_use) )
4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        HIDH_TRACE_ERROR0("HID_ERR_INVALID_PARAM");
4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        status = HID_ERR_INVALID_PARAM;
4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
457ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    else if( hh_cb.devices[dev_handle].state != HID_DEV_CONNECTED )
4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        HIDH_TRACE_ERROR1("HID_ERR_NO_CONNECTION dev_handle %d", dev_handle);
4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        status = HID_ERR_NO_CONNECTION;
4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (status != HID_SUCCESS)
4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (pbuf)
4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            GKI_freebuf ((void *)pbuf);
4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        status = hidh_conn_snd_data( dev_handle, t_type, param, data, report_id, pbuf ) ;
4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return status;
4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         HID_HostCloseDev
4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function disconnects the device.
4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttHID_STATUS HID_HostCloseDev( UINT8 dev_handle )
4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if( !hh_cb.reg_flag )
4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (HID_ERR_NOT_REGISTERED);
4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if( (dev_handle >= HID_HOST_MAX_DEVICES) || (!hh_cb.devices[dev_handle].in_use) )
4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return HID_ERR_INVALID_PARAM;
4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    hh_cb.devices[dev_handle].conn_tries = HID_HOST_MAX_CONN_RETRY+1;
4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_stop_timer( &(hh_cb.devices[dev_handle].conn.timer_entry) ) ;
4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if( hh_cb.devices[dev_handle].state != HID_DEV_CONNECTED )
4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return HID_ERR_NO_CONNECTION;
4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    hh_cb.devices[dev_handle].conn_tries = HID_HOST_MAX_CONN_RETRY+1;
4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return hidh_conn_disconnect( dev_handle );
4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttHID_STATUS HID_HostSetSecurityLevel( char serv_name[], UINT8 sec_lvl )
5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!BTM_SetSecurityLevel (FALSE, serv_name, BTM_SEC_SERVICE_HID_SEC_CTRL,
5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                               sec_lvl, HID_PSM_CONTROL, BTM_SEC_PROTO_HID, HID_SEC_CHN))
5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        HIDH_TRACE_ERROR0 ("Security Registration 1 failed");
5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (HID_ERR_NO_RESOURCES);
5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!BTM_SetSecurityLevel (TRUE, serv_name, BTM_SEC_SERVICE_HID_SEC_CTRL,
5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                               sec_lvl, HID_PSM_CONTROL, BTM_SEC_PROTO_HID, HID_SEC_CHN))
5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        HIDH_TRACE_ERROR0 ("Security Registration 2 failed");
5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (HID_ERR_NO_RESOURCES);
5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!BTM_SetSecurityLevel (FALSE, serv_name, BTM_SEC_SERVICE_HID_NOSEC_CTRL,
5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                               BTM_SEC_NONE, HID_PSM_CONTROL, BTM_SEC_PROTO_HID, HID_NOSEC_CHN))
5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        HIDH_TRACE_ERROR0 ("Security Registration 3 failed");
5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (HID_ERR_NO_RESOURCES);
5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!BTM_SetSecurityLevel (TRUE, serv_name, BTM_SEC_SERVICE_HID_NOSEC_CTRL,
5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                               BTM_SEC_NONE, HID_PSM_CONTROL, BTM_SEC_PROTO_HID, HID_NOSEC_CHN))
5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        HIDH_TRACE_ERROR0 ("Security Registration 4 failed");
5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (HID_ERR_NO_RESOURCES);
5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!BTM_SetSecurityLevel (TRUE, serv_name, BTM_SEC_SERVICE_HID_INTR,
5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                               BTM_SEC_NONE, HID_PSM_INTERRUPT, BTM_SEC_PROTO_HID, 0))
5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        HIDH_TRACE_ERROR0 ("Security Registration 5 failed");
5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (HID_ERR_NO_RESOURCES);
5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!BTM_SetSecurityLevel (FALSE, serv_name, BTM_SEC_SERVICE_HID_INTR,
5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                               BTM_SEC_NONE, HID_PSM_INTERRUPT, BTM_SEC_PROTO_HID, 0))
5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        HIDH_TRACE_ERROR0 ("Security Registration 6 failed");
5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (HID_ERR_NO_RESOURCES);
5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return( HID_SUCCESS );
5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
547