bta_hh_le.c revision dbba0e652e0ce23dd691df3c03979ec6e32c8db3
1dbba0e652e0ce23dd691df3c03979ec6e32c8db3Matthew Xie/****************************************************************************** 2dbba0e652e0ce23dd691df3c03979ec6e32c8db3Matthew Xie * 3dbba0e652e0ce23dd691df3c03979ec6e32c8db3Matthew Xie * Copyright (C) 2009-2013 Broadcom Corporation 4dbba0e652e0ce23dd691df3c03979ec6e32c8db3Matthew Xie * 5dbba0e652e0ce23dd691df3c03979ec6e32c8db3Matthew Xie * Licensed under the Apache License, Version 2.0 (the "License"); 6dbba0e652e0ce23dd691df3c03979ec6e32c8db3Matthew Xie * you may not use this file except in compliance with the License. 7dbba0e652e0ce23dd691df3c03979ec6e32c8db3Matthew Xie * You may obtain a copy of the License at: 8dbba0e652e0ce23dd691df3c03979ec6e32c8db3Matthew Xie * 9dbba0e652e0ce23dd691df3c03979ec6e32c8db3Matthew Xie * http://www.apache.org/licenses/LICENSE-2.0 10dbba0e652e0ce23dd691df3c03979ec6e32c8db3Matthew Xie * 11dbba0e652e0ce23dd691df3c03979ec6e32c8db3Matthew Xie * Unless required by applicable law or agreed to in writing, software 12dbba0e652e0ce23dd691df3c03979ec6e32c8db3Matthew Xie * distributed under the License is distributed on an "AS IS" BASIS, 13dbba0e652e0ce23dd691df3c03979ec6e32c8db3Matthew Xie * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14dbba0e652e0ce23dd691df3c03979ec6e32c8db3Matthew Xie * See the License for the specific language governing permissions and 15dbba0e652e0ce23dd691df3c03979ec6e32c8db3Matthew Xie * limitations under the License. 16dbba0e652e0ce23dd691df3c03979ec6e32c8db3Matthew Xie * 17dbba0e652e0ce23dd691df3c03979ec6e32c8db3Matthew Xie ******************************************************************************/ 182e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 192e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#include "bta_api.h" 202e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#include "bta_hh_int.h" 212e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 222e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if (defined BTA_HH_LE_INCLUDED && BTA_HH_LE_INCLUDED == TRUE) 232e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 242e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#include "bta_api.h" 252e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#include <string.h> 262e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#include "btm_api.h" 272e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#include "btm_ble_api.h" 282e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#include "bta_hh_co.h" 292e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#include "bta_gatt_api.h" 302e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#include "srvc_api.h" 312e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 322e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#ifndef BTA_HH_LE_RECONN 332e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#define BTA_HH_LE_RECONN TRUE 342e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif 352e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 362e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#define BTA_HH_APP_ID_LE 0xff 372e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 382e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#define BTA_HH_LE_RPT_TYPE_VALID(x) ((x) <= BTA_LE_HID_RPT_FEATURE && (x)>=BTA_LE_HID_RPT_INPUT) 392e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 402e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#define BTA_HH_LE_RPT_INST_ID_MAP(s,c) (UINT8)(((s)<<4)||(c)) 412e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#define BTA_HH_LE_RPT_GET_SRVC_INST_ID(x) (UINT8)(x >> 4) 422e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#define BTA_HH_LE_RPT_GET_RPT_INST_ID(x) (UINT8)(x & 0x0f) 432e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 442e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 452e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#define BTA_HH_LE_PROTO_BOOT_MODE 0x00 462e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#define BTA_HH_LE_PROTO_REPORT_MODE 0x01 472e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 482e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#define BTA_HH_SCPP_INST_DEF 0 492e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 502e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#define BTA_HH_LE_DISC_CHAR_NUM 8 512e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachstatic const UINT16 bta_hh_le_disc_char_uuid[BTA_HH_LE_DISC_CHAR_NUM] = 522e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{ 532e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach GATT_UUID_HID_INFORMATION, 542e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach GATT_UUID_HID_REPORT_MAP, 552e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach GATT_UUID_HID_CONTROL_POINT, 562e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach GATT_UUID_HID_REPORT, 572e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach GATT_UUID_HID_BT_KB_INPUT, 582e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach GATT_UUID_HID_BT_KB_OUTPUT, 592e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach GATT_UUID_HID_BT_MOUSE_INPUT, 602e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach GATT_UUID_HID_PROTO_MODE /* always make sure this is the last attribute to discover */ 612e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}; 622e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 632e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#define BTA_LE_HID_RTP_UUID_MAX 5 642e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachstatic const UINT16 bta_hh_uuid_to_rtp_type[BTA_LE_HID_RTP_UUID_MAX][2] = 652e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{ 662e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach {GATT_UUID_HID_REPORT, BTA_HH_RPTT_INPUT}, 672e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach {GATT_UUID_HID_BT_KB_INPUT, BTA_HH_RPTT_INPUT}, 682e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach {GATT_UUID_HID_BT_KB_OUTPUT, BTA_HH_RPTT_OUTPUT}, 692e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach {GATT_UUID_HID_BT_MOUSE_INPUT, BTA_HH_RPTT_INPUT}, 702e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach {GATT_UUID_BATTERY_LEVEL, BTA_HH_RPTT_INPUT} 712e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}; 722e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 732e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 742e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachstatic void bta_hh_gattc_callback(tBTA_GATTC_EVT event, tBTA_GATTC *p_data); 752e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachstatic void bta_hh_le_search_hid_chars(tBTA_HH_DEV_CB *p_dev_cb); 762e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachstatic void bta_hh_le_search_hid_included(tBTA_HH_DEV_CB *p_dev_cb); 772e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachstatic void bta_hh_le_search_scps(tBTA_HH_DEV_CB *p_cb); 782e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachstatic void bta_hh_le_search_scps_chars(tBTA_HH_DEV_CB *p_cb); 792e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachstatic void bta_hh_le_register_scpp_notif(tBTA_HH_DEV_CB *p_dev_cb, tBTA_GATT_STATUS status); 802e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachstatic void bta_hh_le_register_scpp_notif_cmpl(tBTA_HH_DEV_CB *p_dev_cb, tBTA_GATT_STATUS status); 812e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachstatic void bta_hh_le_add_dev_bg_conn(tBTA_HH_DEV_CB *p_cb, BOOLEAN check_bond); 822e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 832e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#define BTA_HH_LE_SRVC_DEF 0 842e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 852e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if BTA_HH_DEBUG == TRUE 862e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachstatic const char *bta_hh_le_rpt_name[4] = 872e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{ 882e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach "UNKNOWN", 892e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach "INPUT", 902e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach "OUTPUT", 912e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach "FEATURE" 922e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}; 932e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 942e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/******************************************************************************* 952e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 962e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function bta_hh_le_hid_report_dbg 972e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 982e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description debug function to print out all HID report available on remote 992e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** device. 1002e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 1012e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Returns void 1022e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 1032e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/ 1042e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachstatic void bta_hh_le_hid_report_dbg(tBTA_HH_DEV_CB *p_cb) 1052e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{ 1062e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach UINT8 i , j; 1072e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBTA_HH_LE_RPT *p_rpt; 1082e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach char * rpt_name; 1092e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 1102e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach APPL_TRACE_DEBUG0("HID Report DB"); 1112e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach for (i = 0; i < BTA_HH_LE_HID_SRVC_MAX; i ++) 1122e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 1132e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_cb->hid_srvc[i].in_use) 1142e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 1152e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_rpt = &p_cb->hid_srvc[i].report[0]; 1162e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 1172e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach APPL_TRACE_DEBUG1("\t HID serivce inst: %d", i); 1182e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 1192e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach for (j = 0; j < BTA_HH_LE_RPT_MAX; j ++, p_rpt++) 1202e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 1212e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach rpt_name = "Unknown"; 1222e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_rpt->in_use) 1232e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 1242e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_rpt->uuid == GATT_UUID_HID_REPORT) 1252e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach rpt_name = "Report"; 1262e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_rpt->uuid == GATT_UUID_HID_BT_KB_INPUT) 1272e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach rpt_name = "Boot KB Input"; 1282e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_rpt->uuid == GATT_UUID_HID_BT_KB_OUTPUT) 1292e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach rpt_name = "Boot KB Output"; 1302e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_rpt->uuid == GATT_UUID_HID_BT_MOUSE_INPUT) 1312e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach rpt_name = "Boot MI Input"; 1322e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 1332e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 1342e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach APPL_TRACE_DEBUG6("\t\t [%s- 0x%04x] [Type: %s], [ReportID: %d] [inst_id: %d] [Clt_cfg: %d]", 1352e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach rpt_name, 1362e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_rpt->uuid , 1372e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach ((p_rpt->rpt_type < 4) ? bta_hh_le_rpt_name[p_rpt->rpt_type] : "UNKNOWN"), 1382e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_rpt->rpt_id, 1392e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_rpt->inst_id, 1402e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_rpt->client_cfg_value); 1412e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 1422e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach else 1432e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach break; 1442e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 1452e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 1462e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach else 1472e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach break; 1482e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 1492e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach} 1502e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/******************************************************************************* 1512e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 1522e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function bta_hh_uuid_to_str 1532e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 1542e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description 1552e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 1562e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Returns void 1572e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 1582e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/ 1592e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachstatic char *bta_hh_uuid_to_str(UINT16 uuid) 1602e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{ 1612e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach switch(uuid) 1622e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 1632e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach case GATT_UUID_HID_INFORMATION: 1642e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach return "GATT_UUID_HID_INFORMATION"; 1652e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach case GATT_UUID_HID_REPORT_MAP: 1662e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach return "GATT_UUID_HID_REPORT_MAP"; 1672e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach case GATT_UUID_HID_CONTROL_POINT: 1682e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach return "GATT_UUID_HID_CONTROL_POINT"; 1692e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach case GATT_UUID_HID_REPORT: 1702e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach return "GATT_UUID_HID_REPORT"; 1712e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach case GATT_UUID_HID_PROTO_MODE: 1722e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach return "GATT_UUID_HID_PROTO_MODE"; 1732e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach case GATT_UUID_HID_BT_KB_INPUT: 1742e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach return "GATT_UUID_HID_BT_KB_INPUT"; 1752e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach case GATT_UUID_HID_BT_KB_OUTPUT: 1762e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach return "GATT_UUID_HID_BT_KB_OUTPUT"; 1772e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach case GATT_UUID_HID_BT_MOUSE_INPUT: 1782e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach return "GATT_UUID_HID_BT_MOUSE_INPUT"; 1792e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach case GATT_UUID_CHAR_CLIENT_CONFIG: 1802e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach return "GATT_UUID_CHAR_CLIENT_CONFIG"; 1812e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach case GATT_UUID_EXT_RPT_REF_DESCR: 1822e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach return "GATT_UUID_EXT_RPT_REF_DESCR"; 1832e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach case GATT_UUID_RPT_REF_DESCR: 1842e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach return "GATT_UUID_RPT_REF_DESCR"; 1852e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach default: 1862e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach return "Unknown UUID"; 1872e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 1882e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach} 1892e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif 1902e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/******************************************************************************* 1912e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 1922e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function bta_hh_le_enable 1932e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 1942e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description initialize LE HID related functionality 1952e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 1962e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 1972e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Returns void 1982e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 1992e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/ 2002e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_le_enable(void) 2012e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{ 2022e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach char app_name[LEN_UUID_128 + 1]; 2032e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBT_UUID app_uuid = {LEN_UUID_128,{0}}; 2042e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach UINT8 xx; 2052e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 2062e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_cb.gatt_if = BTA_GATTS_INVALID_IF; 2072e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 2082e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach for (xx = 0; xx < BTA_HH_MAX_DEVICE; xx ++) 2092e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_cb.le_cb_index[xx] = BTA_HH_IDX_INVALID; 2102e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 2112e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach memset (app_name, 0, LEN_UUID_128 + 1); 2122e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach strncpy(app_name, "BTA HH OVER LE", LEN_UUID_128); 2132e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 2142e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach memcpy((void *)app_uuid.uu.uuid128, (void *)app_name, LEN_UUID_128); 2152e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 2162e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach BTA_GATTC_AppRegister(&app_uuid, bta_hh_gattc_callback); 2172e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 2182e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach return; 2192e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach} 2202e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/******************************************************************************* 2212e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 2222e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function bta_hh_le_register_cmpl 2232e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 2242e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description BTA HH register with BTA GATTC completed 2252e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 2262e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Parameters: 2272e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 2282e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/ 2292e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_le_register_cmpl(tBTA_GATTC_REG *p_reg) 2302e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{ 2312e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBTA_HH_STATUS status = BTA_HH_ERR; 2322e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 2332e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_reg->status == BTA_GATT_OK) 2342e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 2352e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_cb.gatt_if = p_reg->client_if; 2362e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach status = BTA_HH_OK; 2372e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 2382e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach else 2392e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_cb.gatt_if = BTA_GATTS_INVALID_IF; 2402e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 2412e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* signal BTA call back event */ 2422e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach (* bta_hh_cb.p_cback)(BTA_HH_ENABLE_EVT, (tBTA_HH *)&status); 2432e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach} 2442e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 2452e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/******************************************************************************* 2462e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 24736b686527892172cb44091d160b7d2806d49fc76Zhihai Xu** Function bta_hh_le_is_hh_gatt_if 24836b686527892172cb44091d160b7d2806d49fc76Zhihai Xu** 24936b686527892172cb44091d160b7d2806d49fc76Zhihai Xu** Description Check to see if client_if is BTA HH LE GATT interface 25036b686527892172cb44091d160b7d2806d49fc76Zhihai Xu** 25136b686527892172cb44091d160b7d2806d49fc76Zhihai Xu** 25236b686527892172cb44091d160b7d2806d49fc76Zhihai Xu** Returns whether it is HH GATT IF 25336b686527892172cb44091d160b7d2806d49fc76Zhihai Xu** 25436b686527892172cb44091d160b7d2806d49fc76Zhihai Xu*******************************************************************************/ 25536b686527892172cb44091d160b7d2806d49fc76Zhihai XuBOOLEAN bta_hh_le_is_hh_gatt_if(tBTA_GATTC_IF client_if) 25636b686527892172cb44091d160b7d2806d49fc76Zhihai Xu{ 25736b686527892172cb44091d160b7d2806d49fc76Zhihai Xu return (bta_hh_cb.gatt_if == client_if); 25836b686527892172cb44091d160b7d2806d49fc76Zhihai Xu} 25936b686527892172cb44091d160b7d2806d49fc76Zhihai Xu 26036b686527892172cb44091d160b7d2806d49fc76Zhihai Xu/******************************************************************************* 26136b686527892172cb44091d160b7d2806d49fc76Zhihai Xu** 2622e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function bta_hh_le_deregister 2632e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 2642e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description De-register BTA HH from BTA GATTC 2652e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 2662e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 2672e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Returns void 2682e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 2692e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/ 2702e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_le_deregister(void) 2712e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{ 2722e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach BTA_GATTC_AppDeregister(bta_hh_cb.gatt_if); 2732e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach} 2742e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 2752e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/******************************************************************************* 2762e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 2772e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function bta_hh_is_le_device 2782e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 2792e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description Check to see if the remote device is a LE only device 2802e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 2812e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Parameters: 2822e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 2832e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/ 2842e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre EisenbachBOOLEAN bta_hh_is_le_device(tBTA_HH_DEV_CB *p_cb, BD_ADDR remote_bda) 2852e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{ 2862e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_cb->is_le_device = BTM_UseLeLink (remote_bda); 2872e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 2882e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach return p_cb->is_le_device; 2892e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach} 2902e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/******************************************************************************* 2912e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 2922e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function bta_hh_le_hid_srvc_cached 2932e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 2942e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description Check to see if LE HID service has been discovered and cached 2952e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 2962e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Parameters: TRUE : has cache; FALSE: none. 2972e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 2982e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/ 2992e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre EisenbachBOOLEAN bta_hh_le_hid_srvc_cached(tBTA_HH_DEV_CB *p_dev_cb) 3002e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{ 3012e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_dev_cb->hid_srvc[BTA_HH_LE_SRVC_DEF].in_use) 3022e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach return TRUE; 3032e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach else 3042e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach return FALSE; 3052e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach} 3062e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/******************************************************************************* 3072e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 3082e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function bta_hh_le_add_hid_srvc_entry 3092e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 3102e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description Add a HID service entry in the HID device control block 3112e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 3122e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Parameters: 3132e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 3142e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/ 3152e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre EisenbachBOOLEAN bta_hh_le_add_hid_srvc_entry(tBTA_HH_DEV_CB *p_dev_cb, UINT8 idx) 3162e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{ 3172e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach BOOLEAN added = FALSE; 3182e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 3192e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (idx < BTA_HH_LE_HID_SRVC_MAX) 3202e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 3212e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_dev_cb->hid_srvc[idx].in_use = TRUE; 3222e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach added = TRUE; 3232e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 3242e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach else 3252e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 3262e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach APPL_TRACE_ERROR0("DB full,max HID service entry!"); 3272e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 3282e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach return added; 3292e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 3302e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach} 3312e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/******************************************************************************* 3322e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 3332e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function bta_hh_le_open_conn 3342e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 3352e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description open a GATT connection first. 3362e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 3372e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Parameters: 3382e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 3392e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/ 3402e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_le_open_conn(tBTA_HH_DEV_CB *p_cb, BD_ADDR remote_bda) 3412e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{ 3422e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* update cb_index[] map */ 3432e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_cb->hid_handle = BTA_HH_GET_LE_DEV_HDL(p_cb->index); 3442e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach memcpy(p_cb->addr, remote_bda, BD_ADDR_LEN); 3452e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_cb.le_cb_index[BTA_HH_GET_LE_CB_IDX(p_cb->hid_handle)] = p_cb->index; 3462e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_cb->in_use = TRUE; 3472e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 3482e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach BTA_GATTC_Open(bta_hh_cb.gatt_if, remote_bda, TRUE); 3492e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach} 3502e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/******************************************************************************* 3512e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 3522e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function bta_hh_le_fill_16bits_gatt_id 3532e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 3542e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description Utility function to fill a GATT ID strucure 3552e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 3562e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/ 3572e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_le_fill_16bits_gatt_id(UINT8 inst_id, UINT16 uuid, tBTA_GATT_ID *p_output) 3582e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{ 3592e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_output->inst_id = inst_id; 3602e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_output->uuid.len = LEN_UUID_16; 3612e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_output->uuid.uu.uuid16 = uuid; 3622e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach} 3632e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/******************************************************************************* 3642e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 3652e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function bta_hh_le_fill_16bits_srvc_id 3662e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 3672e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description Utility function to fill a service ID strucure with a 16 bits 3682e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** service UUID. 3692e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 3702e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/ 3712e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_le_fill_16bits_srvc_id(BOOLEAN is_pri, UINT8 inst_id, UINT16 srvc_uuid, 3722e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBTA_GATT_SRVC_ID *p_output) 3732e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{ 3742e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach memset((void *)p_output, 0, sizeof(tBTA_GATT_SRVC_ID)); 3752e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_output->is_primary = is_pri; 3762e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_fill_16bits_gatt_id(inst_id, srvc_uuid, &p_output->id); 3772e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 3782e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach} 3792e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/******************************************************************************* 3802e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 3812e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function bta_hh_le_fill_16bits_char_id 3822e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 3832e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description Utility function to fill a char ID strucure with a 16 bits 3842e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** char UUID. 3852e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 3862e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/ 3872e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_le_fill_16bits_char_id(UINT8 inst_id, UINT16 char_uuid, 3882e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBTA_GATT_ID *p_output) 3892e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{ 3902e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach memset((void *)p_output, 0, sizeof(tBTA_GATT_ID)); 3912e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_fill_16bits_gatt_id(inst_id, char_uuid, p_output); 3922e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach} 3932e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/******************************************************************************* 3942e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 3952e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function bta_hh_le_find_dev_cb_by_conn_id 3962e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 3972e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description Utility function find a device control block by connection ID. 3982e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 3992e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/ 4002e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre EisenbachtBTA_HH_DEV_CB * bta_hh_le_find_dev_cb_by_conn_id(UINT16 conn_id) 4012e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{ 4022e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach UINT8 i; 4032e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBTA_HH_DEV_CB *p_dev_cb = &bta_hh_cb.kdev[0]; 4042e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 4052e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach for (i = 0; i < BTA_HH_MAX_DEVICE; i ++, p_dev_cb ++) 4062e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 4072e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_dev_cb->in_use && p_dev_cb->conn_id == conn_id) 4082e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach return p_dev_cb; 4092e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 4102e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach return NULL; 4112e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach} 4122e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/******************************************************************************* 4132e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 4142e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function bta_hh_le_find_dev_cb_by_bda 4152e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 4162e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description Utility function find a device control block by BD address. 4172e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 4182e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/ 4192e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre EisenbachtBTA_HH_DEV_CB * bta_hh_le_find_dev_cb_by_bda(BD_ADDR bda) 4202e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{ 4212e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach UINT8 i; 4222e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBTA_HH_DEV_CB *p_dev_cb = &bta_hh_cb.kdev[0]; 4232e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 4242e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach for (i = 0; i < BTA_HH_MAX_DEVICE; i ++, p_dev_cb ++) 4252e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 4262e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_dev_cb->in_use && 4272e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach memcmp(p_dev_cb->addr, bda, BD_ADDR_LEN) == 0) 4282e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach return p_dev_cb; 4292e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 4302e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach return NULL; 4312e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach} 4322e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre EisenbachUINT8 bta_hh_le_find_service_inst_by_battery_inst_id(tBTA_HH_DEV_CB *p_cb, UINT8 ba_inst_id) 4332e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{ 4342e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach UINT8 i; 4352e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 4362e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach for (i = 0; i < BTA_HH_LE_HID_SRVC_MAX; i ++) 4372e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 4382e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_cb->hid_srvc[i].in_use && 4392e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_cb->hid_srvc[i].incl_srvc_inst == ba_inst_id) 4402e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 4412e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach return i; 4422e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 4432e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 4442e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach return BTA_HH_IDX_INVALID; 4452e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach} 4462e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/******************************************************************************* 4472e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 4482e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function bta_hh_le_find_report_entry 4492e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 4502e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description find the report entry by service instance and report UUID and 4512e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** instance ID 4522e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 4532e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/ 4542e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre EisenbachtBTA_HH_LE_RPT * bta_hh_le_find_report_entry(tBTA_HH_DEV_CB *p_cb, 4552e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach UINT8 srvc_inst_id, /* service instance ID */ 4562e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach UINT16 rpt_uuid, 4572e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach UINT8 char_inst_id) 4582e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{ 4592e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach UINT8 i; 4602e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach UINT8 hid_inst_id = srvc_inst_id; 4612e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBTA_HH_LE_RPT *p_rpt; 4622e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 4632e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (rpt_uuid == GATT_UUID_BATTERY_LEVEL) 4642e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 4652e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach hid_inst_id = bta_hh_le_find_service_inst_by_battery_inst_id(p_cb, srvc_inst_id); 4662e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 4672e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (hid_inst_id == BTA_HH_IDX_INVALID) 4682e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach return NULL; 4692e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 4702e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 4712e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_rpt = &p_cb->hid_srvc[hid_inst_id].report[0]; 4722e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 4732e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach for (i = 0; i < BTA_HH_LE_RPT_MAX; i ++, p_rpt ++) 4742e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 4752e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_rpt->uuid == rpt_uuid && 4762e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_rpt->inst_id == BTA_HH_LE_RPT_INST_ID_MAP(srvc_inst_id, char_inst_id)) 4772e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 4782e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 4792e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach return p_rpt; 4802e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 4812e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 4822e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach return NULL; 4832e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 4842e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach} 4852e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/******************************************************************************* 4862e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 4872e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function bta_hh_le_find_rpt_by_idtype 4882e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 4892e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description find a report entry by report ID and protocol mode 4902e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 4912e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Returns void 4922e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 4932e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/ 4942e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre EisenbachtBTA_HH_LE_RPT * bta_hh_le_find_rpt_by_idtype(tBTA_HH_LE_RPT*p_head, UINT8 mode, 4952e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBTA_HH_RPT_TYPE r_type, UINT8 rpt_id) 4962e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{ 4972e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBTA_HH_LE_RPT *p_rpt = p_head; 4982e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach UINT8 i; 4992e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 5002e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if BTA_HH_DEBUG == TRUE 5012e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach APPL_TRACE_DEBUG2("bta_hh_le_find_rpt_by_idtype: r_tpye: %d rpt_id: %d", r_type, rpt_id); 5022e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif 5032e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 5042e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach for (i = 0 ; i < BTA_HH_LE_RPT_MAX; i ++, p_rpt++) 5052e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 5062e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_rpt->in_use && p_rpt->rpt_id == rpt_id && r_type == p_rpt->rpt_type) 5072e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 5082e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* return battery report w/o condition */ 5092e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_rpt->uuid == GATT_UUID_BATTERY_LEVEL) 5102e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach return p_rpt; 5112e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 5122e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (mode == BTA_HH_PROTO_RPT_MODE && p_rpt->uuid == GATT_UUID_HID_REPORT) 5132e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach return p_rpt; 5142e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 5152e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if ( mode ==BTA_HH_PROTO_BOOT_MODE && 5162e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach (p_rpt->uuid >= GATT_UUID_HID_BT_KB_INPUT && p_rpt->uuid <= GATT_UUID_HID_BT_MOUSE_INPUT)) 5172e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach return p_rpt; 5182e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 5192e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 5202e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach return NULL; 5212e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach} 5222e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/******************************************************************************* 5232e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 5242e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function bta_hh_le_find_alloc_report_entry 5252e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 5262e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description find or allocate a report entry in the HID service report list. 5272e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 5282e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/ 5292e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre EisenbachtBTA_HH_LE_RPT * bta_hh_le_find_alloc_report_entry(tBTA_HH_DEV_CB *p_cb, 5302e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach UINT8 srvc_inst_id, 5312e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach UINT16 rpt_uuid, 5322e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach UINT8 inst_id, 5332e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach UINT8 prop) 5342e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{ 5352e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach UINT8 i, hid_inst_id = srvc_inst_id; 5362e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBTA_HH_LE_RPT *p_rpt; 5372e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 5382e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (rpt_uuid == GATT_UUID_BATTERY_LEVEL) 5392e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 5402e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach hid_inst_id = bta_hh_le_find_service_inst_by_battery_inst_id(p_cb, srvc_inst_id); 5412e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 5422e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (hid_inst_id == BTA_HH_IDX_INVALID) 5432e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach return NULL; 5442e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 5452e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_rpt = &p_cb->hid_srvc[hid_inst_id].report[0]; 5462e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 5472e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach for (i = 0; i < BTA_HH_LE_RPT_MAX; i ++, p_rpt ++) 5482e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 5492e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (!p_rpt->in_use || 5502e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach (p_rpt->uuid == rpt_uuid && 5512e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_rpt->inst_id == BTA_HH_LE_RPT_INST_ID_MAP(srvc_inst_id, inst_id))) 5522e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 5532e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (!p_rpt->in_use) 5542e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 5552e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_rpt->in_use = TRUE; 5562e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_rpt->index = i; 5572e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_rpt->inst_id = BTA_HH_LE_RPT_INST_ID_MAP(srvc_inst_id, inst_id); 5582e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_rpt->prop = prop; 5592e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_rpt->uuid = rpt_uuid; 5602e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 5612e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* assign report type */ 5622e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach for (i = 0; i < BTA_LE_HID_RTP_UUID_MAX; i ++) 5632e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 5642e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (bta_hh_uuid_to_rtp_type[i][0] == rpt_uuid) 5652e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 5662e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_rpt->rpt_type = (tBTA_HH_RPT_TYPE)bta_hh_uuid_to_rtp_type[i][1]; 5672e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 5682e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (rpt_uuid == GATT_UUID_HID_BT_KB_INPUT || rpt_uuid == GATT_UUID_HID_BT_KB_OUTPUT) 5692e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_rpt->rpt_id = BTA_HH_KEYBD_RPT_ID; 5702e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 5712e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (rpt_uuid == GATT_UUID_HID_BT_MOUSE_INPUT) 5722e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_rpt->rpt_id = BTA_HH_MOUSE_RPT_ID; 5732e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 5742e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach break; 5752e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 5762e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 5772e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 5782e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 5792e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach return p_rpt; 5802e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 5812e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 5822e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach return NULL; 5832e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach} 5842e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 5852e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/******************************************************************************* 5862e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 5872e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function bta_hh_le_read_char_dscrpt 5882e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 5892e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description read cahracteristic descriptor 5902e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 5912e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/ 5922e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre EisenbachtBTA_HH_STATUS bta_hh_le_read_char_dscrpt(tBTA_HH_DEV_CB *p_cb, UINT16 srvc_uuid, UINT8 srvc_inst_id, 5932e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach UINT16 char_uuid, UINT8 char_inst_id, UINT16 char_descp_uuid) 5942e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{ 5952e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBTA_GATTC_CHAR_ID char_id; 5962e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBT_UUID descr_uuid; 5972e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBTA_GATTC_CHAR_DESCR_ID descr_id; 5982e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBTA_HH_STATUS status = BTA_HH_ERR; 5992e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 6002e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_fill_16bits_srvc_id(TRUE, srvc_inst_id, srvc_uuid, &char_id.srvc_id); 6012e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_fill_16bits_char_id(char_inst_id, char_uuid, &char_id.char_id); 6022e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 6032e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach descr_uuid.len = LEN_UUID_16; 6042e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach descr_uuid.uu.uuid16 = char_descp_uuid; 6052e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 6062e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* find the report reference descriptor */ 6072e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (BTA_GATTC_GetFirstCharDescr(p_cb->conn_id, 6082e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach &char_id, 6092e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach &descr_uuid, 6102e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach &descr_id) == BTA_GATT_OK) 6112e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 6122e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach BTA_GATTC_ReadCharDescr(p_cb->conn_id, 6132e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach &descr_id, 6142e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach BTA_GATT_AUTH_REQ_NONE); 6152e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 6162e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach status = BTA_HH_OK; 6172e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 6182e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach else 6192e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 6202e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if BTA_HH_DEBUG == TRUE 6212e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach APPL_TRACE_ERROR2("bta_hh_le_read_char_dscrpt: No such descrpt exists: %s(0x%04x)", 6222e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_uuid_to_str(char_descp_uuid), char_descp_uuid); 6232e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif 6242e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 6252e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach return status; 6262e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach} 6272e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/******************************************************************************* 6282e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 6292e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function bta_hh_le_read_rpt_ref_descr 6302e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 6312e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description read report refernece descriptors in service discovery process 6322e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 6332e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/ 6342e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_le_read_rpt_ref_descr(tBTA_HH_DEV_CB *p_dev_cb, tBTA_HH_LE_RPT *p_rpt) 6352e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{ 6362e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach BOOLEAN started = FALSE; 6372e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach UINT16 srvc_uuid, char_uuid; 6382e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 6392e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach while (p_rpt != NULL) 6402e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 6412e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_rpt->rpt_type == BTA_HH_RPTT_INPUT) 6422e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 6432e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* is battery report */ 6442e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_rpt->uuid == GATT_UUID_BATTERY_LEVEL) 6452e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 6462e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if BTA_HH_DEBUG == TRUE 6472e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach APPL_TRACE_DEBUG0("read battery level report reference descriptor"); 6482e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif 6492e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach srvc_uuid = UUID_SERVCLASS_BATTERY; 6502e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach char_uuid = GATT_UUID_BATTERY_LEVEL; 6512e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 6522e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach else 6532e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 6542e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if BTA_HH_DEBUG == TRUE 6552e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach APPL_TRACE_DEBUG0("read HID report reference descriptor"); 6562e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif 6572e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach srvc_uuid = UUID_SERVCLASS_LE_HID; 6582e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach char_uuid = GATT_UUID_HID_REPORT; 6592e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 6602e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 6612e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (bta_hh_le_read_char_dscrpt(p_dev_cb, 6622e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach srvc_uuid, 6632e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach BTA_HH_LE_RPT_GET_SRVC_INST_ID(p_rpt->inst_id), 6642e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach char_uuid, 6652e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach BTA_HH_LE_RPT_GET_RPT_INST_ID(p_rpt->inst_id), 6662e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach GATT_UUID_RPT_REF_DESCR) 6672e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach == BTA_HH_OK) 6682e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 6692e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach started = TRUE; 6702e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach break; 6712e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 6722e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 6732e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach else 6742e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach break; 6752e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 6762e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_rpt->index == BTA_HH_LE_RPT_MAX - 1) 6772e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach break; 6782e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 6792e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_rpt ++; 6802e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 6812e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 6822e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 6832e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* if no report reference descriptor */ 6842e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (!started) 6852e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 6862e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* explore next char */ 6872e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_search_hid_chars(p_dev_cb); 6882e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 6892e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach} 6902e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/******************************************************************************* 6912e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 6922e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function bta_hh_le_save_rpt_ref 6932e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 6942e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description save report reference information and move to next one. 6952e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 6962e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Parameters: 6972e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 6982e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/ 6992e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_le_save_rpt_ref(tBTA_HH_DEV_CB *p_dev_cb, tBTA_HH_LE_RPT *p_rpt, 7002e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBTA_GATTC_READ *p_data) 7012e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{ 7022e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach UINT8 *pp; 7032e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 7042e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* if the length of the descriptor value is right, parse it */ 7052e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_data->status == BTA_GATT_OK && 7062e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_data->p_value && p_data->p_value->unformat.len == 2) 7072e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 7082e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach pp = p_data->p_value->unformat.p_value; 7092e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 7102e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach STREAM_TO_UINT8(p_rpt->rpt_id, pp); 7112e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach STREAM_TO_UINT8(p_rpt->rpt_type, pp); 7122e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 7132e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_rpt->rpt_type > BTA_HH_RPTT_FEATURE) /* invalid report type */ 7142e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_rpt->rpt_type = BTA_HH_RPTT_RESRV; 7152e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 7162e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if BTA_HH_DEBUG == TRUE 7172e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach APPL_TRACE_DEBUG1("report ID: %d", p_rpt->rpt_id); 7182e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif 7192e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 7202e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 7212e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_rpt->index < BTA_HH_LE_RPT_MAX) 7222e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_rpt ++; 7232e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 7242e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* read next report reference descriptor */ 7252e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_read_rpt_ref_descr(p_dev_cb, p_rpt); 7262e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 7272e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach} 7282e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/******************************************************************************* 7292e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 7302e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function bta_hh_le_save_rpt_ref 7312e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 7322e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description save report reference information and move to next one. 7332e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 7342e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Parameters: 7352e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 7362e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/ 7372e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_le_save_ext_rpt_ref(tBTA_HH_DEV_CB *p_dev_cb, 7382e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBTA_GATTC_READ *p_data) 7392e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{ 7402e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach UINT8 *pp; 7412e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 7422e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* if the length of the descriptor value is right, parse it 7432e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach assume it's a 16 bits UUID */ 7442e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_data->status == BTA_GATT_OK && 7452e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_data->p_value && p_data->p_value->unformat.len == 2) 7462e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 7472e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach pp = p_data->p_value->unformat.p_value; 7482e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach STREAM_TO_UINT16(p_dev_cb->hid_srvc[p_dev_cb->cur_srvc_index].ext_rpt_ref, pp); 7492e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 7502e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if BTA_HH_DEBUG == TRUE 7512e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach APPL_TRACE_DEBUG1("External Report Reference UUID 0x%04x", 7522e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_dev_cb->hid_srvc[p_dev_cb->cur_srvc_index].ext_rpt_ref); 7532e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif 7542e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 7552e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_search_hid_chars(p_dev_cb); 7562e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 7572e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach} 7582e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/******************************************************************************* 7592e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 7602e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function bta_hh_le_register_input_notif 7612e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 7622e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description Register for all notifications for the report applicable 7632e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** for the protocol mode. 7642e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 7652e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Parameters: 7662e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 7672e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/ 7682e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_le_register_input_notif(tBTA_HH_DEV_CB *p_dev_cb, UINT8 srvc_inst, 7692e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach UINT8 proto_mode, BOOLEAN register_ba) 7702e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{ 7712e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBTA_HH_LE_RPT *p_rpt = &p_dev_cb->hid_srvc[srvc_inst].report[0]; 7722e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBTA_GATTC_CHAR_ID char_id; 7732e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach UINT8 i; 7742e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach UINT16 srvc_uuid; 7752e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 7762e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if BTA_HH_DEBUG == TRUE 7772e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach APPL_TRACE_DEBUG1("bta_hh_le_register_input_notif mode: %d", proto_mode); 7782e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif 7792e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 7802e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach for (i = 0; i < BTA_HH_LE_RPT_MAX; i ++, p_rpt ++) 7812e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 7822e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_rpt->rpt_type == BTA_HH_RPTT_INPUT) 7832e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 7842e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_rpt->uuid == GATT_UUID_BATTERY_LEVEL) 7852e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach srvc_uuid = UUID_SERVCLASS_BATTERY; 7862e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach else 7872e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach srvc_uuid = UUID_SERVCLASS_LE_HID; 7882e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 7892e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_fill_16bits_srvc_id(TRUE, BTA_HH_LE_RPT_GET_SRVC_INST_ID(p_rpt->inst_id), srvc_uuid, &char_id.srvc_id); 7902e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_fill_16bits_char_id(BTA_HH_LE_RPT_GET_RPT_INST_ID(p_rpt->inst_id), p_rpt->uuid, &char_id.char_id); 7912e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 7922e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (register_ba && p_rpt->uuid == GATT_UUID_BATTERY_LEVEL) 7932e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 7942e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach BTA_GATTC_RegisterForNotifications(bta_hh_cb.gatt_if, 7952e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_dev_cb->addr, 7962e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach &char_id); 7972e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 7982e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* boot mode, deregister report input notification */ 7992e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach else if (proto_mode == BTA_HH_PROTO_BOOT_MODE) 8002e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 8012e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_rpt->uuid == GATT_UUID_HID_REPORT && 8022e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_rpt->client_cfg_value == BTA_GATT_CLT_CONFIG_NOTIFICATION) 8032e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 8042e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach APPL_TRACE_DEBUG1("---> Deregister Report ID: %d", p_rpt->rpt_id); 8052e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach BTA_GATTC_DeregisterForNotifications(bta_hh_cb.gatt_if, 8062e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_dev_cb->addr, 8072e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach &char_id); 8082e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 8092e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* register boot reports notification */ 8102e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach else if (p_rpt->uuid == GATT_UUID_HID_BT_KB_INPUT || 8112e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_rpt->uuid == GATT_UUID_HID_BT_MOUSE_INPUT) 8122e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 8132e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach APPL_TRACE_DEBUG1("<--- Register Boot Report ID: %d", p_rpt->rpt_id); 8142e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach BTA_GATTC_RegisterForNotifications(bta_hh_cb.gatt_if, 8152e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_dev_cb->addr, 8162e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach &char_id); 8172e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 8182e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 8192e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach else if (proto_mode == BTA_HH_PROTO_RPT_MODE) 8202e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 8212e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if ((p_rpt->uuid == GATT_UUID_HID_BT_KB_INPUT || 8222e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_rpt->uuid == GATT_UUID_HID_BT_MOUSE_INPUT) && 8232e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_rpt->client_cfg_value == BTA_GATT_CLT_CONFIG_NOTIFICATION) 8242e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 8252e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 8262e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach APPL_TRACE_DEBUG1("---> Deregister Boot Report ID: %d", p_rpt->rpt_id); 8272e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach BTA_GATTC_DeregisterForNotifications(bta_hh_cb.gatt_if, 8282e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_dev_cb->addr, 8292e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach &char_id); 8302e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 8312e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach else if (p_rpt->uuid == GATT_UUID_HID_REPORT && 8322e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_rpt->client_cfg_value == BTA_GATT_CLT_CONFIG_NOTIFICATION) 8332e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 8342e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach APPL_TRACE_DEBUG1("<--- Register Report ID: %d", p_rpt->rpt_id); 8352e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach BTA_GATTC_RegisterForNotifications(bta_hh_cb.gatt_if, 8362e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_dev_cb->addr, 8372e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach &char_id); 8382e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 8392e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 8402e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* 8412e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach else unknow protocol mode */ 8422e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 8432e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 8442e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach} 8452e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 8462e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/******************************************************************************* 8472e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 8482e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function bta_hh_le_open_cmpl 8492e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 8502e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description HID over GATT connection sucessfully opened 8512e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 8522e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/ 8532e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_le_open_cmpl(tBTA_HH_DEV_CB *p_cb) 8542e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{ 8552e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if ( p_cb->disc_active == BTA_HH_LE_DISC_NONE) 8562e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 8572e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if BTA_HH_DEBUG 8582e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_hid_report_dbg(p_cb); 8592e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif 8602e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_register_input_notif(p_cb, 0, p_cb->mode, TRUE); 8612e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_sm_execute(p_cb, BTA_HH_OPEN_CMPL_EVT, NULL); 8622e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if (BTA_HH_LE_RECONN == TRUE) 8632e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_cb->status == BTA_HH_OK) 8642e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 8652e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_add_dev_bg_conn(p_cb, TRUE); 8662e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 8672e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif 8682e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 8692e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach} 8702e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/******************************************************************************* 8712e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 8722e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function bta_hh_le_write_char_clt_cfg 8732e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 8742e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description Utility function to find and write client configuration of 8752e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** a characteristic 8762e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 8772e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/ 8782e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre EisenbachBOOLEAN bta_hh_le_write_char_clt_cfg(tBTA_HH_DEV_CB *p_cb, 8792e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach UINT8 srvc_inst_id, UINT16 srvc_uuid16, 8802e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach UINT8 char_inst_id, UINT16 char_uuid16, 8812e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach UINT16 clt_cfg_value) 8822e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{ 8832e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBTA_GATTC_CHAR_ID char_id; 8842e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBT_UUID descr_cond; 8852e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBTA_GATTC_CHAR_DESCR_ID descr_id; 8862e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBTA_GATT_UNFMT value; 8872e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach UINT8 buf[2], *pp = buf; 8882e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 8892e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_fill_16bits_srvc_id(TRUE, srvc_inst_id, srvc_uuid16, &char_id.srvc_id); 8902e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_fill_16bits_char_id(char_inst_id, char_uuid16, &char_id.char_id); 8912e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 8922e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach descr_cond.len = LEN_UUID_16; 8932e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach descr_cond.uu.uuid16 = GATT_UUID_CHAR_CLIENT_CONFIG; 8942e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 8952e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach value.len = 2; 8962e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach value.p_value = buf; 8972e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 8982e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach UINT16_TO_STREAM(pp, clt_cfg_value); 8992e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 9002e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (BTA_GATTC_GetFirstCharDescr(p_cb->conn_id, 9012e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach &char_id, 9022e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach &descr_cond, 9032e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach &descr_id) == BTA_GATT_OK) 9042e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 9052e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach BTA_GATTC_WriteCharDescr(p_cb->conn_id, 9062e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach &descr_id, 9072e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach BTA_GATTC_TYPE_WRITE_NO_RSP, 9082e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach &value, 9092e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach BTA_GATT_AUTH_REQ_NONE); 9102e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 9112e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach return TRUE; 9122e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 9132e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach return FALSE; 9142e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach} 9152e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/******************************************************************************* 9162e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 9172e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function bta_hh_le_write_rpt_clt_cfg 9182e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 9192e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description write client configuration. This is only for input report 9202e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** enable all input notification upon connection open. 9212e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 9222e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/ 9232e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre EisenbachBOOLEAN bta_hh_le_write_rpt_clt_cfg(tBTA_HH_DEV_CB *p_cb, UINT8 srvc_inst_id) 9242e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{ 9252e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach UINT8 i; 9262e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBTA_HH_LE_RPT *p_rpt = &p_cb->hid_srvc[srvc_inst_id].report[p_cb->clt_cfg_idx]; 9272e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach UINT16 srvc_uuid; 9282e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 9292e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach for (i = p_cb->clt_cfg_idx; i < BTA_HH_LE_RPT_MAX && p_rpt->in_use; i ++, p_rpt ++) 9302e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 9312e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* enable notification for all input report, regardless mode */ 9322e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_rpt->rpt_type == BTA_HH_RPTT_INPUT) 9332e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 9342e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 9352e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_rpt->uuid == GATT_UUID_BATTERY_LEVEL) 9362e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach srvc_uuid = UUID_SERVCLASS_BATTERY; 9372e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach else 9382e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach srvc_uuid = UUID_SERVCLASS_LE_HID; 9392e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 9402e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (bta_hh_le_write_char_clt_cfg(p_cb, 9412e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach BTA_HH_LE_RPT_GET_SRVC_INST_ID(p_rpt->inst_id), 9422e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach srvc_uuid, 9432e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach BTA_HH_LE_RPT_GET_RPT_INST_ID(p_rpt->inst_id), 9442e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_rpt->uuid, 9452e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach BTA_GATT_CLT_CONFIG_NOTIFICATION)) 9462e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 9472e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_cb->clt_cfg_idx = i; 9482e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach return TRUE; 9492e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 9502e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 9512e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 9522e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 9532e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_cb->clt_cfg_idx = 0; 9542e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 9552e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* client configuration is completed, send open callback */ 9562e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_cb->state == BTA_HH_W4_CONN_ST) 9572e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 9582e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_cb->disc_active &= ~BTA_HH_LE_DISC_HIDS; 9592e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 9602e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* discover scan parameter profile is act as report host */ 9612e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_search_scps(p_cb); 9622e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 9632e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach return FALSE; 9642e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach} 9652e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 9662e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/******************************************************************************* 9672e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 9682e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function bta_hh_le_set_protocol_mode 9692e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 9702e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description Set remote device protocol mode. 9712e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 9722e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/ 9732e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre EisenbachBOOLEAN bta_hh_le_set_protocol_mode(tBTA_HH_DEV_CB *p_cb, tBTA_HH_PROTO_MODE mode) 9742e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{ 9752e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBTA_GATTC_CHAR_ID char_id; 9762e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBTA_HH_CBDATA cback_data ; 9772e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach BOOLEAN exec = TRUE; 9782e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 9792e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach APPL_TRACE_DEBUG1("bta_hh_le_set_protocol_mode attempt mode: %s", 9802e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach (mode == BTA_HH_PROTO_RPT_MODE)? "Report": "Boot"); 9812e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 9822e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach cback_data.handle = p_cb->hid_handle; 9832e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* boot mode is not supported in the remote device */ 9842e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if ((p_cb->hid_srvc[BTA_HH_LE_SRVC_DEF].option_char & BTA_HH_LE_PROTO_MODE_BIT) == 0) 9852e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 9862e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach exec = FALSE; 9872e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_cb->mode = BTA_HH_PROTO_RPT_MODE; 9882e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 9892e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (mode == BTA_HH_PROTO_BOOT_MODE) 9902e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 9912e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach APPL_TRACE_ERROR0("Set Boot Mode failed!! No PROTO_MODE Char!"); 9922e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach cback_data.status = BTA_HH_ERR; 9932e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 9942e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach else 9952e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 9962e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* if set to report mode, need to de-register all input report notification */ 9972e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_register_input_notif(p_cb, 0, p_cb->mode, FALSE); 9982e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach cback_data.status = BTA_HH_OK; 9992e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 10002e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_cb->state == BTA_HH_W4_CONN_ST) 10012e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 10022e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_cb->status = (cback_data.status == BTA_HH_OK)? BTA_HH_OK: BTA_HH_ERR_PROTO; 10032e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 10042e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach else 10052e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach (* bta_hh_cb.p_cback)(BTA_HH_SET_PROTO_EVT, (tBTA_HH *)&cback_data); 10062e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 10072e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach else 10082e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 10092e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_fill_16bits_srvc_id(TRUE, 0, UUID_SERVCLASS_LE_HID, &char_id.srvc_id); 10102e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_fill_16bits_char_id(0, GATT_UUID_HID_PROTO_MODE, &char_id.char_id); 10112e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 10122e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_cb->mode = mode; 10132e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach mode = (mode == BTA_HH_PROTO_BOOT_MODE)? BTA_HH_LE_PROTO_BOOT_MODE : BTA_HH_LE_PROTO_REPORT_MODE; 10142e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 10152e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach BTA_GATTC_WriteCharValue(p_cb->conn_id, 10162e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach &char_id, 10172e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach BTA_GATTC_TYPE_WRITE_NO_RSP, 10182e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 1, 10192e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach &mode, 10202e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach BTA_GATT_AUTH_REQ_NONE); 10212e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 10222e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach return exec; 10232e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach} 10242e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 10252e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/******************************************************************************* 10262e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 10272e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function bta_hh_le_get_protocol_mode 10282e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 10292e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description Get remote device protocol mode. 10302e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 10312e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/ 10322e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_le_get_protocol_mode(tBTA_HH_DEV_CB *p_cb) 10332e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{ 10342e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBTA_GATTC_CHAR_ID char_id; 10352e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBTA_HH_HSDATA hs_data; 10362e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach UINT8 i; 10372e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 10382e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_cb->w4_evt = BTA_HH_GET_PROTO_EVT; 10392e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 10402e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach for (i = 0; i< BTA_HH_LE_HID_SRVC_MAX; i ++) 10412e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 10422e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_cb->hid_srvc[i].in_use && 10432e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_cb->hid_srvc[i].option_char & BTA_HH_LE_PROTO_MODE_BIT) 10442e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 10452e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_fill_16bits_srvc_id(TRUE, 0, UUID_SERVCLASS_LE_HID, &char_id.srvc_id); 10462e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_fill_16bits_char_id(0, GATT_UUID_HID_PROTO_MODE, &char_id.char_id); 10472e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 10482e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach BTA_GATTC_ReadCharacteristic(p_cb->conn_id, 10492e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach &char_id, 10502e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach BTA_GATT_AUTH_REQ_NONE); 10512e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach break; 10522e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 10532e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 10542e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* no service support protocol_mode, by default report mode */ 10552e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (i == BTA_HH_LE_HID_SRVC_MAX) 10562e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 10572e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach hs_data.status = BTA_HH_OK; 10582e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach hs_data.handle = p_cb->hid_handle; 10592e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach hs_data.rsp_data.proto_mode = BTA_HH_PROTO_RPT_MODE; 10602e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_cb->w4_evt = 0; 10612e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach (* bta_hh_cb.p_cback)(BTA_HH_GET_PROTO_EVT, (tBTA_HH *)&hs_data); 10622e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 10632e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 10642e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach} 10652e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/******************************************************************************* 10662e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 10672e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function bta_hh_le_expl_rpt 10682e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 10692e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description explore all report characteristic 10702e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 10712e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/ 10722e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_le_expl_rpt(tBTA_HH_DEV_CB *p_dev_cb, 10732e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBTA_GATTC_CHAR_ID *p_char_id, 10742e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBT_UUID *p_char_cond, 10752e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBTA_GATT_CHAR_PROP prop) 10762e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{ 10772e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBTA_GATTC_CHAR_ID char_result; 10782e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 10792e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach do 10802e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 10812e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (bta_hh_le_find_alloc_report_entry(p_dev_cb, 10822e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_dev_cb->cur_srvc_index, 10832e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach GATT_UUID_HID_REPORT, 10842e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_char_id->char_id.inst_id, 10852e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach prop) == NULL) 10862e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 10872e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach APPL_TRACE_ERROR0("Add report entry failed !!!") 10882e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach break; 10892e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 10902e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 10912e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach APPL_TRACE_DEBUG0("Find more REPORT"); 10922e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 10932e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (BTA_GATTC_GetNextChar(p_dev_cb->conn_id, 10942e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_char_id, 10952e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_char_cond, 10962e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach &char_result, 10972e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach &prop) != BTA_GATT_OK) 10982e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach break; 10992e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 11002e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_char_id = &char_result; 11012e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 11022e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach while (1); 11032e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 11042e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach APPL_TRACE_ERROR0("all report searched"); 11052e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_read_rpt_ref_descr(p_dev_cb, 11062e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach &p_dev_cb->hid_srvc[p_dev_cb->cur_srvc_index].report[0]); 11072e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 11082e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 11092e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach return ; 11102e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach} 11112e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/******************************************************************************* 11122e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 11132e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function bta_hh_le_expl_boot_rpt 11142e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 11152e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description explore boot report 11162e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 11172e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/ 11182e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_le_expl_boot_rpt(tBTA_HH_DEV_CB *p_dev_cb, UINT16 char_uuid, 11192e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBTA_GATT_CHAR_PROP prop) 11202e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{ 11212e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (bta_hh_le_find_alloc_report_entry(p_dev_cb, 11222e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_dev_cb->cur_srvc_index, 11232e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach char_uuid, 11242e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 0, 11252e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach prop) == NULL) 11262e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 11272e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 11282e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach APPL_TRACE_ERROR0("Add report entry failed !!!") 11292e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 11302e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 11312e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach return; 11322e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach} 11332e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/******************************************************************************* 11342e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 11352e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function bta_hh_le_dis_cback 11362e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 11372e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description DIS read complete callback 11382e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 11392e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Parameters: 11402e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 11412e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/ 11422e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_le_dis_cback(BD_ADDR addr, tDIS_VALUE *p_dis_value) 11432e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{ 11442e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBTA_HH_DEV_CB *p_cb = bta_hh_le_find_dev_cb_by_bda(addr); 11452e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 11462e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 11472e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_cb == NULL || p_dis_value == NULL) 11482e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 11492e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach APPL_TRACE_ERROR0("received unexpected/error DIS callback"); 11502e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach return; 11512e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 11522e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 11532e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_cb->disc_active &= ~BTA_HH_LE_DISC_DIS; 11542e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* plug in the PnP info for this device */ 11552e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_dis_value->attr_mask & DIS_ATTR_PNP_ID_BIT) 11562e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 11572e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if BTA_HH_DEBUG == TRUE 11582e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach APPL_TRACE_DEBUG3("Plug in PnP info: product_id = %02x, vendor_id = %04x, version = %04x", 11592e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_dis_value->pnp_id.product_id, 11602e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_dis_value->pnp_id.vendor_id, 11612e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_dis_value->pnp_id.product_version); 11622e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif 11632e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_cb->dscp_info.product_id = p_dis_value->pnp_id.product_id; 11642e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_cb->dscp_info.vendor_id = p_dis_value->pnp_id.vendor_id; 11652e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_cb->dscp_info.version = p_dis_value->pnp_id.product_version; 11662e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 11672e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_open_cmpl(p_cb); 11682e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach} 11692e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/******************************************************************************* 11702e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 11712e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function bta_hh_le_pri_service_discovery 11722e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 11732e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description Initialize GATT discovery on the remote LE HID device by opening 11742e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** a GATT connection first. 11752e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 11762e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Parameters: 11772e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 11782e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/ 11792e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_le_pri_service_discovery(tBTA_HH_DEV_CB *p_cb) 11802e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{ 11812e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBT_UUID pri_srvc; 11822e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 11832e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_cb->disc_active |= (BTA_HH_LE_DISC_HIDS|BTA_HH_LE_DISC_DIS); 11842e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 11852e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* read DIS info */ 11862e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (!DIS_ReadDISInfo(p_cb->addr, bta_hh_le_dis_cback)) 11872e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 11882e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach APPL_TRACE_ERROR0("read DIS failed"); 11892e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_cb->disc_active &= ~BTA_HH_LE_DISC_DIS; 11902e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 11912e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 11922e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* in parallel */ 11932e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* start primary service discovery for HID service */ 11942e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach pri_srvc.len = LEN_UUID_16; 11952e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach pri_srvc.uu.uuid16 = UUID_SERVCLASS_LE_HID; 11962e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach BTA_GATTC_ServiceSearchRequest(p_cb->conn_id, &pri_srvc); 11972e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach return; 11982e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach} 11992e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/******************************************************************************* 12002e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 12012e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function bta_hh_le_encrypt_cback 12022e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 12032e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description link encryption complete callback for bond verification. 12042e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 12052e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Returns None 12062e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 12072e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/ 12082e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_le_encrypt_cback(BD_ADDR bd_addr, void *p_ref_data, tBTM_STATUS result) 12092e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{ 12102e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach UINT8 idx = bta_hh_find_cb(bd_addr); 12112e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBTA_HH_DEV_CB *p_dev_cb; 12122e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 12132e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach APPL_TRACE_ERROR0("bta_hh_le_encrypt_cback"); 12142e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 12152e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (idx != BTA_HH_IDX_INVALID) 12162e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_dev_cb = &bta_hh_cb.kdev[idx]; 12172e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach else 12182e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 12192e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach APPL_TRACE_ERROR0("unexpected encryption callback, ignore"); 12202e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach return; 12212e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 12222e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_dev_cb->status = (result == BTM_SUCCESS) ? BTA_HH_OK : BTA_HH_ERR_SEC; 12232e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 12242e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_sm_execute(p_dev_cb, BTA_HH_ENC_CMPL_EVT, NULL); 12252e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach} 12262e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/******************************************************************************* 12272e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 12282e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function bta_hh_security_cmpl 12292e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 12302e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description Security check completed, start the service discovery 12312e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** if no cache available, otherwise report connection open completed 12322e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 12332e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Parameters: 12342e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 12352e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/ 12362e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_security_cmpl(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_buf) 12372e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{ 12382e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_cb->status == BTA_HH_OK) 12392e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 12402e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* discovery has been done for HID service */ 12412e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_cb->app_id != 0 && bta_hh_le_hid_srvc_cached(p_cb)) 12422e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 12432e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* configure protocol mode */ 12442e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (bta_hh_le_set_protocol_mode(p_cb, p_cb->mode) == FALSE) 12452e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 12462e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach APPL_TRACE_ERROR0("bta_hh_security_cmpl"); 12472e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_open_cmpl(p_cb); 12482e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 12492e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 12502e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* start primary service discovery for HID service */ 12512e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach else 12522e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 12532e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_pri_service_discovery(p_cb); 12542e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 12552e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 12562e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach else 12572e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_api_disc_act(p_cb); 12582e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 12592e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach} 12602e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/******************************************************************************* 12612e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 12622e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function bta_hh_start_security 12632e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 12642e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description start the security check of the established connection 12652e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 12662e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Parameters: 12672e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 12682e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/ 12692e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_start_security(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_buf) 12702e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{ 12712e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach UINT8 sec_flag=0; 12722e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 12732e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* verify bond */ 12742e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach BTM_GetSecurityFlags(p_cb->addr, &sec_flag); 12752e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 12762e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* if link has been encrypted */ 12772e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (sec_flag & BTM_SEC_FLAG_ENCRYPTED) 12782e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 12792e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_sm_execute(p_cb, BTA_HH_ENC_CMPL_EVT, NULL); 12802e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 12812e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* if bonded and link not encrypted */ 12822e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach else if (sec_flag & BTM_SEC_FLAG_LKEY_KNOWN) 12832e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 12842e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach sec_flag = BTM_BLE_SEC_ENCRYPT; 12852e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_cb->status = BTA_HH_ERR_AUTH_FAILED; 12862e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach BTM_SetEncryption(p_cb->addr, bta_hh_le_encrypt_cback, &sec_flag); 12872e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 12882e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* unbonded device, report security error here */ 12892e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach else if (p_cb->sec_mask != BTA_SEC_NONE) 12902e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 12912e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach sec_flag = BTM_BLE_SEC_ENCRYPT_NO_MITM; 12922e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_cb->status = BTA_HH_ERR_AUTH_FAILED; 12932e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach BTM_SetEncryption(p_cb->addr, bta_hh_le_encrypt_cback, &sec_flag); 12942e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 12952e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* otherwise let it go through */ 12962e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach else 12972e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 12982e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_sm_execute(p_cb, BTA_HH_ENC_CMPL_EVT, NULL); 12992e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 13002e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 13012e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 13022e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach} 13032e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/******************************************************************************* 13042e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 13052e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function bta_hh_gatt_open 13062e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 13072e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description process GATT open event. 13082e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 13092e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Parameters: 13102e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 13112e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/ 13122e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_gatt_open(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_buf) 13132e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{ 13142e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBTA_GATTC_OPEN *p_data = &p_buf->le_open; 13152e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach UINT8 *p2; 13162e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tHID_STATUS status = BTA_HH_ERR; 13172e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 13182e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* if received invalid callback data , ignore it */ 13192e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_cb == NULL || p_data == NULL) 13202e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach return; 13212e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 13222e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p2 = p_data->remote_bda; 13232e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 13242e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach APPL_TRACE_DEBUG3("bta_hh_gatt_open BTA_GATTC_OPEN_EVT bda= [%08x%04x] status =%d", 13252e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach ((p2[0])<<24)+((p2[1])<<16)+((p2[2])<<8)+(p2[3]), 13262e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach ((p2[4])<<8)+ p2[5],p_data->status); 13272e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 13282e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_data->status == BTA_GATT_OK) 13292e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 13302e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 13312e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_cb->in_use = TRUE; 13322e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_cb->conn_id = p_data->conn_id; 13332e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_cb->hid_handle = BTA_HH_GET_LE_DEV_HDL(p_cb->index); 13342e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 13352e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_cb.le_cb_index[BTA_HH_GET_LE_CB_IDX(p_cb->hid_handle)] = p_cb->index; 13362e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 13372e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if BTA_HH_DEBUG == TRUE 13382e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach APPL_TRACE_DEBUG3("hid_handle = %2x conn_id = %04x cb_index = %d", p_cb->hid_handle, p_cb->conn_id, p_cb->index); 13392e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif 13402e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 13412e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_sm_execute(p_cb, BTA_HH_START_ENC_EVT, NULL); 13422e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 13432e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 13442e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach else /* open failure */ 13452e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 13462e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_sm_execute(p_cb, BTA_HH_SDP_CMPL_EVT, (tBTA_HH_DATA *)&status); 13472e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 13482e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 13492e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach} 13502e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/******************************************************************************* 13512e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 13522e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function bta_hh_le_close 13532e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 13542e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description This function process the GATT close event and post it as a 13552e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** BTA HH internal event 13562e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 13572e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Parameters: 13582e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 13592e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/ 13602e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_le_close(tBTA_GATTC_CLOSE * p_data) 13612e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{ 13622e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBTA_HH_DEV_CB *p_dev_cb = bta_hh_le_find_dev_cb_by_bda(p_data->remote_bda); 13632e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBTA_HH_LE_CLOSE *p_buf = NULL; 13642e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach UINT16 sm_event = BTA_HH_GATT_CLOSE_EVT; 13652e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 13662e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_dev_cb != NULL && 13672e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach (p_buf = (tBTA_HH_LE_CLOSE *)GKI_getbuf(sizeof(tBTA_HH_LE_CLOSE))) != NULL) 13682e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 13692e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_buf->hdr.event = sm_event; 13702e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_buf->hdr.layer_specific = (UINT16)p_dev_cb->hid_handle; 13712e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_buf->conn_id = p_data->conn_id; 13722e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_buf->reason = p_data->reason; 13732e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 13742e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_dev_cb->conn_id = BTA_GATT_INVALID_CONN_ID; 13752e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 13762e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_sys_sendmsg(p_buf); 13772e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 13782e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach} 13792e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 13802e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/******************************************************************************* 13812e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 13822e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function bta_hh_le_search_result 13832e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 13842e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description This function process the GATT service search result. 13852e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 13862e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Parameters: 13872e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 13882e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/ 13892e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_le_search_result(tBTA_GATTC_SRVC_RES *p_srvc_result) 13902e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{ 13912e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBTA_HH_DEV_CB *p_dev_cb = bta_hh_le_find_dev_cb_by_conn_id(p_srvc_result->conn_id); 13922e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 13932e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_dev_cb != NULL) 13942e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 13952e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach switch (p_srvc_result->service_uuid.id.uuid.uu.uuid16) 13962e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 13972e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach case UUID_SERVCLASS_LE_HID: 13982e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_srvc_result->service_uuid.is_primary) 13992e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 14002e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* found HID primamry service */ 14012e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* TODO: proceed to find battery and device info */ 14022e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (bta_hh_le_add_hid_srvc_entry(p_dev_cb, p_dev_cb->total_srvc)) 14032e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_dev_cb->total_srvc ++; 14042e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach APPL_TRACE_DEBUG1("num of hid service: %d", p_dev_cb->total_srvc); 14052e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 14062e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach break; 14072e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 14082e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach case UUID_SERVCLASS_SCAN_PARAM : /* scan parameter service */ 14092e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_search_scps_chars(p_dev_cb); 14102e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach break; 14112e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 14122e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 14132e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 14142e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 14152e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach} 14162e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 14172e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 14182e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/******************************************************************************* 14192e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 14202e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function bta_hh_le_gatt_disc_cmpl 14212e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 14222e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description Check to see if the remote device is a LE only device 14232e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 14242e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Parameters: 14252e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 14262e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/ 14272e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_le_gatt_disc_cmpl(tBTA_HH_DEV_CB *p_cb, tBTA_HH_STATUS status) 14282e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{ 14292e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach APPL_TRACE_DEBUG0("bta_hh_le_gatt_disc_cmpl "); 14302e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 14312e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* if open sucessful or protocol mode not desired, keep the connection open but inform app */ 14322e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (status == BTA_HH_OK || status == BTA_HH_ERR_PROTO) 14332e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 14342e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* assign a special APP ID temp, since device type unknown */ 14352e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_cb->app_id = BTA_HH_APP_ID_LE; 14362e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 14372e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* set report notification configuration */ 14382e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_cb->clt_cfg_idx = 0; 14392e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_write_rpt_clt_cfg(p_cb, BTA_HH_LE_SRVC_DEF); 14402e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 14412e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach else /* error, close the GATT connection */ 14422e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 14432e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* close GATT connection if it's on */ 14442e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_api_disc_act(p_cb); 14452e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 14462e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach} 14472e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 14482e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/******************************************************************************* 14492e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 14502e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function bta_hh_le_srvc_expl_srvc 14512e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 14522e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description This function discover the next avaible HID service. 14532e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 14542e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Parameters: 14552e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 14562e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/ 14572e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_le_srvc_expl_srvc(tBTA_HH_DEV_CB *p_dev_cb) 14582e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{ 14592e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if BTA_HH_DEBUG == TRUE 14602e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach APPL_TRACE_DEBUG2("bta_hh_le_srvc_expl_srvc cur_srvc_index = %d in_use = %d", 14612e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_dev_cb->cur_srvc_index, 14622e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_dev_cb->hid_srvc[p_dev_cb->cur_srvc_index].in_use); 14632e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif 14642e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 14652e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_dev_cb->cur_srvc_index < BTA_HH_LE_HID_SRVC_MAX && 14662e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_dev_cb->hid_srvc[p_dev_cb->cur_srvc_index].in_use) 14672e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 14682e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (!p_dev_cb->hid_srvc[p_dev_cb->cur_srvc_index].expl_incl_srvc) 14692e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* explore included service first */ 14702e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 14712e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_search_hid_included(p_dev_cb); 14722e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 14732e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach else 14742e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 14752e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* explore characterisc */ 14762e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_dev_cb->hid_srvc[p_dev_cb->cur_srvc_index].cur_expl_char_idx = 0; 14772e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_search_hid_chars(p_dev_cb); 14782e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 14792e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 14802e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach else /* all service discvery finished */ 14812e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 14822e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_gatt_disc_cmpl(p_dev_cb, p_dev_cb->status); 14832e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 14842e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach} 14852e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/******************************************************************************* 14862e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 14872e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function bta_hh_le_srvc_search_cmpl 14882e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 14892e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description This function process the GATT service search complete. 14902e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 14912e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Parameters: 14922e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 14932e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/ 14942e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_le_srvc_search_cmpl(tBTA_GATTC_SEARCH_CMPL *p_data) 14952e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{ 14962e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBTA_HH_DEV_CB *p_dev_cb = bta_hh_le_find_dev_cb_by_conn_id(p_data->conn_id); 14972e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 14982e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* service search exception or no HID service is supported on remote */ 14992e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_dev_cb == NULL) 15002e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach return; 15012e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 15022e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if(p_data->status != BTA_GATT_OK || p_dev_cb->total_srvc == 0) 15032e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 15042e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_dev_cb->status = BTA_HH_ERR_SDP; 15052e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* close the connection and report service discovery complete with error */ 15062e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_api_disc_act(p_dev_cb); 15072e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 15082e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* GATT service discovery sucessfully finished */ 15092e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach else 15102e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 15112e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_dev_cb->disc_active & BTA_HH_LE_DISC_SCPS) 15122e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 15132e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_dev_cb->disc_active &= ~BTA_HH_LE_DISC_SCPS; 15142e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_open_cmpl(p_dev_cb); 15152e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 15162e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach else /* discover HID service */ 15172e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 15182e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_dev_cb->cur_srvc_index = 0; 15192e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_srvc_expl_srvc(p_dev_cb); 15202e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 15212e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach} 15222e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach} 15232e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 15242e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/******************************************************************************* 15252e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 15262e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function bta_hh_le_search_hid_included 15272e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 15282e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description This function search the included service within the HID service. 15292e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 15302e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Parameters: 15312e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 15322e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/ 15332e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachstatic void bta_hh_le_search_hid_included(tBTA_HH_DEV_CB *p_dev_cb) 15342e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{ 15352e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBT_UUID srvc_cond, char_cond; 15362e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBTA_GATTC_INCL_SVC_ID inc_srvc_result; 15372e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBTA_GATT_SRVC_ID srvc_id; 15382e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBTA_GATTC_CHAR_ID char_result; 15392e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBTA_GATT_CHAR_PROP prop = 0; 15402e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 15412e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_fill_16bits_srvc_id(TRUE, p_dev_cb->cur_srvc_index, UUID_SERVCLASS_LE_HID, &srvc_id); 15422e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 15432e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach srvc_cond.len = LEN_UUID_16; 15442e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach srvc_cond.uu.uuid16 = UUID_SERVCLASS_BATTERY; 15452e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 15462e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (BTA_GATTC_GetFirstIncludedService(p_dev_cb->conn_id, 15472e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach &srvc_id, 15482e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach &srvc_cond, 15492e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach &inc_srvc_result) == BTA_GATT_OK) 15502e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 15512e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* read include service UUID */ 15522e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 15532e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_dev_cb->hid_srvc[p_dev_cb->cur_srvc_index].incl_srvc_inst = inc_srvc_result.incl_svc_id.id.inst_id; 15542e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 15552e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach char_cond.len = LEN_UUID_16; 15562e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach char_cond.uu.uuid16 = GATT_UUID_BATTERY_LEVEL; 15572e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 15582e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* find the battery characteristic */ 15592e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (BTA_GATTC_GetFirstChar( p_dev_cb->conn_id, 15602e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach &inc_srvc_result.incl_svc_id, 15612e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach &char_cond, 15622e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach &char_result, 15632e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach &prop) == BTA_GATT_OK) 15642e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 15652e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (bta_hh_le_find_alloc_report_entry(p_dev_cb, 15662e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach char_result.srvc_id.id.inst_id, 15672e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach GATT_UUID_BATTERY_LEVEL, 15682e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach char_result.char_id.inst_id, 15692e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach prop) == NULL) 15702e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 15712e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach APPL_TRACE_ERROR0("Add battery report entry failed !!!") 15722e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 15732e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 15742e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* read the battery characteristic */ 15752e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach BTA_GATTC_ReadCharacteristic(p_dev_cb->conn_id, 15762e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach &char_result, 15772e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach BTA_GATT_AUTH_REQ_NONE); 15782e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 15792e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach return; 15802e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 15812e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 15822e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach else 15832e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 15842e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach APPL_TRACE_ERROR0("Remote device does not have battery level"); 15852e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 15862e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 15872e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 15882e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_dev_cb->hid_srvc[p_dev_cb->cur_srvc_index].expl_incl_srvc = TRUE; 15892e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 15902e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_srvc_expl_srvc(p_dev_cb); 15912e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 15922e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach} 15932e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/******************************************************************************* 15942e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 15952e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function bta_hh_read_battery_level_cmpl 15962e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 15972e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description This function process the battery level read 15982e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 15992e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Parameters: 16002e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 16012e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/ 16022e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_read_battery_level_cmpl(UINT8 status, tBTA_HH_DEV_CB *p_dev_cb, tBTA_GATTC_READ *p_data) 16032e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{ 16042e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_dev_cb->hid_srvc[p_dev_cb->cur_srvc_index].expl_incl_srvc = TRUE; 16052e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_srvc_expl_srvc(p_dev_cb); 16062e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach} 16072e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/******************************************************************************* 16082e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 16092e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function bta_hh_le_search_hid_chars 16102e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 16112e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description This function discover all characteristics a service and 16122e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** all descriptors available. 16132e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 16142e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Parameters: 16152e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 16162e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/ 16172e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachstatic void bta_hh_le_search_hid_chars(tBTA_HH_DEV_CB *p_dev_cb) 16182e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{ 16192e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBT_UUID char_cond; 16202e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBTA_GATTC_CHAR_ID char_result; 16212e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBTA_GATT_CHAR_PROP prop; 16222e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach BOOLEAN next = TRUE; 16232e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach UINT16 char_uuid = 0; 16242e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBTA_GATT_SRVC_ID srvc_id; 16252e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 16262e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_dev_cb->hid_srvc[p_dev_cb->cur_srvc_index].cur_expl_char_idx == BTA_HH_LE_DISC_CHAR_NUM || 16272e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach (p_dev_cb->status != BTA_HH_OK && p_dev_cb->status != BTA_HH_ERR_PROTO)) 16282e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 16292e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_dev_cb->hid_srvc[p_dev_cb->cur_srvc_index].cur_expl_char_idx = 0; 16302e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* explore next service */ 16312e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_dev_cb->cur_srvc_index ++; 16322e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_srvc_expl_srvc(p_dev_cb); 16332e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach return; 16342e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 16352e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 16362e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_dev_cb->hid_srvc[ p_dev_cb->cur_srvc_index].cur_expl_char_idx ++; 16372e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach char_uuid = bta_hh_le_disc_char_uuid[p_dev_cb->hid_srvc[p_dev_cb->cur_srvc_index].cur_expl_char_idx - 1]; 16382e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 16392e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach char_cond.len = LEN_UUID_16; 16402e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach char_cond.uu.uuid16 = char_uuid; 16412e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 16422e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_fill_16bits_srvc_id(TRUE, p_dev_cb->cur_srvc_index, UUID_SERVCLASS_LE_HID, &srvc_id); 16432e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 16442e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if BTA_HH_DEBUG == TRUE 16452e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach APPL_TRACE_DEBUG2("bta_hh_le_search_hid_chars: looking for %s(0x%04x)", 16462e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_uuid_to_str(char_uuid), char_uuid); 16472e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif 16482e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 16492e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (BTA_GATTC_GetFirstChar( p_dev_cb->conn_id, 16502e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach &srvc_id, 16512e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach &char_cond, 16522e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach &char_result, 16532e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach &prop) == BTA_GATT_OK) 16542e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 16552e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach switch (char_uuid) 16562e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 16572e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach case GATT_UUID_HID_CONTROL_POINT: 16582e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_dev_cb->hid_srvc[char_result.srvc_id.id.inst_id].option_char |= BTA_HH_LE_CP_BIT; 16592e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach next = TRUE; 16602e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach break; 16612e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach case GATT_UUID_HID_INFORMATION: 16622e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach case GATT_UUID_HID_REPORT_MAP: 16632e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* read the char value */ 16642e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach BTA_GATTC_ReadCharacteristic(p_dev_cb->conn_id, 16652e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach &char_result, 16662e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach BTA_GATT_AUTH_REQ_NONE); 16672e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach next = FALSE; 16682e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach break; 16692e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 16702e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach case GATT_UUID_HID_PROTO_MODE: 16712e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_dev_cb->hid_srvc[char_result.srvc_id.id.inst_id].option_char |= BTA_HH_LE_PROTO_MODE_BIT; 16722e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach next = !bta_hh_le_set_protocol_mode(p_dev_cb, p_dev_cb->mode); 16732e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach break; 16742e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 16752e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach case GATT_UUID_HID_REPORT: 16762e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_expl_rpt(p_dev_cb, &char_result, &char_cond, prop); 16772e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach next = FALSE; 16782e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach break; 16792e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 16802e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* found boot mode report types */ 16812e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach case GATT_UUID_HID_BT_KB_OUTPUT: 16822e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach case GATT_UUID_HID_BT_MOUSE_INPUT: 16832e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach case GATT_UUID_HID_BT_KB_INPUT: 16842e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_expl_boot_rpt(p_dev_cb, char_uuid, prop); 16852e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach break; 16862e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 16872e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 16882e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach else 16892e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 16902e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (char_uuid == GATT_UUID_HID_PROTO_MODE) 16912e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach next = !bta_hh_le_set_protocol_mode(p_dev_cb, p_dev_cb->mode); 16922e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 16932e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 16942e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 16952e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (next == TRUE) 16962e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 16972e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_search_hid_chars(p_dev_cb); 16982e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 16992e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach} 17002e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/******************************************************************************* 17012e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 17022e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function bta_hh_le_save_rpt_map 17032e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 17042e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description save the report map into the control block. 17052e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 17062e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Parameters: 17072e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 17082e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/ 17092e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_le_save_rpt_map(tBTA_HH_DEV_CB *p_dev_cb, tBTA_GATTC_READ *p_data) 17102e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{ 17112e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach UINT8 *pp ; 17122e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBTA_HH_LE_HID_SRVC *p_srvc = &p_dev_cb->hid_srvc[p_data->srvc_id.id.inst_id]; 17132e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 17142e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach pp = p_data->p_value->unformat.p_value; 17152e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 17162e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* save report descriptor */ 17172e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_srvc->rpt_map != NULL) 17182e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach GKI_freebuf((void*)p_srvc->rpt_map); 17192e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 17202e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_data->p_value->unformat.len > 0) 17212e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_srvc->rpt_map = (UINT8 *)GKI_getbuf(p_data->p_value->unformat.len); 17222e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 17232e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_srvc->rpt_map != NULL) 17242e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 17252e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach STREAM_TO_ARRAY(p_srvc->rpt_map, pp, p_data->p_value->unformat.len); 17262e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_srvc->descriptor.dl_len = p_data->p_value->unformat.len; 17272e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_srvc->descriptor.dsc_list = p_dev_cb->hid_srvc[p_data->srvc_id.id.inst_id].rpt_map; 17282e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 17292e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 17302e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (bta_hh_le_read_char_dscrpt(p_dev_cb, 17312e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach UUID_SERVCLASS_LE_HID, 17322e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_data->srvc_id.id.inst_id, 17332e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach GATT_UUID_HID_REPORT_MAP, 17342e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_data->char_id.inst_id, 17352e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach GATT_UUID_EXT_RPT_REF_DESCR) != BTA_HH_OK) 17362e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 17372e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_search_hid_chars(p_dev_cb); 17382e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 17392e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 17402e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 17412e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach} 17422e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/******************************************************************************* 17432e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 17442e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function bta_hh_le_proc_get_rpt_cmpl 17452e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 17462e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description Process the Read report complete, send GET_REPORT_EVT to application 17472e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** with the report data. 17482e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 17492e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Parameters: 17502e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 17512e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/ 17522e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_le_proc_get_rpt_cmpl(tBTA_HH_DEV_CB *p_dev_cb, tBTA_GATTC_READ *p_data) 17532e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{ 17542e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach BT_HDR *p_buf = NULL; 17552e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBTA_HH_LE_RPT *p_rpt; 17562e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBTA_HH_HSDATA hs_data; 17572e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach UINT8 *pp ; 17582e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 17592e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_dev_cb->w4_evt != BTA_HH_GET_RPT_EVT) 17602e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 17612e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach APPL_TRACE_ERROR1("Unexpected READ cmpl, w4_evt = %d", p_dev_cb->w4_evt); 17622e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach return; 17632e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 17642e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 17652e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach hs_data.status = BTA_HH_ERR; 17662e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach hs_data.handle = p_dev_cb->hid_handle; 17672e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 17682e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_data->status == BTA_GATT_OK) 17692e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 17702e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_rpt = bta_hh_le_find_report_entry(p_dev_cb, 17712e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_data->srvc_id.id.inst_id,//BTA_HH_LE_SRVC_DEF, 17722e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_data->char_id.uuid.uu.uuid16, 17732e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_data->char_id.inst_id); 17742e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 17752e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_rpt != NULL && 17762e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_data->p_value != NULL && 17772e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach (p_buf = (BT_HDR *)GKI_getbuf((UINT16)(sizeof(BT_HDR) +p_data->p_value->unformat.len + 1))) != NULL) 17782e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 17792e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* pack data send to app */ 17802e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach hs_data.status = BTA_HH_OK; 17812e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_buf->len = p_data->p_value->unformat.len + 1; 17822e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_buf->layer_specific = 0; 17832e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 17842e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* attach report ID as the first byte of the report before sending it to USB HID driver */ 17852e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach pp = (UINT8*)(p_buf + 1); 17862e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach UINT8_TO_STREAM(pp, p_rpt->rpt_id); 17872e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach memcpy(pp, p_data->p_value->unformat.p_value, p_data->p_value->unformat.len); 17882e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 17892e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach hs_data.rsp_data.p_rpt_data =p_buf; 17902e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 17912e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 17922e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 17932e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_dev_cb->w4_evt = 0; 17942e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach (* bta_hh_cb.p_cback)(BTA_HH_GET_RPT_EVT, (tBTA_HH *)&hs_data); 17952e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 17962e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach utl_freebuf((void **)&p_buf); 17972e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 17982e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach} 17992e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/******************************************************************************* 18002e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 18012e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function bta_hh_le_proc_read_proto_mode 18022e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 18032e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description Process the Read protocol mode, send GET_PROTO_EVT to application 18042e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** with the protocol mode. 18052e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 18062e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/ 18072e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_le_proc_read_proto_mode(tBTA_HH_DEV_CB *p_dev_cb, tBTA_GATTC_READ *p_data) 18082e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{ 18092e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBTA_HH_HSDATA hs_data; 18102e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 18112e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach hs_data.status = BTA_HH_ERR; 18122e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach hs_data.handle = p_dev_cb->hid_handle; 18132e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach hs_data.rsp_data.proto_mode = p_dev_cb->mode; 18142e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 18152e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_data->status == BTA_GATT_OK && p_data->p_value) 18162e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 18172e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach hs_data.status = BTA_HH_OK; 18182e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* match up BTE/BTA report/boot mode def*/ 18192e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach hs_data.rsp_data.proto_mode = *(p_data->p_value->unformat.p_value); 18202e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* LE repot mode is the opposite value of BR/EDR report mode, flip it here */ 18212e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (hs_data.rsp_data.proto_mode == 0) 18222e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach hs_data.rsp_data.proto_mode = BTA_HH_PROTO_BOOT_MODE; 18232e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach else 18242e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach hs_data.rsp_data.proto_mode = BTA_HH_PROTO_RPT_MODE; 18252e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 18262e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_dev_cb->mode = hs_data.rsp_data.proto_mode; 18272e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 18282e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if BTA_HH_DEBUG 18292e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach APPL_TRACE_DEBUG1("LE GET_PROTOCOL Mode = [%s]", 18302e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach (hs_data.rsp_data.proto_mode == BTA_HH_PROTO_RPT_MODE)? "Report" : "Boot"); 18312e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif 18322e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 18332e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_dev_cb->w4_evt = 0; 18342e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach (* bta_hh_cb.p_cback)(BTA_HH_GET_PROTO_EVT, (tBTA_HH *)&hs_data); 18352e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 18362e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach} 18372e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/******************************************************************************* 18382e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 18392e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function bta_hh_w4_le_read_char_cmpl 18402e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 18412e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description process the GATT read complete in W4_CONN state. 18422e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 18432e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Parameters: 18442e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 18452e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/ 18462e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_w4_le_read_char_cmpl(tBTA_HH_DEV_CB *p_dev_cb, tBTA_HH_DATA *p_buf) 18472e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{ 18482e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBTA_GATTC_READ * p_data = (tBTA_GATTC_READ *)p_buf; 18492e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach UINT8 *pp ; 18502e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 18512e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_data->char_id.uuid.uu.uuid16 == GATT_UUID_BATTERY_LEVEL) 18522e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 18532e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_read_battery_level_cmpl(p_data->status, p_dev_cb, p_data); 18542e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 18552e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach else 18562e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 18572e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_data->status == BTA_GATT_OK && p_data->p_value) 18582e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 18592e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach pp = p_data->p_value->unformat.p_value; 18602e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 18612e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach switch (p_data->char_id.uuid.uu.uuid16) 18622e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 18632e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* save device information */ 18642e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach case GATT_UUID_HID_INFORMATION: 18652e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach STREAM_TO_UINT16(p_dev_cb->dscp_info.version, pp); 18662e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach STREAM_TO_UINT8(p_dev_cb->dscp_info.ctry_code, pp); 18672e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach STREAM_TO_UINT8(p_dev_cb->dscp_info.flag, pp); 18682e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach break; 18692e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 18702e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach case GATT_UUID_HID_REPORT_MAP: 18712e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_save_rpt_map(p_dev_cb, p_data); 18722e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach return; 18732e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 18742e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach default: 18752e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if BTA_HH_DEBUG == TRUE 18762e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach APPL_TRACE_ERROR2("Unexpected read %s(0x%04x)", 18772e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_uuid_to_str(p_data->char_id.uuid.uu.uuid16), 18782e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_data->char_id.uuid.uu.uuid16); 18792e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif 18802e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach break; 18812e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 18822e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 18832e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach else 18842e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 18852e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if BTA_HH_DEBUG == TRUE 18862e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach APPL_TRACE_ERROR3("read uuid %s[0x%04x] error: %d", 18872e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_uuid_to_str(p_data->char_id.uuid.uu.uuid16), 18882e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_data->char_id.uuid.uu.uuid16, 18892e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_data->status); 18902e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#else 18912e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach APPL_TRACE_ERROR2("read uuid [0x%04x] error: %d", p_data->char_id.uuid.uu.uuid16, p_data->status); 18922e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif 18932e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 18942e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_search_hid_chars(p_dev_cb); 18952e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 18962e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 18972e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach} 18982e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/******************************************************************************* 18992e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 19002e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function bta_hh_le_read_char_cmpl 19012e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 19022e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description a characteristic value is received. 19032e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 19042e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Parameters: 19052e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 19062e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/ 19072e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_le_read_char_cmpl (tBTA_HH_DEV_CB *p_dev_cb, tBTA_HH_DATA *p_buf) 19082e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{ 19092e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBTA_GATTC_READ * p_data = (tBTA_GATTC_READ *)p_buf; 19102e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 19112e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach switch (p_data->char_id.uuid.uu.uuid16) 19122e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 19132e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* GET_REPORT */ 19142e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach case GATT_UUID_HID_REPORT: 19152e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach case GATT_UUID_HID_BT_KB_INPUT: 19162e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach case GATT_UUID_HID_BT_KB_OUTPUT: 19172e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach case GATT_UUID_HID_BT_MOUSE_INPUT: 19182e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach case GATT_UUID_BATTERY_LEVEL: /* read battery level */ 19192e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_proc_get_rpt_cmpl(p_dev_cb, p_data); 19202e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach break; 19212e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 19222e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach case GATT_UUID_HID_PROTO_MODE: 19232e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_proc_read_proto_mode(p_dev_cb, p_data); 19242e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach break; 19252e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 19262e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach default: 19272e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach APPL_TRACE_ERROR1("Unexpected Read UUID: 0x%04x", p_data->char_id.uuid.uu.uuid16); 19282e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach break; 19292e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 19302e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 19312e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach} 19322e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/******************************************************************************* 19332e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 19342e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function bta_hh_le_read_descr_cmpl 19352e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 19362e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description read characteristic descriptor is completed in CONN st. 19372e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 19382e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Parameters: 19392e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 19402e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/ 19412e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_le_read_descr_cmpl(tBTA_HH_DEV_CB *p_dev_cb, tBTA_HH_DATA *p_buf) 19422e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{ 19432e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBTA_HH_LE_RPT *p_rpt; 19442e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBTA_GATTC_READ * p_data = (tBTA_GATTC_READ *)p_buf; 19452e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach UINT8 *pp; 19462e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 19472e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* if a report client configuration */ 19482e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_data->descr_type.uuid.uu.uuid16 == GATT_UUID_CHAR_CLIENT_CONFIG) 19492e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 19502e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if ((p_rpt = bta_hh_le_find_report_entry(p_dev_cb, 19512e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach BTA_HH_LE_SRVC_DEF, 19522e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_data->char_id.uuid.uu.uuid16, 19532e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_data->char_id.inst_id)) != NULL) 19542e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 19552e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach pp = p_data->p_value->unformat.p_value; 19562e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach STREAM_TO_UINT16(p_rpt->client_cfg_value, pp); 19572e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 19582e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach APPL_TRACE_DEBUG1("Read Client Configuration: 0x%04x", p_rpt->client_cfg_value); 19592e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 19602e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 19612e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach} 19622e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 19632e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_le_read_battery_level_descr_cmpl(tBTA_HH_DEV_CB *p_dev_cb, tBTA_GATTC_READ * p_data) 19642e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{ 19652e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBTA_HH_LE_RPT *p_rpt; 19662e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach UINT16 descr_uuid = p_data->descr_type.uuid.uu.uuid16; 19672e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 19682e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* read report reference descriptor for battery level is completed */ 19692e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (descr_uuid == GATT_UUID_RPT_REF_DESCR) 19702e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 19712e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if ((p_rpt = bta_hh_le_find_report_entry(p_dev_cb, 19722e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_data->srvc_id.id.inst_id, 19732e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach GATT_UUID_BATTERY_LEVEL, 19742e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_data->char_id.inst_id)) == NULL) 19752e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 19762e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_search_hid_chars(p_dev_cb); 19772e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 19782e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach else 19792e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_save_rpt_ref(p_dev_cb, p_rpt, p_data); 19802e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 19812e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 19822e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach} 19832e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/******************************************************************************* 19842e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 19852e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function bta_hh_w4_le_read_descr_cmpl 19862e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 19872e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description read characteristic descriptor is completed in W4_CONN st. 19882e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 19892e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Parameters: 19902e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 19912e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/ 19922e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_w4_le_read_descr_cmpl(tBTA_HH_DEV_CB *p_dev_cb, tBTA_HH_DATA *p_buf) 19932e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{ 19942e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBTA_HH_LE_RPT *p_rpt; 19952e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBTA_GATTC_READ * p_data = (tBTA_GATTC_READ *)p_buf; 19962e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach UINT16 char_uuid16; 19972e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 19982e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_data == NULL) 19992e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach return; 20002e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 20012e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach char_uuid16 = p_data->char_id.uuid.uu.uuid16; 20022e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 20032e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if BTA_HH_DEBUG == TRUE 20042e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach APPL_TRACE_DEBUG2("bta_hh_w4_le_read_descr_cmpl uuid: %s(0x%04x)", 20052e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_uuid_to_str(p_data->descr_type.uuid.uu.uuid16), 20062e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_data->descr_type.uuid.uu.uuid16); 20072e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif 20082e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach switch (char_uuid16) 20092e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 20102e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach case GATT_UUID_HID_REPORT: 20112e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if ((p_rpt = bta_hh_le_find_report_entry(p_dev_cb, 20122e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_data->srvc_id.id.inst_id, 20132e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach GATT_UUID_HID_REPORT, 20142e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_data->char_id.inst_id)) == NULL) 20152e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 20162e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_search_hid_chars(p_dev_cb); 20172e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 20182e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach else 20192e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_save_rpt_ref(p_dev_cb, p_rpt, p_data); 20202e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach break; 20212e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 20222e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach case GATT_UUID_HID_REPORT_MAP: 20232e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_save_ext_rpt_ref(p_dev_cb, p_data); 20242e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach break; 20252e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 20262e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach case GATT_UUID_BATTERY_LEVEL: 20272e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_read_battery_level_descr_cmpl(p_dev_cb, p_data); 20282e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach break; 20292e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 20302e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach default: 20312e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach APPL_TRACE_ERROR1("unknown descriptor read complete for uuid: 0x%04x", char_uuid16); 20322e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach break; 20332e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 20342e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach} 20352e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 20362e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/******************************************************************************* 20372e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 20382e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function bta_hh_w4_le_write_cmpl 20392e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 20402e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description Write charactersitic complete event at W4_CONN st. 20412e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 20422e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Parameters: 20432e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 20442e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/ 20452e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_w4_le_write_cmpl(tBTA_HH_DEV_CB *p_dev_cb, tBTA_HH_DATA *p_buf) 20462e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{ 20472e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBTA_GATTC_WRITE *p_data = (tBTA_GATTC_WRITE *)p_buf; 20482e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 20492e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_data == NULL) 20502e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach return; 20512e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 20522e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_data->char_id.uuid.uu.uuid16 == GATT_UUID_HID_PROTO_MODE) 20532e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 20542e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_dev_cb->status = (p_data->status == BTA_GATT_OK) ? BTA_HH_OK : BTA_HH_ERR_PROTO; 20552e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 20562e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if ((p_dev_cb->disc_active & BTA_HH_LE_DISC_HIDS) != 0) 20572e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 20582e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_search_hid_chars(p_dev_cb); 20592e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 20602e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach else 20612e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 20622e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_open_cmpl(p_dev_cb); 20632e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 20642e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 20652e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach} 20662e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/******************************************************************************* 20672e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 20682e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function bta_hh_le_write_cmpl 20692e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 20702e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description Write charactersitic complete event at CONN st. 20712e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 20722e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Parameters: 20732e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 20742e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/ 20752e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_le_write_cmpl(tBTA_HH_DEV_CB *p_dev_cb, tBTA_HH_DATA *p_buf) 20762e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{ 20772e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBTA_GATTC_WRITE *p_data = (tBTA_GATTC_WRITE *)p_buf; 20782e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBTA_HH_CBDATA cback_data ; 20792e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach UINT16 cb_evt = p_dev_cb->w4_evt; 20802e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 20812e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_data == NULL || cb_evt == 0) 20822e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach return; 20832e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 20842e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if BTA_HH_DEBUG 20852e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach APPL_TRACE_DEBUG1("bta_hh_le_write_cmpl w4_evt: %d", p_dev_cb->w4_evt); 20862e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif 20872e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach switch (p_data->char_id.uuid.uu.uuid16) 20882e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 20892e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* Set protocol finished */ 20902e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach case GATT_UUID_HID_PROTO_MODE: 20912e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach cback_data.handle = p_dev_cb->hid_handle; 20922e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_data->status == BTA_GATT_OK) 20932e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 20942e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_register_input_notif(p_dev_cb, p_data->srvc_id.id.inst_id, p_dev_cb->mode, FALSE); 20952e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach cback_data.status = BTA_HH_OK; 20962e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 20972e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach else 20982e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach cback_data.status = BTA_HH_ERR; 20992e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_dev_cb->w4_evt = 0; 21002e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach (* bta_hh_cb.p_cback)(cb_evt, (tBTA_HH *)&cback_data); 21012e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach break; 21022e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 21032e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* Set Report finished */ 21042e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach case GATT_UUID_HID_REPORT: 21052e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach case GATT_UUID_HID_BT_KB_INPUT: 21062e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach case GATT_UUID_HID_BT_MOUSE_INPUT: 21072e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach case GATT_UUID_HID_BT_KB_OUTPUT: 21082e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach cback_data.handle = p_dev_cb->hid_handle; 21092e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach cback_data.status = (p_data->status == BTA_GATT_OK)? BTA_HH_OK : BTA_HH_ERR; 21102e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_dev_cb->w4_evt = 0; 21112e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach (* bta_hh_cb.p_cback)(cb_evt, (tBTA_HH *)&cback_data); 21122e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach break; 21132e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 21142e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach case GATT_UUID_SCAN_INT_WINDOW: 21152e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_register_scpp_notif(p_dev_cb, p_data->status); 21162e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach break; 21172e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 21182e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 21192e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach default: 21202e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach break; 21212e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 21222e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 21232e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach} 21242e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/******************************************************************************* 21252e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 21262e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function bta_hh_le_write_char_descr_cmpl 21272e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 21282e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description Write charactersitic descriptor complete event 21292e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 21302e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Parameters: 21312e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 21322e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/ 21332e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_le_write_char_descr_cmpl(tBTA_HH_DEV_CB *p_dev_cb, tBTA_HH_DATA *p_buf) 21342e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{ 21352e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBTA_GATTC_WRITE *p_data = (tBTA_GATTC_WRITE *)p_buf; 21362e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach UINT8 srvc_inst_id, hid_inst_id; 21372e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 21382e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* only write client configuration possible */ 21392e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_data && p_data->descr_type.uuid.uu.uuid16 == GATT_UUID_CHAR_CLIENT_CONFIG) 21402e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 21412e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach srvc_inst_id = p_data->srvc_id.id.inst_id; 21422e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach hid_inst_id = srvc_inst_id; 21432e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach switch (p_data->char_id.uuid.uu.uuid16) 21442e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 21452e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach case GATT_UUID_BATTERY_LEVEL: /* battery level clt cfg registered */ 21462e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach hid_inst_id = bta_hh_le_find_service_inst_by_battery_inst_id(p_dev_cb, srvc_inst_id); 21472e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* fall through */ 21482e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach case GATT_UUID_HID_BT_KB_INPUT: 21492e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach case GATT_UUID_HID_BT_MOUSE_INPUT: 21502e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach case GATT_UUID_HID_REPORT: 21512e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_data->status == BTA_GATT_OK) 21522e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_dev_cb->hid_srvc[hid_inst_id].report[p_dev_cb->clt_cfg_idx ++].client_cfg_value = 21532e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach BTA_GATT_CLT_CONFIG_NOTIFICATION; 21542e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 21552e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_write_rpt_clt_cfg(p_dev_cb, hid_inst_id); 21562e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 21572e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach break; 21582e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 21592e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach case GATT_UUID_SCAN_REFRESH: 21602e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_register_scpp_notif_cmpl(p_dev_cb, p_data->status); 21612e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach break; 21622e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach default: 21632e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach APPL_TRACE_ERROR1("Unknown char ID clt cfg: 0x%04x", p_data->char_id.uuid.uu.uuid16); 21642e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 21652e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 21662e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach else 21672e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 21682e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if BTA_HH_DEBUG == TRUE 21692e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach APPL_TRACE_ERROR2("Unexpected write to %s(0x%04x)", 21702e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_uuid_to_str(p_data->descr_type.uuid.uu.uuid16), 21712e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_data->descr_type.uuid.uu.uuid16); 21722e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#else 21732e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach APPL_TRACE_ERROR1("Unexpected write to (0x%04x)", p_data->descr_type.uuid.uu.uuid16); 21742e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif 21752e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 21762e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 21772e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach} 21782e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/******************************************************************************* 21792e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 21802e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function bta_hh_le_input_rpt_notify 21812e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 21822e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description process the notificaton event, most likely for input report. 21832e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 21842e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Parameters: 21852e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 21862e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/ 21872e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_le_input_rpt_notify(tBTA_GATTC_NOTIFY *p_data) 21882e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{ 21892e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBTA_HH_DEV_CB *p_dev_cb = bta_hh_le_find_dev_cb_by_conn_id(p_data->conn_id); 21902e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach UINT8 app_id; 21912e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach UINT8 *p_buf; 21922e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBTA_HH_LE_RPT *p_rpt; 21932e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 21942e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_dev_cb == NULL) 21952e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 21962e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach APPL_TRACE_ERROR0("notification received from Unknown device"); 21972e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach return; 21982e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 21992e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 22002e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach app_id= p_dev_cb->app_id; 22012e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 22022e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_rpt = bta_hh_le_find_report_entry(p_dev_cb, 22032e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach BTA_HH_LE_SRVC_DEF, 22042e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_data->char_id.char_id.uuid.uu.uuid16, 22052e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_data->char_id.char_id.inst_id); 22062e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_rpt == NULL) 22072e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 22082e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach APPL_TRACE_ERROR0("notification received for Unknown Report"); 22092e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach return; 22102e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 22112e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 22122e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_data->char_id.char_id.uuid.uu.uuid16 == GATT_UUID_HID_BT_MOUSE_INPUT) 22132e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach app_id = BTA_HH_APP_ID_MI; 22142e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach else if (p_data->char_id.char_id.uuid.uu.uuid16 == GATT_UUID_HID_BT_KB_INPUT) 22152e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach app_id = BTA_HH_APP_ID_KB; 22162e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 22170ef5e93291bd4c6d8dedfd012cc27ee7c9b30c0dAndre Eisenbach APPL_TRACE_ERROR1("Notification received on report ID: %d", p_rpt->rpt_id); 22180ef5e93291bd4c6d8dedfd012cc27ee7c9b30c0dAndre Eisenbach 22192e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* need to append report ID to the head of data */ 22200ef5e93291bd4c6d8dedfd012cc27ee7c9b30c0dAndre Eisenbach if (p_rpt->rpt_id != 0) 22212e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 22220ef5e93291bd4c6d8dedfd012cc27ee7c9b30c0dAndre Eisenbach if ((p_buf = (UINT8 *)GKI_getbuf((UINT16)(p_data->len + 1))) == NULL) 22230ef5e93291bd4c6d8dedfd012cc27ee7c9b30c0dAndre Eisenbach { 22240ef5e93291bd4c6d8dedfd012cc27ee7c9b30c0dAndre Eisenbach APPL_TRACE_ERROR0("No resources to send report data"); 22250ef5e93291bd4c6d8dedfd012cc27ee7c9b30c0dAndre Eisenbach return; 22260ef5e93291bd4c6d8dedfd012cc27ee7c9b30c0dAndre Eisenbach } 22272e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 22280ef5e93291bd4c6d8dedfd012cc27ee7c9b30c0dAndre Eisenbach p_buf[0] = p_rpt->rpt_id; 22290ef5e93291bd4c6d8dedfd012cc27ee7c9b30c0dAndre Eisenbach memcpy(&p_buf[1], p_data->value, p_data->len); 22300ef5e93291bd4c6d8dedfd012cc27ee7c9b30c0dAndre Eisenbach ++p_data->len; 22310ef5e93291bd4c6d8dedfd012cc27ee7c9b30c0dAndre Eisenbach } else { 22320ef5e93291bd4c6d8dedfd012cc27ee7c9b30c0dAndre Eisenbach p_buf = p_data->value; 22330ef5e93291bd4c6d8dedfd012cc27ee7c9b30c0dAndre Eisenbach } 22342e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 22352e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_co_data((UINT8)p_dev_cb->hid_handle, 22362e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_buf, 22372e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_data->len, 22382e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_dev_cb->mode, 22392e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 0 , /* no sub class*/ 22402e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_dev_cb->dscp_info.ctry_code, 22412e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_dev_cb->addr, 22422e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach app_id); 22432e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 22440ef5e93291bd4c6d8dedfd012cc27ee7c9b30c0dAndre Eisenbach if (p_buf != p_data->value) 22450ef5e93291bd4c6d8dedfd012cc27ee7c9b30c0dAndre Eisenbach GKI_freebuf(p_buf); 22462e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach} 22472e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 22482e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 22492e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/******************************************************************************* 22502e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 22512e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function bta_hh_gatt_open_fail 22522e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 22532e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description action function to process the open fail 22542e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 22552e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Returns void 22562e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 22572e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/ 22582e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_le_open_fail(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data) 22592e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{ 22602e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBTA_HH_CONN conn_dat ; 22612e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBTA_HH_LE_HID_SRVC *p_hid_srvc = &p_cb->hid_srvc[0]; 22622e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach UINT8 i; 22632e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 22642e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_cb->disc_active = BTA_HH_LE_DISC_NONE; 22652e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* Failure in opening connection or GATT discovery failure */ 22662e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach conn_dat.handle = p_cb->hid_handle; 22672e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach memcpy(conn_dat.bda, p_cb->addr, BD_ADDR_LEN); 22682e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach conn_dat.le_hid = TRUE; 22692e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach conn_dat.scps_supported = p_cb->scps_supported; 22702e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 22712e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_cb->status == BTA_HH_OK) 22722e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach conn_dat.status = (p_data->le_close.reason == BTA_GATT_CONN_UNKNOWN) ? p_cb->status : BTA_HH_ERR; 22732e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach else 22742e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach conn_dat.status = p_cb->status; 22752e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 22762e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach for (i = 0; i < BTA_HH_LE_HID_SRVC_MAX; i ++, p_hid_srvc ++) 22772e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 22782e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach utl_freebuf((void **)&p_hid_srvc->rpt_map); 22792e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach memset(p_hid_srvc, 0, sizeof(tBTA_HH_LE_HID_SRVC)); 22802e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 22812e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 22822e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* Report OPEN fail event */ 22832e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach (*bta_hh_cb.p_cback)(BTA_HH_OPEN_EVT, (tBTA_HH *)&conn_dat); 22842e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 22852e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach} 22862e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/******************************************************************************* 22872e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 22882e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function bta_hh_gatt_close 22892e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 22902e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description action function to process the GATT close int he state machine. 22912e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 22922e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Returns void 22932e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 22942e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/ 22952e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_gatt_close(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data) 22962e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{ 22972e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBTA_HH_CBDATA disc_dat = {BTA_HH_OK, 0}; 22982e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 22992e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* finaliza device driver */ 23002e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_co_close(p_cb->hid_handle, p_cb->app_id); 23012e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* update total conn number */ 23022e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_cb.cnt_num --; 23032e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 23042e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach disc_dat.handle = p_cb->hid_handle; 23052e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach disc_dat.status = p_cb->status; 23062e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 23072e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach (*bta_hh_cb.p_cback)(BTA_HH_CLOSE_EVT, (tBTA_HH *)&disc_dat); 23082e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 23092e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* if no connection is active and HH disable is signaled, disable service */ 23102e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (bta_hh_cb.cnt_num == 0 && bta_hh_cb.w4_disable) 23112e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 23122e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_disc_cmpl(); 23132e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 23142e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach else 23152e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 23162e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if (BTA_HH_LE_RECONN == TRUE) 23172e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_data->le_close.reason == BTA_GATT_CONN_TIMEOUT) 23182e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 23192e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_add_dev_bg_conn(p_cb, FALSE); 23202e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 23212e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif 23222e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 23232e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 23242e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach return; 23252e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 23262e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach} 23272e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/******************************************************************************* 23282e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 23292e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function bta_hh_le_api_disc_act 23302e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 23312e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description initaite a Close API to a remote HID device 23322e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 23332e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Returns void 23342e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 23352e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/ 23362e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_le_api_disc_act(tBTA_HH_DEV_CB *p_cb) 23372e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{ 23382e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_cb->conn_id != BTA_GATT_INVALID_CONN_ID) 23392e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach BTA_GATTC_Close(p_cb->conn_id); 23402e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach} 23412e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 23422e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/******************************************************************************* 23432e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 23442e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function bta_hh_le_get_rpt 23452e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 23462e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description GET_REPORT on a LE HID Report 23472e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 23482e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Returns void 23492e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 23502e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/ 23512e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_le_get_rpt(tBTA_HH_DEV_CB *p_cb, UINT8 srvc_inst, tBTA_HH_RPT_TYPE r_type, UINT8 rpt_id) 23522e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{ 23532e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBTA_HH_LE_RPT *p_rpt = bta_hh_le_find_rpt_by_idtype(p_cb->hid_srvc[srvc_inst].report, p_cb->mode, r_type, rpt_id); 23542e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBTA_GATTC_CHAR_ID char_id; 23552e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach UINT16 srvc_uuid = UUID_SERVCLASS_LE_HID; 23562e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 23572e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_rpt == NULL) 23582e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 23592e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach APPL_TRACE_ERROR0("bta_hh_le_get_rpt: no matching report"); 23602e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach return; 23612e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 23622e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_rpt->uuid == GATT_UUID_BATTERY_LEVEL) 23632e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach srvc_uuid = UUID_SERVCLASS_BATTERY; 23642e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 23652e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_cb->w4_evt = BTA_HH_GET_RPT_EVT; 23662e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 23672e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_fill_16bits_srvc_id(TRUE, srvc_inst, srvc_uuid, &char_id.srvc_id); 23682e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_fill_16bits_char_id(p_rpt->inst_id, p_rpt->uuid, &char_id.char_id); 23692e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 23702e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach BTA_GATTC_ReadCharacteristic(p_cb->conn_id, 23712e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach &char_id, 23722e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach BTA_GATT_AUTH_REQ_NONE); 23732e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach} 23742e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 23752e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/******************************************************************************* 23762e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 23772e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function bta_hh_le_write_rpt 23782e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 23792e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description SET_REPORT/or DATA output on a LE HID Report 23802e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 23812e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Returns void 23822e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 23832e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/ 23842e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_le_write_rpt(tBTA_HH_DEV_CB *p_cb, UINT8 srvc_inst, 23852e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBTA_GATTC_WRITE_TYPE write_type, 23862e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBTA_HH_RPT_TYPE r_type, 23872e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach BT_HDR *p_buf, UINT16 w4_evt ) 23882e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{ 23892e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBTA_HH_LE_RPT *p_rpt; 23902e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBTA_GATTC_CHAR_ID char_id; 23912e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach UINT8 *p_value, rpt_id; 23922e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 23932e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_buf == NULL || p_buf->len == 0) 23942e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 23952e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach APPL_TRACE_ERROR0("bta_hh_le_write_rpt: Illegal data"); 23962e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach return; 23972e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 23982e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 23992e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* strip report ID from the data */ 24002e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_value = (UINT8 *)(p_buf + 1) + p_buf->offset; 24012e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach STREAM_TO_UINT8(rpt_id, p_value); 24022e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_buf->len -= 1; 24032e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 24042e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_rpt = bta_hh_le_find_rpt_by_idtype(p_cb->hid_srvc[srvc_inst].report, p_cb->mode, r_type, rpt_id); 24052e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 24062e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_rpt == NULL) 24072e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 24082e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach APPL_TRACE_ERROR0("bta_hh_le_write_rpt: no matching report"); 24092e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach return; 24102e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 24112e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 24122e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach APPL_TRACE_ERROR2("bta_hh_le_write_rpt: ReportID: 0x%02x Data Len: %d", rpt_id, p_buf->len); 24132e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 24142e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_cb->w4_evt = w4_evt; 24152e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 24162e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_fill_16bits_srvc_id(TRUE, srvc_inst, UUID_SERVCLASS_LE_HID, &char_id.srvc_id); 24172e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_fill_16bits_char_id(p_rpt->inst_id, p_rpt->uuid, &char_id.char_id); 24182e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 24192e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach BTA_GATTC_WriteCharValue(p_cb->conn_id, 24202e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach &char_id, 24212e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach write_type, /* default to use write request */ 24222e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_buf->len, 24232e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_value, 24242e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach BTA_GATT_AUTH_REQ_NONE); 24252e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 24262e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach} 24272e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/******************************************************************************* 24282e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 24292e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function bta_hh_le_suspend 24302e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 24312e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description send LE suspend or exit suspend mode to remote device. 24322e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 24332e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Returns void 24342e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 24352e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/ 24362e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_le_suspend(tBTA_HH_DEV_CB *p_cb, tBTA_HH_TRANS_CTRL_TYPE ctrl_type) 24372e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{ 24382e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach UINT8 i; 24392e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBTA_GATTC_CHAR_ID char_id; 24402e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 24412e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach ctrl_type -= BTA_HH_CTRL_SUSPEND; 24422e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 24432e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach for (i = 0; i < BTA_HH_LE_HID_SRVC_MAX; i ++) 24442e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 24452e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_fill_16bits_srvc_id(TRUE, i, UUID_SERVCLASS_LE_HID, &char_id.srvc_id); 24462e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_fill_16bits_char_id(0, GATT_UUID_HID_CONTROL_POINT, &char_id.char_id); 24472e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 24482e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach BTA_GATTC_WriteCharValue(p_cb->conn_id, 24492e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach &char_id, 24502e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach BTA_GATTC_TYPE_WRITE_NO_RSP, /* default to use write request */ 24512e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 1, 24522e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach &ctrl_type, 24532e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach BTA_GATT_AUTH_REQ_NONE); 24542e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 24552e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach} 24562e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 24572e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/******************************************************************************* 24582e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 24592e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function bta_hh_le_write_dev_act 24602e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 24612e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description Write LE device action. can be SET/GET/DATA transaction. 24622e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 24632e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Returns void 24642e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 24652e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/ 24662e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_le_write_dev_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data) 24672e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{ 24682e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach switch(p_data->api_sndcmd.t_type) 24692e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 24702e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach case HID_TRANS_SET_PROTOCOL: 24712e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_cb->w4_evt = BTA_HH_SET_PROTO_EVT; 24722e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_set_protocol_mode(p_cb, p_data->api_sndcmd.param); 24732e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach break; 24742e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 24752e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach case HID_TRANS_GET_PROTOCOL: 24762e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_get_protocol_mode(p_cb); 24772e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach break; 24782e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 24792e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach case HID_TRANS_GET_REPORT: 24802e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_get_rpt(p_cb, 24812e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach BTA_HH_LE_SRVC_DEF, 24822e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_data->api_sndcmd.param, 24832e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_data->api_sndcmd.rpt_id); 24842e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach break; 24852e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 24862e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach case HID_TRANS_SET_REPORT: 24872e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_write_rpt(p_cb, 24882e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach BTA_HH_LE_SRVC_DEF, 24892e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach BTA_GATTC_TYPE_WRITE, 24902e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_data->api_sndcmd.param, 24912e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_data->api_sndcmd.p_data, 24922e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach BTA_HH_SET_RPT_EVT); 24932e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach break; 24942e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 24952e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach case HID_TRANS_DATA: /* output report */ 24962e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 24972e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_write_rpt(p_cb, 24982e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach BTA_HH_LE_SRVC_DEF, 24992e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach BTA_GATTC_TYPE_WRITE_NO_RSP, 25002e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_data->api_sndcmd.param, 25012e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_data->api_sndcmd.p_data, 25022e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach BTA_HH_DATA_EVT); 25032e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach break; 25042e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 25052e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach case HID_TRANS_CONTROL: 25062e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* no handshake event will be generated */ 25072e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* if VC_UNPLUG is issued, set flag */ 25082e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_data->api_sndcmd.param == BTA_HH_CTRL_SUSPEND || 25092e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_data->api_sndcmd.param == BTA_HH_CTRL_EXIT_SUSPEND) 25102e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 25112e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_suspend(p_cb, p_data->api_sndcmd.param); 25122e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 25132e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach break; 25142e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 25152e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach default: 25162e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach APPL_TRACE_ERROR1("unsupported trsanction for LE HID device: %d", p_data->api_sndcmd.t_type); 25172e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach break; 25182e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 25192e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 25202e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach} 25212e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/******************************************************************************* 25222e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 25232e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function bta_hh_le_get_dscp_act 25242e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 25252e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description Send ReportDescriptor to application for all HID services. 25262e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 25272e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Returns void 25282e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 25292e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/ 25302e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_le_get_dscp_act(tBTA_HH_DEV_CB *p_cb) 25312e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{ 25322e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach UINT8 i; 25332e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 25342e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach for (i = 0 ;i < BTA_HH_LE_HID_SRVC_MAX; i ++) 25352e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 25362e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_cb->hid_srvc[i].in_use) 25372e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 25382e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_cb->dscp_info.descriptor.dl_len = p_cb->hid_srvc[i].descriptor.dl_len; 25392e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_cb->dscp_info.descriptor.dsc_list = p_cb->hid_srvc[i].descriptor.dsc_list; 25402e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 25412e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach (*bta_hh_cb.p_cback)(BTA_HH_GET_DSCP_EVT, (tBTA_HH *)&p_cb->dscp_info); 25422e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 25432e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach else 25442e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach break; 25452e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 25462e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach} 25472e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 25482e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/******************************************************************************* 25492e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 25502e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function bta_hh_le_add_dev_bg_conn 25512e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 25522e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description Remove a LE HID device from back ground connection procedure. 25532e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 25542e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Returns void 25552e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 25562e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/ 25572e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachstatic void bta_hh_le_add_dev_bg_conn(tBTA_HH_DEV_CB *p_cb, BOOLEAN check_bond) 25582e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{ 25592e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach UINT8 sec_flag=0; 25602e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach BOOLEAN to_add = TRUE; 25612e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 25622e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (check_bond) 25632e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 25642e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* start reconnection if remote is a bonded device */ 25652e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* verify bond */ 25662e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach BTM_GetSecurityFlags(p_cb->addr, &sec_flag); 25672e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 25682e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if ((sec_flag & BTM_SEC_FLAG_LKEY_KNOWN) == 0) 25692e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach to_add = FALSE; 25702e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 25712e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 25722e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (/*p_cb->dscp_info.flag & BTA_HH_LE_NORMAL_CONN &&*/ 25732e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach !p_cb->in_bg_conn && to_add) 25742e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 25752e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* add device into BG connection to accept remote initiated connection */ 25762e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach BTA_GATTC_Open(bta_hh_cb.gatt_if, p_cb->addr, FALSE); 25772e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_cb->in_bg_conn = TRUE; 25782e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 25792e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach BTA_DmBleSetBgConnType(BTA_DM_BLE_CONN_AUTO, NULL); 25802e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 25812e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach return; 25822e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach} 25832e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 25842e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/******************************************************************************* 25852e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 25862e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function bta_hh_le_add_device 25872e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 25882e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description Add a LE HID device as a known device, and also add the address 25892e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** into back ground connection WL for incoming connection. 25902e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 25912e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Returns void 25922e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 25932e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/ 25942e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre EisenbachUINT8 bta_hh_le_add_device(tBTA_HH_DEV_CB *p_cb, tBTA_HH_MAINT_DEV *p_dev_info) 25952e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{ 25962e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 25972e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* update DI information */ 25982e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_update_di_info(p_cb, 25992e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_dev_info->dscp_info.vendor_id, 26002e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_dev_info->dscp_info.product_id, 26012e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_dev_info->dscp_info.version, 26022e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_dev_info->dscp_info.flag); 26032e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 26042e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* add to BTA device list */ 26052e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_add_device_to_list(p_cb, p_cb->hid_handle, 26062e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_dev_info->attr_mask, 26072e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach &p_dev_info->dscp_info.descriptor, 26082e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_dev_info->sub_class, 26092e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_dev_info->dscp_info.ssr_max_latency, 26102e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_dev_info->dscp_info.ssr_min_tout, 26112e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_dev_info->app_id); 26122e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 26132e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_add_dev_bg_conn(p_cb, FALSE); 26142e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 26152e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach return p_cb->hid_handle; 26162e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach} 26172e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 26182e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/******************************************************************************* 26192e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 26202e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function bta_hh_le_remove_dev_bg_conn 26212e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 26222e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description Remove a LE HID device from back ground connection procedure. 26232e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 26242e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Returns void 26252e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 26262e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/ 26272e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_le_remove_dev_bg_conn(tBTA_HH_DEV_CB *p_dev_cb) 26282e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{ 26292e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_dev_cb->in_bg_conn) 26302e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 26312e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_dev_cb->in_bg_conn = FALSE; 26322e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 26332e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach BTA_GATTC_CancelOpen(bta_hh_cb.gatt_if, p_dev_cb->addr, FALSE); 26342e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 26352e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach} 26362e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/******************************************************************************* 26372e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 26382e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function bta_hh_le_update_scpp 26392e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 26402e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description action function to update the scan parameters on remote HID 26412e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** device 26422e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 26432e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Parameters: 26442e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 26452e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/ 26462e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_le_update_scpp(tBTA_HH_DEV_CB *p_dev_cb, tBTA_HH_DATA *p_buf) 26472e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{ 26482e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBTA_GATTC_CHAR_ID char_id; 26492e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach UINT8 value[4], *p = value; 26502e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBTA_HH_CBDATA cback_data ; 26512e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 26522e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (!p_dev_cb->is_le_device || 26532e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_dev_cb->mode != BTA_HH_PROTO_RPT_MODE || 26542e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_dev_cb->scps_supported == FALSE) 26552e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 26562e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach APPL_TRACE_ERROR0("Can not set ScPP scan paramter as boot host, or remote does not support ScPP "); 26572e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 26582e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach cback_data.handle = p_dev_cb->hid_handle; 26592e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach cback_data.status = BTA_HH_ERR; 26602e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach (* bta_hh_cb.p_cback)(BTA_HH_UPDATE_SCPP_EVT, (tBTA_HH *)&cback_data); 26612e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 26622e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach return; 26632e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 26642e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 26652e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_dev_cb->w4_evt = BTA_HH_UPDATE_SCPP_EVT; 26662e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 26672e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach UINT16_TO_STREAM(p, p_buf->le_scpp_update.scan_int); 26682e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach UINT16_TO_STREAM(p, p_buf->le_scpp_update.scan_win); 26692e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 26702e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_fill_16bits_srvc_id(TRUE, BTA_HH_SCPP_INST_DEF, UUID_SERVCLASS_SCAN_PARAM, &char_id.srvc_id); 26712e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_fill_16bits_char_id(BTA_HH_SCPP_INST_DEF, GATT_UUID_SCAN_INT_WINDOW, &char_id.char_id); 26722e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 26732e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach BTA_GATTC_WriteCharValue(p_dev_cb->conn_id, 26742e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach &char_id, 26752e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach BTA_GATTC_TYPE_WRITE_NO_RSP, 26762e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 2, 26772e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach value, 26782e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach BTA_GATT_AUTH_REQ_NONE); 26792e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 26802e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach} 26812e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/******************************************************************************* 26822e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 26832e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function bta_hh_gattc_callback 26842e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 26852e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description This is GATT client callback function used in BTA HH. 26862e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 26872e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Parameters: 26882e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 26892e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/ 26902e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachstatic void bta_hh_gattc_callback(tBTA_GATTC_EVT event, tBTA_GATTC *p_data) 26912e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{ 26922e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBTA_HH_DEV_CB *p_dev_cb; 26932e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach UINT16 evt; 26942e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if BTA_HH_DEBUG 26952e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach APPL_TRACE_DEBUG1("bta_hh_gattc_callback event = %d", event); 26962e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif 26972e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_data == NULL) 26982e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach return; 26992e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 27002e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach switch (event) 27012e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 27022e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach case BTA_GATTC_REG_EVT: /* 0 */ 27032e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_register_cmpl(&p_data->reg_oper); 27042e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach break; 27052e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 27062e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach case BTA_GATTC_DEREG_EVT: /* 1 */ 27072e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_cleanup_disable(p_data->reg_oper.status); 27082e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach break; 27092e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 27102e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach case BTA_GATTC_OPEN_EVT: /* 2 */ 27112e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_dev_cb = bta_hh_le_find_dev_cb_by_bda(p_data->open.remote_bda); 27122e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_sm_execute(p_dev_cb, BTA_HH_GATT_OPEN_EVT, (tBTA_HH_DATA *)&p_data->open); 27132e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach break; 27142e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 27152e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach case BTA_GATTC_READ_CHAR_EVT: /* 3 */ 27162e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach case BTA_GATTC_READ_DESCR_EVT: /* 8 */ 27172e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_dev_cb = bta_hh_le_find_dev_cb_by_conn_id(p_data->read.conn_id); 27182e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (event == BTA_GATTC_READ_CHAR_EVT) 27192e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach evt = BTA_HH_GATT_READ_CHAR_CMPL_EVT; 27202e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach else 27212e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach evt = BTA_HH_GATT_READ_DESCR_CMPL_EVT; 27222e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 27232e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_sm_execute(p_dev_cb, evt, (tBTA_HH_DATA *)&p_data->read); 27242e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach break; 27252e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 27262e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach case BTA_GATTC_WRITE_DESCR_EVT: /* 9 */ 27272e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach case BTA_GATTC_WRITE_CHAR_EVT: /* 4 */ 27282e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_dev_cb = bta_hh_le_find_dev_cb_by_conn_id(p_data->write.conn_id); 27292e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (event == BTA_GATTC_WRITE_CHAR_EVT) 27302e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach evt = BTA_HH_GATT_WRITE_CHAR_CMPL_EVT; 27312e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach else 27322e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach evt = BTA_HH_GATT_WRITE_DESCR_CMPL_EVT; 27332e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 27342e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_sm_execute(p_dev_cb, evt, (tBTA_HH_DATA *)&p_data->write); 27352e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach break; 27362e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 27372e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach case BTA_GATTC_CLOSE_EVT: /* 5 */ 27382e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_close(&p_data->close); 27392e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach break; 27402e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 27412e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach case BTA_GATTC_SEARCH_CMPL_EVT: /* 6 */ 27422e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_srvc_search_cmpl(&p_data->search_cmpl); 27432e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach break; 27442e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 27452e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach case BTA_GATTC_SEARCH_RES_EVT: /* 7 */ 27462e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_search_result(&p_data->srvc_res); 27472e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach break; 27482e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 27492e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 27502e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 27512e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach case BTA_GATTC_NOTIF_EVT: /* 10 */ 27522e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_input_rpt_notify(&p_data->notify); 27532e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach break; 27542e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach default: 27552e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach break; 27562e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 27572e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach} 27582e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 27592e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/******************************************************************************* 27602e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 27612e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function bta_hh_le_hid_read_rpt_clt_cfg 27622e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 27632e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description a test command to read report descriptor client configuration 27642e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 27652e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Returns void 27662e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 27672e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/ 27682e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_le_hid_read_rpt_clt_cfg(BD_ADDR bd_addr, UINT8 rpt_id) 27692e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{ 27702e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBTA_HH_DEV_CB *p_cb = NULL; 27712e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBTA_HH_LE_RPT *p_rpt ; 27722e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach UINT8 index = BTA_HH_IDX_INVALID; 27732e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 27742e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach index = bta_hh_find_cb(bd_addr); 27752e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if ((index = bta_hh_find_cb(bd_addr))== BTA_HH_IDX_INVALID) 27762e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 27772e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach APPL_TRACE_ERROR0("unknown device"); 27782e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach return; 27792e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 27802e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 27812e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_cb = &bta_hh_cb.kdev[index]; 27822e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 27832e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_rpt = bta_hh_le_find_rpt_by_idtype(p_cb->hid_srvc[BTA_HH_LE_SRVC_DEF].report, p_cb->mode, BTA_HH_RPTT_INPUT, rpt_id); 27842e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 27852e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (p_rpt == NULL) 27862e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 27872e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach APPL_TRACE_ERROR0("bta_hh_le_write_rpt: no matching report"); 27882e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach return; 27892e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 27902e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 27912e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_read_char_dscrpt(p_cb, 27922e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach UUID_SERVCLASS_LE_HID, 27932e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach BTA_HH_LE_SRVC_DEF, 27942e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_rpt->uuid, 27952e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_rpt->inst_id, 27962e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach GATT_UUID_CHAR_CLIENT_CONFIG); 27972e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 27982e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 27992e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 28002e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach return; 28012e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach} 28022e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/******************************************************************************* 28032e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 28042e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function bta_hh_le_search_scps 28052e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 28062e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description discovery scan parameter service if act as report host, otherwise 28072e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** finish LE connection. 28082e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 28092e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Parameters: 28102e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 28112e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/ 28122e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachstatic void bta_hh_le_search_scps(tBTA_HH_DEV_CB *p_cb) 28132e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{ 28142e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBT_UUID pri_srvc; 28152e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 28162e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if ( p_cb->mode == BTA_HH_PROTO_RPT_MODE) 28172e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 28182e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_cb->disc_active |= BTA_HH_LE_DISC_SCPS; 28192e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* start service discovery for Scan Parameter service */ 28202e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach pri_srvc.len = LEN_UUID_16; 28212e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach pri_srvc.uu.uuid16 = UUID_SERVCLASS_SCAN_PARAM; 28222e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 28232e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach BTA_GATTC_ServiceSearchRequest(p_cb->conn_id, &pri_srvc); 28242e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 28252e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach else 28262e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_open_cmpl(p_cb); 28272e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach} 28282e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/******************************************************************************* 28292e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 28302e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function bta_hh_le_search_scps_chars 28312e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 28322e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description find ScPS optional characteristics scan refresh 28332e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 28342e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Parameters: 28352e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 28362e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/ 28372e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachstatic void bta_hh_le_search_scps_chars(tBTA_HH_DEV_CB *p_cb) 28382e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{ 28392e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBTA_GATT_SRVC_ID srvc_id; 28402e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBT_UUID char_cond; 28412e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBTA_GATTC_CHAR_ID char_result; 28422e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBTA_GATT_CHAR_PROP prop; 28432e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 28442e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_cb->scps_supported = TRUE; 28452e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_fill_16bits_srvc_id(TRUE, 0, UUID_SERVCLASS_SCAN_PARAM, &srvc_id); 28462e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 28472e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach char_cond.len = LEN_UUID_16; 28482e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach char_cond.uu.uuid16 = GATT_UUID_SCAN_REFRESH; 28492e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 28502e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* look for scan refresh */ 28512e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (BTA_GATTC_GetFirstChar( p_cb->conn_id, 28522e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach &srvc_id, 28532e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach &char_cond, 28542e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach &char_result, 28552e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach &prop) == BTA_GATT_OK) 28562e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 28572e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (prop & BTA_GATT_CHAR_PROP_BIT_NOTIFY) 28582e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_cb->scps_notify |= BTA_HH_LE_SCPS_NOTIFY_SPT; 28592e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach else 28602e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_cb->scps_notify = BTA_HH_LE_SCPS_NOTIFY_NONE; 28612e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 28622e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 28632e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach} 28642e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 28652e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/******************************************************************************* 28662e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 28672e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function bta_hh_le_register_scpp_notif 28682e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 28692e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description register scan parameter refresh notitication complete 28702e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 28712e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 28722e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Parameters: 28732e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 28742e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/ 28752e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachstatic void bta_hh_le_register_scpp_notif(tBTA_HH_DEV_CB *p_dev_cb, tBTA_GATT_STATUS status) 28762e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{ 28772e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach UINT8 sec_flag=0; 28782e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBTA_GATTC_CHAR_ID char_id; 28792e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 28802e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* if write scan parameter sucessful */ 28812e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* if bonded and notification is not enabled, configure the client configuration */ 28822e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (status == BTA_GATT_OK && 28832e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach (p_dev_cb->scps_notify & BTA_HH_LE_SCPS_NOTIFY_SPT) != 0 && 28842e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach (p_dev_cb->scps_notify & BTA_HH_LE_SCPS_NOTIFY_ENB) == 0) 28852e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 28862e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach BTM_GetSecurityFlags(p_dev_cb->addr, &sec_flag); 28872e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if ((sec_flag & BTM_SEC_FLAG_LKEY_KNOWN)) 28882e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 28892e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (bta_hh_le_write_char_clt_cfg (p_dev_cb, 28902e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach BTA_HH_SCPP_INST_DEF, 28912e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach UUID_SERVCLASS_SCAN_PARAM, 28922e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach BTA_HH_SCPP_INST_DEF, 28932e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach GATT_UUID_SCAN_REFRESH, 28942e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach BTA_GATT_CLT_CONFIG_NOTIFICATION)) 28952e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach { 28962e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_fill_16bits_srvc_id(TRUE, BTA_HH_SCPP_INST_DEF, UUID_SERVCLASS_SCAN_PARAM, &char_id.srvc_id); 28972e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_fill_16bits_char_id(BTA_HH_SCPP_INST_DEF, GATT_UUID_SCAN_REFRESH, &char_id.char_id); 28982e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 28992e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach BTA_GATTC_RegisterForNotifications(bta_hh_cb.gatt_if, 29002e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_dev_cb->addr, 29012e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach &char_id); 29022e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach return; 29032e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 29042e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 29052e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach } 29062e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach bta_hh_le_register_scpp_notif_cmpl(p_dev_cb, status); 29072e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach} 29082e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/******************************************************************************* 29092e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 29102e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function bta_hh_le_register_scpp_notif_cmpl 29112e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 29122e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description action function to register scan parameter refresh notitication 29132e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 29142e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Parameters: 29152e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** 29162e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/ 29172e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachstatic void bta_hh_le_register_scpp_notif_cmpl(tBTA_HH_DEV_CB *p_dev_cb, tBTA_GATT_STATUS status) 29182e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{ 29192e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach tBTA_HH_CBDATA cback_data ; 29202e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach UINT16 cb_evt = p_dev_cb->w4_evt; 29212e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 29222e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (status == BTA_GATT_OK) 29232e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_dev_cb->scps_notify = (BTA_HH_LE_SCPS_NOTIFY_ENB | BTA_HH_LE_SCPS_NOTIFY_SPT); 29242e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 29252e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach cback_data.handle = p_dev_cb->hid_handle; 29262e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach cback_data.status = (status == BTA_GATT_OK)? BTA_HH_OK : BTA_HH_ERR; 29272e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_dev_cb->w4_evt = 0; 29282e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach (* bta_hh_cb.p_cback)(cb_evt, (tBTA_HH *)&cback_data); 29292e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 29302e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 29312e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach} 29322e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif 29332e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 29342e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 29352e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 29362e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 2937