1 /*
2  * Copyright (c) 2018 Intel Corporation
3  * Copyright (c) 2018,2021 Nordic Semiconductor ASA
4  *
5  * SPDX-License-Identifier: Apache-2.0
6  */
7 
8 /**
9  * @file
10  * @brief USB HID Class device API header
11  */
12 
13 #ifndef ZEPHYR_INCLUDE_USB_HID_CLASS_DEVICE_H_
14 #define ZEPHYR_INCLUDE_USB_HID_CLASS_DEVICE_H_
15 
16 #include <usb/class/hid.h>
17 
18 #ifdef __cplusplus
19 extern "C" {
20 #endif
21 
22 /**
23  * @brief usb_hid.h API
24  * @defgroup usb_hid_class USB HID class API
25  * @{
26  * @}
27  */
28 
29 /**
30  * @defgroup usb_hid_device_api HID class USB specific definitions
31  * @ingroup usb_hid_class
32  * @{
33  */
34 
35 typedef int (*hid_cb_t)(const struct device *dev,
36 			struct usb_setup_packet *setup, int32_t *len,
37 			uint8_t **data);
38 typedef void (*hid_int_ready_callback)(const struct device *dev);
39 typedef void (*hid_protocol_cb_t)(const struct device *dev, uint8_t protocol);
40 typedef void (*hid_idle_cb_t)(const struct device *dev, uint16_t report_id);
41 
42 /**
43  * @brief USB HID device interface
44  */
45 struct hid_ops {
46 	hid_cb_t get_report;
47 	hid_cb_t set_report;
48 	hid_protocol_cb_t protocol_change;
49 	hid_idle_cb_t on_idle;
50 	/*
51 	 * int_in_ready is an optional callback that is called when
52 	 * the current interrupt IN transfer has completed.  This can
53 	 * be used to wait for the endpoint to go idle or to trigger
54 	 * the next transfer.
55 	 */
56 	hid_int_ready_callback int_in_ready;
57 #ifdef CONFIG_ENABLE_HID_INT_OUT_EP
58 	hid_int_ready_callback int_out_ready;
59 #endif
60 };
61 
62 /**
63  * @brief Register HID device
64  *
65  * @param[in]  dev          Pointer to USB HID device
66  * @param[in]  desc         Pointer to HID report descriptor
67  * @param[in]  size         Size of HID report descriptor
68  * @param[in]  op           Pointer to USB HID device interrupt struct
69  */
70 void usb_hid_register_device(const struct device *dev,
71 			     const uint8_t *desc,
72 			     size_t size,
73 			     const struct hid_ops *op);
74 
75 /**
76  * @brief Write to USB HID interrupt endpoint buffer
77  *
78  * @param[in]  dev          Pointer to USB HID device
79  * @param[in]  data         Pointer to data buffer
80  * @param[in]  data_len     Length of data to copy
81  * @param[out] bytes_ret    Bytes written to the EP buffer.
82  *
83  * @return 0 on success, negative errno code on fail.
84  */
85 int hid_int_ep_write(const struct device *dev,
86 		     const uint8_t *data,
87 		     uint32_t data_len,
88 		     uint32_t *bytes_ret);
89 
90 /**
91  * @brief Read from USB HID interrupt endpoint buffer
92  *
93  * @param[in]  dev          Pointer to USB HID device
94  * @param[in]  data         Pointer to data buffer
95  * @param[in]  max_data_len Max length of data to copy
96  * @param[out] ret_bytes    Number of bytes to copy.  If data is NULL and
97  *                          ret_bytes is 0 the number of bytes
98  *                          available in the buffer will be returned.
99  *
100  * @return 0 on success, negative errno code on fail.
101  */
102 int hid_int_ep_read(const struct device *dev,
103 		    uint8_t *data,
104 		    uint32_t max_data_len,
105 		    uint32_t *ret_bytes);
106 
107 /**
108  * @brief Set USB HID class Protocol Code
109  *
110  * @details Should be called before usb_hid_init().
111  *
112  * @param[in]  dev          Pointer to USB HID device
113  * @param[in]  proto_code   Protocol Code to be used for bInterfaceProtocol
114  *
115  * @return 0 on success, negative errno code on fail.
116  */
117 int usb_hid_set_proto_code(const struct device *dev, uint8_t proto_code);
118 
119 /**
120  * @brief Initialize USB HID class support
121  *
122  * @param[in]  dev          Pointer to USB HID device
123  *
124  * @return 0 on success, negative errno code on fail.
125  */
126 int usb_hid_init(const struct device *dev);
127 
128 /**
129  * @}
130  */
131 
132 /*
133  * Macros below are deprecated in 2.6 release.
134  * Please replace with macros from common HID header, include/usb/class/hid.h
135  */
136 
137 #define HID_CLASS_DESCRIPTOR_HID	__DEPRECATED_MACRO USB_DESC_HID
138 #define HID_CLASS_DESCRIPTOR_REPORT	__DEPRECATED_MACRO USB_DESC_HID_REPORT
139 
140 #define HID_GET_REPORT			__DEPRECATED_MACRO USB_HID_GET_REPORT
141 #define HID_GET_IDLE			__DEPRECATED_MACRO USB_HID_GET_IDLE
142 #define HID_GET_PROTOCOL		__DEPRECATED_MACRO USB_HID_GET_PROTOCOL
143 #define HID_SET_REPORT			__DEPRECATED_MACRO USB_HID_SET_REPORT
144 #define HID_SET_IDLE			__DEPRECATED_MACRO USB_HID_SET_IDLE
145 #define HID_SET_PROTOCOL		__DEPRECATED_MACRO USB_HID_SET_PROTOCOL
146 
147 #define ITEM_MAIN			__DEPRECATED_MACRO 0x0
148 #define ITEM_GLOBAL			__DEPRECATED_MACRO 0x1
149 #define ITEM_LOCAL			__DEPRECATED_MACRO 0x2
150 
151 #define ITEM_TAG_INPUT			__DEPRECATED_MACRO 0x8
152 #define ITEM_TAG_OUTPUT			__DEPRECATED_MACRO 0x9
153 #define ITEM_TAG_COLLECTION		__DEPRECATED_MACRO 0xA
154 #define ITEM_TAG_COLLECTION_END		__DEPRECATED_MACRO 0xC
155 
156 #define ITEM_TAG_USAGE_PAGE		__DEPRECATED_MACRO 0x0
157 #define ITEM_TAG_LOGICAL_MIN		__DEPRECATED_MACRO 0x1
158 #define ITEM_TAG_LOGICAL_MAX		__DEPRECATED_MACRO 0x2
159 #define ITEM_TAG_REPORT_SIZE		__DEPRECATED_MACRO 0x7
160 #define ITEM_TAG_REPORT_ID		__DEPRECATED_MACRO 0x8
161 #define ITEM_TAG_REPORT_COUNT		__DEPRECATED_MACRO 0x9
162 
163 #define ITEM_TAG_USAGE			__DEPRECATED_MACRO 0x0
164 #define ITEM_TAG_USAGE_MIN		__DEPRECATED_MACRO 0x1
165 #define ITEM_TAG_USAGE_MAX		__DEPRECATED_MACRO 0x2
166 
167 #define HID_MAIN_ITEM(bTag, bSize)	\
168 	__DEPRECATED_MACRO HID_ITEM(bTag, ITEM_MAIN, bSize)
169 #define HID_GLOBAL_ITEM(bTag, bSize)	\
170 	__DEPRECATED_MACRO HID_ITEM(bTag, ITEM_GLOBAL, bSize)
171 #define HID_LOCAL_ITEM(bTag, bSize)	\
172 	__DEPRECATED_MACRO HID_ITEM(bTag, ITEM_LOCAL, bSize)
173 
174 #define HID_MI_COLLECTION		\
175 	__DEPRECATED_MACRO HID_MAIN_ITEM(ITEM_TAG_COLLECTION, 1)
176 #define HID_MI_COLLECTION_END		\
177 	__DEPRECATED_MACRO HID_MAIN_ITEM(ITEM_TAG_COLLECTION_END, 0)
178 #define HID_MI_INPUT			\
179 	__DEPRECATED_MACRO HID_MAIN_ITEM(ITEM_TAG_INPUT, 1)
180 #define HID_MI_OUTPUT			\
181 	__DEPRECATED_MACRO HID_MAIN_ITEM(ITEM_TAG_OUTPUT, 1)
182 #define HID_GI_USAGE_PAGE		\
183 	__DEPRECATED_MACRO HID_GLOBAL_ITEM(ITEM_TAG_USAGE_PAGE, 1)
184 #define HID_GI_LOGICAL_MIN(size)	\
185 	__DEPRECATED_MACRO HID_GLOBAL_ITEM(ITEM_TAG_LOGICAL_MIN, size)
186 #define HID_GI_LOGICAL_MAX(size)	\
187 	__DEPRECATED_MACRO HID_GLOBAL_ITEM(ITEM_TAG_LOGICAL_MAX, size)
188 #define HID_GI_REPORT_SIZE		\
189 	__DEPRECATED_MACRO HID_GLOBAL_ITEM(ITEM_TAG_REPORT_SIZE, 1)
190 #define HID_GI_REPORT_ID		\
191 	__DEPRECATED_MACRO HID_GLOBAL_ITEM(ITEM_TAG_REPORT_ID, 1)
192 #define HID_GI_REPORT_COUNT		\
193 	__DEPRECATED_MACRO HID_GLOBAL_ITEM(ITEM_TAG_REPORT_COUNT, 1)
194 
195 #define HID_LI_USAGE			\
196 	__DEPRECATED_MACRO HID_LOCAL_ITEM(ITEM_TAG_USAGE, 1)
197 #define HID_LI_USAGE_MIN(size)		\
198 	__DEPRECATED_MACRO HID_LOCAL_ITEM(ITEM_TAG_USAGE_MIN, size)
199 #define HID_LI_USAGE_MAX(size)		\
200 	__DEPRECATED_MACRO HID_LOCAL_ITEM(ITEM_TAG_USAGE_MAX, size)
201 
202 #define USAGE_GEN_DESKTOP		__DEPRECATED_MACRO 0x01
203 #define USAGE_GEN_KEYBOARD		__DEPRECATED_MACRO 0x07
204 #define USAGE_GEN_LEDS			__DEPRECATED_MACRO 0x08
205 #define USAGE_GEN_BUTTON		__DEPRECATED_MACRO 0x09
206 
207 #define USAGE_GEN_DESKTOP_UNDEFINED	__DEPRECATED_MACRO 0x00
208 #define USAGE_GEN_DESKTOP_POINTER	__DEPRECATED_MACRO 0x01
209 #define USAGE_GEN_DESKTOP_MOUSE		__DEPRECATED_MACRO 0x02
210 #define USAGE_GEN_DESKTOP_JOYSTICK	__DEPRECATED_MACRO 0x04
211 #define USAGE_GEN_DESKTOP_GAMEPAD	__DEPRECATED_MACRO 0x05
212 #define USAGE_GEN_DESKTOP_KEYBOARD	__DEPRECATED_MACRO 0x06
213 #define USAGE_GEN_DESKTOP_KEYPAD	__DEPRECATED_MACRO 0x07
214 #define USAGE_GEN_DESKTOP_X		__DEPRECATED_MACRO 0x30
215 #define USAGE_GEN_DESKTOP_Y		__DEPRECATED_MACRO 0x31
216 #define USAGE_GEN_DESKTOP_WHEEL		__DEPRECATED_MACRO 0x38
217 
218 #define COLLECTION_PHYSICAL		__DEPRECATED_MACRO 0x00
219 #define COLLECTION_APPLICATION		__DEPRECATED_MACRO 0x01
220 
221 #ifdef __cplusplus
222 }
223 #endif
224 
225 #endif /* ZEPHYR_INCLUDE_USB_HID_CLASS_DEVICE_H_ */
226