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 #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  *                          max_data_len 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  * @}
134  */
135 
136 #ifdef __cplusplus
137 }
138 #endif
139 
140 #endif /* ZEPHYR_INCLUDE_USB_HID_CLASS_DEVICE_H_ */
141