keyboard/qmk/lib/chibios-contrib/os/hal/include/hal_usb_hid.h

572 lines
20 KiB
C
Raw Normal View History

/*
ChibiOS - Copyright (C) 2016 Jonathan Struebel
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/**
* @file hal_usb_hid.h
* @brief USB HID macros and structures.
*
* @addtogroup USB_HID
* @{
*/
#ifndef HAL_USB_HID_H
#define HAL_USB_HID_H
#if (HAL_USE_USB_HID == TRUE) || defined(__DOXYGEN__)
/*===========================================================================*/
/* Driver constants. */
/*===========================================================================*/
/**
* @name HID specific messages.
* @{
*/
#define HID_GET_REPORT 0x01U
#define HID_GET_IDLE 0x02U
#define HID_GET_PROTOCOL 0x03U
#define HID_SET_REPORT 0x09U
#define HID_SET_IDLE 0x0AU
#define HID_SET_PROTOCOL 0x0BU
/** @} */
/**
* @name HID classes
* @{
*/
#define HID_INTERFACE_CLASS 0x03U
/** @} */
/**
* @name HID subclasses
* @{
*/
#define HID_BOOT_INTERFACE 0x01U
/** @} */
/**
* @name HID descriptors
* @{
*/
#define USB_DESCRIPTOR_HID 0x21U
#define HID_REPORT 0x22U
#define HID_PHYSICAL 0x23U
/** @} */
/**
* @name HID Report items
* @{
*/
#define HID_REPORT_INPUT 0x80
#define HID_REPORT_OUTPUT 0x90
#define HID_REPORT_COLLECTION 0xA0
#define HID_REPORT_FEATURE 0xB0
#define HID_REPORT_END_COLLECTION 0xC0
#define HID_REPORT_USAGE_PAGE 0x04
#define HID_REPORT_LOGICAL_MINIMUM 0x14
#define HID_REPORT_LOGICAL_MAXIMUM 0x24
#define HID_REPORT_PHYSICAL_MINIMUM 0x34
#define HID_REPORT_PHYSICAL_MAXIMUM 0x44
#define HID_REPORT_UNIT_EXPONENT 0x54
#define HID_REPORT_UNIT 0x64
#define HID_REPORT_REPORT_SIZE 0x74
#define HID_REPORT_REPORT_ID 0x84
#define HID_REPORT_REPORT_COUNT 0x94
#define HID_REPORT_REPORT_PUSH 0xA4
#define HID_REPORT_REPORT_POP 0xB4
#define HID_REPORT_USAGE 0x08
#define HID_REPORT_USAGE_MINIMUM 0x18
#define HID_REPORT_USAGE_MAXIMUM 0x28
#define HID_REPORT_DESIGNATOR_INDEX 0x38
#define HID_REPORT_DESIGNATOR_MINUMUM 0x48
#define HID_REPORT_DESIGNATOR_MAXIMUM 0x58
#define HID_REPORT_STRING_INDEX 0x78
#define HID_REPORT_STRING_MINUMUM 0x88
#define HID_REPORT_STRING_MAXIMUM 0x98
#define HID_REPORT_DELIMITER 0xA8
/** @} */
/**
* @name HID Collection item definitions
* @{
*/
#define HID_COLLECTION_PHYSICAL 0x00
#define HID_COLLECTION_APPLICATION 0x01
#define HID_COLLECTION_LOGICAL 0x02
#define HID_COLLECTION_REPORT 0x03
#define HID_COLLECTION_NAMED_ARRAY 0x04
#define HID_COLLECTION_USAGE_SWITCH 0x05
#define HID_COLLECTION_USAGE_MODIFIER 0x06
/** @} */
/**
* @name HID Usage Page item definitions
* @{
*/
#define HID_USAGE_PAGE_GENERIC_DESKTOP 0x01
#define HID_USAGE_PAGE_SIMULATION 0x02
#define HID_USAGE_PAGE_VR 0x03
#define HID_USAGE_PAGE_SPORT 0x04
#define HID_USAGE_PAGE_GAME 0x05
#define HID_USAGE_PAGE_GENERIC_DEVICE 0x06
#define HID_USAGE_PAGE_KEYBOARD_KEYPAD 0x07
#define HID_USAGE_PAGE_LEDS 0x08
#define HID_USAGE_PAGE_BUTTON 0x09
#define HID_USAGE_PAGE_ORDINAL 0x0A
#define HID_USAGE_PAGE_TELEPHONY 0x0B
#define HID_USAGE_PAGE_CONSUMER 0x0C
#define HID_USAGE_PAGE_DIGITIZER 0x0D
#define HID_USAGE_PAGE_PID 0x0F
#define HID_USAGE_PAGE_UNICODE 0x10
#define HID_USAGE_PAGE_VENDOR 0xFF00
/** @} */
/**
* @name HID Usage item definitions
* @{
*/
#define HID_USAGE_ALPHANUMERIC_DISPLAY 0x14
#define HID_USAGE_MEDICAL_INSTRUMENTS 0x40
#define HID_USAGE_MONITOR_PAGE1 0x80
#define HID_USAGE_MONITOR_PAGE2 0x81
#define HID_USAGE_MONITOR_PAGE3 0x82
#define HID_USAGE_MONITOR_PAGE4 0x83
#define HID_USAGE_POWER_PAGE1 0x84
#define HID_USAGE_POWER_PAGE2 0x85
#define HID_USAGE_POWER_PAGE3 0x86
#define HID_USAGE_POWER_PAGE4 0x87
#define HID_USAGE_BAR_CODE_SCANNER_PAGE 0x8C
#define HID_USAGE_SCALE_PAGE 0x8D
#define HID_USAGE_MSR_PAGE 0x8E
#define HID_USAGE_CAMERA_PAGE 0x90
#define HID_USAGE_ARCADE_PAGE 0x91
#define HID_USAGE_POINTER 0x01
#define HID_USAGE_MOUSE 0x02
#define HID_USAGE_JOYSTICK 0x04
#define HID_USAGE_GAMEPAD 0x05
#define HID_USAGE_KEYBOARD 0x06
#define HID_USAGE_KEYPAD 0x07
#define HID_USAGE_MULTIAXIS_CONTROLLER 0x08
#define HID_USAGE_BUTTON1 0x01
#define HID_USAGE_BUTTON2 0x02
#define HID_USAGE_BUTTON3 0x03
#define HID_USAGE_BUTTON4 0x04
#define HID_USAGE_BUTTON5 0x05
#define HID_USAGE_BUTTON6 0x06
#define HID_USAGE_BUTTON7 0x07
#define HID_USAGE_BUTTON8 0x08
#define HID_USAGE_X 0x30
#define HID_USAGE_Y 0x31
#define HID_USAGE_Z 0x32
#define HID_USAGE_RX 0x33
#define HID_USAGE_RY 0x34
#define HID_USAGE_RZ 0x35
#define HID_USAGE_VX 0x40
#define HID_USAGE_VY 0x41
#define HID_USAGE_VZ 0x42
#define HID_USAGE_VBRX 0x43
#define HID_USAGE_VBRY 0x44
#define HID_USAGE_VBRZ 0x45
#define HID_USAGE_VNO 0x46
/** @} */
/**
* @name HID item types definitions
* @{
*/
#define HID_ITEM_DATA 0x00
#define HID_ITEM_CNST 0x01
#define HID_ITEM_ARR 0x00
#define HID_ITEM_VAR 0x02
#define HID_ITEM_ABS 0x00
#define HID_ITEM_REL 0x04
#define HID_ITEM_NWRP 0x00
#define HID_ITEM_WRP 0x08
#define HID_ITEM_LIN 0x00
#define HID_ITEM_NLIN 0x10
#define HID_ITEM_PRF 0x00
#define HID_ITEM_NPRF 0x20
#define HID_ITEM_NNUL 0x00
#define HID_ITEM_NUL 0x40
#define HID_ITEM_NVOL 0x00
#define HID_ITEM_VOL 0x80
#define HID_ITEM_DATA_VAR_ABS (HID_ITEM_DATA | \
HID_ITEM_VAR | \
HID_ITEM_ABS)
#define HID_ITEM_CNST_VAR_ABS (HID_ITEM_CNST | \
HID_ITEM_VAR | \
HID_ITEM_ABS)
#define HID_ITEM_DATA_VAR_REL (HID_ITEM_DATA | \
HID_ITEM_VAR | \
HID_ITEM_REL)
/** @} */
/**
* @name Helper macros for USB HID descriptors
* @{
*/
/*
* @define HID Descriptor size.
*/
#define USB_DESC_HID_SIZE 9U
/**
* @brief HID Descriptor helper macro.
* @note This macro can only be used with a single HID report descriptor
*/
#define USB_DESC_HID(bcdHID, bCountryCode, bNumDescriptors, \
bDescriptorType, wDescriptorLength) \
USB_DESC_BYTE(USB_DESC_HID_SIZE), \
USB_DESC_BYTE(USB_DESCRIPTOR_HID), \
USB_DESC_BCD(bcdHID), \
USB_DESC_BYTE(bCountryCode), \
USB_DESC_BYTE(bNumDescriptors), \
USB_DESC_BYTE(bDescriptorType), \
USB_DESC_WORD(wDescriptorLength)
/**
* @brief HID Report item helper macro (Single byte).
*/
#define HID_ITEM_B(id, value) \
USB_DESC_BYTE(id | 0x01), \
USB_DESC_BYTE(value)
/**
* @brief HID Report item helper macro (Double byte).
*/
#define HID_ITEM_W(id, value) \
USB_DESC_BYTE(id | 0x02), \
USB_DESC_WORD(value)
/**
* @brief HID Report Usage Page item helper macro (Single byte).
*/
#define HID_USAGE_PAGE_B(up) \
HID_ITEM_B(HID_REPORT_USAGE_PAGE, up)
/**
* @brief HID Report Usage Page item helper macro (Double byte).
*/
#define HID_USAGE_PAGE_W(up) \
HID_ITEM_W(HID_REPORT_USAGE_PAGE, up)
/**
* @brief HID Report Usage item helper macro (Single byte).
*/
#define HID_USAGE_B(u) \
HID_ITEM_B(HID_REPORT_USAGE, u)
/**
* @brief HID Report Usage item helper macro (Double byte).
*/
#define HID_USAGE_W(u) \
HID_ITEM_W(HID_REPORT_USAGE, u)
/**
* @brief HID Report Collection item helper macro (Single Byte).
*/
#define HID_COLLECTION_B(c) \
HID_ITEM_B(HID_REPORT_COLLECTION, c)
/**
* @brief HID Report Collection item helper macro (Double Byte).
*/
#define HID_COLLECTION_W(c) \
HID_ITEM_W(HID_REPORT_COLLECTION, c)
/**
* @brief HID Report End Collection item helper macro.
*/
#define HID_END_COLLECTION \
USB_DESC_BYTE(HID_REPORT_END_COLLECTION)
/**
* @brief HID Report Usage Minimum item helper macro (Single byte).
*/
#define HID_USAGE_MINIMUM_B(x) \
HID_ITEM_B(HID_REPORT_USAGE_MINIMUM, x)
/**
* @brief HID Report Usage Minimum item helper macro (Double byte).
*/
#define HID_USAGE_MINIMUM_W(x) \
HID_ITEM_W(HID_REPORT_USAGE_MINIMUM, x)
/**
* @brief HID Report Usage Maximum item helper macro (Single byte).
*/
#define HID_USAGE_MAXIMUM_B(x) \
HID_ITEM_B(HID_REPORT_USAGE_MAXIMUM, x)
/**
* @brief HID Report Usage Maximum item helper macro (Double byte).
*/
#define HID_USAGE_MAXIMUM_W(x) \
HID_ITEM_W(HID_REPORT_USAGE_MAXIMUM, x)
/**
* @brief HID Report Logical Minimum item helper macro (Single byte).
*/
#define HID_LOGICAL_MINIMUM_B(x) \
HID_ITEM_B(HID_REPORT_LOGICAL_MINIMUM, x)
/**
* @brief HID Report Logical Minimum item helper macro (Double byte).
*/
#define HID_LOGICAL_MINIMUM_W(x) \
HID_ITEM_W(HID_REPORT_LOGICAL_MINIMUM, x)
/**
* @brief HID Report Logical Maximum item helper macro (Single byte).
*/
#define HID_LOGICAL_MAXIMUM_B(x) \
HID_ITEM_B(HID_REPORT_LOGICAL_MAXIMUM, x)
/**
* @brief HID Report Logical Maximum item helper macro (Double byte).
*/
#define HID_LOGICAL_MAXIMUM_W(x) \
HID_ITEM_W(HID_REPORT_LOGICAL_MAXIMUM, x)
/**
* @brief HID Report ID item helper macro (Single byte).
*/
#define HID_REPORT_ID_B(x) \
HID_ITEM_B(HID_REPORT_REPORT_ID, x)
/**
* @brief HID Report ID item helper macro (Double byte).
*/
#define HID_REPORT_ID_W(x) \
HID_ITEM_W(HID_REPORT_REPORT_ID, x)
/**
* @brief HID Report Count item helper macro (Single byte).
*/
#define HID_REPORT_COUNT_B(x) \
HID_ITEM_B(HID_REPORT_REPORT_COUNT, x)
/**
* @brief HID Report Count item helper macro (Double byte).
*/
#define HID_REPORT_COUNT_W(x) \
HID_ITEM_W(HID_REPORT_REPORT_COUNT, x)
/**
* @brief HID Report Size item helper macro (Single byte).
*/
#define HID_REPORT_SIZE_B(x) \
HID_ITEM_B(HID_REPORT_REPORT_SIZE, x)
/**
* @brief HID Report Size item helper macro (Double byte).
*/
#define HID_REPORT_SIZE_W(x) \
HID_ITEM_W(HID_REPORT_REPORT_SIZE, x)
/**
* @brief HID Report Input item helper macro (Single byte).
*/
#define HID_INPUT_B(x) \
HID_ITEM_B(HID_REPORT_INPUT, x)
/**
* @brief HID Report Input item helper macro (Double byte).
*/
#define HID_INPUT_W(x) \
HID_ITEM_W(HID_REPORT_INPUT, x)
/** @} */
/**
* @brief HID Report Output item helper macro (Single byte).
*/
#define HID_OUTPUT_B(x) \
HID_ITEM_B(HID_REPORT_OUTPUT, x)
/**
* @brief HID Report Output item helper macro (Double byte).
*/
#define HID_OUTPUT_W(x) \
HID_ITEM_W(HID_REPORT_OUTPUT, x)
/** @} */
/*===========================================================================*/
/* Driver pre-compile time settings. */
/*===========================================================================*/
/**
* @name USB HID configuration options
* @{
*/
/**
* @brief USB HID buffers size.
* @details Configuration parameter, the buffer size must be a multiple of
* the USB data endpoint maximum packet size.
* @note The default is 256 bytes for both the transmission and receive
* buffers.
*/
#if !defined(USB_HID_BUFFERS_SIZE) || defined(__DOXYGEN__)
#define USB_HID_BUFFERS_SIZE 256
#endif
/**
* @brief USB HID number of buffers.
* @note The default is 2 buffers.
*/
#if !defined(USB_HID_BUFFERS_NUMBER) || defined(__DOXYGEN__)
#define USB_HID_BUFFERS_NUMBER 2
#endif
/** @} */
/*===========================================================================*/
/* Derived constants and error checks. */
/*===========================================================================*/
#if HAL_USE_USB == FALSE
#error "USB HID Driver requires HAL_USE_USB"
#endif
/*===========================================================================*/
/* Driver data structures and types. */
/*===========================================================================*/
/**
* @brief Driver state machine possible states.
*/
typedef enum {
HID_UNINIT = 0, /**< Not initialized. */
HID_STOP = 1, /**< Stopped. */
HID_READY = 2 /**< Ready. */
} hidstate_t;
/**
* @brief Structure representing a USB HID driver.
*/
typedef struct USBHIDDriver USBHIDDriver;
/**
* @brief USB HID Driver configuration structure.
* @details An instance of this structure must be passed to @p hidStart()
* in order to configure and start the driver operations.
*/
typedef struct {
/**
* @brief USB driver to use.
*/
USBDriver *usbp;
/**
* @brief Interrupt IN endpoint used for outgoing data transfer.
*/
usbep_t int_in;
/**
* @brief Interrupt OUT endpoint used for incoming data transfer.
*/
usbep_t int_out;
} USBHIDConfig;
/**
* @brief @p USBHIDDriver specific data.
*/
#define _usb_hid_driver_data \
_base_asynchronous_channel_data \
/* Driver state.*/ \
hidstate_t state; \
/* Input buffers queue.*/ \
input_buffers_queue_t ibqueue; \
/* Output queue.*/ \
output_buffers_queue_t obqueue; \
/* Input buffer.*/ \
uint8_t ib[BQ_BUFFER_SIZE(USB_HID_BUFFERS_NUMBER, \
USB_HID_BUFFERS_SIZE)]; \
/* Output buffer.*/ \
uint8_t ob[BQ_BUFFER_SIZE(USB_HID_BUFFERS_NUMBER, \
USB_HID_BUFFERS_SIZE)]; \
/* End of the mandatory fields.*/ \
/* Current configuration data.*/ \
const USBHIDConfig *config;
/**
* @brief @p USBHIDDriver specific methods.
*/
#define _usb_hid_driver_methods \
_base_asynchronous_channel_methods \
/* Buffer flush method.*/ \
void (*flush)(void *instance);
/**
* @extends BaseAsynchronousChannelVMT
*
* @brief @p USBHIDDriver virtual methods table.
*/
struct USBHIDDriverVMT {
_usb_hid_driver_methods
};
/**
* @extends BaseAsynchronousChannel
*
* @brief Full duplex USB HID driver class.
* @details This class extends @p BaseAsynchronousChannel by adding physical
* I/O queues.
*/
struct USBHIDDriver {
/** @brief Virtual Methods Table.*/
const struct USBHIDDriverVMT *vmt;
_usb_hid_driver_data
};
#define USB_DRIVER_EXT_FIELDS \
USBHIDDriver hid
/*===========================================================================*/
/* Driver macros. */
/*===========================================================================*/
/*===========================================================================*/
/* External declarations. */
/*===========================================================================*/
#ifdef __cplusplus
extern "C" {
#endif
void hidInit(void);
void hidObjectInit(USBHIDDriver *uhdp);
void hidStart(USBHIDDriver *uhdp, const USBHIDConfig *config);
void hidStop(USBHIDDriver *uhdp);
void hidDisconnectI(USBHIDDriver *uhdp);
void hidConfigureHookI(USBHIDDriver *uhdp);
bool hidRequestsHook(USBDriver *usbp);
void hidDataTransmitted(USBDriver *usbp, usbep_t ep);
void hidDataReceived(USBDriver *usbp, usbep_t ep);
size_t hidWriteReport(USBHIDDriver *uhdp, uint8_t *bp, size_t n);
size_t hidWriteReportt(USBHIDDriver *uhdp, uint8_t *bp, size_t n, systime_t timeout);
size_t hidReadReport(USBHIDDriver *uhdp, uint8_t *bp, size_t n);
size_t hidReadReportt(USBHIDDriver *uhdp, uint8_t *bp, size_t n, systime_t timeout);
#ifdef __cplusplus
}
#endif
#endif /* HAL_USE_USB_HID */
#endif /* HAL_USB_HID_H */
/** @} */