• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 <bluetooth/log.h>
29 
30 #include "internal_include/bt_target.h"
31 #include "macros.h"
32 #include "stack/include/sdp_api.h"
33 /*
34  * tHID_STATUS: HID result codes, returned by HID and device and host functions.
35  */
36 typedef enum : uint8_t {
37   HID_SUCCESS = 0,
38   HID_ERR_NOT_REGISTERED,
39   HID_ERR_ALREADY_REGISTERED,
40   HID_ERR_NO_RESOURCES,
41   HID_ERR_NO_CONNECTION,
42   HID_ERR_INVALID_PARAM,
43   HID_ERR_UNSUPPORTED,
44   HID_ERR_UNKNOWN_COMMAND,
45   HID_ERR_CONGESTED,
46   HID_ERR_CONN_IN_PROCESS,
47   HID_ERR_ALREADY_CONN,
48   HID_ERR_DISCONNECTING,
49   HID_ERR_SET_CONNABLE_FAIL,
50   /* Device specific error codes */
51   HID_ERR_HOST_UNKNOWN,
52   HID_ERR_L2CAP_FAILED,
53   HID_ERR_AUTH_FAILED,
54   HID_ERR_SDP_BUSY,
55   HID_ERR_GATT,
56 
57   HID_ERR_INVALID = 0xFF
58 } tHID_STATUS;
59 
hid_status_text(const tHID_STATUS & status)60 inline std::string hid_status_text(const tHID_STATUS& status) {
61   switch (status) {
62     CASE_RETURN_TEXT(HID_SUCCESS);
63     CASE_RETURN_TEXT(HID_ERR_NOT_REGISTERED);
64     CASE_RETURN_TEXT(HID_ERR_ALREADY_REGISTERED);
65     CASE_RETURN_TEXT(HID_ERR_NO_RESOURCES);
66     CASE_RETURN_TEXT(HID_ERR_NO_CONNECTION);
67     CASE_RETURN_TEXT(HID_ERR_INVALID_PARAM);
68     CASE_RETURN_TEXT(HID_ERR_UNSUPPORTED);
69     CASE_RETURN_TEXT(HID_ERR_UNKNOWN_COMMAND);
70     CASE_RETURN_TEXT(HID_ERR_CONGESTED);
71     CASE_RETURN_TEXT(HID_ERR_CONN_IN_PROCESS);
72     CASE_RETURN_TEXT(HID_ERR_ALREADY_CONN);
73     CASE_RETURN_TEXT(HID_ERR_DISCONNECTING);
74     CASE_RETURN_TEXT(HID_ERR_SET_CONNABLE_FAIL);
75     CASE_RETURN_TEXT(HID_ERR_HOST_UNKNOWN);
76     CASE_RETURN_TEXT(HID_ERR_L2CAP_FAILED);
77     CASE_RETURN_TEXT(HID_ERR_AUTH_FAILED);
78     CASE_RETURN_TEXT(HID_ERR_SDP_BUSY);
79     CASE_RETURN_TEXT(HID_ERR_GATT);
80     CASE_RETURN_TEXT(HID_ERR_INVALID);
81     default:
82       return std::format("UNKNOWN[{}]", static_cast<uint8_t>(status));
83   }
84 }
85 
86 #define HID_L2CAP_CONN_FAIL (0x0100) /* Connection Attempt was made but failed */
87 #define HID_L2CAP_REQ_FAIL (0x0200)  /* L2CAP_ConnectReq API failed */
88 #define HID_L2CAP_CFG_FAIL (0x0400)  /* L2CAP Configuration was rejected by peer */
89 
90 /* Define the HID transaction types
91  */
92 #define HID_TRANS_HANDSHAKE (0)
93 #define HID_TRANS_CONTROL (1)
94 #define HID_TRANS_GET_REPORT (4)
95 #define HID_TRANS_SET_REPORT (5)
96 #define HID_TRANS_GET_PROTOCOL (6)
97 #define HID_TRANS_SET_PROTOCOL (7)
98 #define HID_TRANS_GET_IDLE (8)
99 #define HID_TRANS_SET_IDLE (9)
100 #define HID_TRANS_DATA (10)
101 #define HID_TRANS_DATAC (11)
102 
103 #define HID_GET_TRANS_FROM_HDR(x) (((x) >> 4) & 0x0f)
104 #define HID_GET_PARAM_FROM_HDR(x) ((x) & 0x0f)
105 #define HID_BUILD_HDR(t, p) (uint8_t)(((t) << 4) | ((p) & 0x0f))
106 
107 /* Parameters for Handshake
108  */
109 #define HID_PAR_HANDSHAKE_RSP_SUCCESS (0)
110 #define HID_PAR_HANDSHAKE_RSP_NOT_READY (1)
111 #define HID_PAR_HANDSHAKE_RSP_ERR_INVALID_REP_ID (2)
112 #define HID_PAR_HANDSHAKE_RSP_ERR_UNSUPPORTED_REQ (3)
113 #define HID_PAR_HANDSHAKE_RSP_ERR_INVALID_PARAM (4)
114 #define HID_PAR_HANDSHAKE_RSP_ERR_UNKNOWN (14)
115 #define HID_PAR_HANDSHAKE_RSP_ERR_FATAL (15)
116 
117 /* Parameters for Control
118  */
119 #define HID_PAR_CONTROL_NOP (0)
120 #define HID_PAR_CONTROL_HARD_RESET (1)
121 #define HID_PAR_CONTROL_SOFT_RESET (2)
122 #define HID_PAR_CONTROL_SUSPEND (3)
123 #define HID_PAR_CONTROL_EXIT_SUSPEND (4)
124 #define HID_PAR_CONTROL_VIRTUAL_CABLE_UNPLUG (5)
125 
126 /* Different report types in get, set, data
127  */
128 #define HID_PAR_REP_TYPE_MASK (0x03)
129 #define HID_PAR_REP_TYPE_OTHER (0x00)
130 #define HID_PAR_REP_TYPE_INPUT (0x01)
131 #define HID_PAR_REP_TYPE_OUTPUT (0x02)
132 #define HID_PAR_REP_TYPE_FEATURE (0x03)
133 
134 /* Parameters for Get Report
135  */
136 
137 /* Buffer size in two bytes after Report ID */
138 #define HID_PAR_GET_REP_BUFSIZE_FOLLOWS (0x08)
139 
140 /* Parameters for Protocol Type
141  */
142 #define HID_PAR_PROTOCOL_MASK (0x01)
143 #define HID_PAR_PROTOCOL_REPORT (0x01)
144 #define HID_PAR_PROTOCOL_BOOT_MODE (0x00)
145 
146 #define HID_PAR_REP_TYPE_MASK (0x03)
147 
148 /* Descriptor types in the SDP record
149  */
150 #define HID_SDP_DESCRIPTOR_REPORT (0x22)
151 #define HID_SDP_DESCRIPTOR_PHYSICAL (0x23)
152 
153 typedef struct desc_info {
154   uint16_t dl_len;
155   uint8_t* dsc_list;
156 } tHID_DEV_DSCP_INFO;
157 
158 #define HID_SSR_PARAM_INVALID 0xffff
159 
160 #define HIDD_APP_DESCRIPTOR_LEN 2048
161 
162 typedef struct sdp_info {
163   char svc_name[HID_MAX_SVC_NAME_LEN];   /*Service Name */
164   char svc_descr[HID_MAX_SVC_DESCR_LEN]; /*Service Description*/
165   char prov_name[HID_MAX_PROV_NAME_LEN]; /*Provider Name.*/
166   uint16_t rel_num;                      /*Release Number */
167   uint16_t hpars_ver;                    /*HID Parser Version.*/
168   uint16_t ssr_max_latency;              /* HIDSSRHostMaxLatency value, if
169                                             HID_SSR_PARAM_INVALID not used*/
170   uint16_t ssr_min_tout;                 /* HIDSSRHostMinTimeout value, if HID_SSR_PARAM_INVALID not
171                                             used* */
172   uint8_t sub_class;                     /*Device Subclass.*/
173   uint8_t ctry_code;                     /*Country Code.*/
174   uint16_t sup_timeout;                  /* Supervisory Timeout */
175 
176   tHID_DEV_DSCP_INFO dscp_info; /* Descriptor list and Report list to be set in
177                                   the SDP record.
178                                   This parameter is used if
179                                   HID_DEV_USE_GLB_SDP_REC is set to false.*/
180   tSDP_DISC_REC* p_sdp_layer_rec;
181 } tHID_DEV_SDP_INFO;
182 
183 namespace std {
184 template <>
185 struct formatter<tHID_STATUS> : enum_formatter<tHID_STATUS> {};
186 }  // namespace std
187 
188 #endif
189