1 /******************************************************************************
2 *
3 * Copyright 2002-2012 Broadcom Corporation
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at:
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 *
17 ******************************************************************************/
18
19 /******************************************************************************
20 *
21 * This file contains HID protocol definitions
22 *
23 ******************************************************************************/
24
25 #ifndef HIDDEFS_H
26 #define HIDDEFS_H
27
28 #include <base/strings/stringprintf.h>
29 #include <bluetooth/log.h>
30
31 #include "internal_include/bt_target.h"
32 #include "macros.h"
33 #include "stack/include/sdp_api.h"
34 /*
35 * tHID_STATUS: HID result codes, returned by HID and device and host functions.
36 */
37 typedef enum : uint8_t {
38 HID_SUCCESS = 0,
39 HID_ERR_NOT_REGISTERED,
40 HID_ERR_ALREADY_REGISTERED,
41 HID_ERR_NO_RESOURCES,
42 HID_ERR_NO_CONNECTION,
43 HID_ERR_INVALID_PARAM,
44 HID_ERR_UNSUPPORTED,
45 HID_ERR_UNKNOWN_COMMAND,
46 HID_ERR_CONGESTED,
47 HID_ERR_CONN_IN_PROCESS,
48 HID_ERR_ALREADY_CONN,
49 HID_ERR_DISCONNECTING,
50 HID_ERR_SET_CONNABLE_FAIL,
51 /* Device specific error codes */
52 HID_ERR_HOST_UNKNOWN,
53 HID_ERR_L2CAP_FAILED,
54 HID_ERR_AUTH_FAILED,
55 HID_ERR_SDP_BUSY,
56 HID_ERR_GATT,
57
58 HID_ERR_INVALID = 0xFF
59 } tHID_STATUS;
60
hid_status_text(const tHID_STATUS & status)61 inline std::string hid_status_text(const tHID_STATUS& status) {
62 switch (status) {
63 CASE_RETURN_TEXT(HID_SUCCESS);
64 CASE_RETURN_TEXT(HID_ERR_NOT_REGISTERED);
65 CASE_RETURN_TEXT(HID_ERR_ALREADY_REGISTERED);
66 CASE_RETURN_TEXT(HID_ERR_NO_RESOURCES);
67 CASE_RETURN_TEXT(HID_ERR_NO_CONNECTION);
68 CASE_RETURN_TEXT(HID_ERR_INVALID_PARAM);
69 CASE_RETURN_TEXT(HID_ERR_UNSUPPORTED);
70 CASE_RETURN_TEXT(HID_ERR_UNKNOWN_COMMAND);
71 CASE_RETURN_TEXT(HID_ERR_CONGESTED);
72 CASE_RETURN_TEXT(HID_ERR_CONN_IN_PROCESS);
73 CASE_RETURN_TEXT(HID_ERR_ALREADY_CONN);
74 CASE_RETURN_TEXT(HID_ERR_DISCONNECTING);
75 CASE_RETURN_TEXT(HID_ERR_SET_CONNABLE_FAIL);
76 CASE_RETURN_TEXT(HID_ERR_HOST_UNKNOWN);
77 CASE_RETURN_TEXT(HID_ERR_L2CAP_FAILED);
78 CASE_RETURN_TEXT(HID_ERR_AUTH_FAILED);
79 CASE_RETURN_TEXT(HID_ERR_SDP_BUSY);
80 CASE_RETURN_TEXT(HID_ERR_GATT);
81 CASE_RETURN_TEXT(HID_ERR_INVALID);
82 default:
83 return base::StringPrintf("UNKNOWN[%hhu]", status);
84 }
85 }
86
87 #define HID_L2CAP_CONN_FAIL \
88 (0x0100) /* Connection Attempt was made but failed */
89 #define HID_L2CAP_REQ_FAIL (0x0200) /* L2CAP_ConnectReq API failed */
90 #define HID_L2CAP_CFG_FAIL \
91 (0x0400) /* L2CAP Configuration was rejected by peer */
92
93 /* Define the HID transaction types
94 */
95 #define HID_TRANS_HANDSHAKE (0)
96 #define HID_TRANS_CONTROL (1)
97 #define HID_TRANS_GET_REPORT (4)
98 #define HID_TRANS_SET_REPORT (5)
99 #define HID_TRANS_GET_PROTOCOL (6)
100 #define HID_TRANS_SET_PROTOCOL (7)
101 #define HID_TRANS_GET_IDLE (8)
102 #define HID_TRANS_SET_IDLE (9)
103 #define HID_TRANS_DATA (10)
104 #define HID_TRANS_DATAC (11)
105
106 #define HID_GET_TRANS_FROM_HDR(x) (((x) >> 4) & 0x0f)
107 #define HID_GET_PARAM_FROM_HDR(x) ((x)&0x0f)
108 #define HID_BUILD_HDR(t, p) (uint8_t)(((t) << 4) | ((p)&0x0f))
109
110 /* Parameters for Handshake
111 */
112 #define HID_PAR_HANDSHAKE_RSP_SUCCESS (0)
113 #define HID_PAR_HANDSHAKE_RSP_NOT_READY (1)
114 #define HID_PAR_HANDSHAKE_RSP_ERR_INVALID_REP_ID (2)
115 #define HID_PAR_HANDSHAKE_RSP_ERR_UNSUPPORTED_REQ (3)
116 #define HID_PAR_HANDSHAKE_RSP_ERR_INVALID_PARAM (4)
117 #define HID_PAR_HANDSHAKE_RSP_ERR_UNKNOWN (14)
118 #define HID_PAR_HANDSHAKE_RSP_ERR_FATAL (15)
119
120 /* Parameters for Control
121 */
122 #define HID_PAR_CONTROL_NOP (0)
123 #define HID_PAR_CONTROL_HARD_RESET (1)
124 #define HID_PAR_CONTROL_SOFT_RESET (2)
125 #define HID_PAR_CONTROL_SUSPEND (3)
126 #define HID_PAR_CONTROL_EXIT_SUSPEND (4)
127 #define HID_PAR_CONTROL_VIRTUAL_CABLE_UNPLUG (5)
128
129 /* Different report types in get, set, data
130 */
131 #define HID_PAR_REP_TYPE_MASK (0x03)
132 #define HID_PAR_REP_TYPE_OTHER (0x00)
133 #define HID_PAR_REP_TYPE_INPUT (0x01)
134 #define HID_PAR_REP_TYPE_OUTPUT (0x02)
135 #define HID_PAR_REP_TYPE_FEATURE (0x03)
136
137 /* Parameters for Get Report
138 */
139
140 /* Buffer size in two bytes after Report ID */
141 #define HID_PAR_GET_REP_BUFSIZE_FOLLOWS (0x08)
142
143 /* Parameters for Protocol Type
144 */
145 #define HID_PAR_PROTOCOL_MASK (0x01)
146 #define HID_PAR_PROTOCOL_REPORT (0x01)
147 #define HID_PAR_PROTOCOL_BOOT_MODE (0x00)
148
149 #define HID_PAR_REP_TYPE_MASK (0x03)
150
151 /* Descriptor types in the SDP record
152 */
153 #define HID_SDP_DESCRIPTOR_REPORT (0x22)
154 #define HID_SDP_DESCRIPTOR_PHYSICAL (0x23)
155
156 typedef struct desc_info {
157 uint16_t dl_len;
158 uint8_t* dsc_list;
159 } tHID_DEV_DSCP_INFO;
160
161 #define HID_SSR_PARAM_INVALID 0xffff
162
163 #define HIDD_APP_DESCRIPTOR_LEN 2048
164
165 typedef struct sdp_info {
166 char svc_name[HID_MAX_SVC_NAME_LEN]; /*Service Name */
167 char svc_descr[HID_MAX_SVC_DESCR_LEN]; /*Service Description*/
168 char prov_name[HID_MAX_PROV_NAME_LEN]; /*Provider Name.*/
169 uint16_t rel_num; /*Release Number */
170 uint16_t hpars_ver; /*HID Parser Version.*/
171 uint16_t ssr_max_latency; /* HIDSSRHostMaxLatency value, if
172 HID_SSR_PARAM_INVALID not used*/
173 uint16_t
174 ssr_min_tout; /* HIDSSRHostMinTimeout value, if HID_SSR_PARAM_INVALID not
175 used* */
176 uint8_t sub_class; /*Device Subclass.*/
177 uint8_t ctry_code; /*Country Code.*/
178 uint16_t sup_timeout; /* Supervisory Timeout */
179
180 tHID_DEV_DSCP_INFO dscp_info; /* Descriptor list and Report list to be set in
181 the SDP record.
182 This parameter is used if
183 HID_DEV_USE_GLB_SDP_REC is set to false.*/
184 tSDP_DISC_REC* p_sdp_layer_rec;
185 } tHID_DEV_SDP_INFO;
186
187 namespace fmt {
188 template <>
189 struct formatter<tHID_STATUS> : enum_formatter<tHID_STATUS> {};
190 } // namespace fmt
191
192 #endif
193