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