blob: 514d2192be139a06305259928cf1ef4b2f626570 [file] [log] [blame]
/*
* Copyright (c) 2018 Intel Corporation
* Copyright (c) 2018,2021 Nordic Semiconductor ASA
*
* SPDX-License-Identifier: Apache-2.0
*/
/**
* @file
* @brief USB HID Class device API header
*/
#ifndef ZEPHYR_INCLUDE_USB_HID_CLASS_DEVICE_H_
#define ZEPHYR_INCLUDE_USB_HID_CLASS_DEVICE_H_
#include <usb/class/hid.h>
#ifdef __cplusplus
extern "C" {
#endif
/**
* @brief usb_hid.h API
* @defgroup usb_hid_class USB HID class API
* @{
* @}
*/
/**
* @defgroup usb_hid_device_api HID class USB specific definitions
* @ingroup usb_hid_class
* @{
*/
typedef int (*hid_cb_t)(const struct device *dev,
struct usb_setup_packet *setup, int32_t *len,
uint8_t **data);
typedef void (*hid_int_ready_callback)(const struct device *dev);
typedef void (*hid_protocol_cb_t)(const struct device *dev, uint8_t protocol);
typedef void (*hid_idle_cb_t)(const struct device *dev, uint16_t report_id);
/**
* @brief USB HID device interface
*/
struct hid_ops {
hid_cb_t get_report;
hid_cb_t set_report;
hid_protocol_cb_t protocol_change;
hid_idle_cb_t on_idle;
/*
* int_in_ready is an optional callback that is called when
* the current interrupt IN transfer has completed. This can
* be used to wait for the endpoint to go idle or to trigger
* the next transfer.
*/
hid_int_ready_callback int_in_ready;
#ifdef CONFIG_ENABLE_HID_INT_OUT_EP
hid_int_ready_callback int_out_ready;
#endif
};
/**
* @brief Register HID device
*
* @param[in] dev Pointer to USB HID device
* @param[in] desc Pointer to HID report descriptor
* @param[in] size Size of HID report descriptor
* @param[in] op Pointer to USB HID device interrupt struct
*/
void usb_hid_register_device(const struct device *dev,
const uint8_t *desc,
size_t size,
const struct hid_ops *op);
/**
* @brief Write to USB HID interrupt endpoint buffer
*
* @param[in] dev Pointer to USB HID device
* @param[in] data Pointer to data buffer
* @param[in] data_len Length of data to copy
* @param[out] bytes_ret Bytes written to the EP buffer.
*
* @return 0 on success, negative errno code on fail.
*/
int hid_int_ep_write(const struct device *dev,
const uint8_t *data,
uint32_t data_len,
uint32_t *bytes_ret);
/**
* @brief Read from USB HID interrupt endpoint buffer
*
* @param[in] dev Pointer to USB HID device
* @param[in] data Pointer to data buffer
* @param[in] max_data_len Max length of data to copy
* @param[out] ret_bytes Number of bytes to copy. If data is NULL and
* max_data_len is 0 the number of bytes
* available in the buffer will be returned.
*
* @return 0 on success, negative errno code on fail.
*/
int hid_int_ep_read(const struct device *dev,
uint8_t *data,
uint32_t max_data_len,
uint32_t *ret_bytes);
/**
* @brief Set USB HID class Protocol Code
*
* @details Should be called before usb_hid_init().
*
* @param[in] dev Pointer to USB HID device
* @param[in] proto_code Protocol Code to be used for bInterfaceProtocol
*
* @return 0 on success, negative errno code on fail.
*/
int usb_hid_set_proto_code(const struct device *dev, uint8_t proto_code);
/**
* @brief Initialize USB HID class support
*
* @param[in] dev Pointer to USB HID device
*
* @return 0 on success, negative errno code on fail.
*/
int usb_hid_init(const struct device *dev);
/**
* @}
*/
/*
* Macros below are deprecated in 2.6 release.
* Please replace with macros from common HID header, include/usb/class/hid.h
*/
#define HID_CLASS_DESCRIPTOR_HID __DEPRECATED_MACRO USB_DESC_HID
#define HID_CLASS_DESCRIPTOR_REPORT __DEPRECATED_MACRO USB_DESC_HID_REPORT
#define HID_GET_REPORT __DEPRECATED_MACRO USB_HID_GET_REPORT
#define HID_GET_IDLE __DEPRECATED_MACRO USB_HID_GET_IDLE
#define HID_GET_PROTOCOL __DEPRECATED_MACRO USB_HID_GET_PROTOCOL
#define HID_SET_REPORT __DEPRECATED_MACRO USB_HID_SET_REPORT
#define HID_SET_IDLE __DEPRECATED_MACRO USB_HID_SET_IDLE
#define HID_SET_PROTOCOL __DEPRECATED_MACRO USB_HID_SET_PROTOCOL
#define ITEM_MAIN __DEPRECATED_MACRO 0x0
#define ITEM_GLOBAL __DEPRECATED_MACRO 0x1
#define ITEM_LOCAL __DEPRECATED_MACRO 0x2
#define ITEM_TAG_INPUT __DEPRECATED_MACRO 0x8
#define ITEM_TAG_OUTPUT __DEPRECATED_MACRO 0x9
#define ITEM_TAG_COLLECTION __DEPRECATED_MACRO 0xA
#define ITEM_TAG_COLLECTION_END __DEPRECATED_MACRO 0xC
#define ITEM_TAG_USAGE_PAGE __DEPRECATED_MACRO 0x0
#define ITEM_TAG_LOGICAL_MIN __DEPRECATED_MACRO 0x1
#define ITEM_TAG_LOGICAL_MAX __DEPRECATED_MACRO 0x2
#define ITEM_TAG_REPORT_SIZE __DEPRECATED_MACRO 0x7
#define ITEM_TAG_REPORT_ID __DEPRECATED_MACRO 0x8
#define ITEM_TAG_REPORT_COUNT __DEPRECATED_MACRO 0x9
#define ITEM_TAG_USAGE __DEPRECATED_MACRO 0x0
#define ITEM_TAG_USAGE_MIN __DEPRECATED_MACRO 0x1
#define ITEM_TAG_USAGE_MAX __DEPRECATED_MACRO 0x2
#define HID_MAIN_ITEM(bTag, bSize) \
__DEPRECATED_MACRO HID_ITEM(bTag, ITEM_MAIN, bSize)
#define HID_GLOBAL_ITEM(bTag, bSize) \
__DEPRECATED_MACRO HID_ITEM(bTag, ITEM_GLOBAL, bSize)
#define HID_LOCAL_ITEM(bTag, bSize) \
__DEPRECATED_MACRO HID_ITEM(bTag, ITEM_LOCAL, bSize)
#define HID_MI_COLLECTION \
__DEPRECATED_MACRO HID_MAIN_ITEM(ITEM_TAG_COLLECTION, 1)
#define HID_MI_COLLECTION_END \
__DEPRECATED_MACRO HID_MAIN_ITEM(ITEM_TAG_COLLECTION_END, 0)
#define HID_MI_INPUT \
__DEPRECATED_MACRO HID_MAIN_ITEM(ITEM_TAG_INPUT, 1)
#define HID_MI_OUTPUT \
__DEPRECATED_MACRO HID_MAIN_ITEM(ITEM_TAG_OUTPUT, 1)
#define HID_GI_USAGE_PAGE \
__DEPRECATED_MACRO HID_GLOBAL_ITEM(ITEM_TAG_USAGE_PAGE, 1)
#define HID_GI_LOGICAL_MIN(size) \
__DEPRECATED_MACRO HID_GLOBAL_ITEM(ITEM_TAG_LOGICAL_MIN, size)
#define HID_GI_LOGICAL_MAX(size) \
__DEPRECATED_MACRO HID_GLOBAL_ITEM(ITEM_TAG_LOGICAL_MAX, size)
#define HID_GI_REPORT_SIZE \
__DEPRECATED_MACRO HID_GLOBAL_ITEM(ITEM_TAG_REPORT_SIZE, 1)
#define HID_GI_REPORT_ID \
__DEPRECATED_MACRO HID_GLOBAL_ITEM(ITEM_TAG_REPORT_ID, 1)
#define HID_GI_REPORT_COUNT \
__DEPRECATED_MACRO HID_GLOBAL_ITEM(ITEM_TAG_REPORT_COUNT, 1)
#define HID_LI_USAGE \
__DEPRECATED_MACRO HID_LOCAL_ITEM(ITEM_TAG_USAGE, 1)
#define HID_LI_USAGE_MIN(size) \
__DEPRECATED_MACRO HID_LOCAL_ITEM(ITEM_TAG_USAGE_MIN, size)
#define HID_LI_USAGE_MAX(size) \
__DEPRECATED_MACRO HID_LOCAL_ITEM(ITEM_TAG_USAGE_MAX, size)
#define USAGE_GEN_DESKTOP __DEPRECATED_MACRO 0x01
#define USAGE_GEN_KEYBOARD __DEPRECATED_MACRO 0x07
#define USAGE_GEN_LEDS __DEPRECATED_MACRO 0x08
#define USAGE_GEN_BUTTON __DEPRECATED_MACRO 0x09
#define USAGE_GEN_DESKTOP_UNDEFINED __DEPRECATED_MACRO 0x00
#define USAGE_GEN_DESKTOP_POINTER __DEPRECATED_MACRO 0x01
#define USAGE_GEN_DESKTOP_MOUSE __DEPRECATED_MACRO 0x02
#define USAGE_GEN_DESKTOP_JOYSTICK __DEPRECATED_MACRO 0x04
#define USAGE_GEN_DESKTOP_GAMEPAD __DEPRECATED_MACRO 0x05
#define USAGE_GEN_DESKTOP_KEYBOARD __DEPRECATED_MACRO 0x06
#define USAGE_GEN_DESKTOP_KEYPAD __DEPRECATED_MACRO 0x07
#define USAGE_GEN_DESKTOP_X __DEPRECATED_MACRO 0x30
#define USAGE_GEN_DESKTOP_Y __DEPRECATED_MACRO 0x31
#define USAGE_GEN_DESKTOP_WHEEL __DEPRECATED_MACRO 0x38
#define COLLECTION_PHYSICAL __DEPRECATED_MACRO 0x00
#define COLLECTION_APPLICATION __DEPRECATED_MACRO 0x01
#ifdef __cplusplus
}
#endif
#endif /* ZEPHYR_INCLUDE_USB_HID_CLASS_DEVICE_H_ */