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 <zephyr/usb/class/hid.h>
17 #include <zephyr/usb/usb_ch9.h>
18 
19 #ifdef __cplusplus
20 extern "C" {
21 #endif
22 
23 /**
24  * @brief usb_hid.h API
25  * @defgroup usb_hid_class USB HID class API
26  * @ingroup usb
27  * @{
28  */
29 
30 /**
31  * @defgroup usb_hid_device_api HID class USB specific definitions
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 	hid_int_ready_callback int_out_ready;
58 };
59 
60 /**
61  * @brief Register HID device
62  *
63  * @param[in]  dev          Pointer to USB HID device
64  * @param[in]  desc         Pointer to HID report descriptor
65  * @param[in]  size         Size of HID report descriptor
66  * @param[in]  op           Pointer to USB HID device interrupt struct
67  */
68 void usb_hid_register_device(const struct device *dev,
69 			     const uint8_t *desc,
70 			     size_t size,
71 			     const struct hid_ops *op);
72 
73 /**
74  * @brief Write to USB HID interrupt endpoint buffer
75  *
76  * @param[in]  dev          Pointer to USB HID device
77  * @param[in]  data         Pointer to data buffer
78  * @param[in]  data_len     Length of data to copy
79  * @param[out] bytes_ret    Bytes written to the EP buffer.
80  *
81  * @return 0 on success, negative errno code on fail.
82  */
83 int hid_int_ep_write(const struct device *dev,
84 		     const uint8_t *data,
85 		     uint32_t data_len,
86 		     uint32_t *bytes_ret);
87 
88 /**
89  * @brief Read from USB HID interrupt endpoint buffer
90  *
91  * @param[in]  dev          Pointer to USB HID device
92  * @param[in]  data         Pointer to data buffer
93  * @param[in]  max_data_len Max length of data to copy
94  * @param[out] ret_bytes    Number of bytes to copy.  If data is NULL and
95  *                          max_data_len is 0 the number of bytes
96  *                          available in the buffer will be returned.
97  *
98  * @return 0 on success, negative errno code on fail.
99  */
100 int hid_int_ep_read(const struct device *dev,
101 		    uint8_t *data,
102 		    uint32_t max_data_len,
103 		    uint32_t *ret_bytes);
104 
105 /**
106  * @brief Set USB HID class Protocol Code
107  *
108  * @details Should be called before usb_hid_init().
109  *
110  * @param[in]  dev          Pointer to USB HID device
111  * @param[in]  proto_code   Protocol Code to be used for bInterfaceProtocol
112  *
113  * @return 0 on success, negative errno code on fail.
114  */
115 int usb_hid_set_proto_code(const struct device *dev, uint8_t proto_code);
116 
117 /**
118  * @brief Initialize USB HID class support
119  *
120  * @param[in]  dev          Pointer to USB HID device
121  *
122  * @return 0 on success, negative errno code on fail.
123  */
124 int usb_hid_init(const struct device *dev);
125 
126 /**
127  * @}
128  */
129 
130 /**
131  * @}
132  */
133 
134 #ifdef __cplusplus
135 }
136 #endif
137 
138 #endif /* ZEPHYR_INCLUDE_USB_HID_CLASS_DEVICE_H_ */
139