From 636b30c3d8a11b7cfede7b1e8dd58549aa8e4ffd Mon Sep 17 00:00:00 2001 From: sakumisu <1203593632@qq.com> Date: Fri, 26 Nov 2021 23:41:59 +0800 Subject: [PATCH] refactor usb class structure --- class/audio/usb_audio.h | 708 +++++++++++++++ class/audio/usbd_audio.c | 28 +- class/audio/usbd_audio.h | 244 +----- class/cdc/usb_cdc.h | 444 ++++++++++ class/cdc/usbd_cdc.c | 8 +- class/cdc/usbd_cdc.h | 417 +-------- class/dfu/usb_dfu.h | 103 +++ class/dfu/usbd_dfu.c | 2 +- class/dfu/usbd_dfu.h | 95 +- class/hid/usb_hid.h | 708 +++++++++++++++ class/hid/usbd_hid.c | 18 +- class/hid/usbd_hid.h | 331 +------ class/midi/{usbd_midi.h => usb_midi.h} | 26 +- class/msc/usb_msc.h | 121 +++ class/msc/{usbd_scsi.h => usb_scsi.h} | 30 +- class/msc/usbd_msc.c | 25 +- class/msc/usbd_msc.h | 85 +- class/tmc/{usbd_tmc.h => usb_tmc.h} | 20 +- class/video/usb_video.h | 809 ++++++++++++++++++ class/video/usbd_video.c | 6 +- class/video/usbd_video.h | 801 +---------------- class/webusb/usbd_webusb.h | 22 - class/winusb/usbd_winusb.h | 26 - common/usb_dc.h | 41 +- common/usb_def.h | 349 +++++--- common/usb_slist.h | 6 +- common/usb_util.h | 135 ++- core/usbd_core.c | 152 ++-- core/usbd_core.h | 42 +- .../MDK-ARM/stm32f103c8t6.uvoptx | 50 +- .../MDK-ARM/stm32f103c8t6.uvprojx | 76 +- .../stm32f103c8t6/example/cdc/cdc_init.c | 3 +- .../stm32f103c8t6/example/example_select.h | 5 +- .../example/hid_keyboard/hid_keyboard_init.c | 2 +- .../example/msc_ram/msc_ram_init.c | 29 +- 35 files changed, 3552 insertions(+), 2415 deletions(-) create mode 100644 class/audio/usb_audio.h create mode 100644 class/cdc/usb_cdc.h create mode 100644 class/dfu/usb_dfu.h create mode 100644 class/hid/usb_hid.h rename class/midi/{usbd_midi.h => usb_midi.h} (95%) create mode 100644 class/msc/usb_msc.h rename class/msc/{usbd_scsi.h => usb_scsi.h} (96%) rename class/tmc/{usbd_tmc.h => usb_tmc.h} (94%) create mode 100644 class/video/usb_video.h delete mode 100644 class/webusb/usbd_webusb.h delete mode 100644 class/winusb/usbd_winusb.h diff --git a/class/audio/usb_audio.h b/class/audio/usb_audio.h new file mode 100644 index 00000000..9b7a6c10 --- /dev/null +++ b/class/audio/usb_audio.h @@ -0,0 +1,708 @@ +/** + * @file + * @brief USB Audio Class public header + * + * Header follows below documentation: + * - USB Class Definition for Audio Devices (audio10.pdf) + * + * Additional documentation considered a part of USB Audio v1.0: + * - USB Class Definition for Audio Data Formats (frmts10.pdf) + * - USB Class Definition for Terminal Types (termt10.pdf) + */ + +#ifndef _USB_AUDIO_H_ +#define _USB_AUDIO_H_ + +/** Audio Interface Subclass Codes + * Refer to Table A-2 from audio10.pdf + */ +#define AUDIO_SUBCLASS_UNDEFINED 0x00 +#define AUDIO_SUBCLASS_AUDIOCONTROL 0x01 +#define AUDIO_SUBCLASS_AUDIOSTREAMING 0x02 +#define AUDIO_SUBCLASS_MIDISTREAMING 0x03 + +#define AUDIO_PROTOCOL_UNDEFINED 0x00 +#define AUDIO_PROTOCOLv20 0x20 /* IP version 2.0 */ +#define AUDIO_PROTOCOLv20_BCD 0x0200 /* IP version 2.0 (BCD) */ + +/** Audio Class-Specific Request Codes + * Refer to Table A-9 from audio10.pdf + */ +#define AUDIO_REQUEST_UNDEFINED 0x00 +#define AUDIO_REQUEST_SET_CUR 0x01 +#define AUDIO_REQUEST_GET_CUR 0x81 +#define AUDIO_REQUEST_SET_MIN 0x02 +#define AUDIO_REQUEST_GET_MIN 0x82 +#define AUDIO_REQUEST_SET_MAX 0x03 +#define AUDIO_REQUEST_GET_MAX 0x83 +#define AUDIO_REQUEST_SET_RES 0x04 +#define AUDIO_REQUEST_GET_RES 0x84 +#define AUDIO_REQUEST_SET_MEM 0x05 +#define AUDIO_REQUEST_GET_MEM 0x85 +#define AUDIO_REQUEST_GET_STAT 0xFF + +/** Audio Class-Specific Control Interface Descriptor Subtypes + * Refer to Table A-5 from audio10.pdf + */ +#define AUDIO_CONTROL_UNDEF 0x01U +#define AUDIO_CONTROL_HEADER 0x01U +#define AUDIO_CONTROL_INPUT_TERMINAL 0x02U +#define AUDIO_CONTROL_OUTPUT_TERMINAL 0x03U +#define AUDIO_CONTROL_MIXER_UNIT 0x04U +#define AUDIO_CONTROL_SELECTOR_UNIT 0x05U +#define AUDIO_CONTROL_FEATURE_UNIT 0x06U +#define AUDIO_CONTROL_EFFECT_UNIT 0x07U +#define AUDIO_CONTROL_PROCESSING_UNIT 0x08U +#define AUDIO_CONTROL_EXTENSION_UNIT 0x09U +#define AUDIO_CONTROL_CLOCK_SOURCE 0x0aU +#define AUDIO_CONTROL_CLOCK_SELECTOR 0x0bU +#define AUDIO_CONTROL_CLOCK_MULTIPLIER 0x0cU +#define AUDIO_CONTROL_SAMPLERATE_CONVERTER 0x0dU + +/** Audio Class-Specific AS Interface Descriptor Subtypes + * Refer to Table A-6 from audio10.pdf + */ +#define AUDIO_STREAMING_UNDEFINED 0x00U +#define AUDIO_STREAMING_GENERAL 0x01U +#define AUDIO_STREAMING_FORMAT_TYPE 0x02U +#define AUDIO_STREAMING_ENCODER 0x03U +#define AUDIO_STREAMING_DECODER 0x04U + +/* Clock Source Descriptor Clock Types */ +#define AUDIO_CLKSRC_EXTERNAL 0x00 /* External clock */ +#define AUDIO_CLKSRC_INTERNAL_FIXED 0x01 /* Internal fixed clock */ +#define AUDIO_CLKSRC_INTERNAL_VAR 0x02 /* Internal variable clock */ +#define AUDIO_CLKSRC_INTERNAL_PROG 0x03 /* Internal programmable clock */ + +/* Effect Unit Effect Types */ +#define AUDIO_EFFECT_UNDEF 0x00 +#define AUDIO_EFFECT_PARAM_EQ_SECTION 0x01 +#define AUDIO_EFFECT_REVERBERATION 0x02 +#define AUDIO_EFFECT_MOD_DELAY 0x03 +#define AUDIO_EFFECT_DYN_RANGE_COMP 0x04 + +/* Processing Unit Process Types */ +#define AUDIO_PROCESS_UNDEFINED 0x00 +#define AUDIO_PROCESS_UPDOWNMIX 0x01 +#define AUDIO_PROCESS_DOLBY_PROLOGIC 0x02 +#define AUDIO_PROCESS_STEREO_EXTENDER 0x03 + +/* Audio Class-Specific Endpoint Descriptor Subtypes */ +#define AUDIO_ENDPOINT_UNDEFINED 0x00U +#define AUDIO_ENDPOINT_GENERAL 0x01U + +/* Feature Unit Control Bits */ +#define AUDIO_CONTROL_MUTE 0x0001 +#define AUDIO_CONTROL_VOLUME 0x0002 +#define AUDIO_CONTROL_BASS 0x0004 +#define AUDIO_CONTROL_MID 0x0008 +#define AUDIO_CONTROL_TREBLE 0x0010 +#define AUDIO_CONTROL_GRAPHIC_EQUALIZER 0x0020 +#define AUDIO_CONTROL_AUTOMATIC_GAIN 0x0040 +#define AUDIO_CONTROL_DEALY 0x0080 +#define AUDIO_CONTROL_BASS_BOOST 0x0100 +#define AUDIO_CONTROL_LOUDNESS 0x0200 + +/* Encoder Type Codes */ +#define AUDIO_ENCODER_UNDEF 0x00 +#define AUDIO_ENCODER_OTHER 0x01 +#define AUDIO_ENCODER_MPEG 0x02 +#define AUDIO_ENCODER_AC3 0x03 +#define AUDIO_ENCODER_WMA 0x04 +#define AUDIO_ENCODER_DTS 0x05 + +/* Decoder Type Codes */ +#define AUDIO_DECODER_UNDEF 0x00 +#define AUDIO_DECODER_OTHER 0x01 +#define AUDIO_DECODER_MPEG 0x02 +#define AUDIO_DECODER_AC3 0x03 +#define AUDIO_DECODER_WMA 0x04 +#define AUDIO_DECODER_DTS 0x05 + +/* Audio Descriptor Types */ +#define AUDIO_UNDEFINED_DESCRIPTOR_TYPE 0x20 +#define AUDIO_DEVICE_DESCRIPTOR_TYPE 0x21 +#define AUDIO_CONFIGURATION_DESCRIPTOR_TYPE 0x22 +#define AUDIO_STRING_DESCRIPTOR_TYPE 0x23 +#define AUDIO_INTERFACE_DESCRIPTOR_TYPE 0x24 +#define AUDIO_ENDPOINT_DESCRIPTOR_TYPE 0x25 + +/* Audio Data Format Type I Codes */ +#define AUDIO_FORMAT_TYPE_I_UNDEFINED 0x0000 +#define AUDIO_FORMAT_PCM 0x0001 +#define AUDIO_FORMAT_PCM8 0x0002 +#define AUDIO_FORMAT_IEEE_FLOAT 0x0003 +#define AUDIO_FORMAT_ALAW 0x0004 +#define AUDIO_FORMAT_MULAW 0x0005 + +/* bmChannelConfig: a bitmap field that indicates which spatial locations + * are occupied by the channels present in the cluster. The bit allocations + * are as follows: + */ +#define AUDIO_CHANNEL_M 0 /* Mono */ +#define AUDIO_CHANNEL_FL (1 << 0) /* Front Left */ +#define AUDIO_CHANNEL_FR (1 << 1) /* Front Right */ +#define AUDIO_CHANNEL_FC (1 << 2) /* Front Center */ +#define AUDIO_CHANNEL_LFE (1 << 3) /* Low Frequency Effects */ +#define AUDIO_CHANNEL_BL (1 << 4) /* Back Left */ +#define AUDIO_CHANNEL_BR (1 << 5) /* Back Right */ +#define AUDIO_CHANNEL_FLC (1 << 6) /* Front Left of Center */ +#define AUDIO_CHANNEL_FRC (1 << 7) /* Front Right of Center */ +#define AUDIO_CHANNEL_BC (1 << 8) /* Back Center */ +#define AUDIO_CHANNEL_SL (1 << 9) /* Side Left */ +#define AUDIO_CHANNEL_SR (1 << 10) /* Side Right */ +#define AUDIO_CHANNEL_TC (1 << 11) /* Top Center */ +#define AUDIO_CHANNEL_TFL (1 << 12) /* Top Front Left */ +#define AUDIO_CHANNEL_TFC (1 << 13) /* Top Front Center */ +#define AUDIO_CHANNEL_TFR (1 << 14) /* Top Front Right */ +#define AUDIO_CHANNEL_TBL (1 << 15) /* Top Back Left */ +#define AUDIO_CHANNEL_TBC (1 << 16) /* Top Back Center */ +#define AUDIO_CHANNEL_TBR (1 << 17) /* Top Back Right */ +#define AUDIO_CHANNEL_TFLC (1 << 18) /* Top Front Left of Center */ +#define AUDIO_CHANNEL_TFRC (1 << 19) /* Top Front Right of Center */ +#define AUDIO_CHANNEL_LLFE (1 << 20) /* Left Low Frequency Effects */ +#define AUDIO_CHANNEL_RLFE (1 << 21) /* Right Low Frequency Effects */ +#define AUDIO_CHANNEL_TSL (1 << 22) /* Top Side Left */ +#define AUDIO_CHANNEL_TSR (1 << 23) /* Top Side Right */ +#define AUDIO_CHANNEL_BOC (1 << 24) /* Bottom Center */ +#define AUDIO_CHANNEL_BLC (1 << 25) /* Back Left of Center */ +#define AUDIO_CHANNEL_BRC (1 << 26) /* Back Right of Center */ + /* Bits 27-30: Reserved */ +#define AUDIO_CHANNEL_RD (1 << 31) /* Raw Data */ + +/* Audio Function Category Codes */ +#define AUDIO_CATEGORY_UNDEF 0x00 /* Undefined */ +#define AUDIO_CATEGORY_SPEAKER 0x01 /* Desktop speaker */ +#define AUDIO_CATEGORY_THEATER 0x02 /* Home theater */ +#define AUDIO_CATEGORY_MICROPHONE 0x03 /* Microphone */ +#define AUDIO_CATEGORY_HEADSET 0x04 /* Headset */ +#define AUDIO_CATEGORY_TELEPHONE 0x05 /* Telephone */ +#define AUDIO_CATEGORY_CONVERTER 0x06 /* Converter */ +#define AUDIO_CATEGORY_RECORDER 0x07 /* Voice/Sound recorder */ +#define AUDIO_CATEGORY_IO_BOX 0x08 /* I/O box */ +#define AUDIO_CATEGORY_INSTRUMENT 0x09 /* Musical instrument */ +#define AUDIO_CATEGORY_PROAUDIO 0x0a /* Pro-audio */ +#define AUDIO_CATEGORY_AV 0x0b /* Audio/video */ +#define AUDIO_CATEGORY_CONTROL 0x0c /* Control panel */ +#define AUDIO_CATEGORY_OTHER 0xff + +/* Clock Source Control Selectors */ +#define AUDIO_CS_CONTROL_UNDEF 0x00 +#define AUDIO_CS_CONTROL_SAM_FREQ 0x01 +#define AUDIO_CS_CONTROL_CLOCK_VALID 0x02 + +/* Clock Selector Control Selectors */ +#define AUDIO_CX_CONTROL_UNDEF 0x00 +#define AUDIO_CX_CONTROL_CLOCKSEL 0x01 + +/* Clock Multiplier Control Selectors */ +#define AUDIO_CM_CONTROL_UNDEF 0x00 +#define AUDIO_CM_CONTROL_NUMERATOR 0x01 +#define AUDIO_CM_CONTROL_DENOMINATOR 0x02 + +/* Terminal Control Selectors */ +#define AUDIO_TE_CONTROL_UNDEF 0x00 +#define AUDIO_TE_CONTROL_COPY_PROTECT 0x01 +#define AUDIO_TE_CONTROL_CONNECTOR 0x02 +#define AUDIO_TE_CONTROL_OVERLOAD 0x03 +#define AUDIO_TE_CONTROL_CLUSTER 0x04 +#define AUDIO_TE_CONTROL_UNDERFLOW 0x05 +#define AUDIO_TE_CONTROL_OVERFLOW 0x06 +#define AUDIO_TE_CONTROL_LATENCY 0x07 + +/* Mixer Control Selectors */ +#define AUDIO_MU_CONTROL_UNDEF 0x00 +#define AUDIO_MU_CONTROL_MIXER 0x01 +#define AUDIO_MU_CONTROL_CLUSTER 0x02 +#define AUDIO_MU_CONTROL_UNDERFLOW 0x03 +#define AUDIO_MU_CONTROL_OVERFLOW 0x04 +#define AUDIO_MU_CONTROL_LATENCY 0x05 + +/* Selector Control Selectors */ +#define AUDIO_SU_CONTROL_UNDEFINE 0x00 +#define AUDIO_SU_CONTROL_SELECTOR 0x01 +#define AUDIO_SU_CONTROL_LATENCY 0x02 + +/* Feature Unit Control Selectors */ +#define AUDIO_FU_CONTROL_UNDEF 0x00 +#define AUDIO_FU_CONTROL_MUTE 0x01 +#define AUDIO_FU_CONTROL_VOLUME 0x02 +#define AUDIO_FU_CONTROL_BASS 0x03 +#define AUDIO_FU_CONTROL_MID 0x04 +#define AUDIO_FU_CONTROL_TREBLE 0x05 +#define AUDIO_FU_CONTROL_EQUALIZER 0x06 +#define AUDIO_FU_CONTROL_AGC 0x07 +#define AUDIO_FU_CONTROL_DELAY 0x08 +#define AUDIO_FU_CONTROL_BASS_BOOST 0x09 +#define AUDIO_FU_CONTROL_LOUDNESS 0x0a +#define AUDIO_FU_CONTROL_INP_GAIN 0x0b +#define AUDIO_FU_CONTROL_INP_GAIN_PAD 0x0c +#define AUDIO_FU_CONTROL_PHASE_INVERT 0x0d +#define AUDIO_FU_CONTROL_UNDERFLOW 0x0e +#define AUDIO_FU_CONTROL_OVERFLOW 0x0f +#define AUDIO_FU_CONTROL_LATENCY 0x10 + +/* Parametric Equalizer Section Effect Unit Control Selectors */ +#define AUDIO_PE_CONTROL_UNDEF 0x00 +#define AUDIO_PE_CONTROL_ENABLE 0x01 +#define AUDIO_PE_CONTROL_CENTERFREQ 0x02 +#define AUDIO_PE_CONTROL_QFACTOR 0x03 +#define AUDIO_PE_CONTROL_GAIN 0x04 +#define AUDIO_PE_CONTROL_UNDERFLOW 0x05 +#define AUDIO_PE_CONTROL_OVERFLOW 0x06 +#define AUDIO_PE_CONTROL_LATENCY 0x07 + +/* Reverberation Effect Unit Control Selectors */ +#define AUDIO_RV_CONTROL_UNDEF 0x00 +#define AUDIO_RV_CONTROL_ENABLE 0x01 +#define AUDIO_RV_CONTROL_TYPE 0x02 +#define AUDIO_RV_CONTROL_LEVEL 0x03 +#define AUDIO_RV_CONTROL_TIME 0x04 +#define AUDIO_RV_CONTROL_FEEDBACK 0x05 +#define AUDIO_RV_CONTROL_PREDELAY 0x06 +#define AUDIO_RV_CONTROL_DENSITY 0x07 +#define AUDIO_RV_CONTROL_HF_ROLLOFF 0x08 +#define AUDIO_RV_CONTROL_UNDERFLOW 0x09 +#define AUDIO_RV_CONTROL_OVERFLOW 0x0a +#define AUDIO_RV_CONTROL_LATENCY 0x0b + +/* Modulation Delay Effect Unit Control Selectors */ +#define AUDIO_MD_CONTROL_UNDEF 0x00 +#define AUDIO_MD_CONTROL_ENABLE 0x01 +#define AUDIO_MD_CONTROL_BALANCE 0x02 +#define AUDIO_MD_CONTROL_RATE 0x03 +#define AUDIO_MD_CONTROL_DEPTH 0x04 +#define AUDIO_MD_CONTROL_TIME 0x05 +#define AUDIO_MD_CONTROL_FEEDBACK 0x06 +#define AUDIO_MD_CONTROL_UNDERFLOW 0x07 +#define AUDIO_MD_CONTROL_OVERFLOW 0x08 +#define AUDIO_MD_CONTROL_LATENCY 0x09 + +/* Dynamic Range Compressor Effect Unit Control Selectors */ +#define AUDIO_DR_CONTROL_UNDEF 0x00 +#define AUDIO_DR_CONTROL_ENABLE 0x01 +#define AUDIO_DR_CONTROL_COMP_RATE 0x02 +#define AUDIO_DR_CONTROL_MAXAMPL 0x03 +#define AUDIO_DR_CONTROL_THRESHOLD 0x04 +#define AUDIO_DR_CONTROL_ATTACK_TIME 0x05 +#define AUDIO_DR_CONTROL_RELEASE_TIME 0x06 +#define AUDIO_DR_CONTROL_UNDERFLOW 0x07 +#define AUDIO_DR_CONTROL_OVERFLOW 0x08 +#define AUDIO_DR_CONTROL_LATENCY 0x09 + +/* Up/Down-mix Processing Unit Control Selectors */ +#define AUDIO_UD_CONTROL_UNDEF 0x00 +#define AUDIO_UD_CONTROL_ENABLE 0x01 +#define AUDIO_UD_CONTROL_MODE_SELECT 0x02 +#define AUDIO_UD_CONTROL_CLUSTER 0x03 +#define AUDIO_UD_CONTROL_UNDERFLOW 0x04 +#define AUDIO_UD_CONTROL_OVERFLOW 0x05 +#define AUDIO_UD_CONTROL_LATENCY 0x06 + +/* Dolby Prologic?Processing Unit Control Selectors */ +#define AUDIO_DP_CONTROL_UNDEF 0x00 +#define AUDIO_DP_CONTROL_ENABLE 0x01 +#define AUDIO_DP_CONTROL_MODE_SELECT 0x02 +#define AUDIO_DP_CONTROL_CLUSTER 0x03 +#define AUDIO_DP_CONTROL_UNDERFLOW 0x04 +#define AUDIO_DP_CONTROL_OVERFLOW 0x05 +#define AUDIO_DP_CONTROL_LATENCY 0x06 + +/* Stereo Extender Processing Unit Control Selectors */ +#define AUDIO_STEXT_CONTROL_UNDEF 0x00 +#define AUDIO_STEXT_CONTROL_ENABLE 0x01 +#define AUDIO_STEXT_CONTROL_WIDTH 0x02 +#define AUDIO_STEXT_CONTROL_UNDERFLOW 0x03 +#define AUDIO_STEXT_CONTROL_OVERFLOW 0x04 +#define AUDIO_STEXT_CONTROL_LATENCY 0x05 + +/* Extension Unit Control Selectors */ + +#define AUDIO_XU_CONTROL_UNDEF 0x00 +#define AUDIO_XU_CONTROL_ENABLE 0x01 +#define AUDIO_XU_CONTROL_CLUSTER 0x02 +#define AUDIO_XU_CONTROL_UNDERFLOW 0x03 +#define AUDIO_XU_CONTROL_OVERFLOW 0x04 +#define AUDIO_XU_CONTROL_LATENCY 0x05 + +/* AudioStreaming Interface Control Selectors */ + +#define AUDIO_AS_CONTROL_UNDEF 0x00 +#define AUDIO_AS_CONTROL_ACT_ALT 0x01 +#define AUDIO_AS_CONTROL_VAL_ALT 0x02 +#define AUDIO_AS_CONTROL_AUDIO_FORMAT 0x03 + +/* Encoder Control Selectors */ + +#define AUDIO_EN_CONTROL_UNDEF 0x00 +#define AUDIO_EN_CONTROL_BIT_RATE 0x01 +#define AUDIO_EN_CONTROL_QUALITY 0x02 +#define AUDIO_EN_CONTROL_VBR 0x03 +#define AUDIO_EN_CONTROL_TYPE 0x04 +#define AUDIO_EN_CONTROL_UNDERFLOW 0x05 +#define AUDIO_EN_CONTROL_OVERFLOW 0x06 +#define AUDIO_EN_CONTROL_ENCODER_ERR 0x07 +#define AUDIO_EN_CONTROL_PARAM1 0x08 +#define AUDIO_EN_CONTROL_PARAM2 0x09 +#define AUDIO_EN_CONTROL_PARAM3 0x0a +#define AUDIO_EN_CONTROL_PARAM4 0x0b +#define AUDIO_EN_CONTROL_PARAM5 0x0c +#define AUDIO_EN_CONTROL_PARAM6 0x0d +#define AUDIO_EN_CONTROL_PARAM7 0x0e +#define AUDIO_EN_CONTROL_PARAM8 0x0f + +/* MPEG Decoder Control Selectors */ + +#define AUDIO_MPGD_CONTROL_UNDEF 0x00 +#define AUDIO_MPGD_CONTROL_DUAL_CHAN 0x01 +#define AUDIO_MPGD_CONTROL_2ND_STEREO 0x02 +#define AUDIO_MPGD_CONTROL_MULTILING 0x03 +#define AUDIO_MPGD_CONTROL_DYN_RANGE 0x04 +#define AUDIO_MPGD_CONTROL_SCALING 0x05 +#define AUDIO_MPGD_CONTROL_HILO_SCALE 0x06 +#define AUDIO_MPGD_CONTROL_UNDERFLOW 0x07 +#define AUDIO_MPGD_CONTROL_OVERFLOW 0x08 +#define AUDIO_MPGD_CONTROL_DECODE_ERR 0x09 + +/* AC-3 Decoder Control Selectors */ + +#define AUDIO_AC3D_CONTROL_UNDEF 0x00 +#define AUDIO_AC3D_CONTROL_MODE 0x01 +#define AUDIO_AC3D_CONTROL_DYN_RANGE 0x02 +#define AUDIO_AC3D_CONTROL_SCALING 0x03 +#define AUDIO_AC3D_CONTROL_HILO_SCALE 0x04 +#define AUDIO_AC3D_CONTROL_UNDERFLOW 0x05 +#define AUDIO_AC3D_CONTROL_OVERFLOW 0x06 +#define AUDIO_AC3D_CONTROL_DECODE_ERR 0x07 + +/* WMA Decoder Control Selectors */ + +#define AUDIO_WMAD_CONTROL_UNDEF 0x00 +#define AUDIO_WMAD_CONTROL_UNDERFLOW 0x01 +#define AUDIO_WMAD_CONTROL_OVERFLOW 0x02 +#define AUDIO_WMAD_CONTROL_DECODE_ERR 0x03 + +/* DTS Decoder Control Selectors */ + +#define AUDIO_DTSD_CONTROL_UNDEF 0x00 +#define AUDIO_DTSD_CONTROL_UNDERFLOW 0x01 +#define AUDIO_DTSD_CONTROL_OVERFLOW 0x02 +#define AUDIO_DTSD_CONTROL_DECODE_ERR 0x03 + +/* Endpoint Control Selectors */ + +#define AUDIO_EP_CONTROL_UNDEF 0x00 +#define AUDIO_EP_CONTROL_PITCH 0x01 +#define AUDIO_EP_CONTROL_OVERRUN 0x02 +#define AUDIO_EP_CONTROL_UNDERRUN 0x03 + +/* Encoder Error Codes */ + +/* <0: Reserved for vendor extensions */ + +#define AUDIO_ENCODER_SUCCESS 0 /* No Error */ +#define AUDIO_ENCODER_ERROR_NOMEM 1 /* Out of Memory */ +#define AUDIO_ENCODER_ERROR_BW 2 /* Out of Bandwidth */ +#define AUDIO_ENCODER_ERROR_CYCLE 3 /* Out of Processing Cycles */ +#define AUDIO_ENCODER_ERROR_FRAME 4 /* General Format Frame Error */ +#define AUDIO_ENCODER_ERROR_TOOSMALL 5 /* Format Frame Too Small */ +#define AUDIO_ENCODER_ERROR_TOOBIG 6 /* Format Frame Too Large */ +#define AUDIO_ENCODER_ERROR_BADFORMAT 7 /* Bad Data Format */ +#define AUDIO_ENCODER_ERROR_NCHAN 8 /* Incorrect Number of Channels */ +#define AUDIO_ENCODER_ERROR_RATE 9 /* Incorrect Sampling Rate */ +#define AUDIO_ENCODER_ERROR_BITRATE 10 /* Unable to Meet Target Bitrate */ +#define AUDIO_ENCODER_ERROR_PARMS 11 /* Inconsistent Set of Parameters */ +#define AUDIO_ENCODER_ERROR_NOTREADY 12 /* Not Ready */ +#define AUDIO_ENCODER_ERROR_BUSY 13 /* Busy */ + /* >13: Reserved */ + +/* Format Type Codes */ + +#define AUDIO_FORMAT_TYPE_UNDEF 0x00 +#define AUDIO_FORMAT_TYPEI 0x01 +#define AUDIO_FORMAT_TYPEII 0x02 +#define AUDIO_FORMAT_TYPEIII 0x03 +#define AUDIO_FORMAT_TYPEIV 0x04 +#define AUDIO_FORMAT_EXT_TYPEI 0x81 +#define AUDIO_FORMAT_EXT_TYPEII 0x82 +#define AUDIO_FORMAT_EXT_TYPEIII 0x83 + +/* Audio Data Format Type I Bit Allocations */ + +#define AUDIO_FORMAT_TYPEI_PCM (1 << 0) +#define AUDIO_FORMAT_TYPEI_PCM8 (1 << 1) +#define AUDIO_FORMAT_TYPEI_IEEEFLOAT (1 << 2) +#define AUDIO_FORMAT_TYPEI_ALAW (1 << 3) +#define AUDIO_FORMAT_TYPEI_MULAW (1 << 4) +#define AUDIO_FORMAT_TYPEI_RAWDATA (1 << 31) + +/* Audio Data Format Type II Bit Allocations */ + +#define AUDIO_FORMAT_TYPEII_MPEG (1 << 0) +#define AUDIO_FORMAT_TYPEII_AC3 (1 << 1) +#define AUDIO_FORMAT_TYPEII_WMA (1 << 2) +#define AUDIO_FORMAT_TYPEII_DTS (1 << 3) +#define AUDIO_FORMAT_TYPEII_RAWDATA (1 << 31) + +/* Audio Data Format Type III Bit Allocations */ + +#define AUDIO_FORMAT_TYPEIII_IEC61937_AC3 (1 << 0) +#define AUDIO_FORMAT_TYPEIII_IEC61937_MPEG1_L1 (1 << 1) +#define AUDIO_FORMAT_TYPEIII_IEC61937_MPEG1_L2_3 (1 << 1) +#define AUDIO_FORMAT_TYPEIII_IEC61937_MPEG2_NOEXT (1 << 2) +#define AUDIO_FORMAT_TYPEIII_IEC61937_MPEG2_EXT (1 << 3) +#define AUDIO_FORMAT_TYPEIII_IEC61937_MPEG2_AAC_ADTS (1 << 4) +#define AUDIO_FORMAT_TYPEIII_IEC61937_MPEG2_L1_LS (1 << 5) +#define AUDIO_FORMAT_TYPEIII_IEC61937_MPEG2_L2_3_LS (1 << 6) +#define AUDIO_FORMAT_TYPEIII_IEC61937_DTS_I (1 << 7) +#define AUDIO_FORMAT_TYPEIII_IEC61937_DTS_II (1 << 8) +#define AUDIO_FORMAT_TYPEIII_IEC61937_DTS_III (1 << 9) +#define AUDIO_FORMAT_TYPEIII_IEC61937_ATRAC (1 << 10) +#define AUDIO_FORMAT_TYPEIII_IEC61937_ATRAC2_3 (1 << 11) +#define AUDIO_FORMAT_TYPEIII_WMA (1 << 12) + +/* Audio Data Format Type IV Bit Allocations */ + +#define AUDIO_FORMAT_TYPEIV_PCM (1 << 0) +#define AUDIO_FORMAT_TYPEIV_PCM8 (1 << 1) +#define AUDIO_FORMAT_TYPEIV_IEEE_FLOAT (1 << 2) +#define AUDIO_FORMAT_TYPEIV_ALAW (1 << 3) +#define AUDIO_FORMAT_TYPEIV_MULAW (1 << 4) +#define AUDIO_FORMAT_TYPEIV_MPEG (1 << 5) +#define AUDIO_FORMAT_TYPEIV_AC3 (1 << 6) +#define AUDIO_FORMAT_TYPEIV_WMA (1 << 7) +#define AUDIO_FORMAT_TYPEIV_IEC61937_AC3 (1 << 8) +#define AUDIO_FORMAT_TYPEIV_IEC61937_MPEG1_L1 (1 << 9) +#define AUDIO_FORMAT_TYPEIV_IEC61937_MPEG1_L2_3 (1 << 10) +#define AUDIO_FORMAT_TYPEIV_IEC61937_MPEG2_NOEXT (1 << 10) +#define AUDIO_FORMAT_TYPEIV_IEC61937_MPEG2_EXT (1 << 11) +#define AUDIO_FORMAT_TYPEIV_IEC61937_MPEG2_AAC_ADTS (1 << 12) +#define AUDIO_FORMAT_TYPEIV_IEC61937_MPEG2_L1_LS (1 << 13) +#define AUDIO_FORMAT_TYPEIV_IEC61937_MPEG2_L2_3_LS (1 << 14) +#define AUDIO_FORMAT_TYPEIV_IEC61937_DTS_I (1 << 15) +#define AUDIO_FORMAT_TYPEIV_IEC61937_DTS_II (1 << 16) +#define AUDIO_FORMAT_TYPEIV_IEC61937_DTS_III (1 << 17) +#define AUDIO_FORMAT_TYPEIV_IEC61937_ATRAC (1 << 18) +#define AUDIO_FORMAT_TYPEIV_IEC61937_ATRAC2_3 (1 << 19) +#define AUDIO_FORMAT_TYPEIV_TYPE_III_WMA (1 << 20) +#define AUDIO_FORMAT_TYPEIV_IEC60958_PCM (1 << 21) + +/* Side Band Protocol Codes */ +#define AUDIO_SIDEBAND_PROTOCOL_UNDEF 0x00 +#define AUDIO_PRES_TIMESTAMP_PROTOCOL 0x01 + +/* USB Terminal Types */ +#define AUDIO_TERMINAL_UNDEF 0x0100 +#define AUDIO_TERMINAL_STREAMING 0x0101 +#define AUDIO_TERMINAL_VENDOR 0x01ff + +/* Input Terminal Types */ +#define AUDIO_INTERM_UNDEF 0x0200 /* Undefined Type */ +#define AUDIO_INTERM_MIC 0x0201 /* A generic microhpone */ +#define AUDIO_INTERM_DESKTOP_MIC 0x0202 /* A desktop microphone */ +#define AUDIO_INTERM_PERSONAL_MIC 0x0203 /* Head-mounted or clip-on microphone */ +#define AUDIO_INTERM_OMNI_MIC 0x0204 /* Omni-directional microphone */ +#define AUDIO_INTERM_MIC_ARRAY 0x0205 /* Microphone array */ +#define AUDIO_INTERM_PROC_MIC_ARRAY 0x0206 /* Microphone array with signal processor */ + +/* Output Terminal Types */ +#define AUDIO_OUTTERM_UNDEF 0x0300 /* Undefined Type */ +#define AUDIO_OUTTERM_SPEAKER 0x0301 /* Generic speakers */ +#define AUDIO_OUTTERM_HEADPHONES 0x0302 /* A head-mounted audio output device */ +#define AUDIO_OUTTERM_HEADDISPLAY 0x0303 /* Head Mounted Display Audio */ +#define AUDIO_OUTTERM_DESKTOP 0x0304 /* Desktop speaker */ +#define AUDIO_OUTTERM_ROOM 0x0305 /* Room speaker */ +#define AUDIO_OUTTERM_COMMS 0x0306 /* Communication speaker */ +#define AUDIO_OUTTERM_LOFREQ 0x0307 /* Low frequency effects speaker */ + +/* Bi-directional Terminal Types */ +#define AUDIO_BIDITERM_UNDEF 0x0400 /* Undefined Type */ +#define AUDIO_BIDITERM_HANDSET 0x0401 /* Hand-held bi-directional audio device */ +#define AUDIO_BIDITERM_HEADSET 0x0402 /* Head-mounted bi-directional audio device */ +#define AUDIO_BIDITERM_SPEAKERPHONE 0x0403 /* Speakerphone, no echo reduction */ +#define AUDIO_BIDITERM_ECHOSUPPRESS 0x0404 /* Echo-suppressing speakerphone */ +#define AUDIO_BIDITERM_ECHOCANCEL 0x0405 /* Echo-canceling speakerphone */ + +/* Telephony Terminal Types */ +#define AUDIO_TELETERM_UNDEF 0x0500 /* Undefined Type */ +#define AUDIO_TELETERM_PHONELINE 0x0501 /* Analog telephone line jack, an ISDN line, + * a proprietary PBX interface, or a wireless link */ +#define AUDIO_TELETERM_TELEPHONE 0x0502 /* Device can be used as a telephone */ +#define AUDIO_TELETERM_DOWNLINE 0x0503 /* Down Line Phone */ + +/* External Terminal Types */ +#define AUDIO_EXTTERM_UNDEF 0x0600 /* Undefined Type */ +#define AUDIO_EXTTERM_ANALOG 0x0601 /* Generic analog connector */ +#define AUDIO_EXTTERM_DIGITAL 0x0602 /* Generic digital audio interface */ +#define AUDIO_EXTTERM_LINE 0x0603 /* Analog connector at standard line levels */ +#define AUDIO_EXTTERM_LEGACY 0x0604 /* Legacy audio line out connector */ +#define AUDIO_EXTTERM_SPDIF 0x0605 /* SPDIF interface */ +#define AUDIO_EXTTERM_1394DA 0x0606 /* 1394 DA stream */ +#define AUDIO_EXTTERM_1394DV 0x0607 /* 1394 DV stream soundtrack */ +#define AUDIO_EXTTERM_ADAT 0x0608 /* ADAT Lightpipe */ +#define AUDIO_EXTTERM_TDIF 0x0609 /* TDIF - Tascam Digital Interface */ +#define AUDIO_EXTTERM_MADI 0x060a /* MADI - Multi-channel Audio Digital Interface (AES) */ + +/* Embedded Function Terminal Types */ +#define AUDIO_EMBEDTERM_UNDEF 0x0700 /* Undefined Type */ +#define AUDIO_EMBEDTERM_CALIBRATION 0x0701 /* Level Calibration Noise Source */ +#define AUDIO_EMBEDTERM_EQUALIZATION 0x0702 /* Equalization Noise */ +#define AUDIO_EMBEDTERM_CD 0x0703 /* CD player */ +#define AUDIO_EMBEDTERM_DAT 0x0704 /* Digital Audio Tape */ +#define AUDIO_EMBEDTERM_DCC 0x0705 /* Digital Compact Cassette */ +#define AUDIO_EMBEDTERM_COMPRESSED 0x0706 /* Compressed Audio Player */ +#define AUDIO_EMBEDTERM_TAPE 0x0707 /* Analog Audio Tape */ +#define AUDIO_EMBEDTERM_PHONOGRAPH 0x0708 /* Analog vinyl record player */ +#define AUDIO_EMBEDTERM_VCR 0x0709 /* Audio track of VCR */ +#define AUDIO_EMBEDTERM_VIDDISC 0x070a /* Audio track of VideoDisc player */ +#define AUDIO_EMBEDTERM_DVD 0x070b /* Audio track of DVD player */ +#define AUDIO_EMBEDTERM_TVTUNER 0x070c /* Audio track of TV tuner */ +#define AUDIO_EMBEDTERM_SATELLITE 0x070d /* Audio track of satellite receiver */ +#define AUDIO_EMBEDTERM_CABLETUNER 0x070e /* Audio track of cable tuner */ +#define AUDIO_EMBEDTERM_DSS 0x070f /* Audio track of DSS receiver */ +#define AUDIO_EMBEDTERM_RADIO 0x0710 /* AM/FM radio receiver */ +#define AUDIO_EMBEDTERM_TRANSMITTER 0x0711 /* AM/FM radio transmitter */ +#define AUDIO_EMBEDTERM_MULTITRACK 0x0712 /* A multi-track recording system */ +#define AUDIO_EMBEDTERM_SYNTHESIZER 0x0713 /* Synthesizer */ +#define AUDIO_EMBEDTERM_PIANO 0x0714 /* Piano */ +#define AUDIO_EMBEDTERM_GUITAR 0x0715 /* Guitar */ +#define AUDIO_EMBEDTERM_PERCUSSON 0x0716 /* Percussion Instrument */ +#define AUDIO_EMBEDTERM_INSTRUMENT 0x0717 /* Other Musical Instrument */ + +#define AUDIO_FORMAT_TYPE_I 0x01 +#define AUDIO_FORMAT_TYPE_II 0x02 +#define AUDIO_FORMAT_TYPE_III 0x03 + +/** USB Terminal Types + * Refer to Table 2-1 - Table 2-4 from termt10.pdf + */ +enum usb_audio_terminal_types { + /* USB Terminal Types */ + USB_AUDIO_USB_UNDEFINED = 0x0100, + USB_AUDIO_USB_STREAMING = 0x0101, + USB_AUDIO_USB_VENDOR_SPEC = 0x01FF, + + /* Input Terminal Types */ + USB_AUDIO_IN_UNDEFINED = 0x0200, + USB_AUDIO_IN_MICROPHONE = 0x0201, + USB_AUDIO_IN_DESKTOP_MIC = 0x0202, + USB_AUDIO_IN_PERSONAL_MIC = 0x0203, + USB_AUDIO_IN_OM_DIR_MIC = 0x0204, + USB_AUDIO_IN_MIC_ARRAY = 0x0205, + USB_AUDIO_IN_PROC_MIC_ARRAY = 0x0205, + + /* Output Terminal Types */ + USB_AUDIO_OUT_UNDEFINED = 0x0300, + USB_AUDIO_OUT_SPEAKER = 0x0301, + USB_AUDIO_OUT_HEADPHONES = 0x0302, + USB_AUDIO_OUT_HEAD_AUDIO = 0x0303, + USB_AUDIO_OUT_DESKTOP_SPEAKER = 0x0304, + USB_AUDIO_OUT_ROOM_SPEAKER = 0x0305, + USB_AUDIO_OUT_COMM_SPEAKER = 0x0306, + USB_AUDIO_OUT_LOW_FREQ_SPEAKER = 0x0307, + + /* Bi-directional Terminal Types */ + USB_AUDIO_IO_UNDEFINED = 0x0400, + USB_AUDIO_IO_HANDSET = 0x0401, + USB_AUDIO_IO_HEADSET = 0x0402, + USB_AUDIO_IO_SPEAKERPHONE_ECHO_NONE = 0x0403, + USB_AUDIO_IO_SPEAKERPHONE_ECHO_SUP = 0x0404, + USB_AUDIO_IO_SPEAKERPHONE_ECHO_CAN = 0x0405, +}; + +/** + * @warning Size of baInterface is 2 just to make it useable + * for all kind of devices: headphones, microphone and headset. + * Actual size of the struct should be checked by reading + * .bLength. + */ +struct adc_ac_if_descriptor { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubtype; + uint16_t bcdAUDIO; + uint16_t wTotalLength; + uint8_t bInCollection; + uint8_t baInterfaceNr[2]; +} __PACKED; + +struct adc_as_if_descriptor { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubtype; + uint8_t bTerminalLink; + uint8_t bDelay; + uint16_t wFormatTag; +} __PACKED; + +struct adc_input_terminal_descriptor { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubtype; + uint8_t bTerminalID; + uint16_t wTerminalType; + uint8_t bAssocTerminal; + uint8_t bNrChannels; + uint16_t wChannelConfig; + uint8_t iChannelNames; + uint8_t iTerminal; +} __PACKED; + +struct adc_output_terminal_descriptor { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubtype; + uint8_t bTerminalID; + uint16_t wTerminalType; + uint8_t bAssocTerminal; + uint8_t bSourceID; + uint8_t iTerminal; +} __PACKED; + +/** + * @note Size of Feature unit descriptor is not fixed. + * This structure is just a helper not a common type. + */ +struct adc_feature_unit_descriptor { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubtype; + uint8_t bUnitID; + uint8_t bSourceID; + uint8_t bControlSize; + uint16_t bmaControls[1]; +} __PACKED; + +struct adc_format_type_i_descriptor { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubtype; + uint8_t bFormatType; + uint8_t bNrChannels; + uint8_t bSubframeSize; + uint8_t bBitResolution; + uint8_t bSamFreqType; + uint8_t tSamFreq[3]; +} __PACKED; + +struct adc_as_std_ep_descriptor { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bEndpointAddress; + uint8_t bmAttributes; + uint16_t wMaxPacketSize; + uint8_t bInterval; + uint8_t bRefresh; + uint8_t bSynchAddress; +} __PACKED; + +struct adc_as_cs_ep_descriptor { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubtype; + uint8_t bmAttributes; + uint8_t bLockDelayUnits; + uint16_t wLockDelay; +} __PACKED; + +#endif /* _USB_AUDIO_H_ */ diff --git a/class/audio/usbd_audio.c b/class/audio/usbd_audio.c index 94d4311f..9ec5c28a 100644 --- a/class/audio/usbd_audio.c +++ b/class/audio/usbd_audio.c @@ -12,12 +12,12 @@ int audio_class_request_handler(struct usb_setup_packet *setup, uint8_t **data, switch (setup->bRequest) { case AUDIO_REQUEST_SET_CUR: - if (setup->wValueL == 0x01) { - if (setup->wValueH == AUDIO_FU_CONTROL_MUTE) { + if (LO_BYTE(setup->wValue) == 0x01) { + if (HI_BYTE(setup->wValue) == AUDIO_FU_CONTROL_MUTE) { memcpy(&audio_control_info.mute, *data, *len); - } else if (setup->wValueH == AUDIO_FU_CONTROL_VOLUME) { + } else if (HI_BYTE(setup->wValue) == AUDIO_FU_CONTROL_VOLUME) { memcpy(&audio_control_info.vol_current, *data, *len); - uint32_t vol; + int vol; if (audio_control_info.vol_current == 0) { vol = 100; } else { @@ -31,10 +31,10 @@ int audio_class_request_handler(struct usb_setup_packet *setup, uint8_t **data, break; case AUDIO_REQUEST_GET_CUR: - if (setup->wValueH == AUDIO_FU_CONTROL_MUTE) { + if (HI_BYTE(setup->wValue) == AUDIO_FU_CONTROL_MUTE) { *data = (uint8_t *)&audio_control_info.mute; *len = 1; - } else if (setup->wValueH == AUDIO_FU_CONTROL_VOLUME) { + } else if (HI_BYTE(setup->wValue) == AUDIO_FU_CONTROL_VOLUME) { *data = (uint8_t *)&audio_control_info.vol_current; *len = 2; } @@ -77,14 +77,14 @@ int audio_class_request_handler(struct usb_setup_packet *setup, uint8_t **data, void audio_notify_handler(uint8_t event, void *arg) { switch (event) { - case USB_EVENT_RESET: + case USBD_EVENT_RESET: break; - case USB_EVENT_SOF: + case USBD_EVENT_SOF: break; - case USB_EVENT_SET_INTERFACE: + case USBD_EVENT_SET_INTERFACE: usbd_audio_set_interface_callback(((uint8_t *)arg)[3]); break; @@ -93,10 +93,6 @@ void audio_notify_handler(uint8_t event, void *arg) } } -__weak void usbd_audio_set_volume(uint8_t vol) -{ -} - void usbd_audio_add_interface(usbd_class_t *class, usbd_interface_t *intf) { static usbd_class_t *last_class = NULL; @@ -111,4 +107,8 @@ void usbd_audio_add_interface(usbd_class_t *class, usbd_interface_t *intf) intf->vendor_handler = NULL; intf->notify_handler = audio_notify_handler; usbd_class_add_interface(class, intf); -} \ No newline at end of file +} + +__WEAK void usbd_audio_set_volume(uint8_t vol) +{ +} diff --git a/class/audio/usbd_audio.h b/class/audio/usbd_audio.h index 35f3fe25..d5030e5b 100644 --- a/class/audio/usbd_audio.h +++ b/class/audio/usbd_audio.h @@ -13,252 +13,12 @@ #ifndef _USBD_AUDIO_H_ #define _USBD_AUDIO_H_ +#include "usb_audio.h" + #ifdef __cplusplus extern "C" { #endif -/** Audio Interface Subclass Codes - * Refer to Table A-2 from audio10.pdf - */ -#define AUDIO_SUBCLASS_UNDEFINED 0x00 -#define AUDIO_SUBCLASS_AUDIOCONTROL 0x01 -#define AUDIO_SUBCLASS_AUDIOSTREAMING 0x02 -#define AUDIO_SUBCLASS_MIDISTREAMING 0x03 - -#define AUDIO_PROTOCOL_UNDEFINED 0x00U - -#define AUDIO_ENDPOINT_GENERAL 0x01U - -/** Audio Class-Specific Control Interface Descriptor Subtypes - * Refer to Table A-5 from audio10.pdf - */ -#define AUDIO_CONTROL_UNDEFINED 0x01U -#define AUDIO_CONTROL_HEADER 0x01U -#define AUDIO_CONTROL_INPUT_TERMINAL 0x02U -#define AUDIO_CONTROL_OUTPUT_TERMINAL 0x03U -#define AUDIO_CONTROL_MIXER_UNIT 0x04U -#define AUDIO_CONTROL_SELECTOR_UNIT 0x05U -#define AUDIO_CONTROL_FEATURE_UNIT 0x06U -#define AUDIO_CONTROL_PROCESSING_UNIT 0x07U -#define AUDIO_CONTROL_EXTENSION_UNIT 0x08U - -/** Audio Class-Specific AS Interface Descriptor Subtypes - * Refer to Table A-6 from audio10.pdf - */ -#define AUDIO_STREAMING_UNDEFINED 0x00U -#define AUDIO_STREAMING_GENERAL 0x01U -#define AUDIO_STREAMING_FORMAT_TYPE 0x02U -#define AUDIO_STREAMING_FORMAT_SPECIFIC 0x03U - -/** Audio Class-Specific Request Codes - * Refer to Table A-9 from audio10.pdf - */ -#define AUDIO_REQUEST_UNDEFINED 0x00 -#define AUDIO_REQUEST_SET_CUR 0x01 -#define AUDIO_REQUEST_GET_CUR 0x81 -#define AUDIO_REQUEST_SET_MIN 0x02 -#define AUDIO_REQUEST_GET_MIN 0x82 -#define AUDIO_REQUEST_SET_MAX 0x03 -#define AUDIO_REQUEST_GET_MAX 0x83 -#define AUDIO_REQUEST_SET_RES 0x04 -#define AUDIO_REQUEST_GET_RES 0x84 -#define AUDIO_REQUEST_SET_MEM 0x05 -#define AUDIO_REQUEST_GET_MEM 0x85 -#define AUDIO_REQUEST_GET_STAT 0xFF - -/* Feature Unit Control Bits */ -#define AUDIO_CONTROL_MUTE 0x0001 -#define AUDIO_CONTROL_VOLUME 0x0002 -#define AUDIO_CONTROL_BASS 0x0004 -#define AUDIO_CONTROL_MID 0x0008 -#define AUDIO_CONTROL_TREBLE 0x0010 -#define AUDIO_CONTROL_GRAPHIC_EQUALIZER 0x0020 -#define AUDIO_CONTROL_AUTOMATIC_GAIN 0x0040 -#define AUDIO_CONTROL_DEALY 0x0080 -#define AUDIO_CONTROL_BASS_BOOST 0x0100 -#define AUDIO_CONTROL_LOUDNESS 0x0200 - -/** Feature Unit Control Selectors - * Refer to Table A-11 from audio10.pdf - */ -#define AUDIO_FU_CONTROL_MUTE 0x01 -#define AUDIO_FU_CONTROL_VOLUME 0x02 -#define AUDIO_FU_CONTROL_BASS 0x03 -#define AUDIO_FU_CONTROL_MID 0x04 -#define AUDIO_FU_CONTROL_TREBLE 0x05 -#define AUDIO_FU_CONTROL_GRAPHIC_EQUALIZER 0x06 -#define AUDIO_FU_CONTROL_AUTOMATIC_GAIN 0x07 -#define AUDIO_FU_CONTROL_DELAY 0x08 -#define AUDIO_FU_CONTROL_BASS_BOOST 0x09 -#define AUDIO_FU_CONTROL_LOUDNESS 0x0A - -/* Audio Descriptor Types */ -#define AUDIO_UNDEFINED_DESCRIPTOR_TYPE 0x20 -#define AUDIO_DEVICE_DESCRIPTOR_TYPE 0x21 -#define AUDIO_CONFIGURATION_DESCRIPTOR_TYPE 0x22 -#define AUDIO_STRING_DESCRIPTOR_TYPE 0x23 -#define AUDIO_INTERFACE_DESCRIPTOR_TYPE 0x24 -#define AUDIO_ENDPOINT_DESCRIPTOR_TYPE 0x25 - -/* Audio Data Format Type I Codes */ -#define AUDIO_FORMAT_TYPE_I_UNDEFINED 0x0000 -#define AUDIO_FORMAT_PCM 0x0001 -#define AUDIO_FORMAT_PCM8 0x0002 -#define AUDIO_FORMAT_IEEE_FLOAT 0x0003 -#define AUDIO_FORMAT_ALAW 0x0004 -#define AUDIO_FORMAT_MULAW 0x0005 - -/* Predefined Audio Channel Configuration Bits */ -#define AUDIO_CHANNEL_M 0x0000 /* Mono */ -#define AUDIO_CHANNEL_L 0x0001 /* Left Front */ -#define AUDIO_CHANNEL_R 0x0002 /* Right Front */ -#define AUDIO_CHANNEL_C 0x0004 /* Center Front */ -#define AUDIO_CHANNEL_LFE 0x0008 /* Low Freq. Enhance. */ -#define AUDIO_CHANNEL_LS 0x0010 /* Left Surround */ -#define AUDIO_CHANNEL_RS 0x0020 /* Right Surround */ -#define AUDIO_CHANNEL_LC 0x0040 /* Left of Center */ -#define AUDIO_CHANNEL_RC 0x0080 /* Right of Center */ -#define AUDIO_CHANNEL_S 0x0100 /* Surround */ -#define AUDIO_CHANNEL_SL 0x0200 /* Side Left */ -#define AUDIO_CHANNEL_SR 0x0400 /* Side Right */ -#define AUDIO_CHANNEL_T 0x0800 /* Top */ - -#define AUDIO_FORMAT_TYPE_I 0x01 -#define AUDIO_FORMAT_TYPE_II 0x02 -#define AUDIO_FORMAT_TYPE_III 0x03 - -/** USB Terminal Types - * Refer to Table 2-1 - Table 2-4 from termt10.pdf - */ -enum usb_audio_terminal_types { - /* USB Terminal Types */ - USB_AUDIO_USB_UNDEFINED = 0x0100, - USB_AUDIO_USB_STREAMING = 0x0101, - USB_AUDIO_USB_VENDOR_SPEC = 0x01FF, - - /* Input Terminal Types */ - USB_AUDIO_IN_UNDEFINED = 0x0200, - USB_AUDIO_IN_MICROPHONE = 0x0201, - USB_AUDIO_IN_DESKTOP_MIC = 0x0202, - USB_AUDIO_IN_PERSONAL_MIC = 0x0203, - USB_AUDIO_IN_OM_DIR_MIC = 0x0204, - USB_AUDIO_IN_MIC_ARRAY = 0x0205, - USB_AUDIO_IN_PROC_MIC_ARRAY = 0x0205, - - /* Output Terminal Types */ - USB_AUDIO_OUT_UNDEFINED = 0x0300, - USB_AUDIO_OUT_SPEAKER = 0x0301, - USB_AUDIO_OUT_HEADPHONES = 0x0302, - USB_AUDIO_OUT_HEAD_AUDIO = 0x0303, - USB_AUDIO_OUT_DESKTOP_SPEAKER = 0x0304, - USB_AUDIO_OUT_ROOM_SPEAKER = 0x0305, - USB_AUDIO_OUT_COMM_SPEAKER = 0x0306, - USB_AUDIO_OUT_LOW_FREQ_SPEAKER = 0x0307, - - /* Bi-directional Terminal Types */ - USB_AUDIO_IO_UNDEFINED = 0x0400, - USB_AUDIO_IO_HANDSET = 0x0401, - USB_AUDIO_IO_HEADSET = 0x0402, - USB_AUDIO_IO_SPEAKERPHONE_ECHO_NONE = 0x0403, - USB_AUDIO_IO_SPEAKERPHONE_ECHO_SUP = 0x0404, - USB_AUDIO_IO_SPEAKERPHONE_ECHO_CAN = 0x0405, -}; - -/** - * @warning Size of baInterface is 2 just to make it useable - * for all kind of devices: headphones, microphone and headset. - * Actual size of the struct should be checked by reading - * .bLength. - */ -struct cs_ac_if_descriptor { - uint8_t bLength; - uint8_t bDescriptorType; - uint8_t bDescriptorSubtype; - uint16_t bcdADC; - uint16_t wTotalLength; - uint8_t bInCollection; - uint8_t baInterfaceNr[2]; -} __packed; - -struct input_terminal_descriptor { - uint8_t bLength; - uint8_t bDescriptorType; - uint8_t bDescriptorSubtype; - uint8_t bTerminalID; - uint16_t wTerminalType; - uint8_t bAssocTerminal; - uint8_t bNrChannels; - uint16_t wChannelConfig; - uint8_t iChannelNames; - uint8_t iTerminal; -} __packed; - -/** - * @note Size of Feature unit descriptor is not fixed. - * This structure is just a helper not a common type. - */ -struct feature_unit_descriptor { - uint8_t bLength; - uint8_t bDescriptorType; - uint8_t bDescriptorSubtype; - uint8_t bUnitID; - uint8_t bSourceID; - uint8_t bControlSize; - uint16_t bmaControls[1]; -} __packed; - -struct output_terminal_descriptor { - uint8_t bLength; - uint8_t bDescriptorType; - uint8_t bDescriptorSubtype; - uint8_t bTerminalID; - uint16_t wTerminalType; - uint8_t bAssocTerminal; - uint8_t bSourceID; - uint8_t iTerminal; -} __packed; - -struct as_cs_interface_descriptor { - uint8_t bLength; - uint8_t bDescriptorType; - uint8_t bDescriptorSubtype; - uint8_t bTerminalLink; - uint8_t bDelay; - uint16_t wFormatTag; -} __packed; - -struct format_type_i_descriptor { - uint8_t bLength; - uint8_t bDescriptorType; - uint8_t bDescriptorSubtype; - uint8_t bFormatType; - uint8_t bNrChannels; - uint8_t bSubframeSize; - uint8_t bBitResolution; - uint8_t bSamFreqType; - uint8_t tSamFreq[3]; -} __packed; - -struct std_as_ad_endpoint_descriptor { - uint8_t bLength; - uint8_t bDescriptorType; - uint8_t bEndpointAddress; - uint8_t bmAttributes; - uint16_t wMaxPacketSize; - uint8_t bInterval; - uint8_t bRefresh; - uint8_t bSynchAddress; -} __packed; - -struct cs_as_ad_ep_descriptor { - uint8_t bLength; - uint8_t bDescriptorType; - uint8_t bDescriptorSubtype; - uint8_t bmAttributes; - uint8_t bLockDelayUnits; - uint16_t wLockDelay; -} __packed; - struct usbd_audio_control_info { uint16_t vol_min; uint16_t vol_max; diff --git a/class/cdc/usb_cdc.h b/class/cdc/usb_cdc.h new file mode 100644 index 00000000..0f131bbd --- /dev/null +++ b/class/cdc/usb_cdc.h @@ -0,0 +1,444 @@ +/** + * @file + * @brief USB Communications Device Class (CDC) public header + * + * Header follows the Class Definitions for + * Communications Devices Specification (CDC120-20101103-track.pdf), + * PSTN Devices Specification (PSTN120.pdf) and + * Ethernet Control Model Devices Specification (ECM120.pdf). + * Header is limited to ACM and ECM Subclasses. + */ + +#ifndef _USB_CDC_H +#define _USB_CDC_H + +/*------------------------------------------------------------------------------ + * Definitions based on usbcdc11.pdf (www.usb.org) + *----------------------------------------------------------------------------*/ +/* Communication device class specification version 1.10 */ +#define CDC_V1_10 0x0110U +// Communication device class specification version 1.2 +#define CDC_V1_2_0 0x0120U + +/* Communication interface class code */ +/* (usbcdc11.pdf, 4.2, Table 15) */ +#define CDC_COMMUNICATION_INTERFACE_CLASS 0x02U + +/* Communication interface class subclass codes */ +/* (usbcdc11.pdf, 4.3, Table 16) */ +#define CDC_SUBCLASS_NONE 0x00 /* Reserved */ +#define CDC_SUBCLASS_DLC 0x01 /* Direct Line Control Model */ +#define CDC_SUBCLASS_ACM 0x02 /* Abstract Control Model */ +#define CDC_SUBCLASS_TCM 0x03 /* Telephone Control Model */ +#define CDC_SUBCLASS_MCM 0x04 /* Multi-Channel Control Model */ +#define CDC_SUBCLASS_CAPI 0x05 /* CAPI Control Model */ +#define CDC_SUBCLASS_ECM 0x06 /* Ethernet Networking Control Model */ +#define CDC_SUBCLASS_ATM 0x07 /* ATM Networking Control Model */ + /* 0x08-0x0d Reserved (future use) */ +#define CDC_SUBCLASS_MBIM 0x0e /* MBIM Control Model */ + /* 0x0f-0x7f Reserved (future use) */ + /* 0x80-0xfe Reserved (vendor specific) */ + +#define CDC_DIRECT_LINE_CONTROL_MODEL 0x01U +#define CDC_ABSTRACT_CONTROL_MODEL 0x02U +#define CDC_TELEPHONE_CONTROL_MODEL 0x03U +#define CDC_MULTI_CHANNEL_CONTROL_MODEL 0x04U +#define CDC_CAPI_CONTROL_MODEL 0x05U +#define CDC_ETHERNET_NETWORKING_CONTROL_MODEL 0x06U +#define CDC_ATM_NETWORKING_CONTROL_MODEL 0x07U +#define CDC_WIRELESS_HANDSET_CONTROL_MODEL 0x08U +#define CDC_DEVICE_MANAGEMENT 0x09U +#define CDC_MOBILE_DIRECT_LINE_MODEL 0x0AU +#define CDC_OBEX 0x0BU +#define CDC_ETHERNET_EMULATION_MODEL 0x0CU +#define CDC_NETWORK_CONTROL_MODEL 0x0DU + +/* Communication interface class control protocol codes */ +/* (usbcdc11.pdf, 4.4, Table 17) */ +#define CDC_COMMON_PROTOCOL_NONE 0x00U +#define CDC_COMMON_PROTOCOL_AT_COMMANDS 0x01U +#define CDC_COMMON_PROTOCOL_AT_COMMANDS_PCCA_101 0x02U +#define CDC_COMMON_PROTOCOL_AT_COMMANDS_PCCA_101_AND_ANNEXO 0x03U +#define CDC_COMMON_PROTOCOL_AT_COMMANDS_GSM_707 0x04U +#define CDC_COMMON_PROTOCOL_AT_COMMANDS_3GPP_27007 0x05U +#define CDC_COMMON_PROTOCOL_AT_COMMANDS_CDMA 0x06U +#define CDC_COMMON_PROTOCOL_ETHERNET_EMULATION_MODEL 0x07U +// NCM Communication Interface Protocol Codes +// (usbncm10.pdf, 4.2, Table 4-2) +#define CDC_NCM_PROTOCOL_NONE 0x00U +#define CDC_NCM_PROTOCOL_OEM 0xFEU + +/* Data interface class code */ +/* (usbcdc11.pdf, 4.5, Table 18) */ +#define CDC_DATA_INTERFACE_CLASS 0x0A + +/* Data Interface Sub-Class Codes ********************************************/ +#define CDC_DATA_SUBCLASS_NONE 0x00 + +/* Data interface class protocol codes */ +/* (usbcdc11.pdf, 4.7, Table 19) */ +#define CDC_DATA_PROTOCOL_ISDN_BRI 0x30 +#define CDC_DATA_PROTOCOL_HDLC 0x31 +#define CDC_DATA_PROTOCOL_TRANSPARENT 0x32 +#define CDC_DATA_PROTOCOL_Q921_MANAGEMENT 0x50 +#define CDC_DATA_PROTOCOL_Q921_DATA_LINK 0x51 +#define CDC_DATA_PROTOCOL_Q921_MULTIPLEXOR 0x52 +#define CDC_DATA_PROTOCOL_V42 0x90 +#define CDC_DATA_PROTOCOL_EURO_ISDN 0x91 +#define CDC_DATA_PROTOCOL_V24_RATE_ADAPTATION 0x92 +#define CDC_DATA_PROTOCOL_CAPI 0x93 +#define CDC_DATA_PROTOCOL_HOST_BASED_DRIVER 0xFD +#define CDC_DATA_PROTOCOL_DESCRIBED_IN_PUFD 0xFE + +/* Type values for bDescriptorType field of functional descriptors */ +/* (usbcdc11.pdf, 5.2.3, Table 24) */ +#define CDC_CS_INTERFACE 0x24 +#define CDC_CS_ENDPOINT 0x25 + +/* Type values for bDescriptorSubtype field of functional descriptors */ +/* (usbcdc11.pdf, 5.2.3, Table 25) */ +#define CDC_FUNC_DESC_HEADER 0x00 +#define CDC_FUNC_DESC_CALL_MANAGEMENT 0x01 +#define CDC_FUNC_DESC_ABSTRACT_CONTROL_MANAGEMENT 0x02 +#define CDC_FUNC_DESC_DIRECT_LINE_MANAGEMENT 0x03 +#define CDC_FUNC_DESC_TELEPHONE_RINGER 0x04 +#define CDC_FUNC_DESC_REPORTING_CAPABILITIES 0x05 +#define CDC_FUNC_DESC_UNION 0x06 +#define CDC_FUNC_DESC_COUNTRY_SELECTION 0x07 +#define CDC_FUNC_DESC_TELEPHONE_OPERATIONAL_MODES 0x08 +#define CDC_FUNC_DESC_USB_TERMINAL 0x09 +#define CDC_FUNC_DESC_NETWORK_CHANNEL 0x0A +#define CDC_FUNC_DESC_PROTOCOL_UNIT 0x0B +#define CDC_FUNC_DESC_EXTENSION_UNIT 0x0C +#define CDC_FUNC_DESC_MULTI_CHANNEL_MANAGEMENT 0x0D +#define CDC_FUNC_DESC_CAPI_CONTROL_MANAGEMENT 0x0E +#define CDC_FUNC_DESC_ETHERNET_NETWORKING 0x0F +#define CDC_FUNC_DESC_ATM_NETWORKING 0x10 +#define CDC_FUNC_DESC_WIRELESS_HANDSET_CONTROL_MODEL 0x11 +#define CDC_FUNC_DESC_MOBILE_DIRECT_LINE_MODEL 0x12 +#define CDC_FUNC_DESC_MOBILE_DIRECT_LINE_MODEL_DETAIL 0x13 +#define CDC_FUNC_DESC_DEVICE_MANAGEMENT_MODEL 0x14 +#define CDC_FUNC_DESC_OBEX 0x15 +#define CDC_FUNC_DESC_COMMAND_SET 0x16 +#define CDC_FUNC_DESC_COMMAND_SET_DETAIL 0x17 +#define CDC_FUNC_DESC_TELEPHONE_CONTROL_MODEL 0x18 +#define CDC_FUNC_DESC_OBEX_SERVICE_IDENTIFIER 0x19 + +/* CDC class-specific request codes */ +/* (usbcdc11.pdf, 6.2, Table 46) */ +/* see Table 45 for info about the specific requests. */ +#define CDC_REQUEST_SEND_ENCAPSULATED_COMMAND 0x00 +#define CDC_REQUEST_GET_ENCAPSULATED_RESPONSE 0x01 +#define CDC_REQUEST_SET_COMM_FEATURE 0x02 +#define CDC_REQUEST_GET_COMM_FEATURE 0x03 +#define CDC_REQUEST_CLEAR_COMM_FEATURE 0x04 +#define CDC_REQUEST_SET_AUX_LINE_STATE 0x10 +#define CDC_REQUEST_SET_HOOK_STATE 0x11 +#define CDC_REQUEST_PULSE_SETUP 0x12 +#define CDC_REQUEST_SEND_PULSE 0x13 +#define CDC_REQUEST_SET_PULSE_TIME 0x14 +#define CDC_REQUEST_RING_AUX_JACK 0x15 +#define CDC_REQUEST_SET_LINE_CODING 0x20 +#define CDC_REQUEST_GET_LINE_CODING 0x21 +#define CDC_REQUEST_SET_CONTROL_LINE_STATE 0x22 +#define CDC_REQUEST_SEND_BREAK 0x23 +#define CDC_REQUEST_SET_RINGER_PARMS 0x30 +#define CDC_REQUEST_GET_RINGER_PARMS 0x31 +#define CDC_REQUEST_SET_OPERATION_PARMS 0x32 +#define CDC_REQUEST_GET_OPERATION_PARMS 0x33 +#define CDC_REQUEST_SET_LINE_PARMS 0x34 +#define CDC_REQUEST_GET_LINE_PARMS 0x35 +#define CDC_REQUEST_DIAL_DIGITS 0x36 +#define CDC_REQUEST_SET_UNIT_PARAMETER 0x37 +#define CDC_REQUEST_GET_UNIT_PARAMETER 0x38 +#define CDC_REQUEST_CLEAR_UNIT_PARAMETER 0x39 +#define CDC_REQUEST_GET_PROFILE 0x3A +#define CDC_REQUEST_SET_ETHERNET_MULTICAST_FILTERS 0x40 +#define CDC_REQUEST_SET_ETHERNET_PMP_FILTER 0x41 +#define CDC_REQUEST_GET_ETHERNET_PMP_FILTER 0x42 +#define CDC_REQUEST_SET_ETHERNET_PACKET_FILTER 0x43 +#define CDC_REQUEST_GET_ETHERNET_STATISTIC 0x44 +#define CDC_REQUEST_SET_ATM_DATA_FORMAT 0x50 +#define CDC_REQUEST_GET_ATM_DEVICE_STATISTICS 0x51 +#define CDC_REQUEST_SET_ATM_DEFAULT_VC 0x52 +#define CDC_REQUEST_GET_ATM_VC_STATISTICS 0x53 + +/* Communication feature selector codes */ +/* (usbcdc11.pdf, 6.2.2..6.2.4, Table 47) */ +#define CDC_ABSTRACT_STATE 0x01 +#define CDC_COUNTRY_SETTING 0x02 + +/** Control Signal Bitmap Values for SetControlLineState */ +#define SET_CONTROL_LINE_STATE_RTS 0x02 +#define SET_CONTROL_LINE_STATE_DTR 0x01 + +/* Feature Status returned for ABSTRACT_STATE Selector */ +/* (usbcdc11.pdf, 6.2.3, Table 48) */ +#define CDC_IDLE_SETTING (1 << 0) +#define CDC_DATA_MULTPLEXED_STATE (1 << 1) + +/* Control signal bitmap values for the SetControlLineState request */ +/* (usbcdc11.pdf, 6.2.14, Table 51) */ +#define CDC_DTE_PRESENT (1 << 0) +#define CDC_ACTIVATE_CARRIER (1 << 1) + +/* CDC class-specific notification codes */ +/* (usbcdc11.pdf, 6.3, Table 68) */ +/* see Table 67 for Info about class-specific notifications */ +#define CDC_NOTIFICATION_NETWORK_CONNECTION 0x00 +#define CDC_RESPONSE_AVAILABLE 0x01 +#define CDC_AUX_JACK_HOOK_STATE 0x08 +#define CDC_RING_DETECT 0x09 +#define CDC_NOTIFICATION_SERIAL_STATE 0x20 +#define CDC_CALL_STATE_CHANGE 0x28 +#define CDC_LINE_STATE_CHANGE 0x29 +#define CDC_CONNECTION_SPEED_CHANGE 0x2A + +/* UART state bitmap values (Serial state notification). */ +/* (usbcdc11.pdf, 6.3.5, Table 69) */ +#define CDC_SERIAL_STATE_OVERRUN (1 << 6) /* receive data overrun error has occurred */ +#define CDC_SERIAL_STATE_OVERRUN_Pos (6) +#define CDC_SERIAL_STATE_OVERRUN_Msk (1 << CDC_SERIAL_STATE_OVERRUN_Pos) +#define CDC_SERIAL_STATE_PARITY (1 << 5) /* parity error has occurred */ +#define CDC_SERIAL_STATE_PARITY_Pos (5) +#define CDC_SERIAL_STATE_PARITY_Msk (1 << CDC_SERIAL_STATE_PARITY_Pos) +#define CDC_SERIAL_STATE_FRAMING (1 << 4) /* framing error has occurred */ +#define CDC_SERIAL_STATE_FRAMING_Pos (4) +#define CDC_SERIAL_STATE_FRAMING_Msk (1 << CDC_SERIAL_STATE_FRAMING_Pos) +#define CDC_SERIAL_STATE_RING (1 << 3) /* state of ring signal detection */ +#define CDC_SERIAL_STATE_RING_Pos (3) +#define CDC_SERIAL_STATE_RING_Msk (1 << CDC_SERIAL_STATE_RING_Pos) +#define CDC_SERIAL_STATE_BREAK (1 << 2) /* state of break detection */ +#define CDC_SERIAL_STATE_BREAK_Pos (2) +#define CDC_SERIAL_STATE_BREAK_Msk (1 << CDC_SERIAL_STATE_BREAK_Pos) +#define CDC_SERIAL_STATE_TX_CARRIER (1 << 1) /* state of transmission carrier */ +#define CDC_SERIAL_STATE_TX_CARRIER_Pos (1) +#define CDC_SERIAL_STATE_TX_CARRIER_Msk (1 << CDC_SERIAL_STATE_TX_CARRIER_Pos) +#define CDC_SERIAL_STATE_RX_CARRIER (1 << 0) /* state of receiver carrier */ +#define CDC_SERIAL_STATE_RX_CARRIER_Pos (0) +#define CDC_SERIAL_STATE_RX_CARRIER_Msk (1 << CDC_SERIAL_STATE_RX_CARRIER_Pos) + +/*------------------------------------------------------------------------------ + * Structures based on usbcdc11.pdf (www.usb.org) + *----------------------------------------------------------------------------*/ + +/* Header functional descriptor */ +/* (usbcdc11.pdf, 5.2.3.1) */ +/* This header must precede any list of class-specific descriptors. */ +struct cdc_header_descriptor { + uint8_t bFunctionLength; /* size of this descriptor in bytes */ + uint8_t bDescriptorType; /* CS_INTERFACE descriptor type */ + uint8_t bDescriptorSubtype; /* Header functional descriptor subtype */ + uint16_t bcdCDC; /* USB CDC specification release version */ +} __PACKED; + +/* Call management functional descriptor */ +/* (usbcdc11.pdf, 5.2.3.2) */ +/* Describes the processing of calls for the communication class interface. */ +struct cdc_call_management_descriptor { + uint8_t bFunctionLength; /* size of this descriptor in bytes */ + uint8_t bDescriptorType; /* CS_INTERFACE descriptor type */ + uint8_t bDescriptorSubtype; /* call management functional descriptor subtype */ + uint8_t bmCapabilities; /* capabilities that this configuration supports */ + uint8_t bDataInterface; /* interface number of the data class interface used for call management (optional) */ +} __PACKED; + +/* Abstract control management functional descriptor */ +/* (usbcdc11.pdf, 5.2.3.3) */ +/* Describes the command supported by the communication interface class with the Abstract Control Model subclass code. */ +struct cdc_abstract_control_management_descriptor { + uint8_t bFunctionLength; /* size of this descriptor in bytes */ + uint8_t bDescriptorType; /* CS_INTERFACE descriptor type */ + uint8_t bDescriptorSubtype; /* abstract control management functional descriptor subtype */ + uint8_t bmCapabilities; /* capabilities supported by this configuration */ +} __PACKED; + +/* Union functional descriptors */ +/* (usbcdc11.pdf, 5.2.3.8) */ +/* Describes the relationship between a group of interfaces that can be considered to form a functional unit. */ +struct cdc_union_descriptor { + uint8_t bFunctionLength; /* size of this descriptor in bytes */ + uint8_t bDescriptorType; /* CS_INTERFACE descriptor type */ + uint8_t bDescriptorSubtype; /* union functional descriptor subtype */ + uint8_t bMasterInterface; /* interface number designated as master */ +} __PACKED; + +/* Union functional descriptors with one slave interface */ +/* (usbcdc11.pdf, 5.2.3.8) */ +struct cdc_union_1slave_descriptor { + uint8_t bFunctionLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubtype; + uint8_t bControlInterface; + uint8_t bSubordinateInterface0; +} __PACKED; + +/* Line coding structure for GET_LINE_CODING / SET_LINE_CODING class requests*/ +/* Format of the data returned when a GetLineCoding request is received */ +/* (usbcdc11.pdf, 6.2.13) */ +struct cdc_line_coding { + uint32_t dwDTERate; /* Data terminal rate in bits per second */ + uint8_t bCharFormat; /* Number of stop bits */ + uint8_t bParityType; /* Parity bit type */ + uint8_t bDataBits; /* Number of data bits */ +} __PACKED; + +/** Data structure for the notification about SerialState */ +struct cdc_acm_notification { + uint8_t bmRequestType; + uint8_t bNotificationType; + uint16_t wValue; + uint16_t wIndex; + uint16_t wLength; + uint16_t data; +} __PACKED; + +/** Ethernet Networking Functional Descriptor */ +struct cdc_ecm_descriptor { + uint8_t bFunctionLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubtype; + uint8_t iMACAddress; + uint32_t bmEthernetStatistics; + uint16_t wMaxSegmentSize; + uint16_t wNumberMCFilters; + uint8_t bNumberPowerFilters; +} __PACKED; + +/*Length of template descriptor: 66 bytes*/ +#define CDC_ACM_DESCRIPTOR_LEN (8 + 9 + 5 + 5 + 4 + 5 + 7 + 9 + 7 + 7) +// clang-format off +#ifndef CONFIG_USB_HS +#define CDC_ACM_DESCRIPTOR_INIT(bFirstInterface, int_ep, out_ep, in_ep, str_idx) \ + /* Interface Associate */ \ + 0x08, /* bLength */ \ + USB_DESCRIPTOR_TYPE_INTERFACE_ASSOCIATION, /* bDescriptorType */ \ + bFirstInterface, /* bFirstInterface */ \ + 0x02, /* bInterfaceCount */ \ + USB_DEVICE_CLASS_CDC, /* bFunctionClass */ \ + CDC_ABSTRACT_CONTROL_MODEL, /* bFunctionSubClass */ \ + CDC_COMMON_PROTOCOL_AT_COMMANDS, /* bFunctionProtocol */ \ + 0x00, /* iFunction */ \ + 0x09, /* bLength */ \ + USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType */ \ + bFirstInterface, /* bInterfaceNumber */ \ + 0x00, /* bAlternateSetting */ \ + 0x01, /* bNumEndpoints */ \ + USB_DEVICE_CLASS_CDC, /* bInterfaceClass */ \ + CDC_ABSTRACT_CONTROL_MODEL, /* bInterfaceSubClass */ \ + CDC_COMMON_PROTOCOL_AT_COMMANDS, /* bInterfaceProtocol */ \ + str_idx, /* iInterface */ \ + 0x05, /* bLength */ \ + CDC_CS_INTERFACE, /* bDescriptorType */ \ + CDC_FUNC_DESC_HEADER, /* bDescriptorSubtype */ \ + WBVAL(CDC_V1_10), /* bcdCDC */ \ + 0x05, /* bLength */ \ + CDC_CS_INTERFACE, /* bDescriptorType */ \ + CDC_FUNC_DESC_CALL_MANAGEMENT, /* bDescriptorSubtype */ \ + bFirstInterface, /* bmCapabilities */ \ + (uint8_t)(bFirstInterface + 1), /* bDataInterface */ \ + 0x04, /* bLength */ \ + CDC_CS_INTERFACE, /* bDescriptorType */ \ + CDC_FUNC_DESC_ABSTRACT_CONTROL_MANAGEMENT, /* bDescriptorSubtype */ \ + 0x02, /* bmCapabilities */ \ + 0x05, /* bLength */ \ + CDC_CS_INTERFACE, /* bDescriptorType */ \ + CDC_FUNC_DESC_UNION, /* bDescriptorSubtype */ \ + bFirstInterface, /* bMasterInterface */ \ + (uint8_t)(bFirstInterface + 1), /* bSlaveInterface0 */ \ + 0x07, /* bLength */ \ + USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType */ \ + int_ep, /* bEndpointAddress */ \ + 0x03, /* bmAttributes */ \ + 0x40, 0x00, /* wMaxPacketSize */ \ + 0x00, /* bInterval */ \ + 0x09, /* bLength */ \ + USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType */ \ + (uint8_t)(bFirstInterface + 1), /* bInterfaceNumber */ \ + 0x00, /* bAlternateSetting */ \ + 0x02, /* bNumEndpoints */ \ + CDC_DATA_INTERFACE_CLASS, /* bInterfaceClass */ \ + 0x00, /* bInterfaceSubClass */ \ + 0x00, /* bInterfaceProtocol */ \ + 0x00, /* iInterface */ \ + 0x07, /* bLength */ \ + USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType */ \ + out_ep, /* bEndpointAddress */ \ + 0x02, /* bmAttributes */ \ + 0x40, 0x00, /* wMaxPacketSize */ \ + 0x00, /* bInterval */ \ + 0x07, /* bLength */ \ + USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType */ \ + in_ep, /* bEndpointAddress */ \ + 0x02, /* bmAttributes */ \ + 0x40, 0x00, /* wMaxPacketSize */ \ + 0x00 /* bInterval */ +#else +#define CDC_ACM_DESCRIPTOR_INIT(bFirstInterface, int_ep, out_ep, in_ep, str_idx) \ + /* Interface Associate */ \ + 0x08, /* bLength */ \ + USB_DESCRIPTOR_TYPE_INTERFACE_ASSOCIATION, /* bDescriptorType */ \ + bFirstInterface, /* bFirstInterface */ \ + 0x02, /* bInterfaceCount */ \ + USB_DEVICE_CLASS_CDC, /* bFunctionClass */ \ + CDC_ABSTRACT_CONTROL_MODEL, /* bFunctionSubClass */ \ + CDC_COMMON_PROTOCOL_AT_COMMANDS, /* bFunctionProtocol */ \ + 0x00, /* iFunction */ \ + 0x09, /* bLength */ \ + USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType */ \ + bFirstInterface, /* bInterfaceNumber */ \ + 0x00, /* bAlternateSetting */ \ + 0x01, /* bNumEndpoints */ \ + USB_DEVICE_CLASS_CDC, /* bInterfaceClass */ \ + CDC_ABSTRACT_CONTROL_MODEL, /* bInterfaceSubClass */ \ + CDC_COMMON_PROTOCOL_AT_COMMANDS, /* bInterfaceProtocol */ \ + str_idx, /* iInterface */ \ + 0x05, /* bLength */ \ + CDC_CS_INTERFACE, /* bDescriptorType */ \ + CDC_FUNC_DESC_HEADER, /* bDescriptorSubtype */ \ + WBVAL(CDC_V1_10), /* bcdCDC */ \ + 0x05, /* bLength */ \ + CDC_CS_INTERFACE, /* bDescriptorType */ \ + CDC_FUNC_DESC_CALL_MANAGEMENT, /* bDescriptorSubtype */ \ + bFirstInterface, /* bmCapabilities */ \ + (uint8_t)(bFirstInterface + 1), /* bDataInterface */ \ + 0x04, /* bLength */ \ + CDC_CS_INTERFACE, /* bDescriptorType */ \ + CDC_FUNC_DESC_ABSTRACT_CONTROL_MANAGEMENT, /* bDescriptorSubtype */ \ + 0x02, /* bmCapabilities */ \ + 0x05, /* bLength */ \ + CDC_CS_INTERFACE, /* bDescriptorType */ \ + CDC_FUNC_DESC_UNION, /* bDescriptorSubtype */ \ + bFirstInterface, /* bMasterInterface */ \ + (uint8_t)(bFirstInterface + 1), /* bSlaveInterface0 */ \ + 0x07, /* bLength */ \ + USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType */ \ + int_ep, /* bEndpointAddress */ \ + 0x03, /* bmAttributes */ \ + 0x00, 0x02, /* wMaxPacketSize */ \ + 0x00, /* bInterval */ \ + 0x09, /* bLength */ \ + USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType */ \ + (uint8_t)(bFirstInterface + 1), /* bInterfaceNumber */ \ + 0x00, /* bAlternateSetting */ \ + 0x02, /* bNumEndpoints */ \ + CDC_DATA_INTERFACE_CLASS, /* bInterfaceClass */ \ + 0x00, /* bInterfaceSubClass */ \ + 0x00, /* bInterfaceProtocol */ \ + 0x00, /* iInterface */ \ + 0x07, /* bLength */ \ + USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType */ \ + out_ep, /* bEndpointAddress */ \ + 0x02, /* bmAttributes */ \ + 0x00, 0x02, /* wMaxPacketSize */ \ + 0x00, /* bInterval */ \ + 0x07, /* bLength */ \ + USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType */ \ + in_ep, /* bEndpointAddress */ \ + 0x02, /* bmAttributes */ \ + 0x00, 0x02, /* wMaxPacketSize */ \ + 0x00 /* bInterval */ +#endif +// clang-format on + +#endif /* USB_CDC_H_ */ diff --git a/class/cdc/usbd_cdc.c b/class/cdc/usbd_cdc.c index c48a74a8..3170a620 100644 --- a/class/cdc/usbd_cdc.c +++ b/class/cdc/usbd_cdc.c @@ -135,7 +135,7 @@ static int cdc_acm_class_request_handler(struct usb_setup_packet *setup, uint8_t static void cdc_notify_handler(uint8_t event, void *arg) { switch (event) { - case USB_EVENT_RESET: + case USBD_EVENT_RESET: usbd_cdc_acm_reset(); break; @@ -144,13 +144,13 @@ static void cdc_notify_handler(uint8_t event, void *arg) } } -__weak void usbd_cdc_acm_set_line_coding(uint32_t baudrate, uint8_t databits, uint8_t parity, uint8_t stopbits) +__WEAK void usbd_cdc_acm_set_line_coding(uint32_t baudrate, uint8_t databits, uint8_t parity, uint8_t stopbits) { } -__weak void usbd_cdc_acm_set_dtr(bool dtr) +__WEAK void usbd_cdc_acm_set_dtr(bool dtr) { } -__weak void usbd_cdc_acm_set_rts(bool rts) +__WEAK void usbd_cdc_acm_set_rts(bool rts) { } diff --git a/class/cdc/usbd_cdc.h b/class/cdc/usbd_cdc.h index 33c2ac29..1e71e5d5 100644 --- a/class/cdc/usbd_cdc.h +++ b/class/cdc/usbd_cdc.h @@ -12,423 +12,12 @@ #ifndef _USBD_CDC_H #define _USBD_CDC_H +#include "usb_cdc.h" + #ifdef __cplusplus extern "C" { #endif -/*------------------------------------------------------------------------------ - * Definitions based on usbcdc11.pdf (www.usb.org) - *----------------------------------------------------------------------------*/ -/* Communication device class specification version 1.10 */ -#define CDC_V1_10 0x0110U -// Communication device class specification version 1.2 -#define CDC_V1_2_0 0x0120U - -/* Communication interface class code */ -/* (usbcdc11.pdf, 4.2, Table 15) */ -#define CDC_COMMUNICATION_INTERFACE_CLASS 0x02U - -/* Communication interface class subclass codes */ -/* (usbcdc11.pdf, 4.3, Table 16) */ -#define CDC_DIRECT_LINE_CONTROL_MODEL 0x01U -#define CDC_ABSTRACT_CONTROL_MODEL 0x02U -#define CDC_TELEPHONE_CONTROL_MODEL 0x03U -#define CDC_MULTI_CHANNEL_CONTROL_MODEL 0x04U -#define CDC_CAPI_CONTROL_MODEL 0x05U -#define CDC_ETHERNET_NETWORKING_CONTROL_MODEL 0x06U -#define CDC_ATM_NETWORKING_CONTROL_MODEL 0x07U -#define CDC_WIRELESS_HANDSET_CONTROL_MODEL 0x08U -#define CDC_DEVICE_MANAGEMENT 0x09U -#define CDC_MOBILE_DIRECT_LINE_MODEL 0x0AU -#define CDC_OBEX 0x0BU -#define CDC_ETHERNET_EMULATION_MODEL 0x0CU -#define CDC_NETWORK_CONTROL_MODEL 0x0DU - -/* Communication interface class control protocol codes */ -/* (usbcdc11.pdf, 4.4, Table 17) */ -#define CDC_COMMON_PROTOCOL_NONE 0x00U -#define CDC_COMMON_PROTOCOL_AT_COMMANDS 0x01U -#define CDC_COMMON_PROTOCOL_AT_COMMANDS_PCCA_101 0x02U -#define CDC_COMMON_PROTOCOL_AT_COMMANDS_PCCA_101_AND_ANNEXO 0x03U -#define CDC_COMMON_PROTOCOL_AT_COMMANDS_GSM_707 0x04U -#define CDC_COMMON_PROTOCOL_AT_COMMANDS_3GPP_27007 0x05U -#define CDC_COMMON_PROTOCOL_AT_COMMANDS_CDMA 0x06U -#define CDC_COMMON_PROTOCOL_ETHERNET_EMULATION_MODEL 0x07U -// NCM Communication Interface Protocol Codes -// (usbncm10.pdf, 4.2, Table 4-2) -#define CDC_NCM_PROTOCOL_NONE 0x00U -#define CDC_NCM_PROTOCOL_OEM 0xFEU - -/* Data interface class code */ -/* (usbcdc11.pdf, 4.5, Table 18) */ -#define CDC_DATA_INTERFACE_CLASS 0x0A - -/* Data interface class protocol codes */ -/* (usbcdc11.pdf, 4.7, Table 19) */ -#define CDC_DATA_PROTOCOL_ISDN_BRI 0x30 -#define CDC_DATA_PROTOCOL_HDLC 0x31 -#define CDC_DATA_PROTOCOL_TRANSPARENT 0x32 -#define CDC_DATA_PROTOCOL_Q921_MANAGEMENT 0x50 -#define CDC_DATA_PROTOCOL_Q921_DATA_LINK 0x51 -#define CDC_DATA_PROTOCOL_Q921_MULTIPLEXOR 0x52 -#define CDC_DATA_PROTOCOL_V42 0x90 -#define CDC_DATA_PROTOCOL_EURO_ISDN 0x91 -#define CDC_DATA_PROTOCOL_V24_RATE_ADAPTATION 0x92 -#define CDC_DATA_PROTOCOL_CAPI 0x93 -#define CDC_DATA_PROTOCOL_HOST_BASED_DRIVER 0xFD -#define CDC_DATA_PROTOCOL_DESCRIBED_IN_PUFD 0xFE - -/* Type values for bDescriptorType field of functional descriptors */ -/* (usbcdc11.pdf, 5.2.3, Table 24) */ -#define CDC_CS_INTERFACE 0x24 -#define CDC_CS_ENDPOINT 0x25 - -/* Type values for bDescriptorSubtype field of functional descriptors */ -/* (usbcdc11.pdf, 5.2.3, Table 25) */ -#define CDC_FUNC_DESC_HEADER 0x00 -#define CDC_FUNC_DESC_CALL_MANAGEMENT 0x01 -#define CDC_FUNC_DESC_ABSTRACT_CONTROL_MANAGEMENT 0x02 -#define CDC_FUNC_DESC_DIRECT_LINE_MANAGEMENT 0x03 -#define CDC_FUNC_DESC_TELEPHONE_RINGER 0x04 -#define CDC_FUNC_DESC_REPORTING_CAPABILITIES 0x05 -#define CDC_FUNC_DESC_UNION 0x06 -#define CDC_FUNC_DESC_COUNTRY_SELECTION 0x07 -#define CDC_FUNC_DESC_TELEPHONE_OPERATIONAL_MODES 0x08 -#define CDC_FUNC_DESC_USB_TERMINAL 0x09 -#define CDC_FUNC_DESC_NETWORK_CHANNEL 0x0A -#define CDC_FUNC_DESC_PROTOCOL_UNIT 0x0B -#define CDC_FUNC_DESC_EXTENSION_UNIT 0x0C -#define CDC_FUNC_DESC_MULTI_CHANNEL_MANAGEMENT 0x0D -#define CDC_FUNC_DESC_CAPI_CONTROL_MANAGEMENT 0x0E -#define CDC_FUNC_DESC_ETHERNET_NETWORKING 0x0F -#define CDC_FUNC_DESC_ATM_NETWORKING 0x10 -#define CDC_FUNC_DESC_WIRELESS_HANDSET_CONTROL_MODEL 0x11 -#define CDC_FUNC_DESC_MOBILE_DIRECT_LINE_MODEL 0x12 -#define CDC_FUNC_DESC_MOBILE_DIRECT_LINE_MODEL_DETAIL 0x13 -#define CDC_FUNC_DESC_DEVICE_MANAGEMENT_MODEL 0x14 -#define CDC_FUNC_DESC_OBEX 0x15 -#define CDC_FUNC_DESC_COMMAND_SET 0x16 -#define CDC_FUNC_DESC_COMMAND_SET_DETAIL 0x17 -#define CDC_FUNC_DESC_TELEPHONE_CONTROL_MODEL 0x18 -#define CDC_FUNC_DESC_OBEX_SERVICE_IDENTIFIER 0x19 - -/* CDC class-specific request codes */ -/* (usbcdc11.pdf, 6.2, Table 46) */ -/* see Table 45 for info about the specific requests. */ -#define CDC_REQUEST_SEND_ENCAPSULATED_COMMAND 0x00 -#define CDC_REQUEST_GET_ENCAPSULATED_RESPONSE 0x01 -#define CDC_REQUEST_SET_COMM_FEATURE 0x02 -#define CDC_REQUEST_GET_COMM_FEATURE 0x03 -#define CDC_REQUEST_CLEAR_COMM_FEATURE 0x04 -#define CDC_REQUEST_SET_AUX_LINE_STATE 0x10 -#define CDC_REQUEST_SET_HOOK_STATE 0x11 -#define CDC_REQUEST_PULSE_SETUP 0x12 -#define CDC_REQUEST_SEND_PULSE 0x13 -#define CDC_REQUEST_SET_PULSE_TIME 0x14 -#define CDC_REQUEST_RING_AUX_JACK 0x15 -#define CDC_REQUEST_SET_LINE_CODING 0x20 -#define CDC_REQUEST_GET_LINE_CODING 0x21 -#define CDC_REQUEST_SET_CONTROL_LINE_STATE 0x22 -#define CDC_REQUEST_SEND_BREAK 0x23 -#define CDC_REQUEST_SET_RINGER_PARMS 0x30 -#define CDC_REQUEST_GET_RINGER_PARMS 0x31 -#define CDC_REQUEST_SET_OPERATION_PARMS 0x32 -#define CDC_REQUEST_GET_OPERATION_PARMS 0x33 -#define CDC_REQUEST_SET_LINE_PARMS 0x34 -#define CDC_REQUEST_GET_LINE_PARMS 0x35 -#define CDC_REQUEST_DIAL_DIGITS 0x36 -#define CDC_REQUEST_SET_UNIT_PARAMETER 0x37 -#define CDC_REQUEST_GET_UNIT_PARAMETER 0x38 -#define CDC_REQUEST_CLEAR_UNIT_PARAMETER 0x39 -#define CDC_REQUEST_GET_PROFILE 0x3A -#define CDC_REQUEST_SET_ETHERNET_MULTICAST_FILTERS 0x40 -#define CDC_REQUEST_SET_ETHERNET_PMP_FILTER 0x41 -#define CDC_REQUEST_GET_ETHERNET_PMP_FILTER 0x42 -#define CDC_REQUEST_SET_ETHERNET_PACKET_FILTER 0x43 -#define CDC_REQUEST_GET_ETHERNET_STATISTIC 0x44 -#define CDC_REQUEST_SET_ATM_DATA_FORMAT 0x50 -#define CDC_REQUEST_GET_ATM_DEVICE_STATISTICS 0x51 -#define CDC_REQUEST_SET_ATM_DEFAULT_VC 0x52 -#define CDC_REQUEST_GET_ATM_VC_STATISTICS 0x53 - -/* Communication feature selector codes */ -/* (usbcdc11.pdf, 6.2.2..6.2.4, Table 47) */ -#define CDC_ABSTRACT_STATE 0x01 -#define CDC_COUNTRY_SETTING 0x02 - -/** Control Signal Bitmap Values for SetControlLineState */ -#define SET_CONTROL_LINE_STATE_RTS 0x02 -#define SET_CONTROL_LINE_STATE_DTR 0x01 - -/* Feature Status returned for ABSTRACT_STATE Selector */ -/* (usbcdc11.pdf, 6.2.3, Table 48) */ -#define CDC_IDLE_SETTING (1 << 0) -#define CDC_DATA_MULTPLEXED_STATE (1 << 1) - -/* Control signal bitmap values for the SetControlLineState request */ -/* (usbcdc11.pdf, 6.2.14, Table 51) */ -#define CDC_DTE_PRESENT (1 << 0) -#define CDC_ACTIVATE_CARRIER (1 << 1) - -/* CDC class-specific notification codes */ -/* (usbcdc11.pdf, 6.3, Table 68) */ -/* see Table 67 for Info about class-specific notifications */ -#define CDC_NOTIFICATION_NETWORK_CONNECTION 0x00 -#define CDC_RESPONSE_AVAILABLE 0x01 -#define CDC_AUX_JACK_HOOK_STATE 0x08 -#define CDC_RING_DETECT 0x09 -#define CDC_NOTIFICATION_SERIAL_STATE 0x20 -#define CDC_CALL_STATE_CHANGE 0x28 -#define CDC_LINE_STATE_CHANGE 0x29 -#define CDC_CONNECTION_SPEED_CHANGE 0x2A - -/* UART state bitmap values (Serial state notification). */ -/* (usbcdc11.pdf, 6.3.5, Table 69) */ -#define CDC_SERIAL_STATE_OVERRUN (1 << 6) /* receive data overrun error has occurred */ -#define CDC_SERIAL_STATE_OVERRUN_Pos (6) -#define CDC_SERIAL_STATE_OVERRUN_Msk (1 << CDC_SERIAL_STATE_OVERRUN_Pos) -#define CDC_SERIAL_STATE_PARITY (1 << 5) /* parity error has occurred */ -#define CDC_SERIAL_STATE_PARITY_Pos (5) -#define CDC_SERIAL_STATE_PARITY_Msk (1 << CDC_SERIAL_STATE_PARITY_Pos) -#define CDC_SERIAL_STATE_FRAMING (1 << 4) /* framing error has occurred */ -#define CDC_SERIAL_STATE_FRAMING_Pos (4) -#define CDC_SERIAL_STATE_FRAMING_Msk (1 << CDC_SERIAL_STATE_FRAMING_Pos) -#define CDC_SERIAL_STATE_RING (1 << 3) /* state of ring signal detection */ -#define CDC_SERIAL_STATE_RING_Pos (3) -#define CDC_SERIAL_STATE_RING_Msk (1 << CDC_SERIAL_STATE_RING_Pos) -#define CDC_SERIAL_STATE_BREAK (1 << 2) /* state of break detection */ -#define CDC_SERIAL_STATE_BREAK_Pos (2) -#define CDC_SERIAL_STATE_BREAK_Msk (1 << CDC_SERIAL_STATE_BREAK_Pos) -#define CDC_SERIAL_STATE_TX_CARRIER (1 << 1) /* state of transmission carrier */ -#define CDC_SERIAL_STATE_TX_CARRIER_Pos (1) -#define CDC_SERIAL_STATE_TX_CARRIER_Msk (1 << CDC_SERIAL_STATE_TX_CARRIER_Pos) -#define CDC_SERIAL_STATE_RX_CARRIER (1 << 0) /* state of receiver carrier */ -#define CDC_SERIAL_STATE_RX_CARRIER_Pos (0) -#define CDC_SERIAL_STATE_RX_CARRIER_Msk (1 << CDC_SERIAL_STATE_RX_CARRIER_Pos) - -/*------------------------------------------------------------------------------ - * Structures based on usbcdc11.pdf (www.usb.org) - *----------------------------------------------------------------------------*/ - -/* Header functional descriptor */ -/* (usbcdc11.pdf, 5.2.3.1) */ -/* This header must precede any list of class-specific descriptors. */ -struct cdc_header_descriptor { - uint8_t bFunctionLength; /* size of this descriptor in bytes */ - uint8_t bDescriptorType; /* CS_INTERFACE descriptor type */ - uint8_t bDescriptorSubtype; /* Header functional descriptor subtype */ - uint16_t bcdCDC; /* USB CDC specification release version */ -} __packed; - -/* Call management functional descriptor */ -/* (usbcdc11.pdf, 5.2.3.2) */ -/* Describes the processing of calls for the communication class interface. */ -struct cdc_call_management_descriptor { - uint8_t bFunctionLength; /* size of this descriptor in bytes */ - uint8_t bDescriptorType; /* CS_INTERFACE descriptor type */ - uint8_t bDescriptorSubtype; /* call management functional descriptor subtype */ - uint8_t bmCapabilities; /* capabilities that this configuration supports */ - uint8_t bDataInterface; /* interface number of the data class interface used for call management (optional) */ -} __packed; - -/* Abstract control management functional descriptor */ -/* (usbcdc11.pdf, 5.2.3.3) */ -/* Describes the command supported by the communication interface class with the Abstract Control Model subclass code. */ -struct cdc_abstract_control_management_descriptor { - uint8_t bFunctionLength; /* size of this descriptor in bytes */ - uint8_t bDescriptorType; /* CS_INTERFACE descriptor type */ - uint8_t bDescriptorSubtype; /* abstract control management functional descriptor subtype */ - uint8_t bmCapabilities; /* capabilities supported by this configuration */ -} __packed; - -/* Union functional descriptors */ -/* (usbcdc11.pdf, 5.2.3.8) */ -/* Describes the relationship between a group of interfaces that can be considered to form a functional unit. */ -struct cdc_union_descriptor { - uint8_t bFunctionLength; /* size of this descriptor in bytes */ - uint8_t bDescriptorType; /* CS_INTERFACE descriptor type */ - uint8_t bDescriptorSubtype; /* union functional descriptor subtype */ - uint8_t bMasterInterface; /* interface number designated as master */ -} __packed; - -/* Union functional descriptors with one slave interface */ -/* (usbcdc11.pdf, 5.2.3.8) */ -struct cdc_union_1slave_descriptor { - uint8_t bFunctionLength; - uint8_t bDescriptorType; - uint8_t bDescriptorSubtype; - uint8_t bControlInterface; - uint8_t bSubordinateInterface0; -} __packed; - -/* Line coding structure for GET_LINE_CODING / SET_LINE_CODING class requests*/ -/* Format of the data returned when a GetLineCoding request is received */ -/* (usbcdc11.pdf, 6.2.13) */ -struct cdc_line_coding { - uint32_t dwDTERate; /* Data terminal rate in bits per second */ - uint8_t bCharFormat; /* Number of stop bits */ - uint8_t bParityType; /* Parity bit type */ - uint8_t bDataBits; /* Number of data bits */ -} __packed; - -/** Data structure for the notification about SerialState */ -struct cdc_acm_notification { - uint8_t bmRequestType; - uint8_t bNotificationType; - uint16_t wValue; - uint16_t wIndex; - uint16_t wLength; - uint16_t data; -} __packed; - -/** Ethernet Networking Functional Descriptor */ -struct cdc_ecm_descriptor { - uint8_t bFunctionLength; - uint8_t bDescriptorType; - uint8_t bDescriptorSubtype; - uint8_t iMACAddress; - uint32_t bmEthernetStatistics; - uint16_t wMaxSegmentSize; - uint16_t wNumberMCFilters; - uint8_t bNumberPowerFilters; -} __packed; - -/*Length of template descriptor: 66 bytes*/ -#define CDC_ACM_DESCRIPTOR_LEN (8 + 9 + 5 + 5 + 4 + 5 + 7 + 9 + 7 + 7) -// clang-format off -#ifndef CONFIG_USB_HS -#define CDC_ACM_DESCRIPTOR_INIT(bFirstInterface, int_ep, out_ep, in_ep, str_idx) \ - /* Interface Associate */ \ - 0x08, /* bLength */ \ - USB_DESCRIPTOR_TYPE_INTERFACE_ASSOCIATION, /* bDescriptorType */ \ - bFirstInterface, /* bFirstInterface */ \ - 0x02, /* bInterfaceCount */ \ - USB_DEVICE_CLASS_CDC, /* bFunctionClass */ \ - CDC_ABSTRACT_CONTROL_MODEL, /* bFunctionSubClass */ \ - CDC_COMMON_PROTOCOL_AT_COMMANDS, /* bFunctionProtocol */ \ - 0x00, /* iFunction */ \ - 0x09, /* bLength */ \ - USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType */ \ - bFirstInterface, /* bInterfaceNumber */ \ - 0x00, /* bAlternateSetting */ \ - 0x01, /* bNumEndpoints */ \ - USB_DEVICE_CLASS_CDC, /* bInterfaceClass */ \ - CDC_ABSTRACT_CONTROL_MODEL, /* bInterfaceSubClass */ \ - CDC_COMMON_PROTOCOL_AT_COMMANDS, /* bInterfaceProtocol */ \ - str_idx, /* iInterface */ \ - 0x05, /* bLength */ \ - CDC_CS_INTERFACE, /* bDescriptorType */ \ - CDC_FUNC_DESC_HEADER, /* bDescriptorSubtype */ \ - WBVAL(CDC_V1_10), /* bcdCDC */ \ - 0x05, /* bLength */ \ - CDC_CS_INTERFACE, /* bDescriptorType */ \ - CDC_FUNC_DESC_CALL_MANAGEMENT, /* bDescriptorSubtype */ \ - bFirstInterface, /* bmCapabilities */ \ - (uint8_t)(bFirstInterface + 1), /* bDataInterface */ \ - 0x04, /* bLength */ \ - CDC_CS_INTERFACE, /* bDescriptorType */ \ - CDC_FUNC_DESC_ABSTRACT_CONTROL_MANAGEMENT, /* bDescriptorSubtype */ \ - 0x02, /* bmCapabilities */ \ - 0x05, /* bLength */ \ - CDC_CS_INTERFACE, /* bDescriptorType */ \ - CDC_FUNC_DESC_UNION, /* bDescriptorSubtype */ \ - bFirstInterface, /* bMasterInterface */ \ - (uint8_t)(bFirstInterface + 1), /* bSlaveInterface0 */ \ - 0x07, /* bLength */ \ - USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType */ \ - int_ep, /* bEndpointAddress */ \ - 0x03, /* bmAttributes */ \ - 0x40, 0x00, /* wMaxPacketSize */ \ - 0x00, /* bInterval */ \ - 0x09, /* bLength */ \ - USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType */ \ - (uint8_t)(bFirstInterface + 1), /* bInterfaceNumber */ \ - 0x00, /* bAlternateSetting */ \ - 0x02, /* bNumEndpoints */ \ - CDC_DATA_INTERFACE_CLASS, /* bInterfaceClass */ \ - 0x00, /* bInterfaceSubClass */ \ - 0x00, /* bInterfaceProtocol */ \ - 0x00, /* iInterface */ \ - 0x07, /* bLength */ \ - USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType */ \ - out_ep, /* bEndpointAddress */ \ - 0x02, /* bmAttributes */ \ - 0x40, 0x00, /* wMaxPacketSize */ \ - 0x00, /* bInterval */ \ - 0x07, /* bLength */ \ - USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType */ \ - in_ep, /* bEndpointAddress */ \ - 0x02, /* bmAttributes */ \ - 0x40, 0x00, /* wMaxPacketSize */ \ - 0x00 /* bInterval */ -#else -#define CDC_ACM_DESCRIPTOR_INIT(bFirstInterface, int_ep, out_ep, in_ep, str_idx) \ - /* Interface Associate */ \ - 0x08, /* bLength */ \ - USB_DESCRIPTOR_TYPE_INTERFACE_ASSOCIATION, /* bDescriptorType */ \ - bFirstInterface, /* bFirstInterface */ \ - 0x02, /* bInterfaceCount */ \ - USB_DEVICE_CLASS_CDC, /* bFunctionClass */ \ - CDC_ABSTRACT_CONTROL_MODEL, /* bFunctionSubClass */ \ - CDC_COMMON_PROTOCOL_AT_COMMANDS, /* bFunctionProtocol */ \ - 0x00, /* iFunction */ \ - 0x09, /* bLength */ \ - USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType */ \ - bFirstInterface, /* bInterfaceNumber */ \ - 0x00, /* bAlternateSetting */ \ - 0x01, /* bNumEndpoints */ \ - USB_DEVICE_CLASS_CDC, /* bInterfaceClass */ \ - CDC_ABSTRACT_CONTROL_MODEL, /* bInterfaceSubClass */ \ - CDC_COMMON_PROTOCOL_AT_COMMANDS, /* bInterfaceProtocol */ \ - str_idx, /* iInterface */ \ - 0x05, /* bLength */ \ - CDC_CS_INTERFACE, /* bDescriptorType */ \ - CDC_FUNC_DESC_HEADER, /* bDescriptorSubtype */ \ - WBVAL(CDC_V1_10), /* bcdCDC */ \ - 0x05, /* bLength */ \ - CDC_CS_INTERFACE, /* bDescriptorType */ \ - CDC_FUNC_DESC_CALL_MANAGEMENT, /* bDescriptorSubtype */ \ - bFirstInterface, /* bmCapabilities */ \ - (uint8_t)(bFirstInterface + 1), /* bDataInterface */ \ - 0x04, /* bLength */ \ - CDC_CS_INTERFACE, /* bDescriptorType */ \ - CDC_FUNC_DESC_ABSTRACT_CONTROL_MANAGEMENT, /* bDescriptorSubtype */ \ - 0x02, /* bmCapabilities */ \ - 0x05, /* bLength */ \ - CDC_CS_INTERFACE, /* bDescriptorType */ \ - CDC_FUNC_DESC_UNION, /* bDescriptorSubtype */ \ - bFirstInterface, /* bMasterInterface */ \ - (uint8_t)(bFirstInterface + 1), /* bSlaveInterface0 */ \ - 0x07, /* bLength */ \ - USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType */ \ - int_ep, /* bEndpointAddress */ \ - 0x03, /* bmAttributes */ \ - 0x00, 0x02, /* wMaxPacketSize */ \ - 0x00, /* bInterval */ \ - 0x09, /* bLength */ \ - USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType */ \ - (uint8_t)(bFirstInterface + 1), /* bInterfaceNumber */ \ - 0x00, /* bAlternateSetting */ \ - 0x02, /* bNumEndpoints */ \ - CDC_DATA_INTERFACE_CLASS, /* bInterfaceClass */ \ - 0x00, /* bInterfaceSubClass */ \ - 0x00, /* bInterfaceProtocol */ \ - 0x00, /* iInterface */ \ - 0x07, /* bLength */ \ - USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType */ \ - out_ep, /* bEndpointAddress */ \ - 0x02, /* bmAttributes */ \ - 0x00, 0x02, /* wMaxPacketSize */ \ - 0x00, /* bInterval */ \ - 0x07, /* bLength */ \ - USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType */ \ - in_ep, /* bEndpointAddress */ \ - 0x02, /* bmAttributes */ \ - 0x00, 0x02, /* wMaxPacketSize */ \ - 0x00 /* bInterval */ -#endif -// clang-format on - void usbd_cdc_add_acm_interface(usbd_class_t *class, usbd_interface_t *intf); void usbd_cdc_acm_set_line_coding(uint32_t baudrate, uint8_t databits, uint8_t parity, uint8_t stopbits); @@ -439,4 +28,4 @@ void usbd_cdc_acm_set_rts(bool rts); } #endif -#endif /* USB_CDC_H_ */ +#endif /* USBD_CDC_H_ */ diff --git a/class/dfu/usb_dfu.h b/class/dfu/usb_dfu.h new file mode 100644 index 00000000..937c2d55 --- /dev/null +++ b/class/dfu/usb_dfu.h @@ -0,0 +1,103 @@ +/** + * @file + * @brief USB DFU Class public header + * + */ + +#ifndef _USB_DFU_H_ +#define _USB_DFU_H_ + +/**\addtogroup USB_MODULE_DFU USB DFU class + * \brief This module contains USB Device Firmware Upgrade class definitions. + * \details This module based on + * + [USB Device Firmware Upgrade Specification, Revision 1.1] + * (https://www.usb.org/sites/default/files/DFU_1.1.pdf) + * @{ */ + +/** DFU Specification release */ +#define DFU_VERSION 0x0110 + +/** DFU Class Subclass */ +#define DFU_SUBCLASS_DFU 0x01 + +/** DFU Class runtime Protocol */ +#define DFU_PROTOCOL_RUNTIME 0x01 + +/** DFU Class DFU mode Protocol */ +#define DFU_PROTOCOL_MODE 0x02 + +/** + * @brief DFU Class Specific Requests + */ +#define DFU_REQUEST_DETACH 0x00 +#define DFU_REQUEST_DNLOAD 0x01 +#define DFU_REQUEST_UPLOAD 0x02 +#define DFU_REQUEST_GETSTATUS 0x03 +#define DFU_REQUEST_CLRSTATUS 0x04 +#define DFU_REQUEST_GETSTATE 0x05 +#define DFU_REQUEST_ABORT 0x06 + +/** DFU FUNCTIONAL descriptor type */ +#define DFU_FUNC_DESC 0x21 + +/** DFU attributes DFU Functional Descriptor */ +#define DFU_ATTR_WILL_DETACH 0x08 +#define DFU_ATTR_MANIFESTATION_TOLERANT 0x04 +#define DFU_ATTR_CAN_UPLOAD 0x02 +#define DFU_ATTR_CAN_DNLOAD 0x01 + +/** bStatus values for the DFU_GETSTATUS response */ +#define DFU_STATUS_OK 0x00U +#define DFU_STATUS_ERR_TARGET 0x01U +#define DFU_STATUS_ERR_FILE 0x02U +#define DFU_STATUS_ERR_WRITE 0x03U +#define DFU_STATUS_ERR_ERASE 0x04U +#define DFU_STATUS_ERR_CHECK_ERASED 0x05U +#define DFU_STATUS_ERR_PROG 0x06U +#define DFU_STATUS_ERR_VERIFY 0x07U +#define DFU_STATUS_ERR_ADDRESS 0x08U +#define DFU_STATUS_ERR_NOTDONE 0x09U +#define DFU_STATUS_ERR_FIRMWARE 0x0AU +#define DFU_STATUS_ERR_VENDOR 0x0BU +#define DFU_STATUS_ERR_USB 0x0CU +#define DFU_STATUS_ERR_POR 0x0DU +#define DFU_STATUS_ERR_UNKNOWN 0x0EU +#define DFU_STATUS_ERR_STALLEDPKT 0x0FU + +/** bState values for the DFU_GETSTATUS response */ +#define DFU_STATE_APP_IDLE 0U +#define DFU_STATE_APP_DETACH 1U +#define DFU_STATE_DFU_IDLE 2U +#define DFU_STATE_DFU_DNLOAD_SYNC 3U +#define DFU_STATE_DFU_DNLOAD_BUSY 4U +#define DFU_STATE_DFU_DNLOAD_IDLE 5U +#define DFU_STATE_DFU_MANIFEST_SYNC 6U +#define DFU_STATE_DFU_MANIFEST 7U +#define DFU_STATE_DFU_MANIFEST_WAIT_RESET 8U +#define DFU_STATE_DFU_UPLOAD_IDLE 9U +#define DFU_STATE_DFU_ERROR 10U + +/** Run-Time Functional Descriptor */ +struct dfu_runtime_descriptor { + uint8_t bLength; /**<\brief Descriptor length in bytes.*/ + uint8_t bDescriptorType; /**<\brief DFU functional descriptor type.*/ + uint8_t bmAttributes; /**<\brief USB DFU capabilities \ref USB_DFU_CAPAB*/ + uint16_t wDetachTimeout; /**<\brief USB DFU detach timeout in ms.*/ + uint16_t wTransferSize; /**<\brief USB DFU maximum transfer block size in bytes.*/ + uint16_t bcdDFUVersion; /**<\brief USB DFU version \ref VERSION_BCD utility macro.*/ +} __PACKED; + +/**\brief Payload packet to response in DFU_GETSTATUS request */ +struct dfu_info { + uint8_t bStatus; /**<\brief An indication of the status resulting from the + * execution of the most recent request.*/ + uint8_t bPollTimeout; /**<\brief Minimum time (LSB) in ms, that the host should wait + * before sending a subsequent DFU_GETSTATUS request.*/ + uint16_t wPollTimeout; /**<\brief Minimum time (MSB) in ms, that the host should wait + * before sending a subsequent DFU_GETSTATUS request.*/ + uint8_t bState; /**<\brief An indication of the state that the device is going + * to enter immediately following transmission of this response.*/ + uint8_t iString; /**<\brief Index of the status string descriptor.*/ +}; + +#endif /* _USB_DFU_H_ */ diff --git a/class/dfu/usbd_dfu.c b/class/dfu/usbd_dfu.c index 2b11808f..02f46742 100644 --- a/class/dfu/usbd_dfu.c +++ b/class/dfu/usbd_dfu.c @@ -38,7 +38,7 @@ int dfu_class_request_handler(struct usb_setup_packet *setup, uint8_t **data, ui void dfu_notify_handler(uint8_t event, void *arg) { switch (event) { - case USB_EVENT_RESET: + case USBD_EVENT_RESET: break; diff --git a/class/dfu/usbd_dfu.h b/class/dfu/usbd_dfu.h index c5f7a045..6a380318 100644 --- a/class/dfu/usbd_dfu.h +++ b/class/dfu/usbd_dfu.h @@ -7,103 +7,12 @@ #ifndef _USBD_DFU_H_ #define _USBD_DFU_H_ +#include "usb_dfu.h" + #ifdef __cplusplus extern "C" { #endif -/**\addtogroup USB_MODULE_DFU USB DFU class - * \brief This module contains USB Device Firmware Upgrade class definitions. - * \details This module based on - * + [USB Device Firmware Upgrade Specification, Revision 1.1] - * (https://www.usb.org/sites/default/files/DFU_1.1.pdf) - * @{ */ - -/** DFU Specification release */ -#define DFU_VERSION 0x0110 - -/** DFU Class Subclass */ -#define DFU_SUBCLASS_DFU 0x01 - -/** DFU Class runtime Protocol */ -#define DFU_PROTOCOL_RUNTIME 0x01 - -/** DFU Class DFU mode Protocol */ -#define DFU_PROTOCOL_MODE 0x02 - -/** - * @brief DFU Class Specific Requests - */ -#define DFU_REQUEST_DETACH 0x00 -#define DFU_REQUEST_DNLOAD 0x01 -#define DFU_REQUEST_UPLOAD 0x02 -#define DFU_REQUEST_GETSTATUS 0x03 -#define DFU_REQUEST_CLRSTATUS 0x04 -#define DFU_REQUEST_GETSTATE 0x05 -#define DFU_REQUEST_ABORT 0x06 - -/** DFU FUNCTIONAL descriptor type */ -#define DFU_FUNC_DESC 0x21 - -/** DFU attributes DFU Functional Descriptor */ -#define DFU_ATTR_WILL_DETACH 0x08 -#define DFU_ATTR_MANIFESTATION_TOLERANT 0x04 -#define DFU_ATTR_CAN_UPLOAD 0x02 -#define DFU_ATTR_CAN_DNLOAD 0x01 - -/** bStatus values for the DFU_GETSTATUS response */ -#define DFU_STATUS_OK 0x00U -#define DFU_STATUS_ERR_TARGET 0x01U -#define DFU_STATUS_ERR_FILE 0x02U -#define DFU_STATUS_ERR_WRITE 0x03U -#define DFU_STATUS_ERR_ERASE 0x04U -#define DFU_STATUS_ERR_CHECK_ERASED 0x05U -#define DFU_STATUS_ERR_PROG 0x06U -#define DFU_STATUS_ERR_VERIFY 0x07U -#define DFU_STATUS_ERR_ADDRESS 0x08U -#define DFU_STATUS_ERR_NOTDONE 0x09U -#define DFU_STATUS_ERR_FIRMWARE 0x0AU -#define DFU_STATUS_ERR_VENDOR 0x0BU -#define DFU_STATUS_ERR_USB 0x0CU -#define DFU_STATUS_ERR_POR 0x0DU -#define DFU_STATUS_ERR_UNKNOWN 0x0EU -#define DFU_STATUS_ERR_STALLEDPKT 0x0FU - -/** bState values for the DFU_GETSTATUS response */ -#define DFU_STATE_APP_IDLE 0U -#define DFU_STATE_APP_DETACH 1U -#define DFU_STATE_DFU_IDLE 2U -#define DFU_STATE_DFU_DNLOAD_SYNC 3U -#define DFU_STATE_DFU_DNLOAD_BUSY 4U -#define DFU_STATE_DFU_DNLOAD_IDLE 5U -#define DFU_STATE_DFU_MANIFEST_SYNC 6U -#define DFU_STATE_DFU_MANIFEST 7U -#define DFU_STATE_DFU_MANIFEST_WAIT_RESET 8U -#define DFU_STATE_DFU_UPLOAD_IDLE 9U -#define DFU_STATE_DFU_ERROR 10U - -/** Run-Time Functional Descriptor */ -struct dfu_runtime_descriptor { - uint8_t bLength; /**<\brief Descriptor length in bytes.*/ - uint8_t bDescriptorType; /**<\brief DFU functional descriptor type.*/ - uint8_t bmAttributes; /**<\brief USB DFU capabilities \ref USB_DFU_CAPAB*/ - uint16_t wDetachTimeout; /**<\brief USB DFU detach timeout in ms.*/ - uint16_t wTransferSize; /**<\brief USB DFU maximum transfer block size in bytes.*/ - uint16_t bcdDFUVersion; /**<\brief USB DFU version \ref VERSION_BCD utility macro.*/ -} __packed; - -/**\brief Payload packet to response in DFU_GETSTATUS request */ -struct dfu_info { - uint8_t bStatus; /**<\brief An indication of the status resulting from the - * execution of the most recent request.*/ - uint8_t bPollTimeout; /**<\brief Minimum time (LSB) in ms, that the host should wait - * before sending a subsequent DFU_GETSTATUS request.*/ - uint16_t wPollTimeout; /**<\brief Minimum time (MSB) in ms, that the host should wait - * before sending a subsequent DFU_GETSTATUS request.*/ - uint8_t bState; /**<\brief An indication of the state that the device is going - * to enter immediately following transmission of this response.*/ - uint8_t iString; /**<\brief Index of the status string descriptor.*/ -}; - void usbd_dfu_add_interface(usbd_class_t *class, usbd_interface_t *intf); #ifdef __cplusplus diff --git a/class/hid/usb_hid.h b/class/hid/usb_hid.h new file mode 100644 index 00000000..113b3e16 --- /dev/null +++ b/class/hid/usb_hid.h @@ -0,0 +1,708 @@ +/** + * @file + * @brief Human Interface Device (HID) Class public header + * + * Header follows Device Class Definition for Human Interface Devices (HID) + * Version 1.11 document (HID1_11-1.pdf). + */ +#ifndef __HID_H_ +#define __HID_H_ + +/* Subclass codes (HID 4.2) */ +#define HID_SUBCLASS_NONE 0 /* No subclass */ +#define HID_SUBCLASS_BOOTIF 1 /* Boot Interface Subclass */ + +/* HID Protocol Codes (HID 4.3) */ +#define HID_PROTOCOL_NONE 0x00 +#define HID_PROTOCOL_BOOT 0x00 +#define HID_PROTOCOL_KEYBOARD 0x01 +#define HID_PROTOCOL_REPORT 0x01 +#define HID_PROTOCOL_MOUSE 0x02 + +/* HID Class Descriptor Types (HID 7.1) */ +#define HID_DESCRIPTOR_TYPE_HID 0x21 +#define HID_DESCRIPTOR_TYPE_HID_REPORT 0x22 +#define HID_DESCRIPTOR_TYPE_HID_PHYSICAL 0x23 + +/* HID Class Specific Requests (HID 7.2) */ +#define HID_REQUEST_GET_REPORT 0x01 +#define HID_REQUEST_GET_IDLE 0x02 +#define HID_REQUEST_GET_PROTOCOL 0x03 +#define HID_REQUEST_SET_REPORT 0x09 +#define HID_REQUEST_SET_IDLE 0x0A +#define HID_REQUEST_SET_PROTOCOL 0x0B + +/* Report Type (MS byte of wValue for GET_REPORT) (HID 7.2.1) */ +#define HID_REPORT_INPUT 0x01 +#define HID_REPORT_OUTPUT 0x02 +#define HID_REPORT_FEATURE 0x03 + +/* HID Descriptor ***********************************************************/ + +#define HID_COUNTRY_NONE 0x00 /* Not Supported */ +#define HID_COUNTRY_ARABIC 0x01 /* Arabic */ +#define HID_COUNTRY_BELGIAN 0x02 /* Belgian */ +#define HID_COUNTRY_CANADA 0x03 /* Canadian-Bilingual */ +#define HID_COUNTRY_CANADRFR 0x04 /* Canadian-French */ +#define HID_COUNTRY_CZECH 0x05 /* Czech Republic */ +#define HID_COUNTRY_DANISH 0x06 /* Danish */ +#define HID_COUNTRY_FINNISH 0x07 /* Finnish */ +#define HID_COUNTRY_FRENCH 0x08 /* French */ +#define HID_COUNTRY_GERMAN 0x09 /* German */ +#define HID_COUNTRY_GREEK 0x10 /* Greek */ +#define HID_COUNTRY_HEBREW 0x11 /* Hebrew */ +#define HID_COUNTRY_HUNGARY 0x12 /* Hungary */ +#define HID_COUNTRY_ISO 0x13 /* International (ISO) */ +#define HID_COUNTRY_ITALIAN 0x14 /* Italian */ +#define HID_COUNTRY_JAPAN 0x15 /* Japan (Katakana) */ +#define HID_COUNTRY_KOREAN 0x16 /* Korean */ +#define HID_COUNTRY_LATINAM 0x17 /* Latin American */ +#define HID_COUNTRY_DUTCH 0x18 /* Netherlands/Dutch */ +#define HID_COUNTRY_NORWEGIAN 0x19 /* Norwegian */ +#define HID_COUNTRY_PERSIAN 0x20 /* Persian (Farsi) */ +#define HID_COUNTRY_POLAND 0x21 /* Poland */ +#define HID_COUNTRY_PORTUGUESE 0x22 /* Portuguese */ +#define HID_COUNTRY_RUSSIA 0x23 /* Russia */ +#define HID_COUNTRY_SLOVAKIA 0x24 /* Slovakia */ +#define HID_COUNTRY_SPANISH 0x25 /* Spanish */ +#define HID_COUNTRY_SWEDISH 0x26 /* Swedish */ +#define HID_COUNTRY_SWISSFR 0x27 /* Swiss/French */ +#define HID_COUNTRY_SWISSGR 0x28 /* Swiss/German */ +#define HID_COUNTRY_SWITZERLAND 0x29 /* Switzerland */ +#define HID_COUNTRY_TAIWAN 0x30 /* Taiwan */ +#define HID_COUNTRY_TURKISHQ 0x31 /* Turkish-Q */ +#define HID_COUNTRY_UK 0x32 /* UK */ +#define HID_COUNTRY_US 0x33 /* US */ +#define HID_COUNTRY_YUGOSLAVIA 0x34 /* Yugoslavia */ +#define HID_COUNTRY_TURKISHF 0x35 /* Turkish-F */ + +/* HID report items */ +#define HID_REPORT_ITEM_SIZE_MASK 0x03 +#define HID_REPORT_ITEM_SIZE_0 0x00 /* No data follows */ +#define HID_REPORT_ITEM_SIZE_1 0x01 /* 1 byte of data follows */ +#define HID_REPORT_ITEM_SIZE_2 0x02 /* 2 bytes of data follow */ +#define HID_REPORT_ITEM_SIZE_4 0x03 /* 4 bytes of data follow */ +#define HID_REPORT_ITEM_TYPE_MASK 0x0c +#define HID_REPORT_ITEM_TYPE_MAIN 0x00 +#define HID_REPORT_ITEM_TYPE_GLOBAL 0x04 +#define HID_REPORT_ITEM_TYPE_LOCAL 0x08 +#define HID_REPORT_ITEM_TAG_MASK 0xf0 + +/* Main Items (HID 6.2.2.4) */ +#define HID_MAIN_ITEM_CONSTANT (1 << 0) /* Constant(1) vs Data(0) */ +#define HID_MAIN_ITEM_VARIABLE (1 << 1) /* Variable(1) vs Array(0) */ +#define HID_MAIN_ITEM_RELATIVE (1 << 2) /* Relative(1) vs Absolute(0) */ +#define HID_MAIN_ITEM_WRAP (1 << 3) /* Wrap(1) vs No Wrap(0) */ +#define HID_MAIN_ITEM_NONLINEAR (1 << 4) /* Non Linear(1) vs Linear(0) */ +#define HID_MAIN_ITEM_NOPREFERRED (1 << 5) /* No Preferred (1) vs Preferred State(0) */ +#define HID_MAIN_ITEM_NULLSTATE (1 << 6) /* Null state(1) vs No Null position(0) */ +#define HID_MAIN_ITEM_VOLATILE (1 << 7) /* Volatile(1) vs Non volatile(0) */ +#define HID_MAIN_ITEM_BUFFEREDBYTES (1 << 8) /* Buffered Bytes(1) vs Bit Field(0) */ + +#define HID_MAIN_ITEM_SIZE(pfx) ((pfx)&HID_REPORT_ITEM_SIZE_MASK) +#define HID_MAIN_ITEM_INPUT_PREFIX 0x80 +#define HID_MAIN_ITEM_INPUT_CONSTANT HID_MAIN_ITEM_CONSTANT +#define HID_MAIN_ITEM_INPUT_VARIABLE HID_MAIN_ITEM_VARIABLE +#define HID_MAIN_ITEM_INPUT_RELATIVE HID_MAIN_ITEM_RELATIVE +#define HID_MAIN_ITEM_INPUT_WRAP HID_MAIN_ITEM_WRAP +#define HID_MAIN_ITEM_INPUT_NONLINEAR HID_MAIN_ITEM_NONLINEAR +#define HID_MAIN_ITEM_INPUT_NOPREFERRED HID_MAIN_ITEM_NOPREFERRED +#define HID_MAIN_ITEM_INPUT_NULLSTATE HID_MAIN_ITEM_NULLSTATE +#define HID_MAIN_ITEM_INPUT_BUFFEREDBYTES HID_MAIN_ITEM_BUFFEREDBYTES + +#define HID_MAIN_ITEM_OUTPUT_PREFIX 0x90 +#define HID_MAIN_ITEM_OUTPUT_CONSTANT HID_MAIN_ITEM_CONSTANT +#define HID_MAIN_ITEM_OUTPUT_VARIABLE HID_MAIN_ITEM_VARIABLE +#define HID_MAIN_ITEM_OUTPUT_RELATIVE HID_MAIN_ITEM_RELATIVE +#define HID_MAIN_ITEM_OUTPUT_WRAP HID_MAIN_ITEM_WRAP +#define HID_MAIN_ITEM_OUTPUT_NONLINEAR HID_MAIN_ITEM_NONLINEAR +#define HID_MAIN_ITEM_OUTPUT_NOPREFERRED HID_MAIN_ITEM_NOPREFERRED +#define HID_MAIN_ITEM_OUTPUT_NULLSTATE HID_MAIN_ITEM_NULLSTATE +#define HID_MAIN_ITEM_OUTPUT_VOLATILE HID_MAIN_ITEM_VOLATILE +#define HID_MAIN_ITEM_OUTPUT_BUFFEREDBYTES HID_MAIN_ITEM_BUFFEREDBYTES + +#define HID_MAIN_ITEM_FEATURE_PREFIX 0xb0 +#define HID_MAIN_ITEM_FEATURE_CONSTANT HID_MAIN_ITEM_CONSTANT +#define HID_MAIN_ITEM_FEATURE_VARIABLE HID_MAIN_ITEM_VARIABLE +#define HID_MAIN_ITEM_FEATURE_RELATIVE HID_MAIN_ITEM_RELATIVE +#define HID_MAIN_ITEM_FEATURE_WRAP HID_MAIN_ITEM_WRAP +#define HID_MAIN_ITEM_FEATURE_NONLINEAR HID_MAIN_ITEM_NONLINEAR +#define HID_MAIN_ITEM_FEATURE_NOPREFERRED HID_MAIN_ITEM_NOPREFERRED +#define HID_MAIN_ITEM_FEATURE_NULLSTATE HID_MAIN_ITEM_NULLSTATE +#define HID_MAIN_ITEM_FEATURE_VOLATILE HID_MAIN_ITEM_VOLATILE +#define HID_MAIN_ITEM_FEATURE_BUFFEREDBYTES HID_MAIN_ITEM_BUFFEREDBYTES + +#define HID_MAIN_ITEM_COLLECTION_PREFIX 0xa0 +#define HID_MAIN_ITEM_COLLECTION_PHYSICAL 0x00 /* Physical (group of axes) */ +#define HID_MAIN_ITEM_COLLECTION_APPL 0x01 /* Application (mouse, keyboard) */ +#define HID_MAIN_ITEM_COLLECTION_LOGICAL 0x02 /* Logical (interrelated data) */ +#define HID_MAIN_ITEM_COLLECTION_REPORT 0x03 /* Report */ +#define HID_MAIN_ITEM_COLLECTION_ARRAY 0x04 /* Named Array */ +#define HID_MAIN_ITEM_COLLECTION_SWITCH 0x05 /* Usage Switch */ +#define HID_MAIN_ITEM_COLLECTION_MODIFIER 0x06 /* Usage Modifier */ +#define HID_MAIN_ITEM_ENDCOLLECTION_PREFIX 0xc0 + +/* Global Items (HID 6.2.2.7) */ +#define HID_GLOBAL_ITEM_SIZE(pfx) ((pfx)&HID_REPORT_ITEM_SIZE_MASK) +#define HID_GLOBAL_ITEM_USAGEPAGE_PREFIX 0x04 /* Usage Page */ +#define HID_GLOBAL_ITEM_LOGICALMIN_PREFIX 0x14 /* Logical Minimum */ +#define HID_GLOBAL_ITEM_LOGICALMAX_PREFIX 0x24 /* Logical Maximum */ +#define HID_GLOBAL_ITEM_PHYSICALMIN_PREFIX 0x34 /* Physical Minimum */ +#define HID_GLOBAL_ITEM_PHYSMICALAX_PREFIX 0x44 /* Physical Maximum */ +#define HID_GLOBAL_ITEM_UNITEXP_PREFIX 0x54 /* Unit Exponent */ +#define HID_GLOBAL_ITEM_UNIT_PREFIX 0x64 /* Unit */ +#define HID_GLOBAL_ITEM_REPORTSIZE_PREFIX 0x74 /* Report Size */ +#define HID_GLOBAL_ITEM_REPORTID_PREFIX 0x84 /* Report ID */ +#define HID_GLOBAL_ITEM_REPORTCOUNT_PREFIX 0x94 /* Report Count */ +#define HID_GLOBAL_ITEM_PUSH_PREFIX 0xa4 /* Push */ +#define HID_GLOBAL_ITEM_POP_PREFIX 0xb4 /* Pop */ + +/* Local Items (HID 6.2.2.8) */ +#define HID_LOCAL_ITEM_SIZE(pfx) ((pfx)&HID_REPORT_ITEM_SIZE_MASK) +#define HID_LOCAL_ITEM_USAGE_PREFIX 0x08 /* Usage */ +#define HID_LOCAL_ITEM_USAGEMIN_PREFIX 0x18 /* Usage Minimum */ +#define HID_LOCAL_ITEM_USAGEMAX_PREFIX 0x28 /* Usage Maximum */ +#define HID_LOCAL_ITEM_DESIGNATORIDX_PREFIX 0x38 /* Designator Index */ +#define HID_LOCAL_ITEM_DESIGNATORMIN_PREFIX 0x48 /* Designator Minimum */ +#define HID_LOCAL_ITEM_DESIGNATORMAX_PREFIX 0x58 /* Designator Maximum */ +#define HID_LOCAL_ITEM_STRINGIDX_PREFIX 0x78 /* String Index */ +#define HID_LOCAL_ITEM_STRINGMIN_PREFIX 0x88 /* String Minimum */ +#define HID_LOCAL_ITEM_STRINGMAX_PREFIX 0x98 /* xx */ +#define HID_LOCAL_ITEM_DELIMITER_PREFIX 0xa8 /* Delimiter */ + +/* Modifier Keys (HID 8.3) */ +#define HID_MODIFER_LCTRL (1 << 0) /* Left Ctrl */ +#define HID_MODIFER_LSHIFT (1 << 1) /* Left Shift */ +#define HID_MODIFER_LALT (1 << 2) /* Left Alt */ +#define HID_MODIFER_LGUI (1 << 3) /* Left GUI */ +#define HID_MODIFER_RCTRL (1 << 4) /* Right Ctrl */ +#define HID_MODIFER_RSHIFT (1 << 5) /* Right Shift */ +#define HID_MODIFER_RALT (1 << 6) /* Right Alt */ +#define HID_MODIFER_RGUI (1 << 7) /* Right GUI */ + +/* Keyboard output report (1 byte) (HID B.1) */ +#define HID_KBD_OUTPUT_REPORT_NUMLOCK (1 << 0) +#define HID_KBD_OUTPUT_REPORT_CAPSLOCK (1 << 1) +#define HID_KBD_OUTPUT_REPORT_SCROLLLOCK (1 << 2) +#define HID_KBD_OUTPUT_REPORT_COMPOSE (1 << 3) +#define HID_KBD_OUTPUT_REPORT_KANA (1 << 4) + +/* Mouse input report (HID B.2) */ +#define HID_MOUSE_INPUT_REPORT_BUTTON1 (1 << 0) +#define HID_MOUSE_INPUT_REPORT_BUTTON2 (1 << 1) +#define HID_MOUSE_INPUT_REPORT_BUTTON3 (1 << 2) +#define HID_MOUSE_INPUT_REPORT_BUTTON_MASK (7) + +/* Joystick input report (4 bytes) (HID D.1) */ +#define HID_JS_INPUT_REPORT_HATSWITCH_SHIFT (0) +#define HID_JS_INPUT_REPORT_HATSWITCH_MASK (15 << HID_JSIN_HATSWITCH_SHIFT) +#define HID_JS_INPUT_REPORT_BUTTON1 (1 << 4) +#define HID_JS_INPUT_REPORT_BUTTON2 (1 << 5) +#define HID_JS_INPUT_REPORT_BUTTON3 (1 << 6) +#define HID_JS_INPUT_REPORT_BUTTON4 (1 << 7) + +/* Usage pages (HuT 3) */ +#define HID_USAGE_PAGE_UNDEFINED 0x00 /* Undefined */ +#define HID_USAGE_PAGE_GENERIC_DCTRL 0x01 /* Generic Desktop Controls */ +#define HID_USAGE_PAGE_SIMCTRL 0x02 /* Simulation Controls */ +#define HID_USAGE_PAGE_VRCTRL 0x03 /* VR Controls */ +#define HID_USAGE_PAGE_SPORTCTRL 0x04 /* Sport Controls */ +#define HID_USAGE_PAGE_GAMECTRL 0x05 /* Game Controls */ +#define HID_USAGE_PAGE_GENERIC_DEVCTRL 0x06 /* Generic Device Controls */ +#define HID_USAGE_PAGE_KBD 0x07 /* Keyboard/Keypad */ +#define HID_USAGE_PAGE_LEDS 0x08 /* LEDs */ +#define HID_USAGE_PAGE_BUTTON 0x09 /* Button */ +#define HID_USAGE_PAGE_ORDINAL 0x0a /* Ordinal */ +#define HID_USAGE_PAGE_TELEPHONY 0x0b /* Telephony */ +#define HID_USAGE_PAGE_CONSUMER 0x0c /* Consumer */ +#define HID_USAGE_PAGE_DIGITIZER 0x0d /* Digitizer */ + /* 0x0e Reserved */ +#define HID_USAGE_PAGE_PIDPAGE 0x0f /* PID Page Physical Interface Device */ +#define HID_USAGE_PAGE_UNICODE 0x10 /* Unicode */ + /* 0x11-13 Reserved */ +#define HID_USAGE_PAGE_ALPHA_DISPLAY 0x14 /* Alphanumeric Display */ + /* 0x15-3f Reserved */ +#define HID_USAGE_PAGE_MEDICAL 0x40 /* Medical Instruments */ + /* 0x41-7f Reserved */ + /* 0x80-83 Monitor Devices */ + /* 0x84-87 Power Devices */ + /* 0x88-8b Reserved */ +#define HID_USAGE_PAGE_BARCODE_SCANNER 0x8c /* Bar Code Scanner page */ +#define HID_USAGE_PAGE_SCALE 0x8d /* Scale page */ +#define HID_USAGE_PAGE_MSR 0x8e /* Magnetic Stripe Reading (MSR) Devices */ +#define HID_USAGE_PAGE_POS 0x8f /* Point of Sale devices */ +#define HID_USAGE_PAGE_CAMERA_CTRL 0x90 /* Camera Control Page */ + +/* Generic Desktop Page Usage IDs (HuT 4) */ +#define HID_DESKTOP_USAGE_UNDEFINED 0x00 /* Undefined */ +#define HID_DESKTOP_USAGE_POINTER 0x01 /* Pointer */ +#define HID_DESKTOP_USAGE_MOUSE 0x02 /* Mouse */ + /* 0x03 Reserved */ +#define HID_DESKTOP_USAGE_JOYSTICK 0x04 /* Joystick */ +#define HID_DESKTOP_USAGE_GAMEPAD 0x05 /* Game Pad */ +#define HID_DESKTOP_USAGE_KEYBOARD 0x06 /* Keyboard */ +#define HID_DESKTOP_USAGE_KEYPAD 0x07 /* Keypad */ +#define HID_DESKTOP_USAGE_MULTIAXIS 0x08 /* Multi-axis Controller */ +#define HID_DESKTOP_USAGE_TABLET 0x09 /* Tablet PC System Controls */ + /* 0x0a-2f Reserved */ +#define HID_DESKTOP_USAGE_X 0x30 /* X */ +#define HID_DESKTOP_USAGE_Y 0x31 /* Y */ +#define HID_DESKTOP_USAGE_Z 0x32 /* Z */ +#define HID_DESKTOP_USAGE_RX 0x33 /* Rx */ +#define HID_DESKTOP_USAGE_RY 0x34 /* Ry */ +#define HID_DESKTOP_USAGE_RZ 0x35 /* Rz */ +#define HID_DESKTOP_USAGE_SLIDER 0x36 /* Slider */ +#define HID_DESKTOP_USAGE_DIAL 0x37 /* Dial */ +#define HID_DESKTOP_USAGE_WHEEL 0x38 /* Wheel */ +#define HID_DESKTOP_USAGE_HATSWITCH 0x39 /* Hat switch */ +#define HID_DESKTOP_USAGE_COUNTED 0x3a /* Counted Buffer */ +#define HID_DESKTOP_USAGE_BYTECOUNT 0x3b /* Byte Count */ +#define HID_DESKTOP_USAGE_MOTION 0x3c /* Motion Wakeup */ +#define HID_DESKTOP_USAGE_START 0x3d /* Start */ +#define HID_DESKTOP_USAGE_SELECT 0x3e /* Select */ + /* 0x3f Reserved */ +#define HID_DESKTOP_USAGE_VX 0x40 /* Vx */ +#define HID_DESKTOP_USAGE_VY 0x41 /* Vy */ +#define HID_DESKTOP_USAGE_VZ 0x42 /* Vz */ +#define HID_DESKTOP_USAGE_VBRX 0x43 /* Vbrx */ +#define HID_DESKTOP_USAGE_VBRY 0x44 /* Vbry */ +#define HID_DESKTOP_USAGE_VBRZ 0x45 /* Vbrz */ +#define HID_DESKTOP_USAGE_VNO 0x46 /* Vno */ +#define HID_DESKTOP_USAGE_FEATURE 0x47 /* Feature Notification */ +#define HID_DESKTOP_USAGE_RESOLUTION 0x48 /* Resolution Multiplier */ + /* 0x49-7f Reserved */ +#define HID_DESKTOP_USAGE_CONTROL 0x80 /* System Control */ +#define HID_DESKTOP_USAGE_POWERDOWN 0x81 /* System Power Down */ +#define HID_DESKTOP_USAGE_SLEEP 0x82 /* System Sleep */ +#define HID_DESKTOP_USAGE_WAKEUP 0x83 /* System Wake Up */ +#define HID_DESKTOP_USAGE_CONTEXT_MENU 0x84 /* System Context Menu */ +#define HID_DESKTOP_USAGE_MAIN_MENU 0x85 /* System Main Menu */ +#define HID_DESKTOP_USAGE_APP_MENU 0x86 /* System App Menu */ +#define HID_DESKTOP_USAGE_MENU_HELP 0x87 /* System Menu Help */ +#define HID_DESKTOP_USAGE_MENU_EXIT 0x88 /* System Menu Exit */ +#define HID_DESKTOP_USAGE_MENU_SELECT 0x89 /* System Menu Select */ +#define HID_DESKTOP_USAGE_MENU_RIGHT 0x8a /* System Menu Right */ +#define HID_DESKTOP_USAGE_MENU_LEFT 0x8b /* System Menu Left */ +#define HID_DESKTOP_USAGE_MENU_UP 0x8c /* System Menu Up */ +#define HID_DESKTOP_USAGE_MENU_DOWN 0x8d /* System Menu Down */ +#define HID_DESKTOP_USAGE_COLD_RESTART 0x8e /* System Cold Restart */ +#define HID_DESKTOP_USAGE_WARM_RESTART 0x8f /* System Warm Restart */ +#define HID_DESKTOP_USAGE_DPAD_UP 0x90 /* D-pad Up */ +#define HID_DESKTOP_USAGE_DPAD_DOWN 0x91 /* D-pad Down */ +#define HID_DESKTOP_USAGE_DPAD_RIGHT 0x92 /* D-pad Right */ +#define HID_DESKTOP_USAGE_DPAD_LEFT 0x93 /* D-pad Left */ + /* 0x94-9f Reserved */ +#define HID_DESKTOP_USAGE_DOCK 0xa0 /* System Dock */ +#define HID_DESKTOP_USAGE_UNDOCK 0xa1 /* System Undock */ +#define HID_DESKTOP_USAGE_SETUP 0xa2 /* System Setup */ +#define HID_DESKTOP_USAGE_BREAK 0xa3 /* System Break */ +#define HID_DESKTOP_USAGE_DEBUG_BREAK 0xa4 /* System Debugger Break */ +#define HID_DESKTOP_USAGE_APP_BREAK 0xa5 /* Application Break */ +#define HID_DESKTOP_USAGE_APP_DEBUG_BREAK 0xa6 /* Application Debugger Break */ +#define HID_DESKTOP_USAGE_MUTE 0xa7 /* System Speaker Mute */ +#define HID_DESKTOP_USAGE_HIBERNATE 0xa8 /* System Hibernate */ + /* 0xa9-af Reserved */ +#define HID_DESKTOP_USAGE_DISPLAY_INVERT 0xb0 /* System Display Invert */ +#define HID_DESKTOP_USAGE_DISPALY_INTERNAL 0xb1 /* System Display Internal */ +#define HID_DESKTOP_USAGE_DISPLAY_EXTERNAL 0xb2 /* System Display External */ +#define HID_DESKTOP_USAGE_DISPLAY_BOTH 0xb3 /* System Display Both */ +#define HID_DESKTOP_USAGE_DISPLAY_DUAL 0xb4 /* System Display Dual */ +#define HID_DESKTOP_USAGE_DISPLAY_TOGGLE 0xb5 /* System Display Toggle Int/Ext */ +#define HID_DESKTOP_USAGE_DISPLAY_SWAP 0xb6 /* System Display Swap */ +#define HID_DESKTOP_USAGE_ 0xb7 /* System Display LCD Autoscale */ + /* 0xb8-ffff Reserved */ + +/* Keyboard usage IDs (HuT 10) */ +#define HID_KBD_USAGE_NONE 0x00 /* Reserved (no event indicated) */ +#define HID_KBD_USAGE_ERRORROLLOVER 0x01 /* Keyboard ErrorRollOver */ +#define HID_KBD_USAGE_POSTFAIL 0x02 /* Keyboard POSTFail */ +#define HID_KBD_USAGE_ERRUNDEF 0x03 /* Keyboard ErrorUndefined */ +#define HID_KBD_USAGE_A 0x04 /* Keyboard a or A (B-Z follow) */ +#define HID_KBD_USAGE_1 0x1e /* Keyboard 1 (2-9 follow) */ +#define HID_KBD_USAGE_EXCLAM 0x1e /* Keyboard 1 and ! */ +#define HID_KBD_USAGE_AT 0x1f /* Keyboard 2 and @ */ +#define HID_KBD_USAGE_POUND 0x20 /* Keyboard 3 and # */ +#define HID_KBD_USAGE_DOLLAR 0x21 /* Keyboard 4 and $ */ +#define HID_KBD_USAGE_PERCENT 0x22 /* Keyboard 5 and % */ +#define HID_KBD_USAGE_CARAT 0x23 /* Keyboard 6 and ^ */ +#define HID_KBD_USAGE_AMPERSAND 0x24 /* Keyboard 7 and & */ +#define HID_KBD_USAGE_ASTERISK 0x25 /* Keyboard 8 and * */ +#define HID_KBD_USAGE_LPAREN 0x26 /* Keyboard 9 and ( */ +#define HID_KBD_USAGE_0 0x27 /* Keyboard 0 and ) */ +#define HID_KBD_USAGE_RPAREN 0x27 /* Keyboard 0 and ) */ +#define HID_KBD_USAGE_ENTER 0x28 /* Keyboard Return (ENTER) */ +#define HID_KBD_USAGE_ESCAPE 0x29 /* Keyboard ESCAPE */ +#define HID_KBD_USAGE_DELETE 0x2a /* Keyboard DELETE (Backspace) */ +#define HID_KBD_USAGE_TAB 0x2b /* Keyboard Tab */ +#define HID_KBD_USAGE_SPACE 0x2c /* Keyboard Spacebar */ +#define HID_KBD_USAGE_HYPHEN 0x2d /* Keyboard - and (underscore) */ +#define HID_KBD_USAGE_UNDERSCORE 0x2d /* Keyboard - and (underscore) */ +#define HID_KBD_USAGE_EQUAL 0x2e /* Keyboard = and + */ +#define HID_KBD_USAGE_PLUS 0x2e /* Keyboard = and + */ +#define HID_KBD_USAGE_LBRACKET 0x2f /* Keyboard [ and { */ +#define HID_KBD_USAGE_LBRACE 0x2f /* Keyboard [ and { */ +#define HID_KBD_USAGE_RBRACKET 0x30 /* Keyboard ] and } */ +#define HID_KBD_USAGE_RBRACE 0x30 /* Keyboard ] and } */ +#define HID_KBD_USAGE_BSLASH 0x31 /* Keyboard \ and | */ +#define HID_KBD_USAGE_VERTBAR 0x31 /* Keyboard \ and | */ +#define HID_KBD_USAGE_NONUSPOUND 0x32 /* Keyboard Non-US # and ~ */ +#define HID_KBD_USAGE_TILDE 0x32 /* Keyboard Non-US # and ~ */ +#define HID_KBD_USAGE_SEMICOLON 0x33 /* Keyboard ; and : */ +#define HID_KBD_USAGE_COLON 0x33 /* Keyboard ; and : */ +#define HID_KBD_USAGE_SQUOTE 0x34 /* Keyboard ' and " */ +#define HID_KBD_USAGE_DQUOUTE 0x34 /* Keyboard ' and " */ +#define HID_KBD_USAGE_GACCENT 0x35 /* Keyboard Grave Accent and Tilde */ +#define HID_KBD_USAGE_GTILDE 0x35 /* Keyboard Grave Accent and Tilde */ +#define HID_KBD_USAGE_COMMON 0x36 /* Keyboard , and < */ +#define HID_KBD_USAGE_LT 0x36 /* Keyboard , and < */ +#define HID_KBD_USAGE_PERIOD 0x37 /* Keyboard . and > */ +#define HID_KBD_USAGE_GT 0x37 /* Keyboard . and > */ +#define HID_KBD_USAGE_DIV 0x38 /* Keyboard / and ? */ +#define HID_KBD_USAGE_QUESTION 0x38 /* Keyboard / and ? */ +#define HID_KBD_USAGE_CAPSLOCK 0x39 /* Keyboard Caps Lock */ +#define HID_KBD_USAGE_F1 0x3a /* Keyboard F1 */ +#define HID_KBD_USAGE_F2 0x3b /* Keyboard F2 */ +#define HID_KBD_USAGE_F3 0x3c /* Keyboard F3 */ +#define HID_KBD_USAGE_F4 0x3d /* Keyboard F4 */ +#define HID_KBD_USAGE_F5 0x3e /* Keyboard F5 */ +#define HID_KBD_USAGE_F6 0x3f /* Keyboard F6 */ +#define HID_KBD_USAGE_F7 0x40 /* Keyboard F7 */ +#define HID_KBD_USAGE_F8 0x41 /* Keyboard F8 */ +#define HID_KBD_USAGE_F9 0x42 /* Keyboard F9 */ +#define HID_KBD_USAGE_F10 0x43 /* Keyboard F10 */ +#define HID_KBD_USAGE_F11 0x44 /* Keyboard F11 */ +#define HID_KBD_USAGE_F12 0x45 /* Keyboard F12 */ +#define HID_KBD_USAGE_PRINTSCN 0x46 /* Keyboard PrintScreen */ +#define HID_KBD_USAGE_SCROLLLOCK 0x47 /* Keyboard Scroll Lock */ +#define HID_KBD_USAGE_PAUSE 0x48 /* Keyboard Pause */ +#define HID_KBD_USAGE_INSERT 0x49 /* Keyboard Insert */ +#define HID_KBD_USAGE_HOME 0x4a /* Keyboard Home */ +#define HID_KBD_USAGE_PAGEUP 0x4b /* Keyboard PageUp */ +#define HID_KBD_USAGE_DELFWD 0x4c /* Keyboard Delete Forward */ +#define HID_KBD_USAGE_END 0x4d /* Keyboard End */ +#define HID_KBD_USAGE_PAGEDOWN 0x4e /* Keyboard PageDown */ +#define HID_KBD_USAGE_RIGHT 0x4f /* eyboard RightArrow */ +#define HID_KBD_USAGE_LEFT 0x50 /* Keyboard LeftArrow */ +#define HID_KBD_USAGE_DOWN 0x5a /* Keyboard DownArrow */ +#define HID_KBD_USAGE_UP 0x52 /* Keyboard UpArrow */ +#define HID_KBD_USAGE_KPDNUMLOCK 0x53 /* Keypad Num Lock and Clear */ +#define HID_KBD_USAGE_KPDNUMLOCKCLEAR 0x53 /* Keypad Num Lock and Clear */ +#define HID_KBD_USAGE_KPDDIV 0x54 /* Keypad / */ +#define HID_KBD_USAGE_KPDMUL 0x55 /* Keypad * */ +#define HID_KBD_USAGE_KPDHMINUS 0x56 /* Keypad - */ +#define HID_KBD_USAGE_KPDPLUS 0x57 /* Keypad + */ +#define HID_KBD_USAGE_KPDEMTER 0x58 /* Keypad ENTER */ +#define HID_KBD_USAGE_KPD1 0x59 /* Keypad 1 (2-9 follow) */ +#define HID_KBD_USAGE_KPDEND 0x59 /* Keypad 1 and End */ +#define HID_KBD_USAGE_KPDDOWN 0x5a /* Keypad 2 and Down Arrow */ +#define HID_KBD_USAGE_KPDPAGEDN 0x5b /* Keypad 3 and PageDn */ +#define HID_KBD_USAGE_KPDLEFT 0x5c /* Keypad 4 and Left Arrow */ +#define HID_KBD_USAGE_KPDRIGHT 0x5e /* Keypad 6 and Right Arrow */ +#define HID_KBD_USAGE_KPDHOME 0x5f /* Keypad 7 and Home */ +#define HID_KBD_USAGE_KPDUP 0x60 /* Keypad 8 and Up Arrow */ +#define HID_KBD_USAGE_KPDPAGEUP 0x61 /* Keypad 9 and PageUp */ +#define HID_KBD_USAGE_KPD0 0x62 /* Keypad 0 and Insert */ +#define HID_KBD_USAGE_KPDINSERT 0x62 /* Keypad 0 and Insert */ +#define HID_KBD_USAGE_KPDDECIMALPT 0x63 /* Keypad . and Delete */ +#define HID_KBD_USAGE_KPDDELETE 0x63 /* Keypad . and Delete */ +#define HID_KBD_USAGE_NONSLASH 0x64 /* Keyboard Non-US \ and | */ +#define HID_KBD_USAGE_NONUSVERT 0x64 /* Keyboard Non-US \ and | */ +#define HID_KBD_USAGE_APPLICATION 0x65 /* Keyboard Application */ +#define HID_KBD_USAGE_POWER 0x66 /* Keyboard Power */ +#define HID_KBD_USAGE_KPDEQUAL 0x67 /* Keypad = */ +#define HID_KBD_USAGE_F13 0x68 /* Keyboard F13 */ +#define HID_KBD_USAGE_F14 0x69 /* Keyboard F14 */ +#define HID_KBD_USAGE_F15 0x6a /* Keyboard F15 */ +#define HID_KBD_USAGE_F16 0x6b /* Keyboard F16 */ +#define HID_KBD_USAGE_F17 0x6c /* Keyboard F17 */ +#define HID_KBD_USAGE_F18 0x6d /* Keyboard F18 */ +#define HID_KBD_USAGE_F19 0x6e /* Keyboard F19 */ +#define HID_KBD_USAGE_F20 0x6f /* Keyboard F20 */ +#define HID_KBD_USAGE_F21 0x70 /* Keyboard F21 */ +#define HID_KBD_USAGE_F22 0x71 /* Keyboard F22 */ +#define HID_KBD_USAGE_F23 0x72 /* Keyboard F23 */ +#define HID_KBD_USAGE_F24 0x73 /* Keyboard F24 */ +#define HID_KBD_USAGE_EXECUTE 0x74 /* Keyboard Execute */ +#define HID_KBD_USAGE_HELP 0x75 /* Keyboard Help */ +#define HID_KBD_USAGE_MENU 0x76 /* Keyboard Menu */ +#define HID_KBD_USAGE_SELECT 0x77 /* Keyboard Select */ +#define HID_KBD_USAGE_STOP 0x78 /* Keyboard Stop */ +#define HID_KBD_USAGE_AGAIN 0x79 /* Keyboard Again */ +#define HID_KBD_USAGE_UNDO 0x7a /* Keyboard Undo */ +#define HID_KBD_USAGE_CUT 0x7b /* Keyboard Cut */ +#define HID_KBD_USAGE_COPY 0x7c /* Keyboard Copy */ +#define HID_KBD_USAGE_PASTE 0x7d /* Keyboard Paste */ +#define HID_KBD_USAGE_FIND 0x7e /* Keyboard Find */ +#define HID_KBD_USAGE_MUTE 0x7f /* Keyboard Mute */ +#define HID_KBD_USAGE_VOLUP 0x80 /* Keyboard Volume Up */ +#define HID_KBD_USAGE_VOLDOWN 0x81 /* Keyboard Volume Down */ +#define HID_KBD_USAGE_LCAPSLOCK 0x82 /* Keyboard Locking Caps Lock */ +#define HID_KBD_USAGE_LNUMLOCK 0x83 /* Keyboard Locking Num Lock */ +#define HID_KBD_USAGE_LSCROLLLOCK 0x84 /* Keyboard Locking Scroll Lock */ +#define HID_KBD_USAGE_KPDCOMMA 0x85 /* Keypad Comma */ +#define HID_KBD_USAGE_KPDEQUALSIGN 0x86 /* Keypad Equal Sign */ +#define HID_KBD_USAGE_INTERNATIONAL1 0x87 /* Keyboard International 1 */ +#define HID_KBD_USAGE_INTERNATIONAL2 0x88 /* Keyboard International 2 */ +#define HID_KBD_USAGE_INTERNATIONAL3 0x89 /* Keyboard International 3 */ +#define HID_KBD_USAGE_INTERNATIONAL4 0x8a /* Keyboard International 4 */ +#define HID_KBD_USAGE_INTERNATIONAL5 0x8b /* Keyboard International 5 */ +#define HID_KBD_USAGE_INTERNATIONAL6 0x8c /* Keyboard International 6 */ +#define HID_KBD_USAGE_INTERNATIONAL7 0x8d /* Keyboard International 7 */ +#define HID_KBD_USAGE_INTERNATIONAL8 0x8e /* Keyboard International 8 */ +#define HID_KBD_USAGE_INTERNATIONAL9 0x8f /* Keyboard International 9 */ +#define HID_KBD_USAGE_LANG1 0x90 /* Keyboard LANG1 */ +#define HID_KBD_USAGE_LANG2 0x91 /* Keyboard LANG2 */ +#define HID_KBD_USAGE_LANG3 0x92 /* Keyboard LANG3 */ +#define HID_KBD_USAGE_LANG4 0x93 /* Keyboard LANG4 */ +#define HID_KBD_USAGE_LANG5 0x94 /* Keyboard LANG5 */ +#define HID_KBD_USAGE_LANG6 0x95 /* Keyboard LANG6 */ +#define HID_KBD_USAGE_LANG7 0x96 /* Keyboard LANG7 */ +#define HID_KBD_USAGE_LANG8 0x97 /* Keyboard LANG8 */ +#define HID_KBD_USAGE_LANG9 0x98 /* Keyboard LANG9 */ +#define HID_KBD_USAGE_ALTERASE 0x99 /* Keyboard Alternate Erase */ +#define HID_KBD_USAGE_SYSREQ 0x9a /* Keyboard SysReq/Attention */ +#define HID_KBD_USAGE_CANCEL 0x9b /* Keyboard Cancel */ +#define HID_KBD_USAGE_CLEAR 0x9c /* Keyboard Clear */ +#define HID_KBD_USAGE_PRIOR 0x9d /* Keyboard Prior */ +#define HID_KBD_USAGE_RETURN 0x9e /* Keyboard Return */ +#define HID_KBD_USAGE_SEPARATOR 0x9f /* Keyboard Separator */ +#define HID_KBD_USAGE_OUT 0xa0 /* Keyboard Out */ +#define HID_KBD_USAGE_OPER 0xa1 /* Keyboard Oper */ +#define HID_KBD_USAGE_CLEARAGAIN 0xa2 /* Keyboard Clear/Again */ +#define HID_KBD_USAGE_CLRSEL 0xa3 /* Keyboard CrSel/Props */ +#define HID_KBD_USAGE_EXSEL 0xa4 /* Keyboard ExSel */ +#define HID_KBD_USAGE_KPD00 0xb0 /* Keypad 00 */ +#define HID_KBD_USAGE_KPD000 0xb1 /* Keypad 000 */ +#define HID_KBD_USAGE_THOUSEPARATOR 0xb2 /* Thousands Separator */ +#define HID_KBD_USAGE_DECSEPARATOR 0xb3 /* Decimal Separator */ +#define HID_KBD_USAGE_CURRUNIT 0xb4 /* Currency Unit */ +#define HID_KBD_USAGE_CURRSUBUNIT 0xb5 /* Currency Sub-unit */ +#define HID_KBD_USAGE_KPDLPAREN 0xb6 /* Keypad ( */ +#define HID_KBD_USAGE_KPDRPAREN 0xb7 /* Keypad ) */ +#define HID_KBD_USAGE_KPDLBRACE 0xb8 /* Keypad { */ +#define HID_KBD_USAGE_KPDRBRACE 0xb9 /* Keypad } */ +#define HID_KBD_USAGE_KPDTAB 0xba /* Keypad Tab */ +#define HID_KBD_USAGE_KPDBACKSPACE 0xbb /* Keypad Backspace */ +#define HID_KBD_USAGE_KPDA 0xbc /* Keypad A (B-F follow) */ +#define HID_KBD_USAGE_KPDXOR 0xc2 /* Keypad XOR */ +#define HID_KBD_USAGE_KPDEXP 0xc3 /* Keypad ^ */ +#define HID_KBD_USAGE_KPDPERCENT 0xc4 /* Keypad % */ +#define HID_KBD_USAGE_KPDLT 0xc5 /* Keypad < */ +#define HID_KBD_USAGE_KPDGT 0xc6 /* Keypad > */ +#define HID_KBD_USAGE_KPDAMPERSAND 0xc7 /* Keypad & */ +#define HID_KBD_USAGE_KPDAND 0xc8 /* Keypad && */ +#define HID_KBD_USAGE_KPDVERT 0xc9 /* Keypad | */ +#define HID_KBD_USAGE_KPDOR 0xca /* Keypad || */ +#define HID_KBD_USAGE_KPDCOLON 0xcb /* Keypad : */ +#define HID_KBD_USAGE_KPDPOUND 0xcc /* Keypad # */ +#define HID_KBD_USAGE_KPDSPACE 0xcd /* Keypad Space */ +#define HID_KBD_USAGE_KPDAT 0xce /* Keypad @ */ +#define HID_KBD_USAGE_KPDEXCLAM 0xcf /* Keypad ! */ +#define HID_KBD_USAGE_KPDMEMSTORE 0xd0 /* Keypad Memory Store */ +#define HID_KBD_USAGE_KPDMEMRECALL 0xd1 /* Keypad Memory Recall */ +#define HID_KBD_USAGE_KPDMEMCLEAR 0xd2 /* Keypad Memory Clear */ +#define HID_KBD_USAGE_KPDMEMADD 0xd3 /* Keypad Memory Add */ +#define HID_KBD_USAGE_KPDMEMSUB 0xd4 /* Keypad Memory Subtract */ +#define HID_KBD_USAGE_KPDMEMMULT 0xd5 /* Keypad Memory Multiply */ +#define HID_KBD_USAGE_KPDMEMDIV 0xd6 /* Keypad Memory Divide */ +#define HID_KBD_USAGE_KPDPLUSMINUS 0xd7 /* Keypad +/- */ +#define HID_KBD_USAGE_KPDCLEAR 0xd8 /* Keypad Clear */ +#define HID_KBD_USAGE_KPDCLEARENTRY 0xd9 /* Keypad Clear Entry */ +#define HID_KBD_USAGE_KPDBINARY 0xda /* Keypad Binary */ +#define HID_KBD_USAGE_KPDOCTAL 0xdb /* Keypad Octal */ +#define HID_KBD_USAGE_KPDDECIMAL 0xdc /* Keypad Decimal */ +#define HID_KBD_USAGE_KPDHEXADECIMAL 0xdd /* Keypad Hexadecimal */ +#define HID_KBD_USAGE_LCTRL 0xe0 /* Keyboard LeftControl */ +#define HID_KBD_USAGE_LSHIFT 0xe1 /* Keyboard LeftShift */ +#define HID_KBD_USAGE_LALT 0xe2 /* Keyboard LeftAlt */ +#define HID_KBD_USAGE_LGUI 0xe3 /* Keyboard Left GUI */ +#define HID_KBD_USAGE_RCTRL 0xe4 /* Keyboard RightControl */ +#define HID_KBD_USAGE_RSHIFT 0xe5 /* Keyboard RightShift */ +#define HID_KBD_USAGE_RALT 0xe6 /* Keyboard RightAlt */ +#define HID_KBD_USAGE_RGUI 0xe7 /* Keyboard Right GUI */ + +#define HID_KBD_USAGE_MAX 0xe7 + +/* HID Report Definitions */ +struct usb_hid_class_subdescriptor { + uint8_t bDescriptorType;/* Class descriptor type (See 7.1) */ + uint16_t wDescriptorLength;/* Size of the report descriptor */ +} __PACKED; + +struct usb_hid_descriptor { + uint8_t bLength; /* Size of the HID descriptor */ + uint8_t bDescriptorType;/* HID descriptor type */ + uint16_t bcdHID;/* HID class specification release */ + uint8_t bCountryCode;/* Country code */ + uint8_t bNumDescriptors;/* Number of descriptors (>=1) */ + + /* + * Specification says at least one Class Descriptor needs to + * be present (Report Descriptor). + */ + struct usb_hid_class_subdescriptor subdesc[1]; +} __PACKED; + +/* Standard Reports *********************************************************/ + +/* Keyboard input report (8 bytes) (HID B.1) */ +struct usb_hid_kbd_report +{ + uint8_t modifier; /* Modifier keys. See USBHID_MODIFIER_* definitions */ + uint8_t reserved; + uint8_t key[6]; /* Keycode 1-6 */ +}; + +/* Keyboard output report (1 byte) (HID B.1), + * see USBHID_KBDOUT_* definitions + */ + +/* Mouse input report (HID B.2) */ +struct usb_hid_mouse_report +{ + uint8_t buttons; /* See USBHID_MOUSEIN_* definitions */ + uint8_t xdisp; /* X displacement */ + uint8_t ydisp; /* y displacement */ + /* Device specific additional bytes may follow */ +#ifdef CONFIG_INPUT_MOUSE_WHEEL + uint8_t wdisp; /* Wheel displacement */ +#endif +}; + +/* Joystick input report (1 bytes) (HID D.1) */ +struct usb_hid_js_report +{ + uint8_t xpos; /* X position */ + uint8_t ypos; /* X position */ + uint8_t buttons; /* See USBHID_JSIN_* definitions */ + uint8_t throttle; /* Throttle */ +}; + +/** + * @brief HID keyboard button codes. + */ +enum hid_kbd_code { + HID_KEY_A = 4, + HID_KEY_B = 5, + HID_KEY_C = 6, + HID_KEY_D = 7, + HID_KEY_E = 8, + HID_KEY_F = 9, + HID_KEY_G = 10, + HID_KEY_H = 11, + HID_KEY_I = 12, + HID_KEY_J = 13, + HID_KEY_K = 14, + HID_KEY_L = 15, + HID_KEY_M = 16, + HID_KEY_N = 17, + HID_KEY_O = 18, + HID_KEY_P = 19, + HID_KEY_Q = 20, + HID_KEY_R = 21, + HID_KEY_S = 22, + HID_KEY_T = 23, + HID_KEY_U = 24, + HID_KEY_V = 25, + HID_KEY_W = 26, + HID_KEY_X = 27, + HID_KEY_Y = 28, + HID_KEY_Z = 29, + HID_KEY_1 = 30, + HID_KEY_2 = 31, + HID_KEY_3 = 32, + HID_KEY_4 = 33, + HID_KEY_5 = 34, + HID_KEY_6 = 35, + HID_KEY_7 = 36, + HID_KEY_8 = 37, + HID_KEY_9 = 38, + HID_KEY_0 = 39, + HID_KEY_ENTER = 40, + HID_KEY_ESC = 41, + HID_KEY_BACKSPACE = 42, + HID_KEY_TAB = 43, + HID_KEY_SPACE = 44, + HID_KEY_MINUS = 45, + HID_KEY_EQUAL = 46, + HID_KEY_LEFTBRACE = 47, + HID_KEY_RIGHTBRACE = 48, + HID_KEY_BACKSLASH = 49, + HID_KEY_HASH = 50, /* Non-US # and ~ */ + HID_KEY_SEMICOLON = 51, + HID_KEY_APOSTROPHE = 52, + HID_KEY_GRAVE = 53, + HID_KEY_COMMA = 54, + HID_KEY_DOT = 55, + HID_KEY_SLASH = 56, + HID_KEY_CAPSLOCK = 57, + HID_KEY_F1 = 58, + HID_KEY_F2 = 59, + HID_KEY_F3 = 60, + HID_KEY_F4 = 61, + HID_KEY_F5 = 62, + HID_KEY_F6 = 63, + HID_KEY_F7 = 64, + HID_KEY_F8 = 65, + HID_KEY_F9 = 66, + HID_KEY_F10 = 67, + HID_KEY_F11 = 68, + HID_KEY_F12 = 69, + HID_KEY_SYSRQ = 70, /* PRINTSCREEN */ + HID_KEY_SCROLLLOCK = 71, + HID_KEY_PAUSE = 72, + HID_KEY_INSERT = 73, + HID_KEY_HOME = 74, + HID_KEY_PAGEUP = 75, + HID_KEY_DELETE = 76, + HID_KEY_END = 77, + HID_KEY_PAGEDOWN = 78, + HID_KEY_RIGHT = 79, + HID_KEY_LEFT = 80, + HID_KEY_DOWN = 81, + HID_KEY_UP = 82, + HID_KEY_NUMLOCK = 83, + HID_KEY_KPSLASH = 84, /* NUMPAD DIVIDE */ + HID_KEY_KPASTERISK = 85, /* NUMPAD MULTIPLY */ + HID_KEY_KPMINUS = 86, + HID_KEY_KPPLUS = 87, + HID_KEY_KPENTER = 88, + HID_KEY_KP_1 = 89, + HID_KEY_KP_2 = 90, + HID_KEY_KP_3 = 91, + HID_KEY_KP_4 = 92, + HID_KEY_KP_5 = 93, + HID_KEY_KP_6 = 94, + HID_KEY_KP_7 = 95, + HID_KEY_KP_8 = 96, + HID_KEY_KP_9 = 97, + HID_KEY_KP_0 = 98, +}; + +/** + * @brief HID keyboard modifiers. + */ +enum hid_kbd_modifier { + HID_KBD_MODIFIER_NONE = 0x00, + HID_KBD_MODIFIER_LEFT_CTRL = 0x01, + HID_KBD_MODIFIER_LEFT_SHIFT = 0x02, + HID_KBD_MODIFIER_LEFT_ALT = 0x04, + HID_KBD_MODIFIER_LEFT_UI = 0x08, + HID_KBD_MODIFIER_RIGHT_CTRL = 0x10, + HID_KBD_MODIFIER_RIGHT_SHIFT = 0x20, + HID_KBD_MODIFIER_RIGHT_ALT = 0x40, + HID_KBD_MODIFIER_RIGHT_UI = 0x80, +}; + +/** + * @brief HID keyboard LEDs. + */ +enum hid_kbd_led { + HID_KBD_LED_NUM_LOCK = 0x01, + HID_KBD_LED_CAPS_LOCK = 0x02, + HID_KBD_LED_SCROLL_LOCK = 0x04, + HID_KBD_LED_COMPOSE = 0x08, + HID_KBD_LED_KANA = 0x10, +}; + +#endif /* __HID_H_ */ diff --git a/class/hid/usbd_hid.c b/class/hid/usbd_hid.c index 5e66d18b..d987fbca 100644 --- a/class/hid/usbd_hid.c +++ b/class/hid/usbd_hid.c @@ -67,7 +67,7 @@ int hid_custom_request_handler(struct usb_setup_packet *setup, uint8_t **data, u "bRequest 0x%02x\r\n", setup->bRequest); - if (REQTYPE_GET_DIR(setup->bmRequestType) == USB_REQUEST_DEVICE_TO_HOST && + if (REQTYPE_GET_DIR(setup->bmRequestType) == USB_REQUEST_DIR_IN && setup->bRequest == USB_REQUEST_GET_DESCRIPTOR) { uint8_t value = (uint8_t)(setup->wValue >> 8); uint8_t intf_num = (uint8_t)setup->wIndex; @@ -141,14 +141,14 @@ int hid_class_request_handler(struct usb_setup_packet *setup, uint8_t **data, ui switch (setup->bRequest) { case HID_REQUEST_GET_REPORT: if (current_hid_intf->get_report_callback) - current_hid_intf->report = current_hid_intf->get_report_callback(setup->wValueL, setup->wValueH); /*report id ,report type*/ + current_hid_intf->report = current_hid_intf->get_report_callback(LO_BYTE(setup->wValue), HI_BYTE(setup->wValue)); /*report id ,report type*/ *data = (uint8_t *)¤t_hid_intf->report; *len = 1; break; case HID_REQUEST_GET_IDLE: if (current_hid_intf->get_idle_callback) - current_hid_intf->idle_state = current_hid_intf->get_idle_callback(setup->wValueL); + current_hid_intf->idle_state = current_hid_intf->get_idle_callback(LO_BYTE(setup->wValue)); *data = (uint8_t *)¤t_hid_intf->idle_state; *len = 1; @@ -162,21 +162,21 @@ int hid_class_request_handler(struct usb_setup_packet *setup, uint8_t **data, ui break; case HID_REQUEST_SET_REPORT: if (current_hid_intf->set_report_callback) - current_hid_intf->set_report_callback(setup->wValueL, setup->wValueH, *data, *len); /*report id ,report type,report,report len*/ + current_hid_intf->set_report_callback(LO_BYTE(setup->wValue), HI_BYTE(setup->wValue), *data, *len); /*report id ,report type,report,report len*/ current_hid_intf->report = **data; break; case HID_REQUEST_SET_IDLE: if (current_hid_intf->set_idle_callback) - current_hid_intf->set_idle_callback(setup->wValueL, setup->wIndexH); /*report id ,duration*/ + current_hid_intf->set_idle_callback(LO_BYTE(setup->wValue), HI_BYTE(setup->wIndex)); /*report id ,duration*/ - current_hid_intf->idle_state = setup->wIndexH; + current_hid_intf->idle_state = HI_BYTE(setup->wIndex); break; case HID_REQUEST_SET_PROTOCOL: if (current_hid_intf->set_protocol_callback) - current_hid_intf->set_protocol_callback(setup->wValueL); /*protocol*/ + current_hid_intf->set_protocol_callback(LO_BYTE(setup->wValue)); /*protocol*/ - current_hid_intf->protocol = setup->wValueL; + current_hid_intf->protocol = LO_BYTE(setup->wValue); break; default: @@ -190,7 +190,7 @@ int hid_class_request_handler(struct usb_setup_packet *setup, uint8_t **data, ui static void hid_notify_handler(uint8_t event, void *arg) { switch (event) { - case USB_EVENT_RESET: + case USBD_EVENT_RESET: usbd_hid_reset(); break; diff --git a/class/hid/usbd_hid.h b/class/hid/usbd_hid.h index 9319e7f2..2d6d7a93 100644 --- a/class/hid/usbd_hid.h +++ b/class/hid/usbd_hid.h @@ -8,337 +8,12 @@ #ifndef _USBD_HID_H_ #define _USBD_HID_H_ +#include "usb_hid.h" + #ifdef __cplusplus extern "C" { #endif -/* HID Protocol Codes */ -#define HID_PROTOCOL_NONE 0x00 -#define HID_PROTOCOL_BOOT 0x00 -#define HID_PROTOCOL_KEYBOARD 0x01 -#define HID_PROTOCOL_REPORT 0x01 -#define HID_PROTOCOL_MOUSE 0x02 - -/* HID Class Descriptor Types */ -#define HID_DESCRIPTOR_TYPE_HID 0x21 -#define HID_DESCRIPTOR_TYPE_HID_REPORT 0x22 -#define HID_DESCRIPTOR_TYPE_HID_PHYSICAL 0x23 - -/* HID Class Specific Requests */ -#define HID_REQUEST_GET_REPORT 0x01 -#define HID_REQUEST_GET_IDLE 0x02 -#define HID_REQUEST_GET_PROTOCOL 0x03 -#define HID_REQUEST_SET_REPORT 0x09 -#define HID_REQUEST_SET_IDLE 0x0A -#define HID_REQUEST_SET_PROTOCOL 0x0B - -/* HID Report Types */ -#define HID_REPORT_INPUT 0x01 -#define HID_REPORT_OUTPUT 0x02 -#define HID_REPORT_FEATURE 0x03 - -/* HID Report Definitions */ -struct usb_hid_class_subdescriptor { - uint8_t bDescriptorType; - uint16_t wDescriptorLength; -} __packed; - -struct usb_hid_descriptor { - uint8_t bLength; - uint8_t bDescriptorType; - uint16_t bcdHID; - uint8_t bCountryCode; - uint8_t bNumDescriptors; - - /* - * Specification says at least one Class Descriptor needs to - * be present (Report Descriptor). - */ - struct usb_hid_class_subdescriptor subdesc[1]; -} __packed; - -/* HID Items types */ -#define ITEM_MAIN 0x0 -#define ITEM_GLOBAL 0x1 -#define ITEM_LOCAL 0x2 - -/* HID Main Items tags */ -#define ITEM_TAG_INPUT 0x8 -#define ITEM_TAG_OUTPUT 0x9 -#define ITEM_TAG_COLLECTION 0xA -#define ITEM_TAG_COLLECTION_END 0xC - -/* HID Global Items tags */ -#define ITEM_TAG_USAGE_PAGE 0x0 -#define ITEM_TAG_LOGICAL_MIN 0x1 -#define ITEM_TAG_LOGICAL_MAX 0x2 -#define ITEM_TAG_REPORT_SIZE 0x7 -#define ITEM_TAG_REPORT_ID 0x8 -#define ITEM_TAG_REPORT_COUNT 0x9 - -/* HID Local Items tags */ -#define ITEM_TAG_USAGE 0x0 -#define ITEM_TAG_USAGE_MIN 0x1 -#define ITEM_TAG_USAGE_MAX 0x2 - -#define HID_ITEM(bTag, bType, bSize) (((bTag & 0xF) << 4) | \ - ((bType & 0x3) << 2) | (bSize & 0x3)) - -#define HID_MAIN_ITEM(bTag, bSize) HID_ITEM(bTag, ITEM_MAIN, bSize) -#define HID_GLOBAL_ITEM(bTag, bSize) HID_ITEM(bTag, ITEM_GLOBAL, bSize) -#define HID_LOCAL_ITEM(bTag, bSize) HID_ITEM(bTag, ITEM_LOCAL, bSize) - -#define HID_MI_COLLECTION HID_MAIN_ITEM(ITEM_TAG_COLLECTION, 1) -#define HID_MI_COLLECTION_END HID_MAIN_ITEM(ITEM_TAG_COLLECTION_END, \ - 0) -#define HID_MI_INPUT HID_MAIN_ITEM(ITEM_TAG_INPUT, 1) -#define HID_MI_OUTPUT HID_MAIN_ITEM(ITEM_TAG_OUTPUT, 1) - -#define HID_GI_USAGE_PAGE HID_GLOBAL_ITEM(ITEM_TAG_USAGE_PAGE, 1) -#define HID_GI_LOGICAL_MIN(size) HID_GLOBAL_ITEM(ITEM_TAG_LOGICAL_MIN, \ - size) -#define HID_GI_LOGICAL_MAX(size) HID_GLOBAL_ITEM(ITEM_TAG_LOGICAL_MAX, \ - size) -#define HID_GI_REPORT_SIZE HID_GLOBAL_ITEM(ITEM_TAG_REPORT_SIZE, \ - 1) -#define HID_GI_REPORT_ID HID_GLOBAL_ITEM(ITEM_TAG_REPORT_ID, \ - 1) -#define HID_GI_REPORT_COUNT HID_GLOBAL_ITEM(ITEM_TAG_REPORT_COUNT, \ - 1) - -#define HID_LI_USAGE HID_LOCAL_ITEM(ITEM_TAG_USAGE, 1) -#define HID_LI_USAGE_MIN(size) HID_LOCAL_ITEM(ITEM_TAG_USAGE_MIN, \ - size) -#define HID_LI_USAGE_MAX(size) HID_LOCAL_ITEM(ITEM_TAG_USAGE_MAX, \ - size) - -/* Defined in Universal Serial Bus HID Usage Tables version 1.11 */ -#define USAGE_GEN_DESKTOP 0x01 -#define USAGE_GEN_KEYBOARD 0x07 -#define USAGE_GEN_LEDS 0x08 -#define USAGE_GEN_BUTTON 0x09 - -/* Generic Desktop Page usages */ -#define USAGE_GEN_DESKTOP_UNDEFINED 0x00 -#define USAGE_GEN_DESKTOP_POINTER 0x01 -#define USAGE_GEN_DESKTOP_MOUSE 0x02 -#define USAGE_GEN_DESKTOP_JOYSTICK 0x04 -#define USAGE_GEN_DESKTOP_GAMEPAD 0x05 -#define USAGE_GEN_DESKTOP_KEYBOARD 0x06 -#define USAGE_GEN_DESKTOP_KEYPAD 0x07 -#define USAGE_GEN_DESKTOP_X 0x30 -#define USAGE_GEN_DESKTOP_Y 0x31 -#define USAGE_GEN_DESKTOP_WHEEL 0x38 - -/* Collection types */ -#define COLLECTION_PHYSICAL 0x00 -#define COLLECTION_APPLICATION 0x01 - -/* Example HID report descriptors */ -/** - * @brief Simple HID mouse report descriptor for n button mouse. - * - * @param bcnt Button count. Allowed values from 1 to 8. - */ -#define HID_MOUSE_REPORT_DESC(bcnt) \ - { \ - /* USAGE_PAGE (Generic Desktop) */ \ - HID_GI_USAGE_PAGE, USAGE_GEN_DESKTOP, /* USAGE (Mouse) */ \ - HID_LI_USAGE, USAGE_GEN_DESKTOP_MOUSE, /* COLLECTION (Application) */ \ - HID_MI_COLLECTION, COLLECTION_APPLICATION, /* USAGE (Pointer) */ \ - HID_LI_USAGE, USAGE_GEN_DESKTOP_POINTER, /* COLLECTION (Physical) */ \ - HID_MI_COLLECTION, COLLECTION_PHYSICAL, /* Bits used for button signalling */ /* USAGE_PAGE (Button) */ \ - HID_GI_USAGE_PAGE, USAGE_GEN_BUTTON, /* USAGE_MINIMUM (Button 1) */ \ - HID_LI_USAGE_MIN(1), 0x01, /* USAGE_MAXIMUM (Button bcnt) */ \ - HID_LI_USAGE_MAX(1), bcnt, /* LOGICAL_MINIMUM (0) */ \ - HID_GI_LOGICAL_MIN(1), 0x00, /* LOGICAL_MAXIMUM (1) */ \ - HID_GI_LOGICAL_MAX(1), 0x01, /* REPORT_SIZE (1) */ \ - HID_GI_REPORT_SIZE, 0x01, /* REPORT_COUNT (bcnt) */ \ - HID_GI_REPORT_COUNT, bcnt, /* INPUT (Data,Var,Abs) */ \ - HID_MI_INPUT, 0x02, /* Unused bits */ /* REPORT_SIZE (8 - bcnt) */ \ - HID_GI_REPORT_SIZE, (8 - bcnt), /* REPORT_COUNT (1) */ \ - HID_GI_REPORT_COUNT, 0x01, /* INPUT (Cnst,Ary,Abs) */ \ - HID_MI_INPUT, 0x01, /* X and Y axis, scroll */ /* USAGE_PAGE (Generic Desktop) */ \ - HID_GI_USAGE_PAGE, USAGE_GEN_DESKTOP, /* USAGE (X) */ \ - HID_LI_USAGE, USAGE_GEN_DESKTOP_X, /* USAGE (Y) */ \ - HID_LI_USAGE, USAGE_GEN_DESKTOP_Y, /* USAGE (WHEEL) */ \ - HID_LI_USAGE, USAGE_GEN_DESKTOP_WHEEL, /* LOGICAL_MINIMUM (-127) */ \ - HID_GI_LOGICAL_MIN(1), -127, /* LOGICAL_MAXIMUM (127) */ \ - HID_GI_LOGICAL_MAX(1), 127, /* REPORT_SIZE (8) */ \ - HID_GI_REPORT_SIZE, 0x08, /* REPORT_COUNT (3) */ \ - HID_GI_REPORT_COUNT, 0x03, /* INPUT (Data,Var,Rel) */ \ - HID_MI_INPUT, 0x06, /* END_COLLECTION */ \ - HID_MI_COLLECTION_END, /* END_COLLECTION */ \ - HID_MI_COLLECTION_END, \ - } - -/** - * @brief Simple HID keyboard report descriptor. - */ -#define HID_KEYBOARD_REPORT_DESC() \ - { \ - /* USAGE_PAGE (Generic Desktop) */ \ - HID_GI_USAGE_PAGE, USAGE_GEN_DESKTOP, /* USAGE (Keyboard) */ \ - HID_LI_USAGE, USAGE_GEN_DESKTOP_KEYBOARD, /* COLLECTION (Application) */ \ - HID_MI_COLLECTION, COLLECTION_APPLICATION, /* USAGE_PAGE (Keypad) */ \ - HID_GI_USAGE_PAGE, USAGE_GEN_DESKTOP_KEYPAD, /* USAGE_MINIMUM (Keyboard LeftControl) */ \ - HID_LI_USAGE_MIN(1), 0xE0, /* USAGE_MAXIMUM (Keyboard Right GUI) */ \ - HID_LI_USAGE_MAX(1), 0xE7, /* LOGICAL_MINIMUM (0) */ \ - HID_GI_LOGICAL_MIN(1), 0x00, /* LOGICAL_MAXIMUM (1) */ \ - HID_GI_LOGICAL_MAX(1), 0x01, /* REPORT_SIZE (1) */ \ - HID_GI_REPORT_SIZE, 0x01, /* REPORT_COUNT (8) */ \ - HID_GI_REPORT_COUNT, 0x08, /* INPUT (Data,Var,Abs) */ \ - HID_MI_INPUT, 0x02, /* REPORT_SIZE (8) */ \ - HID_GI_REPORT_SIZE, 0x08, /* REPORT_COUNT (1) */ \ - HID_GI_REPORT_COUNT, 0x01, /* INPUT (Cnst,Var,Abs) */ \ - HID_MI_INPUT, 0x03, /* REPORT_SIZE (1) */ \ - HID_GI_REPORT_SIZE, 0x01, /* REPORT_COUNT (5) */ \ - HID_GI_REPORT_COUNT, 0x05, /* USAGE_PAGE (LEDs) */ \ - HID_GI_USAGE_PAGE, USAGE_GEN_LEDS, /* USAGE_MINIMUM (Num Lock) */ \ - HID_LI_USAGE_MIN(1), 0x01, /* USAGE_MAXIMUM (Kana) */ \ - HID_LI_USAGE_MAX(1), 0x05, /* OUTPUT (Data,Var,Abs) */ \ - HID_MI_OUTPUT, 0x02, /* REPORT_SIZE (3) */ \ - HID_GI_REPORT_SIZE, 0x03, /* REPORT_COUNT (1) */ \ - HID_GI_REPORT_COUNT, 0x01, /* OUTPUT (Cnst,Var,Abs) */ \ - HID_MI_OUTPUT, 0x03, /* REPORT_SIZE (8) */ \ - HID_GI_REPORT_SIZE, 0x08, /* REPORT_COUNT (6) */ \ - HID_GI_REPORT_COUNT, 0x06, /* LOGICAL_MINIMUM (0) */ \ - HID_GI_LOGICAL_MIN(1), 0x00, /* LOGICAL_MAXIMUM (101) */ \ - HID_GI_LOGICAL_MAX(1), 0x65, /* USAGE_PAGE (Keypad) */ \ - HID_GI_USAGE_PAGE, USAGE_GEN_DESKTOP_KEYPAD, /* USAGE_MINIMUM (Reserved) */ \ - HID_LI_USAGE_MIN(1), 0x00, /* USAGE_MAXIMUM (Keyboard Application) */ \ - HID_LI_USAGE_MAX(1), 0x65, /* INPUT (Data,Ary,Abs) */ \ - HID_MI_INPUT, 0x00, /* END_COLLECTION */ \ - HID_MI_COLLECTION_END, \ - } - -/** - * @brief HID keyboard button codes. - */ -enum hid_kbd_code { - HID_KEY_A = 4, - HID_KEY_B = 5, - HID_KEY_C = 6, - HID_KEY_D = 7, - HID_KEY_E = 8, - HID_KEY_F = 9, - HID_KEY_G = 10, - HID_KEY_H = 11, - HID_KEY_I = 12, - HID_KEY_J = 13, - HID_KEY_K = 14, - HID_KEY_L = 15, - HID_KEY_M = 16, - HID_KEY_N = 17, - HID_KEY_O = 18, - HID_KEY_P = 19, - HID_KEY_Q = 20, - HID_KEY_R = 21, - HID_KEY_S = 22, - HID_KEY_T = 23, - HID_KEY_U = 24, - HID_KEY_V = 25, - HID_KEY_W = 26, - HID_KEY_X = 27, - HID_KEY_Y = 28, - HID_KEY_Z = 29, - HID_KEY_1 = 30, - HID_KEY_2 = 31, - HID_KEY_3 = 32, - HID_KEY_4 = 33, - HID_KEY_5 = 34, - HID_KEY_6 = 35, - HID_KEY_7 = 36, - HID_KEY_8 = 37, - HID_KEY_9 = 38, - HID_KEY_0 = 39, - HID_KEY_ENTER = 40, - HID_KEY_ESC = 41, - HID_KEY_BACKSPACE = 42, - HID_KEY_TAB = 43, - HID_KEY_SPACE = 44, - HID_KEY_MINUS = 45, - HID_KEY_EQUAL = 46, - HID_KEY_LEFTBRACE = 47, - HID_KEY_RIGHTBRACE = 48, - HID_KEY_BACKSLASH = 49, - HID_KEY_HASH = 50, /* Non-US # and ~ */ - HID_KEY_SEMICOLON = 51, - HID_KEY_APOSTROPHE = 52, - HID_KEY_GRAVE = 53, - HID_KEY_COMMA = 54, - HID_KEY_DOT = 55, - HID_KEY_SLASH = 56, - HID_KEY_CAPSLOCK = 57, - HID_KEY_F1 = 58, - HID_KEY_F2 = 59, - HID_KEY_F3 = 60, - HID_KEY_F4 = 61, - HID_KEY_F5 = 62, - HID_KEY_F6 = 63, - HID_KEY_F7 = 64, - HID_KEY_F8 = 65, - HID_KEY_F9 = 66, - HID_KEY_F10 = 67, - HID_KEY_F11 = 68, - HID_KEY_F12 = 69, - HID_KEY_SYSRQ = 70, /* PRINTSCREEN */ - HID_KEY_SCROLLLOCK = 71, - HID_KEY_PAUSE = 72, - HID_KEY_INSERT = 73, - HID_KEY_HOME = 74, - HID_KEY_PAGEUP = 75, - HID_KEY_DELETE = 76, - HID_KEY_END = 77, - HID_KEY_PAGEDOWN = 78, - HID_KEY_RIGHT = 79, - HID_KEY_LEFT = 80, - HID_KEY_DOWN = 81, - HID_KEY_UP = 82, - HID_KEY_NUMLOCK = 83, - HID_KEY_KPSLASH = 84, /* NUMPAD DIVIDE */ - HID_KEY_KPASTERISK = 85, /* NUMPAD MULTIPLY */ - HID_KEY_KPMINUS = 86, - HID_KEY_KPPLUS = 87, - HID_KEY_KPENTER = 88, - HID_KEY_KP_1 = 89, - HID_KEY_KP_2 = 90, - HID_KEY_KP_3 = 91, - HID_KEY_KP_4 = 92, - HID_KEY_KP_5 = 93, - HID_KEY_KP_6 = 94, - HID_KEY_KP_7 = 95, - HID_KEY_KP_8 = 96, - HID_KEY_KP_9 = 97, - HID_KEY_KP_0 = 98, -}; - -/** - * @brief HID keyboard modifiers. - */ -enum hid_kbd_modifier { - HID_KBD_MODIFIER_NONE = 0x00, - HID_KBD_MODIFIER_LEFT_CTRL = 0x01, - HID_KBD_MODIFIER_LEFT_SHIFT = 0x02, - HID_KBD_MODIFIER_LEFT_ALT = 0x04, - HID_KBD_MODIFIER_LEFT_UI = 0x08, - HID_KBD_MODIFIER_RIGHT_CTRL = 0x10, - HID_KBD_MODIFIER_RIGHT_SHIFT = 0x20, - HID_KBD_MODIFIER_RIGHT_ALT = 0x40, - HID_KBD_MODIFIER_RIGHT_UI = 0x80, -}; - -/** - * @brief HID keyboard LEDs. - */ -enum hid_kbd_led { - HID_KBD_LED_NUM_LOCK = 0x01, - HID_KBD_LED_CAPS_LOCK = 0x02, - HID_KBD_LED_SCROLL_LOCK = 0x04, - HID_KBD_LED_COMPOSE = 0x08, - HID_KBD_LED_KANA = 0x10, -}; - void usbd_hid_descriptor_register(uint8_t intf_num, const uint8_t *desc); void usbd_hid_report_descriptor_register(uint8_t intf_num, const uint8_t *desc, uint32_t desc_len); void usbd_hid_add_interface(usbd_class_t *class, usbd_interface_t *intf); @@ -357,4 +32,4 @@ void usbd_hid_set_request_callback( uint8_t intf_num, } #endif -#endif /* _USB_HID_H_ */ +#endif /* _USBD_HID_H_ */ diff --git a/class/midi/usbd_midi.h b/class/midi/usb_midi.h similarity index 95% rename from class/midi/usbd_midi.h rename to class/midi/usb_midi.h index 7073bb4a..430d75ce 100644 --- a/class/midi/usbd_midi.h +++ b/class/midi/usb_midi.h @@ -1,15 +1,11 @@ /** * @file - * @brief USB MIDI Device Class public header + * @brief USB MIDI Class public header * */ -#ifndef _USBD_MIDI_H_ -#define _USBD_MIDI_H_ - -#ifdef __cplusplus -extern "C" { -#endif +#ifndef _USB_MIDI_H_ +#define _USB_MIDI_H_ /* MIDI Streaming class specific interfaces */ #define MIDI_IN_JACK 0x02 @@ -130,7 +126,7 @@ struct midi_cs_interface_descriptor { uint8_t SubType; uint16_t bcdADC; uint16_t wTotalLength; -} __packed; +} __PACKED; struct midi_in_jack_descriptor { uint8_t bLength; @@ -139,7 +135,7 @@ struct midi_in_jack_descriptor { uint8_t bJackType; uint8_t bJackId; uint8_t iJack; -} __packed; +} __PACKED; struct midi_out_jack_descriptor { uint8_t bLength; @@ -151,7 +147,7 @@ struct midi_out_jack_descriptor { uint8_t baSourceId; uint8_t baSourcePin; uint8_t iJack; -} __packed; +} __PACKED; #define MIDI_ADAPTER_AC_INTERFACE_DESCRIPTOR_SIZE(num) (8 + num) #define MIDI_ADAPTER_AC_INTERFACE_DESCRIPTOR(num) \ @@ -163,7 +159,7 @@ struct midi_out_jack_descriptor { uint16_t wTotalLength; \ uint8_t bInCollection; \ uint8_t baInterfaceNr[num]; \ - } __packed + } __PACKED #define MIDI_CS_BULK_ENDPOINT_DESCRIPTOR_SIZE(num) (4 + num) #define MIDI_CS_BULK_ENDPOINT_DESCRIPTOR(num) \ @@ -173,10 +169,6 @@ struct midi_out_jack_descriptor { uint8_t SubType; \ uint8_t bNumEmbMIDIJack; \ uint8_t baAssocJackID[num]; \ - } __packed + } __PACKED -#ifdef __cplusplus -} -#endif - -#endif /* _USBD_MIDI_H_ */ +#endif /* _USB_MIDI_H_ */ diff --git a/class/msc/usb_msc.h b/class/msc/usb_msc.h new file mode 100644 index 00000000..d7b353e2 --- /dev/null +++ b/class/msc/usb_msc.h @@ -0,0 +1,121 @@ +/** + * @file + * @brief USB Mass Storage Class public header + * + * Header follows the Mass Storage Class Specification + * (Mass_Storage_Specification_Overview_v1.4_2-19-2010.pdf) and + * Mass Storage Class Bulk-Only Transport Specification + * (usbmassbulk_10.pdf). + * Header is limited to Bulk-Only Transfer protocol. + */ + +#ifndef _USB_MSC_H__ +#define _USB_MSC_H__ + +/* MSC Subclass Codes */ +#define MSC_SUBCLASS_RBC 0x01 /* Reduced block commands (e.g., flash devices) */ +#define MSC_SUBCLASS_SFF8020I_MMC2 0x02 /* SFF-8020i/MMC-2 (ATAPI) (e.g., C/DVD) */ +#define MSC_SUBCLASS_QIC157 0x03 /* QIC-157 (e.g., tape device) */ +#define MSC_SUBCLASS_UFI 0x04 /* e.g. floppy device */ +#define MSC_SUBCLASS_SFF8070I 0x05 /* SFF-8070i (e.g. floppy disk) */ +#define MSC_SUBCLASS_SCSI 0x06 /* SCSI transparent */ + +/* MSC Protocol Codes */ +#define MSC_PROTOCOL_CBI_INT 0x00 /* CBI transport with command completion interrupt */ +#define MSC_PROTOCOL_CBI_NOINT 0x01 /* CBI transport without command completion interrupt */ +#define MSC_PROTOCOL_BULK_ONLY 0x50 /* Bulk only transport */ + +/* MSC Request Codes */ +#define MSC_REQUEST_RESET 0xFF +#define MSC_REQUEST_GET_MAX_LUN 0xFE + +/** MSC Command Block Wrapper (CBW) Signature */ +#define MSC_CBW_Signature 0x43425355 +/** Bulk-only Command Status Wrapper (CSW) Signature */ +#define MSC_CSW_Signature 0x53425355 + +/** MSC Command Block Status Values */ +#define CSW_STATUS_CMD_PASSED 0x00 +#define CSW_STATUS_CMD_FAILED 0x01 +#define CSW_STATUS_PHASE_ERROR 0x02 + +#define MSC_MAX_CDB_LEN (16) /* Max length of SCSI Command Data Block */ + +/** MSC Bulk-Only Command Block Wrapper (CBW) */ +struct CBW { + uint32_t dSignature; /* 'USBC' = 0x43425355 */ + uint32_t dTag; /* Depends on command id */ + uint32_t dDataLength; /* Number of bytes that host expects to transfer */ + uint8_t bmFlags; /* Bit 7: Direction=IN (other obsolete or reserved) */ + uint8_t bLUN; /* LUN (normally 0) */ + uint8_t bCBLength; /* len of cdb[] */ + uint8_t CB[MSC_MAX_CDB_LEN]; /* Command Data Block */ +} __PACKED; + +#define USB_SIZEOF_MSC_CBW 31 + +/** MSC Bulk-Only Command Status Wrapper (CSW) */ +struct CSW { + uint32_t dSignature; /* 'USBS' = 0x53425355 */ + uint32_t dTag; /* Same tag as original command */ + uint32_t dDataResidue; /* Amount not transferred */ + uint8_t bStatus; /* Status of transfer */ +} __PACKED; + +#define USB_SIZEOF_MSC_CSW 13 + +/*Length of template descriptor: 23 bytes*/ +#define MSC_DESCRIPTOR_LEN (9 + 7 + 7) +// clang-format off +#ifndef CONFIG_USB_HS +#define MSC_DESCRIPTOR_INIT(bFirstInterface, out_ep, in_ep,str_idx) \ + /* Interface */ \ + 0x09, /* bLength */ \ + USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType */ \ + bFirstInterface, /* bInterfaceNumber */ \ + 0x00, /* bAlternateSetting */ \ + 0x02, /* bNumEndpoints */ \ + USB_DEVICE_CLASS_MASS_STORAGE, /* bInterfaceClass */ \ + MSC_SUBCLASS_SCSI, /* bInterfaceSubClass */ \ + MSC_PROTOCOL_BULK_ONLY, /* bInterfaceProtocol */ \ + str_idx, /* iInterface */ \ + 0x07, /* bLength */ \ + USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType */ \ + out_ep, /* bEndpointAddress */ \ + 0x02, /* bmAttributes */ \ + 0x40, 0x00, /* wMaxPacketSize */ \ + 0x00, /* bInterval */ \ + 0x07, /* bLength */ \ + USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType */ \ + in_ep, /* bEndpointAddress */ \ + 0x02, /* bmAttributes */ \ + 0x40, 0x00, /* wMaxPacketSize */ \ + 0x00 /* bInterval */ +#else +#define MSC_DESCRIPTOR_INIT(bFirstInterface, out_ep, in_ep,str_idx) \ + /* Interface */ \ + 0x09, /* bLength */ \ + USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType */ \ + bFirstInterface, /* bInterfaceNumber */ \ + 0x00, /* bAlternateSetting */ \ + 0x02, /* bNumEndpoints */ \ + USB_DEVICE_CLASS_MASS_STORAGE, /* bInterfaceClass */ \ + MSC_SUBCLASS_SCSI, /* bInterfaceSubClass */ \ + MSC_PROTOCOL_BULK_ONLY, /* bInterfaceProtocol */ \ + str_idx, /* iInterface */ \ + 0x07, /* bLength */ \ + USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType */ \ + out_ep, /* bEndpointAddress */ \ + 0x02, /* bmAttributes */ \ + 0x00, 0x02, /* wMaxPacketSize */ \ + 0x00, /* bInterval */ \ + 0x07, /* bLength */ \ + USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType */ \ + in_ep, /* bEndpointAddress */ \ + 0x02, /* bmAttributes */ \ + 0x00, 0x02, /* wMaxPacketSize */ \ + 0x00 /* bInterval */ +#endif +// clang-format on + +#endif /* USB_MSC_H_ */ diff --git a/class/msc/usbd_scsi.h b/class/msc/usb_scsi.h similarity index 96% rename from class/msc/usbd_scsi.h rename to class/msc/usb_scsi.h index 618d8f7a..c13e7765 100644 --- a/class/msc/usbd_scsi.h +++ b/class/msc/usb_scsi.h @@ -9,8 +9,8 @@ * Header is limited to Bulk-Only Transfer protocol. */ -#ifndef _USBD_SCSI_H_ -#define _USBD_SCSI_H_ +#ifndef _USB_SCSI_H_ +#define _USB_SCSI_H_ /* SCSI Commands */ #define SCSI_TEST_UNIT_READY 0x00 @@ -90,7 +90,7 @@ //--------------------------------------------------------------------+ /// SCSI Test Unit Ready Command -typedef struct __packed { +typedef struct __PACKED { uint8_t cmd_code; ///< SCSI OpCode for \ref SCSI_CMD_TEST_UNIT_READY uint8_t lun; ///< Logical Unit uint8_t reserved[3]; @@ -98,7 +98,7 @@ typedef struct __packed { } scsi_test_unit_ready_cmd_t; /// SCSI Inquiry Command -typedef struct __packed { +typedef struct __PACKED { uint8_t cmd_code; ///< SCSI OpCode for \ref SCSI_CMD_INQUIRY uint8_t reserved1; uint8_t page_code; @@ -108,7 +108,7 @@ typedef struct __packed { } scsi_inquiry_cmd_t, scsi_request_sense_cmd_t; /// SCSI Inquiry Response Data -typedef struct __packed { +typedef struct __PACKED { uint8_t peripheral_device_type : 5; uint8_t peripheral_qualifier : 3; @@ -150,7 +150,7 @@ typedef struct __packed { uint8_t product_rev[4]; ///< 4 bytes of ASCII data defined by the vendor. } scsi_inquiry_resp_t; -typedef struct __packed { +typedef struct __PACKED { uint8_t response_code : 7; ///< 70h - current errors, Fixed Format 71h - deferred errors, Fixed Format uint8_t valid : 1; @@ -173,7 +173,7 @@ typedef struct __packed { } scsi_sense_fixed_resp_t; -typedef struct __packed { +typedef struct __PACKED { uint8_t cmd_code; ///< SCSI OpCode for \ref SCSI_CMD_MODE_SENSE_6 uint8_t : 3; @@ -189,7 +189,7 @@ typedef struct __packed { } scsi_mode_sense6_cmd_t; // This is only a Mode parameter header(6). -typedef struct __packed { +typedef struct __PACKED { uint8_t data_len; uint8_t medium_type; @@ -240,14 +240,14 @@ typedef struct uint8_t block_desc_length[2]; } scsi_mode_10_resp_t; -typedef struct __packed { +typedef struct __PACKED { uint8_t cmd_code; ///< SCSI OpCode for \ref SCSI_CMD_PREVENT_ALLOW_MEDIUM_REMOVAL uint8_t reserved[3]; uint8_t prohibit_removal; uint8_t control; } scsi_prevent_allow_medium_removal_t; -typedef struct __packed { +typedef struct __PACKED { uint8_t cmd_code; uint8_t immded : 1; @@ -271,14 +271,14 @@ typedef struct __packed { // SCSI MMC //--------------------------------------------------------------------+ /// SCSI Read Format Capacity: Write Capacity -typedef struct __packed { +typedef struct __PACKED { uint8_t cmd_code; uint8_t reserved[6]; uint16_t alloc_length; uint8_t control; } scsi_read_format_capacity_cmd_t; -typedef struct __packed { +typedef struct __PACKED { uint8_t reserved[3]; uint8_t list_length; /// must be 8*n, length in bytes of formattable capacity descriptor followed it. @@ -296,7 +296,7 @@ typedef struct __packed { //--------------------------------------------------------------------+ /// SCSI Read Capacity 10 Command: Read Capacity -typedef struct __packed { +typedef struct __PACKED { uint8_t cmd_code; ///< SCSI OpCode for \ref SCSI_CMD_READ_CAPACITY_10 uint8_t reserved1; uint32_t lba; ///< The first Logical Block Address (LBA) accessed by this command @@ -313,7 +313,7 @@ typedef struct } scsi_read_capacity10_resp_t; /// SCSI Read 10 Command -typedef struct __packed { +typedef struct __PACKED { uint8_t cmd_code; ///< SCSI OpCode uint8_t reserved; // has LUN according to wiki uint32_t lba; ///< The first Logical Block Address (LBA) accessed by this command @@ -322,4 +322,4 @@ typedef struct __packed { uint8_t control; } scsi_read10_t, scsi_write10_t, scsi_read_write_10_t; -#endif /* ZEPHYR_INCLUDE_USB_CLASS_USB_CDC_H_ */ +#endif /* USB_SCSI_H */ diff --git a/class/msc/usbd_msc.c b/class/msc/usbd_msc.c index 262adbb1..f95e79b2 100644 --- a/class/msc/usbd_msc.c +++ b/class/msc/usbd_msc.c @@ -21,8 +21,8 @@ * */ #include "usbd_core.h" -#include "usbd_scsi.h" #include "usbd_msc.h" +#include "usb_scsi.h" /* max USB packet size */ #ifndef CONFIG_USB_HS @@ -46,25 +46,6 @@ enum Stage { MSC_WAIT_CSW = 4, /* Command Status Wrapper */ }; -/** MSC Bulk-Only Command Block Wrapper (CBW) */ -struct CBW { - uint32_t dSignature; - uint32_t dTag; - uint32_t dDataLength; - uint8_t bmFlags; - uint8_t bLUN; - uint8_t bCBLength; - uint8_t CB[16]; -} __packed; - -/** MSC Bulk-Only Command Status Wrapper (CSW) */ -struct CSW { - uint32_t dSignature; - uint32_t dTag; - uint32_t dDataResidue; - uint8_t bStatus; -} __packed; - /* Device data structure */ struct usbd_msc_cfg_private { /* state of the bulk-only state machine */ @@ -970,7 +951,7 @@ static void mass_storage_bulk_in(uint8_t ep) void msc_storage_notify_handler(uint8_t event, void *arg) { switch (event) { - case USB_EVENT_RESET: + case USBD_EVENT_RESET: usbd_msc_reset(); break; @@ -1001,4 +982,4 @@ void usbd_msc_class_init(uint8_t out_ep, uint8_t in_ep) usbd_interface_add_endpoint(&msc_intf, &mass_ep_data[0]); usbd_interface_add_endpoint(&msc_intf, &mass_ep_data[1]); -} \ No newline at end of file +} diff --git a/class/msc/usbd_msc.h b/class/msc/usbd_msc.h index 3b5fe3e5..ba17e617 100644 --- a/class/msc/usbd_msc.h +++ b/class/msc/usbd_msc.h @@ -12,91 +12,12 @@ #ifndef _USBD_MSC_H__ #define _USBD_MSC_H__ +#include "usb_msc.h" + #ifdef __cplusplus extern "C" { #endif -/* MSC Subclass Codes */ -#define MSC_SUBCLASS_RBC 0x01 -#define MSC_SUBCLASS_SFF8020I_MMC2 0x02 -#define MSC_SUBCLASS_QIC157 0x03 -#define MSC_SUBCLASS_UFI 0x04 -#define MSC_SUBCLASS_SFF8070I 0x05 -#define MSC_SUBCLASS_SCSI 0x06 - -/* MSC Protocol Codes */ -#define MSC_PROTOCOL_CBI_INT 0x00 -#define MSC_PROTOCOL_CBI_NOINT 0x01 -#define MSC_PROTOCOL_BULK_ONLY 0x50 - -/* MSC Request Codes */ -#define MSC_REQUEST_RESET 0xFF -#define MSC_REQUEST_GET_MAX_LUN 0xFE - -/** MSC Command Block Wrapper (CBW) Signature */ -#define MSC_CBW_Signature 0x43425355 -/** Bulk-only Command Status Wrapper (CSW) Signature */ -#define MSC_CSW_Signature 0x53425355 - -/** MSC Command Block Status Values */ -#define CSW_STATUS_CMD_PASSED 0x00 -#define CSW_STATUS_CMD_FAILED 0x01 -#define CSW_STATUS_PHASE_ERROR 0x02 - -/*Length of template descriptor: 23 bytes*/ -#define MSC_DESCRIPTOR_LEN (9 + 7 + 7) -// clang-format off -#ifndef SUPPORT_USB_HS -#define MSC_DESCRIPTOR_INIT(bFirstInterface, out_ep, in_ep,str_idx) \ - /* Interface */ \ - 0x09, /* bLength */ \ - USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType */ \ - bFirstInterface, /* bInterfaceNumber */ \ - 0x00, /* bAlternateSetting */ \ - 0x02, /* bNumEndpoints */ \ - USB_DEVICE_CLASS_MASS_STORAGE, /* bInterfaceClass */ \ - MSC_SUBCLASS_SCSI, /* bInterfaceSubClass */ \ - MSC_PROTOCOL_BULK_ONLY, /* bInterfaceProtocol */ \ - str_idx, /* iInterface */ \ - 0x07, /* bLength */ \ - USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType */ \ - out_ep, /* bEndpointAddress */ \ - 0x02, /* bmAttributes */ \ - 0x40, 0x00, /* wMaxPacketSize */ \ - 0x00, /* bInterval */ \ - 0x07, /* bLength */ \ - USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType */ \ - in_ep, /* bEndpointAddress */ \ - 0x02, /* bmAttributes */ \ - 0x40, 0x00, /* wMaxPacketSize */ \ - 0x00 /* bInterval */ -#else -#define MSC_DESCRIPTOR_INIT(bFirstInterface, out_ep, in_ep,str_idx) \ - /* Interface */ \ - 0x09, /* bLength */ \ - USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType */ \ - bFirstInterface, /* bInterfaceNumber */ \ - 0x00, /* bAlternateSetting */ \ - 0x02, /* bNumEndpoints */ \ - USB_DEVICE_CLASS_MASS_STORAGE, /* bInterfaceClass */ \ - MSC_SUBCLASS_SCSI, /* bInterfaceSubClass */ \ - MSC_PROTOCOL_BULK_ONLY, /* bInterfaceProtocol */ \ - str_idx, /* iInterface */ \ - 0x07, /* bLength */ \ - USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType */ \ - out_ep, /* bEndpointAddress */ \ - 0x02, /* bmAttributes */ \ - 0x00, 0x02, /* wMaxPacketSize */ \ - 0x00, /* bInterval */ \ - 0x07, /* bLength */ \ - USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType */ \ - in_ep, /* bEndpointAddress */ \ - 0x02, /* bmAttributes */ \ - 0x00, 0x02, /* wMaxPacketSize */ \ - 0x00 /* bInterval */ -#endif -// clang-format on - void usbd_msc_class_init(uint8_t out_ep, uint8_t in_ep); void usbd_msc_get_cap(uint8_t lun, uint32_t *block_num, uint16_t *block_size); int usbd_msc_sector_read(uint32_t sector, uint8_t *buffer, uint32_t length); @@ -106,4 +27,4 @@ int usbd_msc_sector_write(uint32_t sector, uint8_t *buffer, uint32_t length); } #endif -#endif /* USB_MSC_H_ */ +#endif /* USBD_MSC_H_ */ diff --git a/class/tmc/usbd_tmc.h b/class/tmc/usb_tmc.h similarity index 94% rename from class/tmc/usbd_tmc.h rename to class/tmc/usb_tmc.h index 1ee8a663..eb622b49 100644 --- a/class/tmc/usbd_tmc.h +++ b/class/tmc/usb_tmc.h @@ -1,15 +1,11 @@ /** * @file - * @brief USB TMC Device Class public header + * @brief USB TMC Class public header * */ -#ifndef _USBD_TMC_H_ -#define _USBD_TMC_H_ - -#ifdef __cplusplus -extern "C" { -#endif +#ifndef _USB_TMC_H_ +#define _USB_TMC_H_ /**@addtogroup MODULE_TMC USB TMC class * @brief This module contains USB Device Test and Measurement Class definitions. @@ -55,7 +51,7 @@ struct tmc_get_capabilities_response { uint8_t InterfaceCapabilities; uint8_t DeviceCapabilities; uint8_t Reserved1[18]; -} __packed; +} __PACKED; /**@name MsgId values * @{*/ @@ -129,10 +125,6 @@ struct usb_tmc_bulk_header { uint8_t Reserved; /** USBTMC command message specific */ union usb_tmc_bulk_header_specific MsgSpecific; -} __packed; +} __PACKED; -#ifdef __cplusplus -} -#endif - -#endif /* _USBD_TMC_H_ */ +#endif /* _USB_TMC_H_ */ diff --git a/class/video/usb_video.h b/class/video/usb_video.h new file mode 100644 index 00000000..facfc11b --- /dev/null +++ b/class/video/usb_video.h @@ -0,0 +1,809 @@ +/** + * @file + * @brief USB Video Class public header + * + * Header follows below documentation: + * - USB Device Class Definition for Video Devices UVC 1.5 Class specification.pdf + */ + +#ifndef _USB_VIDEO_H_ +#define _USB_VIDEO_H_ + +#define USB_DEVICE_VIDEO_CLASS_VERSION_1_5 0 + +/*! @brief Video device subclass code */ +#define VIDEO_SC_UNDEFINED 0x00U +#define VIDEO_SC_VIDEOCONTROL 0x01U +#define VIDEO_SC_VIDEOSTREAMING 0x02U +#define VIDEO_SC_VIDEO_INTERFACE_COLLECTION 0x03U + +/*! @brief Video device protocol code */ +#define VIDEO_PC_PROTOCOL_UNDEFINED 0x00U +#define VIDEO_PC_PROTOCOL_15 0x01U + +/*! @brief Video device class-specific descriptor type */ +#define VIDEO_CS_UNDEFINED_DESCRIPTOR_TYPE 0x20U +#define VIDEO_CS_DEVICE_DESCRIPTOR_TYPE 0x21U +#define VIDEO_CS_CONFIGURATION_DESCRIPTOR_TYPE 0x22U +#define VIDEO_CS_STRING_DESCRIPTOR_TYPE 0x23U +#define VIDEO_CS_INTERFACE_DESCRIPTOR_TYPE 0x24U +#define VIDEO_CS_ENDPOINT_DESCRIPTOR_TYPE 0x25U + +/*! @brief Video device class-specific VC interface descriptor subtype */ +#define VIDEO_VC_DESCRIPTOR_UNDEFINED_DESCRIPTOR_SUBTYPE 0x00U +#define VIDEO_VC_HEADER_DESCRIPTOR_SUBTYPE 0x01U +#define VIDEO_VC_INPUT_TERMINAL_DESCRIPTOR_SUBTYPE 0x02U +#define VIDEO_VC_OUTPUT_TERMINAL_DESCRIPTOR_SUBTYPE 0x03U +#define VIDEO_VC_SELECTOR_UNIT_DESCRIPTOR_SUBTYPE 0x04U +#define VIDEO_VC_PROCESSING_UNIT_DESCRIPTOR_SUBTYPE 0x05U +#define VIDEO_VC_EXTENSION_UNIT_DESCRIPTOR_SUBTYPE 0x06U +#define VIDEO_VC_ENCODING_UNIT_DESCRIPTOR_SUBTYPE 0x07U + +/*! @brief Video device class-specific VS interface descriptor subtype */ +#define VIDEO_VS_UNDEFINED_DESCRIPTOR_SUBTYPE 0x00U +#define VIDEO_VS_INPUT_HEADER_DESCRIPTOR_SUBTYPE 0x01U +#define VIDEO_VS_OUTPUT_HEADER_DESCRIPTOR_SUBTYPE 0x02U +#define VIDEO_VS_STILL_IMAGE_FRAME_DESCRIPTOR_SUBTYPE 0x03U +#define VIDEO_VS_FORMAT_UNCOMPRESSED_DESCRIPTOR_SUBTYPE 0x04U +#define VIDEO_VS_FRAME_UNCOMPRESSED_DESCRIPTOR_SUBTYPE 0x05U +#define VIDEO_VS_FORMAT_MJPEG_DESCRIPTOR_SUBTYPE 0x06U +#define VIDEO_VS_FRAME_MJPEG_DESCRIPTOR_SUBTYPE 0x07U +#define VIDEO_VS_FORMAT_MPEG2TS_DESCRIPTOR_SUBTYPE 0x0AU +#define VIDEO_VS_FORMAT_DV_DESCRIPTOR_SUBTYPE 0x0CU +#define VIDEO_VS_COLORFORMAT_DESCRIPTOR_SUBTYPE 0x0DU +#define VIDEO_VS_FORMAT_FRAME_BASED_DESCRIPTOR_SUBTYPE 0x10U +#define VIDEO_VS_FRAME_FRAME_BASED_DESCRIPTOR_SUBTYPE 0x11U +#define VIDEO_VS_FORMAT_STREAM_BASED_DESCRIPTOR_SUBTYPE 0x12U +#define VIDEO_VS_FORMAT_H264_DESCRIPTOR_SUBTYPE 0x13U +#define VIDEO_VS_FRAME_H264_DESCRIPTOR_SUBTYPE 0x14U +#define VIDEO_VS_FORMAT_H264_SIMULCAST_DESCRIPTOR_SUBTYPE 0x15U +#define VIDEO_VS_FORMAT_VP8_DESCRIPTOR_SUBTYPE 0x16U +#define VIDEO_VS_FRAME_VP8_DESCRIPTOR_SUBTYPE 0x17U +#define VIDEO_VS_FORMAT_VP8_SIMULCAST_DESCRIPTOR_SUBTYPE 0x18U + +/*! @brief Video device class-specific VC endpoint descriptor subtype */ +#define VIDEO_EP_UNDEFINED_DESCRIPTOR_SUBTYPE 0x00U +#define VIDEO_EP_GENERAL_DESCRIPTOR_SUBTYPE 0x01U +#define VIDEO_EP_ENDPOINT_DESCRIPTOR_SUBTYPE 0x02U +#define VIDEO_EP_INTERRUPT_DESCRIPTOR_SUBTYPE 0x03U + +/*! @brief Video device class-specific request code */ +#define VIDEO_REQUEST_UNDEFINED 0x00U +#define VIDEO_REQUEST_SET_CUR 0x01U +#define VIDEO_REQUEST_SET_CUR_ALL 0x11U +#define VIDEO_REQUEST_GET_CUR 0x81U +#define VIDEO_REQUEST_GET_MIN 0x82U +#define VIDEO_REQUEST_GET_MAX 0x83U +#define VIDEO_REQUEST_GET_RES 0x84U +#define VIDEO_REQUEST_GET_LEN 0x85U +#define VIDEO_REQUEST_GET_INFO 0x86U +#define VIDEO_REQUEST_GET_DEF 0x87U +#define VIDEO_REQUEST_GET_CUR_ALL 0x91U +#define VIDEO_REQUEST_GET_MIN_ALL 0x92U +#define VIDEO_REQUEST_GET_MAX_ALL 0x93U +#define VIDEO_REQUEST_GET_RES_ALL 0x94U +#define VIDEO_REQUEST_GET_DEF_ALL 0x97U + +/*! @brief Video device class-specific VideoControl interface control selector */ +#define VIDEO_VC_CONTROL_UNDEFINED 0x00U +#define VIDEO_VC_VIDEO_POWER_MODE_CONTROL 0x01U +#define VIDEO_VC_REQUEST_ERROR_CODE_CONTROL 0x02U + +/*! @brief Video device class-specific Terminal control selector */ +#define VIDEO_TE_CONTROL_UNDEFINED 0x00U + +/*! @brief Video device class-specific Selector Unit control selector */ +#define VIDEO_SU_CONTROL_UNDEFINED 0x00U +#define VIDEO_SU_INPUT_SELECT_CONTROL 0x01U + +/*! @brief Video device class-specific Camera Terminal control selector */ +#define VIDEO_CT_CONTROL_UNDEFINED 0x00U +#define VIDEO_CT_SCANNING_MODE_CONTROL 0x01U +#define VIDEO_CT_AE_MODE_CONTROL 0x02U +#define VIDEO_CT_AE_PRIORITY_CONTROL 0x03U +#define VIDEO_CT_EXPOSURE_TIME_ABSOLUTE_CONTROL 0x04U +#define VIDEO_CT_EXPOSURE_TIME_RELATIVE_CONTROL 0x05U +#define VIDEO_CT_FOCUS_ABSOLUTE_CONTROL 0x06U +#define VIDEO_CT_FOCUS_RELATIVE_CONTROL 0x07U +#define VIDEO_CT_FOCUS_AUTO_CONTROL 0x08U +#define VIDEO_CT_IRIS_ABSOLUTE_CONTROL 0x09U +#define VIDEO_CT_IRIS_RELATIVE_CONTROL 0x0AU +#define VIDEO_CT_ZOOM_ABSOLUTE_CONTROL 0x0BU +#define VIDEO_CT_ZOOM_RELATIVE_CONTROL 0x0CU +#define VIDEO_CT_PANTILT_ABSOLUTE_CONTROL 0x0DU +#define VIDEO_CT_PANTILT_RELATIVE_CONTROL 0x0EU +#define VIDEO_CT_ROLL_ABSOLUTE_CONTROL 0x0FU +#define VIDEO_CT_ROLL_RELATIVE_CONTROL 0x10U +#define VIDEO_CT_PRIVACY_CONTROL 0x11U +#define VIDEO_CT_FOCUS_SIMPLE_CONTROL 0x12U +#define VIDEO_CT_WINDOW_CONTROL 0x13U +#define VIDEO_CT_REGION_OF_INTEREST_CONTROL 0x14U + +/*! @brief Video device class-specific Processing Unit control selector */ +#define VIDEO_PU_CONTROL_UNDEFINED 0x00U +#define VIDEO_PU_BACKLIGHT_COMPENSATION_CONTROL 0x01U +#define VIDEO_PU_BRIGHTNESS_CONTROL 0x02U +#define VIDEO_PU_CONTRAST_CONTROL 0x03U +#define VIDEO_PU_GAIN_CONTROL 0x04U +#define VIDEO_PU_POWER_LINE_FREQUENCY_CONTROL 0x05U +#define VIDEO_PU_HUE_CONTROL 0x06U +#define VIDEO_PU_SATURATION_CONTROL 0x07U +#define VIDEO_PU_SHARPNESS_CONTROL 0x08U +#define VIDEO_PU_GAMMA_CONTROL 0x09U +#define VIDEO_PU_WHITE_BALANCE_TEMPERATURE_CONTROL 0x0AU +#define VIDEO_PU_WHITE_BALANCE_TEMPERATURE_AUTO_CONTROL 0x0BU +#define VIDEO_PU_WHITE_BALANCE_COMPONENT_CONTROL 0x0CU +#define VIDEO_PU_WHITE_BALANCE_COMPONENT_AUTO_CONTROL 0x0DU +#define VIDEO_PU_DIGITAL_MULTIPLIER_CONTROL 0x0EU +#define VIDEO_PU_DIGITAL_MULTIPLIER_LIMIT_CONTROL 0x0FU +#define VIDEO_PU_HUE_AUTO_CONTROL 0x10U +#define VIDEO_PU_ANALOG_VIDEO_STANDARD_CONTROL 0x11U +#define VIDEO_PU_ANALOG_LOCK_STATUS_CONTROL 0x12U +#define VIDEO_PU_CONTRAST_AUTO_CONTROL 0x13U + +/*! @brief Video device class-specific Encoding Unit control selector */ +#define VIDEO_EU_CONTROL_UNDEFINED 0x00U +#define VIDEO_EU_SELECT_LAYER_CONTROL 0x01U +#define VIDEO_EU_PROFILE_TOOLSET_CONTROL 0x02U +#define VIDEO_EU_VIDEO_RESOLUTION_CONTROL 0x03U +#define VIDEO_EU_MIN_FRAME_INTERVAL_CONTROL 0x04U +#define VIDEO_EU_SLICE_MODE_CONTROL 0x05U +#define VIDEO_EU_RATE_CONTROL_MODE_CONTROL 0x06U +#define VIDEO_EU_AVERAGE_BITRATE_CONTROL 0x07U +#define VIDEO_EU_CPB_SIZE_CONTROL 0x08U +#define VIDEO_EU_PEAK_BIT_RATE_CONTROL 0x09U +#define VIDEO_EU_QUANTIZATION_PARAMS_CONTROL 0x0AU +#define VIDEO_EU_SYNC_REF_FRAME_CONTROL 0x0BU +#define VIDEO_EU_LTR_BUFFER_ CONTROL0x0CU +#define VIDEO_EU_LTR_PICTURE_CONTROL 0x0DU +#define VIDEO_EU_LTR_VALIDATION_CONTROL 0x0EU +#define VIDEO_EU_LEVEL_IDC_LIMIT_CONTROL 0x0FU +#define VIDEO_EU_SEI_PAYLOADTYPE_CONTROL 0x10U +#define VIDEO_EU_QP_RANGE_CONTROL 0x11U +#define VIDEO_EU_PRIORITY_CONTROL 0x12U +#define VIDEO_EU_START_OR_STOP_LAYER_CONTROL 0x13U +#define VIDEO_EU_ERROR_RESILIENCY_CONTROL 0x14U + +/*! @brief Video device class-specific Extension Unit control selector */ +#define VIDEO_XU_CONTROL_UNDEFINED 0x00U + +/*! @brief Video device class-specific VideoStreaming Interface control selector */ +#define VIDEO_VS_CONTROL_UNDEFINED 0x00U +#define VIDEO_VS_PROBE_CONTROL 0x01U +#define VIDEO_VS_COMMIT_CONTROL 0x02U +#define VIDEO_VS_STILL_PROBE_CONTROL 0x03U +#define VIDEO_VS_STILL_COMMIT_CONTROL 0x04U +#define VIDEO_VS_STILL_IMAGE_TRIGGER_CONTROL 0x05U +#define VIDEO_VS_STREAM_ERROR_CODE_CONTROL 0x06U +#define VIDEO_VS_GENERATE_KEY_FRAME_CONTROL 0x07U +#define VIDEO_VS_UPDATE_FRAME_SEGMENT_CONTROL 0x08U +#define VIDEO_VS_SYNCH_DELAY_CONTROL 0x09U + +/*! @}*/ + +/*! + * @name USB Video class terminal types + * @{ + */ + +/*! @brief Video device USB terminal type */ +#define VIDEO_TT_VENDOR_SPECIFIC 0x0100U +#define VIDEO_TT_STREAMING 0x0101U + +/*! @brief Video device input terminal type */ +#define VIDEO_ITT_VENDOR_SPECIFIC 0x0200U +#define VIDEO_ITT_CAMERA 0x0201U +#define VIDEO_ITT_MEDIA_TRANSPORT_INPUT 0x0202U + +/*! @brief Video device output terminal type */ +#define VIDEO_OTT_VENDOR_SPECIFIC 0x0300U +#define VIDEO_OTT_DISPLAY 0x0301U +#define VIDEO_OTT_MEDIA_TRANSPORT_OUTPUT 0x0302U + +/*! @brief Video device external terminal type */ +#define VIDEO_ET_VENDOR_SPECIFIC 0x0400U +#define VIDEO_ET_COMPOSITE_CONNECTOR 0x0401U +#define VIDEO_ET_SVIDEO_CONNECTOR 0x0402U +#define VIDEO_ET_COMPONENT_CONNECTOR 0x0403U + +/*! @}*/ + +/*! + * @name USB Video class setup request types + * @{ + */ + +/*! @brief Video device class setup request set type */ +#define VIDEO_SET_REQUEST_INTERFACE 0x21U +#define VIDEO_SET_REQUEST_ENDPOINT 0x22U + +/*! @brief Video device class setup request get type */ +#define VIDEO_GET_REQUEST_INTERFACE 0xA1U +#define VIDEO_GET_REQUEST_ENDPOINT 0xA2U + +/*! @}*/ + +/*! @brief Video device still image trigger control */ +#define VIDEO_STILL_IMAGE_TRIGGER_NORMAL_OPERATION 0x00U +#define VIDEO_STILL_IMAGE_TRIGGER_TRANSMIT_STILL_IMAGE 0x01U +#define VIDEO_STILL_IMAGE_TRIGGER_TRANSMIT_STILL_IMAGE_VS_DEDICATED_BULK_PIPE 0x02U +#define VIDEO_STILL_IMAGE_TRIGGER_ABORT_STILL_IMAGE_TRANSMISSION 0x03U + +/*! + * @name USB Video device class-specific request commands + * @{ + */ + +/*! @brief Video device class-specific request GET CUR COMMAND */ +#define VIDEO_GET_CUR_VC_POWER_MODE_CONTROL 0x8101U +#define VIDEO_GET_CUR_VC_ERROR_CODE_CONTROL 0x8102U + +#define VIDEO_GET_CUR_PU_BACKLIGHT_COMPENSATION_CONTROL 0x8121U +#define VIDEO_GET_CUR_PU_BRIGHTNESS_CONTROL 0x8122U +#define VIDEO_GET_CUR_PU_CONTRACT_CONTROL 0x8123U +#define VIDEO_GET_CUR_PU_GAIN_CONTROL 0x8124U +#define VIDEO_GET_CUR_PU_POWER_LINE_FREQUENCY_CONTROL 0x8125U +#define VIDEO_GET_CUR_PU_HUE_CONTROL 0x8126U +#define VIDEO_GET_CUR_PU_SATURATION_CONTROL 0x8127U +#define VIDEO_GET_CUR_PU_SHARRNESS_CONTROL 0x8128U +#define VIDEO_GET_CUR_PU_GAMMA_CONTROL 0x8129U +#define VIDEO_GET_CUR_PU_WHITE_BALANCE_TEMPERATURE_CONTROL 0x812AU +#define VIDEO_GET_CUR_PU_WHITE_BALANCE_TEMPERATURE_AUTO_CONTROL 0x812BU +#define VIDEO_GET_CUR_PU_WHITE_BALANCE_COMPONENT_CONTROL 0x812CU +#define VIDEO_GET_CUR_PU_WHITE_BALANCE_COMPONENT_AUTO_CONTROL 0x812DU +#define VIDEO_GET_CUR_PU_DIGITAL_MULTIPLIER_CONTROL 0x812EU +#define VIDEO_GET_CUR_PU_DIGITAL_MULTIPLIER_LIMIT_CONTROL 0x812FU +#define VIDEO_GET_CUR_PU_HUE_AUTO_CONTROL 0x8130U +#define VIDEO_GET_CUR_PU_ANALOG_VIDEO_STANDARD_CONTROL 0x8131U +#define VIDEO_GET_CUR_PU_ANALOG_LOCK_STATUS_CONTROL 0x8132U +#if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5 +#define VIDEO_GET_CUR_PU_CONTRAST_AUTO_CONTROL 0x8133U +#endif + +#define VIDEO_GET_CUR_CT_SCANNING_MODE_CONTROL 0x8141U +#define VIDEO_GET_CUR_CT_AE_MODE_CONTROL 0x8142U +#define VIDEO_GET_CUR_CT_AE_PRIORITY_CONTROL 0x8143U +#define VIDEO_GET_CUR_CT_EXPOSURE_TIME_ABSOLUTE_CONTROL 0x8144U +#define VIDEO_GET_CUR_CT_EXPOSURE_TIME_RELATIVE_CONTROL 0x8145U +#define VIDEO_GET_CUR_CT_FOCUS_ABSOLUTE_CONTROL 0x8146U +#define VIDEO_GET_CUR_CT_FOCUS_RELATIVE_CONTROL 0x8147U +#define VIDEO_GET_CUR_CT_FOCUS_AUTO_CONTROL 0x8148U +#define VIDEO_GET_CUR_CT_IRIS_ABSOLUTE_CONTROL 0x8149U +#define VIDEO_GET_CUR_CT_IRIS_RELATIVE_CONTROL 0x814AU +#define VIDEO_GET_CUR_CT_ZOOM_ABSOLUTE_CONTROL 0x814BU +#define VIDEO_GET_CUR_CT_ZOOM_RELATIVE_CONTROL 0x814CU +#define VIDEO_GET_CUR_CT_PANTILT_ABSOLUTE_CONTROL 0x814DU +#define VIDEO_GET_CUR_CT_PANTILT_RELATIVE_CONTROL 0x814EU +#define VIDEO_GET_CUR_CT_ROLL_ABSOLUTE_CONTROL 0x814FU +#define VIDEO_GET_CUR_CT_ROLL_RELATIVE_CONTROL 0x8150U +#define VIDEO_GET_CUR_CT_PRIVACY_CONTROL 0x8151U +#if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5 +#define VIDEO_GET_CUR_CT_FOCUS_SIMPLE_CONTROL 0x8152U +#define VIDEO_GET_CUR_CT_DIGITAL_WINDOW_CONTROL 0x8153U +#define VIDEO_GET_CUR_CT_REGION_OF_INTEREST_CONTROL 0x8154U +#endif + +#define VIDEO_GET_CUR_VS_PROBE_CONTROL 0x8161U +#define VIDEO_GET_CUR_VS_COMMIT_CONTROL 0x8162U +#define VIDEO_GET_CUR_VS_STILL_PROBE_CONTROL 0x8163U +#define VIDEO_GET_CUR_VS_STILL_COMMIT_CONTROL 0x8164U +#define VIDEO_GET_CUR_VS_STILL_IMAGE_TRIGGER_CONTROL 0x8165U +#define VIDEO_GET_CUR_VS_STREAM_ERROR_CODE_CONTROL 0x8166U +#define VIDEO_GET_CUR_VS_GENERATE_KEY_FRAME_CONTROL 0x8167U +#define VIDEO_GET_CUR_VS_UPDATE_FRAME_SEGMENT_CONTROL 0x8168U +#define VIDEO_GET_CUR_VS_SYNCH_DELAY_CONTROL 0x8169U + +#if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5 +#define VIDEO_GET_CUR_EU_SELECT_LAYER_CONTROL 0x8181U +#define VIDEO_GET_CUR_EU_PROFILE_TOOLSET_CONTROL 0x8182U +#define VIDEO_GET_CUR_EU_VIDEO_RESOLUTION_CONTROL 0x8183U +#define VIDEO_GET_CUR_EU_MIN_FRAME_INTERVAL_CONTROL 0x8184U +#define VIDEO_GET_CUR_EU_SLICE_MODE_CONTROL 0x8185U +#define VIDEO_GET_CUR_EU_RATE_CONTROL_MODE_CONTROL 0x8186U +#define VIDEO_GET_CUR_EU_AVERAGE_BITRATE_CONTROL 0x8187U +#define VIDEO_GET_CUR_EU_CPB_SIZE_CONTROL 0x8188U +#define VIDEO_GET_CUR_EU_PEAK_BIT_RATE_CONTROL 0x8189U +#define VIDEO_GET_CUR_EU_QUANTIZATION_PARAMS_CONTROL 0x818AU +#define VIDEO_GET_CUR_EU_SYNC_REF_FRAME_CONTROL 0x818BU +#define VIDEO_GET_CUR_EU_LTR_BUFFER_CONTROL 0x818CU +#define VIDEO_GET_CUR_EU_LTR_PICTURE_CONTROL 0x818DU +#define VIDEO_GET_CUR_EU_LTR_VALIDATION_CONTROL 0x818EU +#define VIDEO_GET_CUR_EU_LEVEL_IDC_LIMIT_CONTROL 0x818FU +#define VIDEO_GET_CUR_EU_SEI_PAYLOADTYPE_CONTROL 0x8190U +#define VIDEO_GET_CUR_EU_QP_RANGE_CONTROL 0x8191U +#define VIDEO_GET_CUR_EU_PRIORITY_CONTROL 0x8192U +#define VIDEO_GET_CUR_EU_START_OR_STOP_LAYER_CONTROL 0x8193U +#define VIDEO_GET_CUR_EU_ERROR_RESILIENCY_CONTROL 0x8194U +#endif + +/*! @brief Video device class-specific request GET MIN COMMAND */ +#define VIDEO_GET_MIN_PU_BACKLIGHT_COMPENSATION_CONTROL 0x8221U +#define VIDEO_GET_MIN_PU_BRIGHTNESS_CONTROL 0x8222U +#define VIDEO_GET_MIN_PU_CONTRACT_CONTROL 0x8223U +#define VIDEO_GET_MIN_PU_GAIN_CONTROL 0x8224U +#define VIDEO_GET_MIN_PU_HUE_CONTROL 0x8226U +#define VIDEO_GET_MIN_PU_SATURATION_CONTROL 0x8227U +#define VIDEO_GET_MIN_PU_SHARRNESS_CONTROL 0x8228U +#define VIDEO_GET_MIN_PU_GAMMA_CONTROL 0x8229U +#define VIDEO_GET_MIN_PU_WHITE_BALANCE_TEMPERATURE_CONTROL 0x822AU +#define VIDEO_GET_MIN_PU_WHITE_BALANCE_COMPONENT_CONTROL 0x822CU +#define VIDEO_GET_MIN_PU_DIGITAL_MULTIPLIER_CONTROL 0x822EU +#define VIDEO_GET_MIN_PU_DIGITAL_MULTIPLIER_LIMIT_CONTROL 0x822FU + +#define VIDEO_GET_MIN_CT_EXPOSURE_TIME_ABSOLUTE_CONTROL 0x8244U +#define VIDEO_GET_MIN_CT_FOCUS_ABSOLUTE_CONTROL 0x8246U +#define VIDEO_GET_MIN_CT_FOCUS_RELATIVE_CONTROL 0x8247U +#define VIDEO_GET_MIN_CT_IRIS_ABSOLUTE_CONTROL 0x8249U +#define VIDEO_GET_MIN_CT_ZOOM_ABSOLUTE_CONTROL 0x824BU +#define VIDEO_GET_MIN_CT_ZOOM_RELATIVE_CONTROL 0x824CU +#define VIDEO_GET_MIN_CT_PANTILT_ABSOLUTE_CONTROL 0x824DU +#define VIDEO_GET_MIN_CT_PANTILT_RELATIVE_CONTROL 0x824EU +#define VIDEO_GET_MIN_CT_ROLL_ABSOLUTE_CONTROL 0x824FU +#define VIDEO_GET_MIN_CT_ROLL_RELATIVE_CONTROL 0x8250U +#if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5 +#define VIDEO_GET_MIN_CT_DIGITAL_WINDOW_CONTROL 0x8251U +#define VIDEO_GET_MIN_CT_REGION_OF_INTEREST_CONTROL 0x8252U +#endif + +#define VIDEO_GET_MIN_VS_PROBE_CONTROL 0x8261U +#define VIDEO_GET_MIN_VS_STILL_PROBE_CONTROL 0x8263U +#define VIDEO_GET_MIN_VS_UPDATE_FRAME_SEGMENT_CONTROL 0x8268U +#define VIDEO_GET_MIN_VS_SYNCH_DELAY_CONTROL 0x8269U + +#if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5 +#define VIDEO_GET_MIN_EU_VIDEO_RESOLUTION_CONTROL 0x8283U +#define VIDEO_GET_MIN_EU_MIN_FRAME_INTERVAL_CONTROL 0x8284U +#define VIDEO_GET_MIN_EU_SLICE_MODE_CONTROL 0x8285U +#define VIDEO_GET_MIN_EU_AVERAGE_BITRATE_CONTROL 0x8287U +#define VIDEO_GET_MIN_EU_CPB_SIZE_CONTROL 0x8288U +#define VIDEO_GET_MIN_EU_PEAK_BIT_RATE_CONTROL 0x8289U +#define VIDEO_GET_MIN_EU_QUANTIZATION_PARAMS_CONTROL 0x828AU +#define VIDEO_GET_MIN_EU_SYNC_REF_FRAME_CONTROL 0x828BU +#define VIDEO_GET_MIN_EU_LEVEL_IDC_LIMIT_CONTROL 0x828FU +#define VIDEO_GET_MIN_EU_SEI_PAYLOADTYPE_CONTROL 0x8290U +#define VIDEO_GET_MIN_EU_QP_RANGE_CONTROL 0x8291U +#endif + +/*! @brief Video device class-specific request GET MAX COMMAND */ +#define VIDEO_GET_MAX_PU_BACKLIGHT_COMPENSATION_CONTROL 0x8321U +#define VIDEO_GET_MAX_PU_BRIGHTNESS_CONTROL 0x8322U +#define VIDEO_GET_MAX_PU_CONTRACT_CONTROL 0x8323U +#define VIDEO_GET_MAX_PU_GAIN_CONTROL 0x8324U +#define VIDEO_GET_MAX_PU_HUE_CONTROL 0x8326U +#define VIDEO_GET_MAX_PU_SATURATION_CONTROL 0x8327U +#define VIDEO_GET_MAX_PU_SHARRNESS_CONTROL 0x8328U +#define VIDEO_GET_MAX_PU_GAMMA_CONTROL 0x8329U +#define VIDEO_GET_MAX_PU_WHITE_BALANCE_TEMPERATURE_CONTROL 0x832AU +#define VIDEO_GET_MAX_PU_WHITE_BALANCE_COMPONENT_CONTROL 0x832CU +#define VIDEO_GET_MAX_PU_DIGITAL_MULTIPLIER_CONTROL 0x832EU +#define VIDEO_GET_MAX_PU_DIGITAL_MULTIPLIER_LIMIT_CONTROL 0x832FU + +#define VIDEO_GET_MAX_CT_EXPOSURE_TIME_ABSOLUTE_CONTROL 0x8344U +#define VIDEO_GET_MAX_CT_FOCUS_ABSOLUTE_CONTROL 0x8346U +#define VIDEO_GET_MAX_CT_FOCUS_RELATIVE_CONTROL 0x8347U +#define VIDEO_GET_MAX_CT_IRIS_ABSOLUTE_CONTROL 0x8349U +#define VIDEO_GET_MAX_CT_ZOOM_ABSOLUTE_CONTROL 0x834BU +#define VIDEO_GET_MAX_CT_ZOOM_RELATIVE_CONTROL 0x834CU +#define VIDEO_GET_MAX_CT_PANTILT_ABSOLUTE_CONTROL 0x834DU +#define VIDEO_GET_MAX_CT_PANTILT_RELATIVE_CONTROL 0x834EU +#define VIDEO_GET_MAX_CT_ROLL_ABSOLUTE_CONTROL 0x834FU +#define VIDEO_GET_MAX_CT_ROLL_RELATIVE_CONTROL 0x8350U +#if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5 +#define VIDEO_GET_MAX_CT_DIGITAL_WINDOW_CONTROL 0x8351U +#define VIDEO_GET_MAX_CT_REGION_OF_INTEREST_CONTROL 0x8352U +#endif + +#define VIDEO_GET_MAX_VS_PROBE_CONTROL 0x8361U +#define VIDEO_GET_MAX_VS_STILL_PROBE_CONTROL 0x8363U +#define VIDEO_GET_MAX_VS_UPDATE_FRAME_SEGMENT_CONTROL 0x8368U +#define VIDEO_GET_MAX_VS_SYNCH_DELAY_CONTROL 0x8369U + +#if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5 +#define VIDEO_GET_MAX_EU_VIDEO_RESOLUTION_CONTROL 0x8383U +#define VIDEO_GET_MAX_EU_MIN_FRAME_INTERVAL_CONTROL 0x8384U +#define VIDEO_GET_MAX_EU_SLICE_MODE_CONTROL 0x8385U +#define VIDEO_GET_MAX_EU_AVERAGE_BITRATE_CONTROL 0x8387U +#define VIDEO_GET_MAX_EU_CPB_SIZE_CONTROL 0x8388U +#define VIDEO_GET_MAX_EU_PEAK_BIT_RATE_CONTROL 0x8389U +#define VIDEO_GET_MAX_EU_QUANTIZATION_PARAMS_CONTROL 0x838AU +#define VIDEO_GET_MAX_EU_SYNC_REF_FRAME_CONTROL 0x838BU +#define VIDEO_GET_MAX_EU_LTR_BUFFER_CONTROL 0x838CU +#define VIDEO_GET_MAX_EU_LEVEL_IDC_LIMIT_CONTROL 0x838FU +#define VIDEO_GET_MAX_EU_SEI_PAYLOADTYPE_CONTROL 0x8390U +#define VIDEO_GET_MAX_EU_QP_RANGE_CONTROL 0x8391U +#endif + +/*! @brief Video device class-specific request GET RES COMMAND */ +#define VIDEO_GET_RES_PU_BACKLIGHT_COMPENSATION_CONTROL 0x8421U +#define VIDEO_GET_RES_PU_BRIGHTNESS_CONTROL 0x8422U +#define VIDEO_GET_RES_PU_CONTRACT_CONTROL 0x8423U +#define VIDEO_GET_RES_PU_GAIN_CONTROL 0x8424U +#define VIDEO_GET_RES_PU_HUE_CONTROL 0x8426U +#define VIDEO_GET_RES_PU_SATURATION_CONTROL 0x8427U +#define VIDEO_GET_RES_PU_SHARRNESS_CONTROL 0x8428U +#define VIDEO_GET_RES_PU_GAMMA_CONTROL 0x8429U +#define VIDEO_GET_RES_PU_WHITE_BALANCE_TEMPERATURE_CONTROL 0x842AU +#define VIDEO_GET_RES_PU_WHITE_BALANCE_COMPONENT_CONTROL 0x842CU +#define VIDEO_GET_RES_PU_DIGITAL_MULTIPLIER_CONTROL 0x842EU +#define VIDEO_GET_RES_PU_DIGITAL_MULTIPLIER_LIMIT_CONTROL 0x842FU + +#define VIDEO_GET_RES_CT_AE_MODE_CONTROL 0x8442U +#define VIDEO_GET_RES_CT_EXPOSURE_TIME_ABSOLUTE_CONTROL 0x8444U +#define VIDEO_GET_RES_CT_FOCUS_ABSOLUTE_CONTROL 0x8446U +#define VIDEO_GET_RES_CT_FOCUS_RELATIVE_CONTROL 0x8447U +#define VIDEO_GET_RES_CT_IRIS_ABSOLUTE_CONTROL 0x8449U +#define VIDEO_GET_RES_CT_ZOOM_ABSOLUTE_CONTROL 0x844BU +#define VIDEO_GET_RES_CT_ZOOM_RELATIVE_CONTROL 0x844CU +#define VIDEO_GET_RES_CT_PANTILT_ABSOLUTE_CONTROL 0x844DU +#define VIDEO_GET_RES_CT_PANTILT_RELATIVE_CONTROL 0x844EU +#define VIDEO_GET_RES_CT_ROLL_ABSOLUTE_CONTROL 0x844FU +#define VIDEO_GET_RES_CT_ROLL_RELATIVE_CONTROL 0x8450U + +#define VIDEO_GET_RES_VS_PROBE_CONTROL 0x8461U +#define VIDEO_GET_RES_VS_STILL_PROBE_CONTROL 0x8463U +#define VIDEO_GET_RES_VS_UPDATE_FRAME_SEGMENT_CONTROL 0x8468U +#define VIDEO_GET_RES_VS_SYNCH_DELAY_CONTROL 0x8469U + +#if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5 +#define VIDEO_GET_RES_EU_AVERAGE_BITRATE_CONTROL 0x8487U +#define VIDEO_GET_RES_EU_CPB_SIZE_CONTROL 0x8488U +#define VIDEO_GET_RES_EU_PEAK_BIT_RATE_CONTROL 0x8489U +#define VIDEO_GET_RES_EU_QUANTIZATION_PARAMS_CONTROL 0x848AU +#define VIDEO_GET_RES_EU_ERROR_RESILIENCY_CONTROL 0x8494U +#endif + +/*! @brief Video device class-specific request GET LEN COMMAND */ + +#define VIDEO_GET_LEN_VS_PROBE_CONTROL 0x8561U +#define VIDEO_GET_LEN_VS_COMMIT_CONTROL 0x8562U +#define VIDEO_GET_LEN_VS_STILL_PROBE_CONTROL 0x8563U +#define VIDEO_GET_LEN_VS_STILL_COMMIT_CONTROL 0x8564U + +#if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5 +#define VIDEO_GET_LEN_EU_SELECT_LAYER_CONTROL 0x8581U +#define VIDEO_GET_LEN_EU_PROFILE_TOOLSET_CONTROL 0x8582U +#define VIDEO_GET_LEN_EU_VIDEO_RESOLUTION_CONTROL 0x8583U +#define VIDEO_GET_LEN_EU_MIN_FRAME_INTERVAL_CONTROL 0x8584U +#define VIDEO_GET_LEN_EU_SLICE_MODE_CONTROL 0x8585U +#define VIDEO_GET_LEN_EU_RATE_CONTROL_MODE_CONTROL 0x8586U +#define VIDEO_GET_LEN_EU_AVERAGE_BITRATE_CONTROL 0x8587U +#define VIDEO_GET_LEN_EU_CPB_SIZE_CONTROL 0x8588U +#define VIDEO_GET_LEN_EU_PEAK_BIT_RATE_CONTROL 0x8589U +#define VIDEO_GET_LEN_EU_QUANTIZATION_PARAMS_CONTROL 0x858AU +#define VIDEO_GET_LEN_EU_SYNC_REF_FRAME_CONTROL 0x858BU +#define VIDEO_GET_LEN_EU_LTR_BUFFER_CONTROL 0x858CU +#define VIDEO_GET_LEN_EU_LTR_PICTURE_CONTROL 0x858DU +#define VIDEO_GET_LEN_EU_LTR_VALIDATION_CONTROL 0x858EU +#define VIDEO_GET_LEN_EU_QP_RANGE_CONTROL 0x8591U +#define VIDEO_GET_LEN_EU_PRIORITY_CONTROL 0x8592U +#define VIDEO_GET_LEN_EU_START_OR_STOP_LAYER_CONTROL 0x8593U +#endif + +/*! @brief Video device class-specific request GET INFO COMMAND */ +#define VIDEO_GET_INFO_VC_POWER_MODE_CONTROL 0x8601U +#define VIDEO_GET_INFO_VC_ERROR_CODE_CONTROL 0x8602U + +#define VIDEO_GET_INFO_PU_BACKLIGHT_COMPENSATION_CONTROL 0x8621U +#define VIDEO_GET_INFO_PU_BRIGHTNESS_CONTROL 0x8622U +#define VIDEO_GET_INFO_PU_CONTRACT_CONTROL 0x8623U +#define VIDEO_GET_INFO_PU_GAIN_CONTROL 0x8624U +#define VIDEO_GET_INFO_PU_POWER_LINE_FREQUENCY_CONTROL 0x8625U +#define VIDEO_GET_INFO_PU_HUE_CONTROL 0x8626U +#define VIDEO_GET_INFO_PU_SATURATION_CONTROL 0x8627U +#define VIDEO_GET_INFO_PU_SHARRNESS_CONTROL 0x8628U +#define VIDEO_GET_INFO_PU_GAMMA_CONTROL 0x8629U +#define VIDEO_GET_INFO_PU_WHITE_BALANCE_TEMPERATURE_CONTROL 0x862AU +#define VIDEO_GET_INFO_PU_WHITE_BALANCE_TEMPERATURE_AUTO_CONTROL 0x862BU +#define VIDEO_GET_INFO_PU_WHITE_BALANCE_COMPONENT_CONTROL 0x862CU +#define VIDEO_GET_INFO_PU_WHITE_BALANCE_COMPONENT_AUTO_CONTROL 0x862DU +#define VIDEO_GET_INFO_PU_DIGITAL_MULTIPLIER_CONTROL 0x862EU +#define VIDEO_GET_INFO_PU_DIGITAL_MULTIPLIER_LIMIT_CONTROL 0x862FU +#define VIDEO_GET_INFO_PU_HUE_AUTO_CONTROL 0x8630U +#define VIDEO_GET_INFO_PU_ANALOG_VIDEO_STANDARD_CONTROL 0x8631U +#define VIDEO_GET_INFO_PU_ANALOG_LOCK_STATUS_CONTROL 0x8632U +#if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5 +#define VIDEO_GET_INFO_PU_CONTRAST_AUTO_CONTROL 0x8633U +#endif + +#define VIDEO_GET_INFO_CT_SCANNING_MODE_CONTROL 0x8641U +#define VIDEO_GET_INFO_CT_AE_MODE_CONTROL 0x8642U +#define VIDEO_GET_INFO_CT_AE_PRIORITY_CONTROL 0x8643U +#define VIDEO_GET_INFO_CT_EXPOSURE_TIME_ABSOLUTE_CONTROL 0x8644U +#define VIDEO_GET_INFO_CT_EXPOSURE_TIME_RELATIVE_CONTROL 0x8645U +#define VIDEO_GET_INFO_CT_FOCUS_ABSOLUTE_CONTROL 0x8646U +#define VIDEO_GET_INFO_CT_FOCUS_RELATIVE_CONTROL 0x8647U +#define VIDEO_GET_INFO_CT_FOCUS_AUTO_CONTROL 0x8648U +#define VIDEO_GET_INFO_CT_IRIS_ABSOLUTE_CONTROL 0x8649U +#define VIDEO_GET_INFO_CT_IRIS_RELATIVE_CONTROL 0x864AU +#define VIDEO_GET_INFO_CT_ZOOM_ABSOLUTE_CONTROL 0x864BU +#define VIDEO_GET_INFO_CT_ZOOM_RELATIVE_CONTROL 0x864CU +#define VIDEO_GET_INFO_CT_PANTILT_ABSOLUTE_CONTROL 0x864DU +#define VIDEO_GET_INFO_CT_PANTILT_RELATIVE_CONTROL 0x864EU +#define VIDEO_GET_INFO_CT_ROLL_ABSOLUTE_CONTROL 0x864FU +#define VIDEO_GET_INFO_CT_ROLL_RELATIVE_CONTROL 0x8650U +#define VIDEO_GET_INFO_CT_PRIVACY_CONTROL 0x8651U +#if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5 +#define VIDEO_GET_INFO_CT_FOCUS_SIMPLE_CONTROL 0x8652U +#endif + +#define VIDEO_GET_INFO_VS_PROBE_CONTROL 0x8661U +#define VIDEO_GET_INFO_VS_COMMIT_CONTROL 0x8662U +#define VIDEO_GET_INFO_VS_STILL_PROBE_CONTROL 0x8663U +#define VIDEO_GET_INFO_VS_STILL_COMMIT_CONTROL 0x8664U +#define VIDEO_GET_INFO_VS_STILL_IMAGE_TRIGGER_CONTROL 0x8665U +#define VIDEO_GET_INFO_VS_STREAM_ERROR_CODE_CONTROL 0x8666U +#define VIDEO_GET_INFO_VS_GENERATE_KEY_FRAME_CONTROL 0x8667U +#define VIDEO_GET_INFO_VS_UPDATE_FRAME_SEGMENT_CONTROL 0x8668U +#define VIDEO_GET_INFO_VS_SYNCH_DELAY_CONTROL 0x8669U + +#if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5 +#define VIDEO_GET_INFO_EU_SELECT_LAYER_CONTROL 0x8681U +#define VIDEO_GET_INFO_EU_PROFILE_TOOLSET_CONTROL 0x8682U +#define VIDEO_GET_INFO_EU_VIDEO_RESOLUTION_CONTROL 0x8683U +#define VIDEO_GET_INFO_EU_MIN_FRAME_INTERVAL_CONTROL 0x8684U +#define VIDEO_GET_INFO_EU_SLICE_MODE_CONTROL 0x8685U +#define VIDEO_GET_INFO_EU_RATE_CONTROL_MODE_CONTROL 0x8686U +#define VIDEO_GET_INFO_EU_AVERAGE_BITRATE_CONTROL 0x8687U +#define VIDEO_GET_INFO_EU_CPB_SIZE_CONTROL 0x8688U +#define VIDEO_GET_INFO_EU_PEAK_BIT_RATE_CONTROL 0x8689U +#define VIDEO_GET_INFO_EU_QUANTIZATION_PARAMS_CONTROL 0x868AU +#define VIDEO_GET_INFO_EU_SYNC_REF_FRAME_CONTROL 0x868BU +#define VIDEO_GET_INFO_EU_LTR_BUFFER_CONTROL 0x868CU +#define VIDEO_GET_INFO_EU_LTR_PICTURE_CONTROL 0x868DU +#define VIDEO_GET_INFO_EU_LTR_VALIDATION_CONTROL 0x868EU +#define VIDEO_GET_INFO_EU_SEI_PAYLOADTYPE_CONTROL 0x8690U +#define VIDEO_GET_INFO_EU_QP_RANGE_CONTROL 0x8691U +#define VIDEO_GET_INFO_EU_PRIORITY_CONTROL 0x8692U +#define VIDEO_GET_INFO_EU_START_OR_STOP_LAYER_CONTROL 0x8693U +#endif + +/*! @brief Video device class-specific request GET DEF COMMAND */ +#define VIDEO_GET_DEF_PU_BACKLIGHT_COMPENSATION_CONTROL 0x8721U +#define VIDEO_GET_DEF_PU_BRIGHTNESS_CONTROL 0x8722U +#define VIDEO_GET_DEF_PU_CONTRACT_CONTROL 0x8723U +#define VIDEO_GET_DEF_PU_GAIN_CONTROL 0x8724U +#define VIDEO_GET_DEF_PU_POWER_LINE_FREQUENCY_CONTROL 0x8725U +#define VIDEO_GET_DEF_PU_HUE_CONTROL 0x8726U +#define VIDEO_GET_DEF_PU_SATURATION_CONTROL 0x8727U +#define VIDEO_GET_DEF_PU_SHARRNESS_CONTROL 0x8728U +#define VIDEO_GET_DEF_PU_GAMMA_CONTROL 0x8729U +#define VIDEO_GET_DEF_PU_WHITE_BALANCE_TEMPERATURE_CONTROL 0x872AU +#define VIDEO_GET_DEF_PU_WHITE_BALANCE_TEMPERATURE_AUTO_CONTROL 0x872BU +#define VIDEO_GET_DEF_PU_WHITE_BALANCE_COMPONENT_CONTROL 0x872CU +#define VIDEO_GET_DEF_PU_WHITE_BALANCE_COMPONENT_AUTO_CONTROL 0x872DU +#define VIDEO_GET_DEF_PU_DIGITAL_MULTIPLIER_CONTROL 0x872EU +#define VIDEO_GET_DEF_PU_DIGITAL_MULTIPLIER_LIMIT_CONTROL 0x872FU +#define VIDEO_GET_DEF_PU_HUE_AUTO_CONTROL 0x8730U +#if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5 +#define VIDEO_GET_DEF_PU_CONTRAST_AUTO_CONTROL 0x8731U +#endif + +#define VIDEO_GET_DEF_CT_AE_MODE_CONTROL 0x8742U +#define VIDEO_GET_DEF_CT_EXPOSURE_TIME_ABSOLUTE_CONTROL 0x8744U +#define VIDEO_GET_DEF_CT_FOCUS_ABSOLUTE_CONTROL 0x8746U +#define VIDEO_GET_DEF_CT_FOCUS_RELATIVE_CONTROL 0x8747U +#define VIDEO_GET_DEF_CT_FOCUS_AUTO_CONTROL 0x8748U +#define VIDEO_GET_DEF_CT_IRIS_ABSOLUTE_CONTROL 0x8749U +#define VIDEO_GET_DEF_CT_ZOOM_ABSOLUTE_CONTROL 0x874BU +#define VIDEO_GET_DEF_CT_ZOOM_RELATIVE_CONTROL 0x874CU +#define VIDEO_GET_DEF_CT_PANTILT_ABSOLUTE_CONTROL 0x874DU +#define VIDEO_GET_DEF_CT_PANTILT_RELATIVE_CONTROL 0x874EU +#define VIDEO_GET_DEF_CT_ROLL_ABSOLUTE_CONTROL 0x874FU +#define VIDEO_GET_DEF_CT_ROLL_RELATIVE_CONTROL 0x8750U +#if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5 +#define VIDEO_GET_DEF_CT_FOCUS_SIMPLE_CONTROL 0x8751U +#define VIDEO_GET_DEF_CT_DIGITAL_WINDOW_CONTROL 0x8752U +#define VIDEO_GET_DEF_CT_REGION_OF_INTEREST_CONTROL 0x8753U +#endif + +#define VIDEO_GET_DEF_VS_PROBE_CONTROL 0x8761U +#define VIDEO_GET_DEF_VS_STILL_PROBE_CONTROL 0x8763U +#define VIDEO_GET_DEF_VS_UPDATE_FRAME_SEGMENT_CONTROL 0x8768U +#define VIDEO_GET_DEF_VS_SYNCH_DELAY_CONTROL 0x8769U + +#if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5 +#define VIDEO_GET_DEF_EU_PROFILE_TOOLSET_CONTROL 0x8782U +#define VIDEO_GET_DEF_EU_VIDEO_RESOLUTION_CONTROL 0x8783U +#define VIDEO_GET_DEF_EU_MIN_FRAME_INTERVAL_CONTROL 0x8784U +#define VIDEO_GET_DEF_EU_SLICE_MODE_CONTROL 0x8785U +#define VIDEO_GET_DEF_EU_RATE_CONTROL_MODE_CONTROL 0x8786U +#define VIDEO_GET_DEF_EU_AVERAGE_BITRATE_CONTROL 0x8787U +#define VIDEO_GET_DEF_EU_CPB_SIZE_CONTROL 0x8788U +#define VIDEO_GET_DEF_EU_PEAK_BIT_RATE_CONTROL 0x8789U +#define VIDEO_GET_DEF_EU_QUANTIZATION_PARAMS_CONTROL 0x878AU +#define VIDEO_GET_DEF_EU_LTR_BUFFER_CONTROL 0x878CU +#define VIDEO_GET_DEF_EU_LTR_PICTURE_CONTROL 0x878DU +#define VIDEO_GET_DEF_EU_LTR_VALIDATION_CONTROL 0x878EU +#define VIDEO_GET_DEF_EU_LEVEL_IDC_LIMIT_CONTROL 0x878FU +#define VIDEO_GET_DEF_EU_SEI_PAYLOADTYPE_CONTROL 0x8790U +#define VIDEO_GET_DEF_EU_QP_RANGE_CONTROL 0x8791U +#define VIDEO_GET_DEF_EU_ERROR_RESILIENCY_CONTROL 0x8794U +#endif + +/*! @brief Video device class-specific request SET CUR COMMAND */ +#define VIDEO_SET_CUR_VC_POWER_MODE_CONTROL 0x0101U + +#define VIDEO_SET_CUR_PU_BACKLIGHT_COMPENSATION_CONTROL 0x0121U +#define VIDEO_SET_CUR_PU_BRIGHTNESS_CONTROL 0x0122U +#define VIDEO_SET_CUR_PU_CONTRACT_CONTROL 0x0123U +#define VIDEO_SET_CUR_PU_GAIN_CONTROL 0x0124U +#define VIDEO_SET_CUR_PU_POWER_LINE_FREQUENCY_CONTROL 0x0125U +#define VIDEO_SET_CUR_PU_HUE_CONTROL 0x0126U +#define VIDEO_SET_CUR_PU_SATURATION_CONTROL 0x0127U +#define VIDEO_SET_CUR_PU_SHARRNESS_CONTROL 0x0128U +#define VIDEO_SET_CUR_PU_GAMMA_CONTROL 0x0129U +#define VIDEO_SET_CUR_PU_WHITE_BALANCE_TEMPERATURE_CONTROL 0x012AU +#define VIDEO_SET_CUR_PU_WHITE_BALANCE_TEMPERATURE_AUTO_CONTROL 0x012BU +#define VIDEO_SET_CUR_PU_WHITE_BALANCE_COMPONENT_CONTROL 0x012CU +#define VIDEO_SET_CUR_PU_WHITE_BALANCE_COMPONENT_AUTO_CONTROL 0x012DU +#define VIDEO_SET_CUR_PU_DIGITAL_MULTIPLIER_CONTROL 0x012EU +#define VIDEO_SET_CUR_PU_DIGITAL_MULTIPLIER_LIMIT_CONTROL 0x012FU +#define VIDEO_SET_CUR_PU_HUE_AUTO_CONTROL 0x0130U +#if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5 +#define VIDEO_SET_CUR_PU_CONTRAST_AUTO_CONTROL 0x0131U +#endif + +#define VIDEO_SET_CUR_CT_SCANNING_MODE_CONTROL 0x0141U +#define VIDEO_SET_CUR_CT_AE_MODE_CONTROL 0x0142U +#define VIDEO_SET_CUR_CT_AE_PRIORITY_CONTROL 0x0143U +#define VIDEO_SET_CUR_CT_EXPOSURE_TIME_ABSOLUTE_CONTROL 0x0144U +#define VIDEO_SET_CUR_CT_EXPOSURE_TIME_RELATIVE_CONTROL 0x0145U +#define VIDEO_SET_CUR_CT_FOCUS_ABSOLUTE_CONTROL 0x0146U +#define VIDEO_SET_CUR_CT_FOCUS_RELATIVE_CONTROL 0x0147U +#define VIDEO_SET_CUR_CT_FOCUS_AUTO_CONTROL 0x0148U +#define VIDEO_SET_CUR_CT_IRIS_ABSOLUTE_CONTROL 0x0149U +#define VIDEO_SET_CUR_CT_IRIS_RELATIVE_CONTROL 0x014AU +#define VIDEO_SET_CUR_CT_ZOOM_ABSOLUTE_CONTROL 0x014BU +#define VIDEO_SET_CUR_CT_ZOOM_RELATIVE_CONTROL 0x014CU +#define VIDEO_SET_CUR_CT_PANTILT_ABSOLUTE_CONTROL 0x014DU +#define VIDEO_SET_CUR_CT_PANTILT_RELATIVE_CONTROL 0x014EU +#define VIDEO_SET_CUR_CT_ROLL_ABSOLUTE_CONTROL 0x014FU +#define VIDEO_SET_CUR_CT_ROLL_RELATIVE_CONTROL 0x0150U +#define VIDEO_SET_CUR_CT_PRIVACY_CONTROL 0x0151U +#if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5 +#define VIDEO_SET_CUR_CT_FOCUS_SIMPLE_CONTROL 0x0152U +#define VIDEO_SET_CUR_CT_DIGITAL_WINDOW_CONTROL 0x0153U +#define VIDEO_SET_CUR_CT_REGION_OF_INTEREST_CONTROL 0x0154U +#endif + +#define VIDEO_SET_CUR_VS_PROBE_CONTROL 0x0161U +#define VIDEO_SET_CUR_VS_COMMIT_CONTROL 0x0162U +#define VIDEO_SET_CUR_VS_STILL_PROBE_CONTROL 0x0163U +#define VIDEO_SET_CUR_VS_STILL_COMMIT_CONTROL 0x0164U +#define VIDEO_SET_CUR_VS_STILL_IMAGE_TRIGGER_CONTROL 0x0165U +#define VIDEO_SET_CUR_VS_STREAM_ERROR_CODE_CONTROL 0x0166U +#define VIDEO_SET_CUR_VS_GENERATE_KEY_FRAME_CONTROL 0x0167U +#define VIDEO_SET_CUR_VS_UPDATE_FRAME_SEGMENT_CONTROL 0x0168U +#define VIDEO_SET_CUR_VS_SYNCH_DELAY_CONTROL 0x0169U + +#if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5 +#define VIDEO_SET_CUR_EU_SELECT_LAYER_CONTROL 0x0181U +#define VIDEO_SET_CUR_EU_PROFILE_TOOLSET_CONTROL 0x0182U +#define VIDEO_SET_CUR_EU_VIDEO_RESOLUTION_CONTROL 0x0183U +#define VIDEO_SET_CUR_EU_MIN_FRAME_INTERVAL_CONTROL 0x0184U +#define VIDEO_SET_CUR_EU_SLICE_MODE_CONTROL 0x0185U +#define VIDEO_SET_CUR_EU_RATE_CONTROL_MODE_CONTROL 0x0186U +#define VIDEO_SET_CUR_EU_AVERAGE_BITRATE_CONTROL 0x0187U +#define VIDEO_SET_CUR_EU_CPB_SIZE_CONTROL 0x0188U +#define VIDEO_SET_CUR_EU_PEAK_BIT_RATE_CONTROL 0x0189U +#define VIDEO_SET_CUR_EU_QUANTIZATION_PARAMS_CONTROL 0x018AU +#define VIDEO_SET_CUR_EU_SYNC_REF_FRAME_CONTROL 0x018BU +#define VIDEO_SET_CUR_EU_LTR_BUFFER_CONTROL 0x018CU +#define VIDEO_SET_CUR_EU_LTR_PICTURE_CONTROL 0x018DU +#define VIDEO_SET_CUR_EU_LTR_VALIDATION_CONTROL 0x018EU +#define VIDEO_SET_CUR_EU_LEVEL_IDC_LIMIT_CONTROL 0x018FU +#define VIDEO_SET_CUR_EU_SEI_PAYLOADTYPE_CONTROL 0x0190U +#define VIDEO_SET_CUR_EU_QP_RANGE_CONTROL 0x0191U +#define VIDEO_SET_CUR_EU_PRIORITY_CONTROL 0x0192U +#define VIDEO_SET_CUR_EU_START_OR_STOP_LAYER_CONTROL 0x0193U +#define VIDEO_SET_CUR_EU_ERROR_RESILIENCY_CONTROL 0x0194U +#endif + +/*! @brief The payload header structure for MJPEG payload format. */ +struct video_mjpeg_payload_header { + uint8_t bHeaderLength; /*!< The payload header length. */ + union { + uint8_t bmheaderInfo; /*!< The payload header bitmap field. */ + struct + { + uint8_t frameIdentifier : 1U; /*!< Frame Identifier. This bit toggles at each frame start boundary and stays + constant for the rest of the frame.*/ + uint8_t endOfFrame : 1U; /*!< End of Frame. This bit indicates the end of a video frame and is set in the + last video sample that belongs to a frame.*/ + uint8_t + presentationTimeStamp : 1U; /*!< Presentation Time Stamp. This bit, when set, indicates the presence of + a PTS field.*/ + uint8_t sourceClockReference : 1U; /*!< Source Clock Reference. This bit, when set, indicates the presence + of a SCR field.*/ + uint8_t reserved : 1U; /*!< Reserved. Set to 0. */ + uint8_t stillImage : 1U; /*!< Still Image. This bit, when set, identifies a video sample that belongs to a + still image.*/ + uint8_t errorBit : 1U; /*!< Error Bit. This bit, when set, indicates an error in the device streaming.*/ + uint8_t endOfHeader : 1U; /*!< End of Header. This bit, when set, indicates the end of the BFH fields.*/ + } headerInfoBits; + struct + { + uint8_t FID : 1U; /*!< Frame Identifier. This bit toggles at each frame start boundary and stays constant + for the rest of the frame.*/ + uint8_t EOI : 1U; /*!< End of Frame. This bit indicates the end of a video frame and is set in the last + video sample that belongs to a frame.*/ + uint8_t PTS : 1U; /*!< Presentation Time Stamp. This bit, when set, indicates the presence of a PTS field.*/ + uint8_t SCR : 1U; /*!< Source Clock Reference. This bit, when set, indicates the presence of a SCR field.*/ + uint8_t RES : 1U; /*!< Reserved. Set to 0. */ + uint8_t STI : 1U; /*!< Still Image. This bit, when set, identifies a video sample that belongs to a still + image.*/ + uint8_t ERR : 1U; /*!< Error Bit. This bit, when set, indicates an error in the device streaming.*/ + uint8_t EOH : 1U; /*!< End of Header. This bit, when set, indicates the end of the BFH fields.*/ + } headerInfoBitmap; + } headerInfoUnion; + uint32_t dwPresentationTime; /*!< Presentation time stamp (PTS) field.*/ + uint8_t bSourceClockReference[6]; /*!< Source clock reference (SCR) field.*/ +} __PACKED; + +/*! @brief The Video probe and commit controls structure.*/ +struct video_probe_and_commit_controls { + union { + uint8_t bmHint; /*!< Bit-field control indicating to the function what fields shall be kept fixed. */ + struct + { + uint8_t dwFrameInterval : 1U; /*!< dwFrameInterval field.*/ + uint8_t wKeyFrameRate : 1U; /*!< wKeyFrameRate field.*/ + uint8_t wPFrameRate : 1U; /*!< wPFrameRate field.*/ + uint8_t wCompQuality : 1U; /*!< wCompQuality field.*/ + uint8_t wCompWindowSize : 1U; /*!< wCompWindowSize field.*/ + uint8_t reserved : 3U; /*!< Reserved field.*/ + } hintBitmap; + } hintUnion; + union { + uint8_t bmHint; /*!< Bit-field control indicating to the function what fields shall be kept fixed. */ + struct + { + uint8_t reserved : 8U; /*!< Reserved field.*/ + } hintBitmap; + } hintUnion1; + uint8_t bFormatIndex; /*!< Video format index from a format descriptor.*/ + uint8_t bFrameIndex; /*!< Video frame index from a frame descriptor.*/ + uint32_t dwFrameInterval; /*!< Frame interval in 100ns units.*/ + uint16_t wKeyFrameRate; /*!< Key frame rate in key-frame per video-frame units.*/ + uint16_t wPFrameRate; /*!< PFrame rate in PFrame/key frame units.*/ + uint16_t wCompQuality; /*!< Compression quality control in abstract units 0U (lowest) to 10000U (highest).*/ + uint16_t wCompWindowSize; /*!< Window size for average bit rate control.*/ + uint16_t wDelay; /*!< Internal video streaming interface latency in ms from video data capture to presentation on + the USB.*/ + uint32_t dwMaxVideoFrameSize; /*!< Maximum video frame or codec-specific segment size in bytes.*/ + uint32_t dwMaxPayloadTransferSize; /*!< Specifies the maximum number of bytes that the device can transmit or + receive in a single payload transfer.*/ + uint32_t dwClockFrequency; /*!< The device clock frequency in Hz for the specified format. This specifies the + units used for the time information fields in the Video Payload Headers in the data + stream.*/ + uint8_t bmFramingInfo; /*!< Bit-field control supporting the following values: D0 Frame ID, D1 EOF.*/ + uint8_t bPreferedVersion; /*!< The preferred payload format version supported by the host or device for the + specified bFormatIndex value.*/ + uint8_t bMinVersion; /*!< The minimum payload format version supported by the device for the specified bFormatIndex + value.*/ + uint8_t bMaxVersion; /*!< The maximum payload format version supported by the device for the specified bFormatIndex + value.*/ +#if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5 + uint8_t bUsage; /*!< This bitmap enables features reported by the bmUsages field of the Video Frame Descriptor.*/ + uint8_t + bBitDepthLuma; /*!< Represents bit_depth_luma_minus8 + 8U, which must be the same as bit_depth_chroma_minus8 + + 8.*/ + uint8_t bmSettings; /*!< A bitmap of flags that is used to discover and control specific features of a temporally + encoded video stream.*/ + uint8_t bMaxNumberOfRefFramesPlus1; /*!< Host indicates the maximum number of frames stored for use as references.*/ + uint16_t bmRateControlModes; /*!< This field contains 4U sub-fields, each of which is a 4U bit number.*/ + uint64_t bmLayoutPerStream; /*!< This field contains 4U sub-fields, each of which is a 2U byte number.*/ +#endif +} __PACKED; + +/*! @brief The Video still probe and still commit controls structure.*/ +struct video_still_probe_and_commit_controls { + uint8_t bFormatIndex; /*!< Video format index from a format descriptor.*/ + uint8_t bFrameIndex; /*!< Video frame index from a frame descriptor.*/ + uint8_t bCompressionIndex; /*!< Compression index from a frame descriptor.*/ + uint32_t dwMaxVideoFrameSize; /*!< Maximum still image size in bytes.*/ + uint32_t dwMaxPayloadTransferSize; /*!< Specifies the maximum number of bytes that the device can transmit or + receive in a single payload transfer.*/ +} __PACKED; + +#endif /* USB_VIDEO_H_ */ diff --git a/class/video/usbd_video.c b/class/video/usbd_video.c index 6eb2554b..fe18e421 100644 --- a/class/video/usbd_video.c +++ b/class/video/usbd_video.c @@ -100,15 +100,15 @@ int video_class_request_handler(struct usb_setup_packet *setup, uint8_t **data, void video_notify_handler(uint8_t event, void *arg) { switch (event) { - case USB_EVENT_RESET: + case USBD_EVENT_RESET: break; - case USB_EVENT_SOF: + case USBD_EVENT_SOF: usbd_video_sof_callback(); break; - case USB_EVENT_SET_INTERFACE: + case USBD_EVENT_SET_INTERFACE: usbd_video_set_interface_callback(((uint8_t *)arg)[3]); break; diff --git a/class/video/usbd_video.h b/class/video/usbd_video.h index 09c452f5..f68001e5 100644 --- a/class/video/usbd_video.h +++ b/class/video/usbd_video.h @@ -9,807 +9,12 @@ #ifndef _USBD_VIDEO_H_ #define _USBD_VIDEO_H_ +#include "usb_video.h" + #ifdef __cplusplus extern "C" { #endif -#define USB_DEVICE_VIDEO_CLASS_VERSION_1_5 0 - -/*! @brief Video device subclass code */ -#define VIDEO_SC_UNDEFINED 0x00U -#define VIDEO_SC_VIDEOCONTROL 0x01U -#define VIDEO_SC_VIDEOSTREAMING 0x02U -#define VIDEO_SC_VIDEO_INTERFACE_COLLECTION 0x03U - -/*! @brief Video device protocol code */ -#define VIDEO_PC_PROTOCOL_UNDEFINED 0x00U -#define VIDEO_PC_PROTOCOL_15 0x01U - -/*! @brief Video device class-specific descriptor type */ -#define VIDEO_CS_UNDEFINED_DESCRIPTOR_TYPE 0x20U -#define VIDEO_CS_DEVICE_DESCRIPTOR_TYPE 0x21U -#define VIDEO_CS_CONFIGURATION_DESCRIPTOR_TYPE 0x22U -#define VIDEO_CS_STRING_DESCRIPTOR_TYPE 0x23U -#define VIDEO_CS_INTERFACE_DESCRIPTOR_TYPE 0x24U -#define VIDEO_CS_ENDPOINT_DESCRIPTOR_TYPE 0x25U - -/*! @brief Video device class-specific VC interface descriptor subtype */ -#define VIDEO_VC_DESCRIPTOR_UNDEFINED_DESCRIPTOR_SUBTYPE 0x00U -#define VIDEO_VC_HEADER_DESCRIPTOR_SUBTYPE 0x01U -#define VIDEO_VC_INPUT_TERMINAL_DESCRIPTOR_SUBTYPE 0x02U -#define VIDEO_VC_OUTPUT_TERMINAL_DESCRIPTOR_SUBTYPE 0x03U -#define VIDEO_VC_SELECTOR_UNIT_DESCRIPTOR_SUBTYPE 0x04U -#define VIDEO_VC_PROCESSING_UNIT_DESCRIPTOR_SUBTYPE 0x05U -#define VIDEO_VC_EXTENSION_UNIT_DESCRIPTOR_SUBTYPE 0x06U -#define VIDEO_VC_ENCODING_UNIT_DESCRIPTOR_SUBTYPE 0x07U - -/*! @brief Video device class-specific VS interface descriptor subtype */ -#define VIDEO_VS_UNDEFINED_DESCRIPTOR_SUBTYPE 0x00U -#define VIDEO_VS_INPUT_HEADER_DESCRIPTOR_SUBTYPE 0x01U -#define VIDEO_VS_OUTPUT_HEADER_DESCRIPTOR_SUBTYPE 0x02U -#define VIDEO_VS_STILL_IMAGE_FRAME_DESCRIPTOR_SUBTYPE 0x03U -#define VIDEO_VS_FORMAT_UNCOMPRESSED_DESCRIPTOR_SUBTYPE 0x04U -#define VIDEO_VS_FRAME_UNCOMPRESSED_DESCRIPTOR_SUBTYPE 0x05U -#define VIDEO_VS_FORMAT_MJPEG_DESCRIPTOR_SUBTYPE 0x06U -#define VIDEO_VS_FRAME_MJPEG_DESCRIPTOR_SUBTYPE 0x07U -#define VIDEO_VS_FORMAT_MPEG2TS_DESCRIPTOR_SUBTYPE 0x0AU -#define VIDEO_VS_FORMAT_DV_DESCRIPTOR_SUBTYPE 0x0CU -#define VIDEO_VS_COLORFORMAT_DESCRIPTOR_SUBTYPE 0x0DU -#define VIDEO_VS_FORMAT_FRAME_BASED_DESCRIPTOR_SUBTYPE 0x10U -#define VIDEO_VS_FRAME_FRAME_BASED_DESCRIPTOR_SUBTYPE 0x11U -#define VIDEO_VS_FORMAT_STREAM_BASED_DESCRIPTOR_SUBTYPE 0x12U -#define VIDEO_VS_FORMAT_H264_DESCRIPTOR_SUBTYPE 0x13U -#define VIDEO_VS_FRAME_H264_DESCRIPTOR_SUBTYPE 0x14U -#define VIDEO_VS_FORMAT_H264_SIMULCAST_DESCRIPTOR_SUBTYPE 0x15U -#define VIDEO_VS_FORMAT_VP8_DESCRIPTOR_SUBTYPE 0x16U -#define VIDEO_VS_FRAME_VP8_DESCRIPTOR_SUBTYPE 0x17U -#define VIDEO_VS_FORMAT_VP8_SIMULCAST_DESCRIPTOR_SUBTYPE 0x18U - -/*! @brief Video device class-specific VC endpoint descriptor subtype */ -#define VIDEO_EP_UNDEFINED_DESCRIPTOR_SUBTYPE 0x00U -#define VIDEO_EP_GENERAL_DESCRIPTOR_SUBTYPE 0x01U -#define VIDEO_EP_ENDPOINT_DESCRIPTOR_SUBTYPE 0x02U -#define VIDEO_EP_INTERRUPT_DESCRIPTOR_SUBTYPE 0x03U - -/*! @brief Video device class-specific request code */ -#define VIDEO_REQUEST_UNDEFINED 0x00U -#define VIDEO_REQUEST_SET_CUR 0x01U -#define VIDEO_REQUEST_SET_CUR_ALL 0x11U -#define VIDEO_REQUEST_GET_CUR 0x81U -#define VIDEO_REQUEST_GET_MIN 0x82U -#define VIDEO_REQUEST_GET_MAX 0x83U -#define VIDEO_REQUEST_GET_RES 0x84U -#define VIDEO_REQUEST_GET_LEN 0x85U -#define VIDEO_REQUEST_GET_INFO 0x86U -#define VIDEO_REQUEST_GET_DEF 0x87U -#define VIDEO_REQUEST_GET_CUR_ALL 0x91U -#define VIDEO_REQUEST_GET_MIN_ALL 0x92U -#define VIDEO_REQUEST_GET_MAX_ALL 0x93U -#define VIDEO_REQUEST_GET_RES_ALL 0x94U -#define VIDEO_REQUEST_GET_DEF_ALL 0x97U - -/*! @brief Video device class-specific VideoControl interface control selector */ -#define VIDEO_VC_CONTROL_UNDEFINED 0x00U -#define VIDEO_VC_VIDEO_POWER_MODE_CONTROL 0x01U -#define VIDEO_VC_REQUEST_ERROR_CODE_CONTROL 0x02U - -/*! @brief Video device class-specific Terminal control selector */ -#define VIDEO_TE_CONTROL_UNDEFINED 0x00U - -/*! @brief Video device class-specific Selector Unit control selector */ -#define VIDEO_SU_CONTROL_UNDEFINED 0x00U -#define VIDEO_SU_INPUT_SELECT_CONTROL 0x01U - -/*! @brief Video device class-specific Camera Terminal control selector */ -#define VIDEO_CT_CONTROL_UNDEFINED 0x00U -#define VIDEO_CT_SCANNING_MODE_CONTROL 0x01U -#define VIDEO_CT_AE_MODE_CONTROL 0x02U -#define VIDEO_CT_AE_PRIORITY_CONTROL 0x03U -#define VIDEO_CT_EXPOSURE_TIME_ABSOLUTE_CONTROL 0x04U -#define VIDEO_CT_EXPOSURE_TIME_RELATIVE_CONTROL 0x05U -#define VIDEO_CT_FOCUS_ABSOLUTE_CONTROL 0x06U -#define VIDEO_CT_FOCUS_RELATIVE_CONTROL 0x07U -#define VIDEO_CT_FOCUS_AUTO_CONTROL 0x08U -#define VIDEO_CT_IRIS_ABSOLUTE_CONTROL 0x09U -#define VIDEO_CT_IRIS_RELATIVE_CONTROL 0x0AU -#define VIDEO_CT_ZOOM_ABSOLUTE_CONTROL 0x0BU -#define VIDEO_CT_ZOOM_RELATIVE_CONTROL 0x0CU -#define VIDEO_CT_PANTILT_ABSOLUTE_CONTROL 0x0DU -#define VIDEO_CT_PANTILT_RELATIVE_CONTROL 0x0EU -#define VIDEO_CT_ROLL_ABSOLUTE_CONTROL 0x0FU -#define VIDEO_CT_ROLL_RELATIVE_CONTROL 0x10U -#define VIDEO_CT_PRIVACY_CONTROL 0x11U -#define VIDEO_CT_FOCUS_SIMPLE_CONTROL 0x12U -#define VIDEO_CT_WINDOW_CONTROL 0x13U -#define VIDEO_CT_REGION_OF_INTEREST_CONTROL 0x14U - -/*! @brief Video device class-specific Processing Unit control selector */ -#define VIDEO_PU_CONTROL_UNDEFINED 0x00U -#define VIDEO_PU_BACKLIGHT_COMPENSATION_CONTROL 0x01U -#define VIDEO_PU_BRIGHTNESS_CONTROL 0x02U -#define VIDEO_PU_CONTRAST_CONTROL 0x03U -#define VIDEO_PU_GAIN_CONTROL 0x04U -#define VIDEO_PU_POWER_LINE_FREQUENCY_CONTROL 0x05U -#define VIDEO_PU_HUE_CONTROL 0x06U -#define VIDEO_PU_SATURATION_CONTROL 0x07U -#define VIDEO_PU_SHARPNESS_CONTROL 0x08U -#define VIDEO_PU_GAMMA_CONTROL 0x09U -#define VIDEO_PU_WHITE_BALANCE_TEMPERATURE_CONTROL 0x0AU -#define VIDEO_PU_WHITE_BALANCE_TEMPERATURE_AUTO_CONTROL 0x0BU -#define VIDEO_PU_WHITE_BALANCE_COMPONENT_CONTROL 0x0CU -#define VIDEO_PU_WHITE_BALANCE_COMPONENT_AUTO_CONTROL 0x0DU -#define VIDEO_PU_DIGITAL_MULTIPLIER_CONTROL 0x0EU -#define VIDEO_PU_DIGITAL_MULTIPLIER_LIMIT_CONTROL 0x0FU -#define VIDEO_PU_HUE_AUTO_CONTROL 0x10U -#define VIDEO_PU_ANALOG_VIDEO_STANDARD_CONTROL 0x11U -#define VIDEO_PU_ANALOG_LOCK_STATUS_CONTROL 0x12U -#define VIDEO_PU_CONTRAST_AUTO_CONTROL 0x13U - -/*! @brief Video device class-specific Encoding Unit control selector */ -#define VIDEO_EU_CONTROL_UNDEFINED 0x00U -#define VIDEO_EU_SELECT_LAYER_CONTROL 0x01U -#define VIDEO_EU_PROFILE_TOOLSET_CONTROL 0x02U -#define VIDEO_EU_VIDEO_RESOLUTION_CONTROL 0x03U -#define VIDEO_EU_MIN_FRAME_INTERVAL_CONTROL 0x04U -#define VIDEO_EU_SLICE_MODE_CONTROL 0x05U -#define VIDEO_EU_RATE_CONTROL_MODE_CONTROL 0x06U -#define VIDEO_EU_AVERAGE_BITRATE_CONTROL 0x07U -#define VIDEO_EU_CPB_SIZE_CONTROL 0x08U -#define VIDEO_EU_PEAK_BIT_RATE_CONTROL 0x09U -#define VIDEO_EU_QUANTIZATION_PARAMS_CONTROL 0x0AU -#define VIDEO_EU_SYNC_REF_FRAME_CONTROL 0x0BU -#define VIDEO_EU_LTR_BUFFER_ CONTROL0x0CU -#define VIDEO_EU_LTR_PICTURE_CONTROL 0x0DU -#define VIDEO_EU_LTR_VALIDATION_CONTROL 0x0EU -#define VIDEO_EU_LEVEL_IDC_LIMIT_CONTROL 0x0FU -#define VIDEO_EU_SEI_PAYLOADTYPE_CONTROL 0x10U -#define VIDEO_EU_QP_RANGE_CONTROL 0x11U -#define VIDEO_EU_PRIORITY_CONTROL 0x12U -#define VIDEO_EU_START_OR_STOP_LAYER_CONTROL 0x13U -#define VIDEO_EU_ERROR_RESILIENCY_CONTROL 0x14U - -/*! @brief Video device class-specific Extension Unit control selector */ -#define VIDEO_XU_CONTROL_UNDEFINED 0x00U - -/*! @brief Video device class-specific VideoStreaming Interface control selector */ -#define VIDEO_VS_CONTROL_UNDEFINED 0x00U -#define VIDEO_VS_PROBE_CONTROL 0x01U -#define VIDEO_VS_COMMIT_CONTROL 0x02U -#define VIDEO_VS_STILL_PROBE_CONTROL 0x03U -#define VIDEO_VS_STILL_COMMIT_CONTROL 0x04U -#define VIDEO_VS_STILL_IMAGE_TRIGGER_CONTROL 0x05U -#define VIDEO_VS_STREAM_ERROR_CODE_CONTROL 0x06U -#define VIDEO_VS_GENERATE_KEY_FRAME_CONTROL 0x07U -#define VIDEO_VS_UPDATE_FRAME_SEGMENT_CONTROL 0x08U -#define VIDEO_VS_SYNCH_DELAY_CONTROL 0x09U - -/*! @}*/ - -/*! - * @name USB Video class terminal types - * @{ - */ - -/*! @brief Video device USB terminal type */ -#define VIDEO_TT_VENDOR_SPECIFIC 0x0100U -#define VIDEO_TT_STREAMING 0x0101U - -/*! @brief Video device input terminal type */ -#define VIDEO_ITT_VENDOR_SPECIFIC 0x0200U -#define VIDEO_ITT_CAMERA 0x0201U -#define VIDEO_ITT_MEDIA_TRANSPORT_INPUT 0x0202U - -/*! @brief Video device output terminal type */ -#define VIDEO_OTT_VENDOR_SPECIFIC 0x0300U -#define VIDEO_OTT_DISPLAY 0x0301U -#define VIDEO_OTT_MEDIA_TRANSPORT_OUTPUT 0x0302U - -/*! @brief Video device external terminal type */ -#define VIDEO_ET_VENDOR_SPECIFIC 0x0400U -#define VIDEO_ET_COMPOSITE_CONNECTOR 0x0401U -#define VIDEO_ET_SVIDEO_CONNECTOR 0x0402U -#define VIDEO_ET_COMPONENT_CONNECTOR 0x0403U - -/*! @}*/ - -/*! - * @name USB Video class setup request types - * @{ - */ - -/*! @brief Video device class setup request set type */ -#define VIDEO_SET_REQUEST_INTERFACE 0x21U -#define VIDEO_SET_REQUEST_ENDPOINT 0x22U - -/*! @brief Video device class setup request get type */ -#define VIDEO_GET_REQUEST_INTERFACE 0xA1U -#define VIDEO_GET_REQUEST_ENDPOINT 0xA2U - -/*! @}*/ - -/*! @brief Video device still image trigger control */ -#define VIDEO_STILL_IMAGE_TRIGGER_NORMAL_OPERATION 0x00U -#define VIDEO_STILL_IMAGE_TRIGGER_TRANSMIT_STILL_IMAGE 0x01U -#define VIDEO_STILL_IMAGE_TRIGGER_TRANSMIT_STILL_IMAGE_VS_DEDICATED_BULK_PIPE 0x02U -#define VIDEO_STILL_IMAGE_TRIGGER_ABORT_STILL_IMAGE_TRANSMISSION 0x03U - -/*! - * @name USB Video device class-specific request commands - * @{ - */ - -/*! @brief Video device class-specific request GET CUR COMMAND */ -#define VIDEO_GET_CUR_VC_POWER_MODE_CONTROL 0x8101U -#define VIDEO_GET_CUR_VC_ERROR_CODE_CONTROL 0x8102U - -#define VIDEO_GET_CUR_PU_BACKLIGHT_COMPENSATION_CONTROL 0x8121U -#define VIDEO_GET_CUR_PU_BRIGHTNESS_CONTROL 0x8122U -#define VIDEO_GET_CUR_PU_CONTRACT_CONTROL 0x8123U -#define VIDEO_GET_CUR_PU_GAIN_CONTROL 0x8124U -#define VIDEO_GET_CUR_PU_POWER_LINE_FREQUENCY_CONTROL 0x8125U -#define VIDEO_GET_CUR_PU_HUE_CONTROL 0x8126U -#define VIDEO_GET_CUR_PU_SATURATION_CONTROL 0x8127U -#define VIDEO_GET_CUR_PU_SHARRNESS_CONTROL 0x8128U -#define VIDEO_GET_CUR_PU_GAMMA_CONTROL 0x8129U -#define VIDEO_GET_CUR_PU_WHITE_BALANCE_TEMPERATURE_CONTROL 0x812AU -#define VIDEO_GET_CUR_PU_WHITE_BALANCE_TEMPERATURE_AUTO_CONTROL 0x812BU -#define VIDEO_GET_CUR_PU_WHITE_BALANCE_COMPONENT_CONTROL 0x812CU -#define VIDEO_GET_CUR_PU_WHITE_BALANCE_COMPONENT_AUTO_CONTROL 0x812DU -#define VIDEO_GET_CUR_PU_DIGITAL_MULTIPLIER_CONTROL 0x812EU -#define VIDEO_GET_CUR_PU_DIGITAL_MULTIPLIER_LIMIT_CONTROL 0x812FU -#define VIDEO_GET_CUR_PU_HUE_AUTO_CONTROL 0x8130U -#define VIDEO_GET_CUR_PU_ANALOG_VIDEO_STANDARD_CONTROL 0x8131U -#define VIDEO_GET_CUR_PU_ANALOG_LOCK_STATUS_CONTROL 0x8132U -#if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5 -#define VIDEO_GET_CUR_PU_CONTRAST_AUTO_CONTROL 0x8133U -#endif - -#define VIDEO_GET_CUR_CT_SCANNING_MODE_CONTROL 0x8141U -#define VIDEO_GET_CUR_CT_AE_MODE_CONTROL 0x8142U -#define VIDEO_GET_CUR_CT_AE_PRIORITY_CONTROL 0x8143U -#define VIDEO_GET_CUR_CT_EXPOSURE_TIME_ABSOLUTE_CONTROL 0x8144U -#define VIDEO_GET_CUR_CT_EXPOSURE_TIME_RELATIVE_CONTROL 0x8145U -#define VIDEO_GET_CUR_CT_FOCUS_ABSOLUTE_CONTROL 0x8146U -#define VIDEO_GET_CUR_CT_FOCUS_RELATIVE_CONTROL 0x8147U -#define VIDEO_GET_CUR_CT_FOCUS_AUTO_CONTROL 0x8148U -#define VIDEO_GET_CUR_CT_IRIS_ABSOLUTE_CONTROL 0x8149U -#define VIDEO_GET_CUR_CT_IRIS_RELATIVE_CONTROL 0x814AU -#define VIDEO_GET_CUR_CT_ZOOM_ABSOLUTE_CONTROL 0x814BU -#define VIDEO_GET_CUR_CT_ZOOM_RELATIVE_CONTROL 0x814CU -#define VIDEO_GET_CUR_CT_PANTILT_ABSOLUTE_CONTROL 0x814DU -#define VIDEO_GET_CUR_CT_PANTILT_RELATIVE_CONTROL 0x814EU -#define VIDEO_GET_CUR_CT_ROLL_ABSOLUTE_CONTROL 0x814FU -#define VIDEO_GET_CUR_CT_ROLL_RELATIVE_CONTROL 0x8150U -#define VIDEO_GET_CUR_CT_PRIVACY_CONTROL 0x8151U -#if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5 -#define VIDEO_GET_CUR_CT_FOCUS_SIMPLE_CONTROL 0x8152U -#define VIDEO_GET_CUR_CT_DIGITAL_WINDOW_CONTROL 0x8153U -#define VIDEO_GET_CUR_CT_REGION_OF_INTEREST_CONTROL 0x8154U -#endif - -#define VIDEO_GET_CUR_VS_PROBE_CONTROL 0x8161U -#define VIDEO_GET_CUR_VS_COMMIT_CONTROL 0x8162U -#define VIDEO_GET_CUR_VS_STILL_PROBE_CONTROL 0x8163U -#define VIDEO_GET_CUR_VS_STILL_COMMIT_CONTROL 0x8164U -#define VIDEO_GET_CUR_VS_STILL_IMAGE_TRIGGER_CONTROL 0x8165U -#define VIDEO_GET_CUR_VS_STREAM_ERROR_CODE_CONTROL 0x8166U -#define VIDEO_GET_CUR_VS_GENERATE_KEY_FRAME_CONTROL 0x8167U -#define VIDEO_GET_CUR_VS_UPDATE_FRAME_SEGMENT_CONTROL 0x8168U -#define VIDEO_GET_CUR_VS_SYNCH_DELAY_CONTROL 0x8169U - -#if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5 -#define VIDEO_GET_CUR_EU_SELECT_LAYER_CONTROL 0x8181U -#define VIDEO_GET_CUR_EU_PROFILE_TOOLSET_CONTROL 0x8182U -#define VIDEO_GET_CUR_EU_VIDEO_RESOLUTION_CONTROL 0x8183U -#define VIDEO_GET_CUR_EU_MIN_FRAME_INTERVAL_CONTROL 0x8184U -#define VIDEO_GET_CUR_EU_SLICE_MODE_CONTROL 0x8185U -#define VIDEO_GET_CUR_EU_RATE_CONTROL_MODE_CONTROL 0x8186U -#define VIDEO_GET_CUR_EU_AVERAGE_BITRATE_CONTROL 0x8187U -#define VIDEO_GET_CUR_EU_CPB_SIZE_CONTROL 0x8188U -#define VIDEO_GET_CUR_EU_PEAK_BIT_RATE_CONTROL 0x8189U -#define VIDEO_GET_CUR_EU_QUANTIZATION_PARAMS_CONTROL 0x818AU -#define VIDEO_GET_CUR_EU_SYNC_REF_FRAME_CONTROL 0x818BU -#define VIDEO_GET_CUR_EU_LTR_BUFFER_CONTROL 0x818CU -#define VIDEO_GET_CUR_EU_LTR_PICTURE_CONTROL 0x818DU -#define VIDEO_GET_CUR_EU_LTR_VALIDATION_CONTROL 0x818EU -#define VIDEO_GET_CUR_EU_LEVEL_IDC_LIMIT_CONTROL 0x818FU -#define VIDEO_GET_CUR_EU_SEI_PAYLOADTYPE_CONTROL 0x8190U -#define VIDEO_GET_CUR_EU_QP_RANGE_CONTROL 0x8191U -#define VIDEO_GET_CUR_EU_PRIORITY_CONTROL 0x8192U -#define VIDEO_GET_CUR_EU_START_OR_STOP_LAYER_CONTROL 0x8193U -#define VIDEO_GET_CUR_EU_ERROR_RESILIENCY_CONTROL 0x8194U -#endif - -/*! @brief Video device class-specific request GET MIN COMMAND */ -#define VIDEO_GET_MIN_PU_BACKLIGHT_COMPENSATION_CONTROL 0x8221U -#define VIDEO_GET_MIN_PU_BRIGHTNESS_CONTROL 0x8222U -#define VIDEO_GET_MIN_PU_CONTRACT_CONTROL 0x8223U -#define VIDEO_GET_MIN_PU_GAIN_CONTROL 0x8224U -#define VIDEO_GET_MIN_PU_HUE_CONTROL 0x8226U -#define VIDEO_GET_MIN_PU_SATURATION_CONTROL 0x8227U -#define VIDEO_GET_MIN_PU_SHARRNESS_CONTROL 0x8228U -#define VIDEO_GET_MIN_PU_GAMMA_CONTROL 0x8229U -#define VIDEO_GET_MIN_PU_WHITE_BALANCE_TEMPERATURE_CONTROL 0x822AU -#define VIDEO_GET_MIN_PU_WHITE_BALANCE_COMPONENT_CONTROL 0x822CU -#define VIDEO_GET_MIN_PU_DIGITAL_MULTIPLIER_CONTROL 0x822EU -#define VIDEO_GET_MIN_PU_DIGITAL_MULTIPLIER_LIMIT_CONTROL 0x822FU - -#define VIDEO_GET_MIN_CT_EXPOSURE_TIME_ABSOLUTE_CONTROL 0x8244U -#define VIDEO_GET_MIN_CT_FOCUS_ABSOLUTE_CONTROL 0x8246U -#define VIDEO_GET_MIN_CT_FOCUS_RELATIVE_CONTROL 0x8247U -#define VIDEO_GET_MIN_CT_IRIS_ABSOLUTE_CONTROL 0x8249U -#define VIDEO_GET_MIN_CT_ZOOM_ABSOLUTE_CONTROL 0x824BU -#define VIDEO_GET_MIN_CT_ZOOM_RELATIVE_CONTROL 0x824CU -#define VIDEO_GET_MIN_CT_PANTILT_ABSOLUTE_CONTROL 0x824DU -#define VIDEO_GET_MIN_CT_PANTILT_RELATIVE_CONTROL 0x824EU -#define VIDEO_GET_MIN_CT_ROLL_ABSOLUTE_CONTROL 0x824FU -#define VIDEO_GET_MIN_CT_ROLL_RELATIVE_CONTROL 0x8250U -#if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5 -#define VIDEO_GET_MIN_CT_DIGITAL_WINDOW_CONTROL 0x8251U -#define VIDEO_GET_MIN_CT_REGION_OF_INTEREST_CONTROL 0x8252U -#endif - -#define VIDEO_GET_MIN_VS_PROBE_CONTROL 0x8261U -#define VIDEO_GET_MIN_VS_STILL_PROBE_CONTROL 0x8263U -#define VIDEO_GET_MIN_VS_UPDATE_FRAME_SEGMENT_CONTROL 0x8268U -#define VIDEO_GET_MIN_VS_SYNCH_DELAY_CONTROL 0x8269U - -#if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5 -#define VIDEO_GET_MIN_EU_VIDEO_RESOLUTION_CONTROL 0x8283U -#define VIDEO_GET_MIN_EU_MIN_FRAME_INTERVAL_CONTROL 0x8284U -#define VIDEO_GET_MIN_EU_SLICE_MODE_CONTROL 0x8285U -#define VIDEO_GET_MIN_EU_AVERAGE_BITRATE_CONTROL 0x8287U -#define VIDEO_GET_MIN_EU_CPB_SIZE_CONTROL 0x8288U -#define VIDEO_GET_MIN_EU_PEAK_BIT_RATE_CONTROL 0x8289U -#define VIDEO_GET_MIN_EU_QUANTIZATION_PARAMS_CONTROL 0x828AU -#define VIDEO_GET_MIN_EU_SYNC_REF_FRAME_CONTROL 0x828BU -#define VIDEO_GET_MIN_EU_LEVEL_IDC_LIMIT_CONTROL 0x828FU -#define VIDEO_GET_MIN_EU_SEI_PAYLOADTYPE_CONTROL 0x8290U -#define VIDEO_GET_MIN_EU_QP_RANGE_CONTROL 0x8291U -#endif - -/*! @brief Video device class-specific request GET MAX COMMAND */ -#define VIDEO_GET_MAX_PU_BACKLIGHT_COMPENSATION_CONTROL 0x8321U -#define VIDEO_GET_MAX_PU_BRIGHTNESS_CONTROL 0x8322U -#define VIDEO_GET_MAX_PU_CONTRACT_CONTROL 0x8323U -#define VIDEO_GET_MAX_PU_GAIN_CONTROL 0x8324U -#define VIDEO_GET_MAX_PU_HUE_CONTROL 0x8326U -#define VIDEO_GET_MAX_PU_SATURATION_CONTROL 0x8327U -#define VIDEO_GET_MAX_PU_SHARRNESS_CONTROL 0x8328U -#define VIDEO_GET_MAX_PU_GAMMA_CONTROL 0x8329U -#define VIDEO_GET_MAX_PU_WHITE_BALANCE_TEMPERATURE_CONTROL 0x832AU -#define VIDEO_GET_MAX_PU_WHITE_BALANCE_COMPONENT_CONTROL 0x832CU -#define VIDEO_GET_MAX_PU_DIGITAL_MULTIPLIER_CONTROL 0x832EU -#define VIDEO_GET_MAX_PU_DIGITAL_MULTIPLIER_LIMIT_CONTROL 0x832FU - -#define VIDEO_GET_MAX_CT_EXPOSURE_TIME_ABSOLUTE_CONTROL 0x8344U -#define VIDEO_GET_MAX_CT_FOCUS_ABSOLUTE_CONTROL 0x8346U -#define VIDEO_GET_MAX_CT_FOCUS_RELATIVE_CONTROL 0x8347U -#define VIDEO_GET_MAX_CT_IRIS_ABSOLUTE_CONTROL 0x8349U -#define VIDEO_GET_MAX_CT_ZOOM_ABSOLUTE_CONTROL 0x834BU -#define VIDEO_GET_MAX_CT_ZOOM_RELATIVE_CONTROL 0x834CU -#define VIDEO_GET_MAX_CT_PANTILT_ABSOLUTE_CONTROL 0x834DU -#define VIDEO_GET_MAX_CT_PANTILT_RELATIVE_CONTROL 0x834EU -#define VIDEO_GET_MAX_CT_ROLL_ABSOLUTE_CONTROL 0x834FU -#define VIDEO_GET_MAX_CT_ROLL_RELATIVE_CONTROL 0x8350U -#if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5 -#define VIDEO_GET_MAX_CT_DIGITAL_WINDOW_CONTROL 0x8351U -#define VIDEO_GET_MAX_CT_REGION_OF_INTEREST_CONTROL 0x8352U -#endif - -#define VIDEO_GET_MAX_VS_PROBE_CONTROL 0x8361U -#define VIDEO_GET_MAX_VS_STILL_PROBE_CONTROL 0x8363U -#define VIDEO_GET_MAX_VS_UPDATE_FRAME_SEGMENT_CONTROL 0x8368U -#define VIDEO_GET_MAX_VS_SYNCH_DELAY_CONTROL 0x8369U - -#if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5 -#define VIDEO_GET_MAX_EU_VIDEO_RESOLUTION_CONTROL 0x8383U -#define VIDEO_GET_MAX_EU_MIN_FRAME_INTERVAL_CONTROL 0x8384U -#define VIDEO_GET_MAX_EU_SLICE_MODE_CONTROL 0x8385U -#define VIDEO_GET_MAX_EU_AVERAGE_BITRATE_CONTROL 0x8387U -#define VIDEO_GET_MAX_EU_CPB_SIZE_CONTROL 0x8388U -#define VIDEO_GET_MAX_EU_PEAK_BIT_RATE_CONTROL 0x8389U -#define VIDEO_GET_MAX_EU_QUANTIZATION_PARAMS_CONTROL 0x838AU -#define VIDEO_GET_MAX_EU_SYNC_REF_FRAME_CONTROL 0x838BU -#define VIDEO_GET_MAX_EU_LTR_BUFFER_CONTROL 0x838CU -#define VIDEO_GET_MAX_EU_LEVEL_IDC_LIMIT_CONTROL 0x838FU -#define VIDEO_GET_MAX_EU_SEI_PAYLOADTYPE_CONTROL 0x8390U -#define VIDEO_GET_MAX_EU_QP_RANGE_CONTROL 0x8391U -#endif - -/*! @brief Video device class-specific request GET RES COMMAND */ -#define VIDEO_GET_RES_PU_BACKLIGHT_COMPENSATION_CONTROL 0x8421U -#define VIDEO_GET_RES_PU_BRIGHTNESS_CONTROL 0x8422U -#define VIDEO_GET_RES_PU_CONTRACT_CONTROL 0x8423U -#define VIDEO_GET_RES_PU_GAIN_CONTROL 0x8424U -#define VIDEO_GET_RES_PU_HUE_CONTROL 0x8426U -#define VIDEO_GET_RES_PU_SATURATION_CONTROL 0x8427U -#define VIDEO_GET_RES_PU_SHARRNESS_CONTROL 0x8428U -#define VIDEO_GET_RES_PU_GAMMA_CONTROL 0x8429U -#define VIDEO_GET_RES_PU_WHITE_BALANCE_TEMPERATURE_CONTROL 0x842AU -#define VIDEO_GET_RES_PU_WHITE_BALANCE_COMPONENT_CONTROL 0x842CU -#define VIDEO_GET_RES_PU_DIGITAL_MULTIPLIER_CONTROL 0x842EU -#define VIDEO_GET_RES_PU_DIGITAL_MULTIPLIER_LIMIT_CONTROL 0x842FU - -#define VIDEO_GET_RES_CT_AE_MODE_CONTROL 0x8442U -#define VIDEO_GET_RES_CT_EXPOSURE_TIME_ABSOLUTE_CONTROL 0x8444U -#define VIDEO_GET_RES_CT_FOCUS_ABSOLUTE_CONTROL 0x8446U -#define VIDEO_GET_RES_CT_FOCUS_RELATIVE_CONTROL 0x8447U -#define VIDEO_GET_RES_CT_IRIS_ABSOLUTE_CONTROL 0x8449U -#define VIDEO_GET_RES_CT_ZOOM_ABSOLUTE_CONTROL 0x844BU -#define VIDEO_GET_RES_CT_ZOOM_RELATIVE_CONTROL 0x844CU -#define VIDEO_GET_RES_CT_PANTILT_ABSOLUTE_CONTROL 0x844DU -#define VIDEO_GET_RES_CT_PANTILT_RELATIVE_CONTROL 0x844EU -#define VIDEO_GET_RES_CT_ROLL_ABSOLUTE_CONTROL 0x844FU -#define VIDEO_GET_RES_CT_ROLL_RELATIVE_CONTROL 0x8450U - -#define VIDEO_GET_RES_VS_PROBE_CONTROL 0x8461U -#define VIDEO_GET_RES_VS_STILL_PROBE_CONTROL 0x8463U -#define VIDEO_GET_RES_VS_UPDATE_FRAME_SEGMENT_CONTROL 0x8468U -#define VIDEO_GET_RES_VS_SYNCH_DELAY_CONTROL 0x8469U - -#if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5 -#define VIDEO_GET_RES_EU_AVERAGE_BITRATE_CONTROL 0x8487U -#define VIDEO_GET_RES_EU_CPB_SIZE_CONTROL 0x8488U -#define VIDEO_GET_RES_EU_PEAK_BIT_RATE_CONTROL 0x8489U -#define VIDEO_GET_RES_EU_QUANTIZATION_PARAMS_CONTROL 0x848AU -#define VIDEO_GET_RES_EU_ERROR_RESILIENCY_CONTROL 0x8494U -#endif - -/*! @brief Video device class-specific request GET LEN COMMAND */ - -#define VIDEO_GET_LEN_VS_PROBE_CONTROL 0x8561U -#define VIDEO_GET_LEN_VS_COMMIT_CONTROL 0x8562U -#define VIDEO_GET_LEN_VS_STILL_PROBE_CONTROL 0x8563U -#define VIDEO_GET_LEN_VS_STILL_COMMIT_CONTROL 0x8564U - -#if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5 -#define VIDEO_GET_LEN_EU_SELECT_LAYER_CONTROL 0x8581U -#define VIDEO_GET_LEN_EU_PROFILE_TOOLSET_CONTROL 0x8582U -#define VIDEO_GET_LEN_EU_VIDEO_RESOLUTION_CONTROL 0x8583U -#define VIDEO_GET_LEN_EU_MIN_FRAME_INTERVAL_CONTROL 0x8584U -#define VIDEO_GET_LEN_EU_SLICE_MODE_CONTROL 0x8585U -#define VIDEO_GET_LEN_EU_RATE_CONTROL_MODE_CONTROL 0x8586U -#define VIDEO_GET_LEN_EU_AVERAGE_BITRATE_CONTROL 0x8587U -#define VIDEO_GET_LEN_EU_CPB_SIZE_CONTROL 0x8588U -#define VIDEO_GET_LEN_EU_PEAK_BIT_RATE_CONTROL 0x8589U -#define VIDEO_GET_LEN_EU_QUANTIZATION_PARAMS_CONTROL 0x858AU -#define VIDEO_GET_LEN_EU_SYNC_REF_FRAME_CONTROL 0x858BU -#define VIDEO_GET_LEN_EU_LTR_BUFFER_CONTROL 0x858CU -#define VIDEO_GET_LEN_EU_LTR_PICTURE_CONTROL 0x858DU -#define VIDEO_GET_LEN_EU_LTR_VALIDATION_CONTROL 0x858EU -#define VIDEO_GET_LEN_EU_QP_RANGE_CONTROL 0x8591U -#define VIDEO_GET_LEN_EU_PRIORITY_CONTROL 0x8592U -#define VIDEO_GET_LEN_EU_START_OR_STOP_LAYER_CONTROL 0x8593U -#endif - -/*! @brief Video device class-specific request GET INFO COMMAND */ -#define VIDEO_GET_INFO_VC_POWER_MODE_CONTROL 0x8601U -#define VIDEO_GET_INFO_VC_ERROR_CODE_CONTROL 0x8602U - -#define VIDEO_GET_INFO_PU_BACKLIGHT_COMPENSATION_CONTROL 0x8621U -#define VIDEO_GET_INFO_PU_BRIGHTNESS_CONTROL 0x8622U -#define VIDEO_GET_INFO_PU_CONTRACT_CONTROL 0x8623U -#define VIDEO_GET_INFO_PU_GAIN_CONTROL 0x8624U -#define VIDEO_GET_INFO_PU_POWER_LINE_FREQUENCY_CONTROL 0x8625U -#define VIDEO_GET_INFO_PU_HUE_CONTROL 0x8626U -#define VIDEO_GET_INFO_PU_SATURATION_CONTROL 0x8627U -#define VIDEO_GET_INFO_PU_SHARRNESS_CONTROL 0x8628U -#define VIDEO_GET_INFO_PU_GAMMA_CONTROL 0x8629U -#define VIDEO_GET_INFO_PU_WHITE_BALANCE_TEMPERATURE_CONTROL 0x862AU -#define VIDEO_GET_INFO_PU_WHITE_BALANCE_TEMPERATURE_AUTO_CONTROL 0x862BU -#define VIDEO_GET_INFO_PU_WHITE_BALANCE_COMPONENT_CONTROL 0x862CU -#define VIDEO_GET_INFO_PU_WHITE_BALANCE_COMPONENT_AUTO_CONTROL 0x862DU -#define VIDEO_GET_INFO_PU_DIGITAL_MULTIPLIER_CONTROL 0x862EU -#define VIDEO_GET_INFO_PU_DIGITAL_MULTIPLIER_LIMIT_CONTROL 0x862FU -#define VIDEO_GET_INFO_PU_HUE_AUTO_CONTROL 0x8630U -#define VIDEO_GET_INFO_PU_ANALOG_VIDEO_STANDARD_CONTROL 0x8631U -#define VIDEO_GET_INFO_PU_ANALOG_LOCK_STATUS_CONTROL 0x8632U -#if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5 -#define VIDEO_GET_INFO_PU_CONTRAST_AUTO_CONTROL 0x8633U -#endif - -#define VIDEO_GET_INFO_CT_SCANNING_MODE_CONTROL 0x8641U -#define VIDEO_GET_INFO_CT_AE_MODE_CONTROL 0x8642U -#define VIDEO_GET_INFO_CT_AE_PRIORITY_CONTROL 0x8643U -#define VIDEO_GET_INFO_CT_EXPOSURE_TIME_ABSOLUTE_CONTROL 0x8644U -#define VIDEO_GET_INFO_CT_EXPOSURE_TIME_RELATIVE_CONTROL 0x8645U -#define VIDEO_GET_INFO_CT_FOCUS_ABSOLUTE_CONTROL 0x8646U -#define VIDEO_GET_INFO_CT_FOCUS_RELATIVE_CONTROL 0x8647U -#define VIDEO_GET_INFO_CT_FOCUS_AUTO_CONTROL 0x8648U -#define VIDEO_GET_INFO_CT_IRIS_ABSOLUTE_CONTROL 0x8649U -#define VIDEO_GET_INFO_CT_IRIS_RELATIVE_CONTROL 0x864AU -#define VIDEO_GET_INFO_CT_ZOOM_ABSOLUTE_CONTROL 0x864BU -#define VIDEO_GET_INFO_CT_ZOOM_RELATIVE_CONTROL 0x864CU -#define VIDEO_GET_INFO_CT_PANTILT_ABSOLUTE_CONTROL 0x864DU -#define VIDEO_GET_INFO_CT_PANTILT_RELATIVE_CONTROL 0x864EU -#define VIDEO_GET_INFO_CT_ROLL_ABSOLUTE_CONTROL 0x864FU -#define VIDEO_GET_INFO_CT_ROLL_RELATIVE_CONTROL 0x8650U -#define VIDEO_GET_INFO_CT_PRIVACY_CONTROL 0x8651U -#if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5 -#define VIDEO_GET_INFO_CT_FOCUS_SIMPLE_CONTROL 0x8652U -#endif - -#define VIDEO_GET_INFO_VS_PROBE_CONTROL 0x8661U -#define VIDEO_GET_INFO_VS_COMMIT_CONTROL 0x8662U -#define VIDEO_GET_INFO_VS_STILL_PROBE_CONTROL 0x8663U -#define VIDEO_GET_INFO_VS_STILL_COMMIT_CONTROL 0x8664U -#define VIDEO_GET_INFO_VS_STILL_IMAGE_TRIGGER_CONTROL 0x8665U -#define VIDEO_GET_INFO_VS_STREAM_ERROR_CODE_CONTROL 0x8666U -#define VIDEO_GET_INFO_VS_GENERATE_KEY_FRAME_CONTROL 0x8667U -#define VIDEO_GET_INFO_VS_UPDATE_FRAME_SEGMENT_CONTROL 0x8668U -#define VIDEO_GET_INFO_VS_SYNCH_DELAY_CONTROL 0x8669U - -#if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5 -#define VIDEO_GET_INFO_EU_SELECT_LAYER_CONTROL 0x8681U -#define VIDEO_GET_INFO_EU_PROFILE_TOOLSET_CONTROL 0x8682U -#define VIDEO_GET_INFO_EU_VIDEO_RESOLUTION_CONTROL 0x8683U -#define VIDEO_GET_INFO_EU_MIN_FRAME_INTERVAL_CONTROL 0x8684U -#define VIDEO_GET_INFO_EU_SLICE_MODE_CONTROL 0x8685U -#define VIDEO_GET_INFO_EU_RATE_CONTROL_MODE_CONTROL 0x8686U -#define VIDEO_GET_INFO_EU_AVERAGE_BITRATE_CONTROL 0x8687U -#define VIDEO_GET_INFO_EU_CPB_SIZE_CONTROL 0x8688U -#define VIDEO_GET_INFO_EU_PEAK_BIT_RATE_CONTROL 0x8689U -#define VIDEO_GET_INFO_EU_QUANTIZATION_PARAMS_CONTROL 0x868AU -#define VIDEO_GET_INFO_EU_SYNC_REF_FRAME_CONTROL 0x868BU -#define VIDEO_GET_INFO_EU_LTR_BUFFER_CONTROL 0x868CU -#define VIDEO_GET_INFO_EU_LTR_PICTURE_CONTROL 0x868DU -#define VIDEO_GET_INFO_EU_LTR_VALIDATION_CONTROL 0x868EU -#define VIDEO_GET_INFO_EU_SEI_PAYLOADTYPE_CONTROL 0x8690U -#define VIDEO_GET_INFO_EU_QP_RANGE_CONTROL 0x8691U -#define VIDEO_GET_INFO_EU_PRIORITY_CONTROL 0x8692U -#define VIDEO_GET_INFO_EU_START_OR_STOP_LAYER_CONTROL 0x8693U -#endif - -/*! @brief Video device class-specific request GET DEF COMMAND */ -#define VIDEO_GET_DEF_PU_BACKLIGHT_COMPENSATION_CONTROL 0x8721U -#define VIDEO_GET_DEF_PU_BRIGHTNESS_CONTROL 0x8722U -#define VIDEO_GET_DEF_PU_CONTRACT_CONTROL 0x8723U -#define VIDEO_GET_DEF_PU_GAIN_CONTROL 0x8724U -#define VIDEO_GET_DEF_PU_POWER_LINE_FREQUENCY_CONTROL 0x8725U -#define VIDEO_GET_DEF_PU_HUE_CONTROL 0x8726U -#define VIDEO_GET_DEF_PU_SATURATION_CONTROL 0x8727U -#define VIDEO_GET_DEF_PU_SHARRNESS_CONTROL 0x8728U -#define VIDEO_GET_DEF_PU_GAMMA_CONTROL 0x8729U -#define VIDEO_GET_DEF_PU_WHITE_BALANCE_TEMPERATURE_CONTROL 0x872AU -#define VIDEO_GET_DEF_PU_WHITE_BALANCE_TEMPERATURE_AUTO_CONTROL 0x872BU -#define VIDEO_GET_DEF_PU_WHITE_BALANCE_COMPONENT_CONTROL 0x872CU -#define VIDEO_GET_DEF_PU_WHITE_BALANCE_COMPONENT_AUTO_CONTROL 0x872DU -#define VIDEO_GET_DEF_PU_DIGITAL_MULTIPLIER_CONTROL 0x872EU -#define VIDEO_GET_DEF_PU_DIGITAL_MULTIPLIER_LIMIT_CONTROL 0x872FU -#define VIDEO_GET_DEF_PU_HUE_AUTO_CONTROL 0x8730U -#if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5 -#define VIDEO_GET_DEF_PU_CONTRAST_AUTO_CONTROL 0x8731U -#endif - -#define VIDEO_GET_DEF_CT_AE_MODE_CONTROL 0x8742U -#define VIDEO_GET_DEF_CT_EXPOSURE_TIME_ABSOLUTE_CONTROL 0x8744U -#define VIDEO_GET_DEF_CT_FOCUS_ABSOLUTE_CONTROL 0x8746U -#define VIDEO_GET_DEF_CT_FOCUS_RELATIVE_CONTROL 0x8747U -#define VIDEO_GET_DEF_CT_FOCUS_AUTO_CONTROL 0x8748U -#define VIDEO_GET_DEF_CT_IRIS_ABSOLUTE_CONTROL 0x8749U -#define VIDEO_GET_DEF_CT_ZOOM_ABSOLUTE_CONTROL 0x874BU -#define VIDEO_GET_DEF_CT_ZOOM_RELATIVE_CONTROL 0x874CU -#define VIDEO_GET_DEF_CT_PANTILT_ABSOLUTE_CONTROL 0x874DU -#define VIDEO_GET_DEF_CT_PANTILT_RELATIVE_CONTROL 0x874EU -#define VIDEO_GET_DEF_CT_ROLL_ABSOLUTE_CONTROL 0x874FU -#define VIDEO_GET_DEF_CT_ROLL_RELATIVE_CONTROL 0x8750U -#if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5 -#define VIDEO_GET_DEF_CT_FOCUS_SIMPLE_CONTROL 0x8751U -#define VIDEO_GET_DEF_CT_DIGITAL_WINDOW_CONTROL 0x8752U -#define VIDEO_GET_DEF_CT_REGION_OF_INTEREST_CONTROL 0x8753U -#endif - -#define VIDEO_GET_DEF_VS_PROBE_CONTROL 0x8761U -#define VIDEO_GET_DEF_VS_STILL_PROBE_CONTROL 0x8763U -#define VIDEO_GET_DEF_VS_UPDATE_FRAME_SEGMENT_CONTROL 0x8768U -#define VIDEO_GET_DEF_VS_SYNCH_DELAY_CONTROL 0x8769U - -#if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5 -#define VIDEO_GET_DEF_EU_PROFILE_TOOLSET_CONTROL 0x8782U -#define VIDEO_GET_DEF_EU_VIDEO_RESOLUTION_CONTROL 0x8783U -#define VIDEO_GET_DEF_EU_MIN_FRAME_INTERVAL_CONTROL 0x8784U -#define VIDEO_GET_DEF_EU_SLICE_MODE_CONTROL 0x8785U -#define VIDEO_GET_DEF_EU_RATE_CONTROL_MODE_CONTROL 0x8786U -#define VIDEO_GET_DEF_EU_AVERAGE_BITRATE_CONTROL 0x8787U -#define VIDEO_GET_DEF_EU_CPB_SIZE_CONTROL 0x8788U -#define VIDEO_GET_DEF_EU_PEAK_BIT_RATE_CONTROL 0x8789U -#define VIDEO_GET_DEF_EU_QUANTIZATION_PARAMS_CONTROL 0x878AU -#define VIDEO_GET_DEF_EU_LTR_BUFFER_CONTROL 0x878CU -#define VIDEO_GET_DEF_EU_LTR_PICTURE_CONTROL 0x878DU -#define VIDEO_GET_DEF_EU_LTR_VALIDATION_CONTROL 0x878EU -#define VIDEO_GET_DEF_EU_LEVEL_IDC_LIMIT_CONTROL 0x878FU -#define VIDEO_GET_DEF_EU_SEI_PAYLOADTYPE_CONTROL 0x8790U -#define VIDEO_GET_DEF_EU_QP_RANGE_CONTROL 0x8791U -#define VIDEO_GET_DEF_EU_ERROR_RESILIENCY_CONTROL 0x8794U -#endif - -/*! @brief Video device class-specific request SET CUR COMMAND */ -#define VIDEO_SET_CUR_VC_POWER_MODE_CONTROL 0x0101U - -#define VIDEO_SET_CUR_PU_BACKLIGHT_COMPENSATION_CONTROL 0x0121U -#define VIDEO_SET_CUR_PU_BRIGHTNESS_CONTROL 0x0122U -#define VIDEO_SET_CUR_PU_CONTRACT_CONTROL 0x0123U -#define VIDEO_SET_CUR_PU_GAIN_CONTROL 0x0124U -#define VIDEO_SET_CUR_PU_POWER_LINE_FREQUENCY_CONTROL 0x0125U -#define VIDEO_SET_CUR_PU_HUE_CONTROL 0x0126U -#define VIDEO_SET_CUR_PU_SATURATION_CONTROL 0x0127U -#define VIDEO_SET_CUR_PU_SHARRNESS_CONTROL 0x0128U -#define VIDEO_SET_CUR_PU_GAMMA_CONTROL 0x0129U -#define VIDEO_SET_CUR_PU_WHITE_BALANCE_TEMPERATURE_CONTROL 0x012AU -#define VIDEO_SET_CUR_PU_WHITE_BALANCE_TEMPERATURE_AUTO_CONTROL 0x012BU -#define VIDEO_SET_CUR_PU_WHITE_BALANCE_COMPONENT_CONTROL 0x012CU -#define VIDEO_SET_CUR_PU_WHITE_BALANCE_COMPONENT_AUTO_CONTROL 0x012DU -#define VIDEO_SET_CUR_PU_DIGITAL_MULTIPLIER_CONTROL 0x012EU -#define VIDEO_SET_CUR_PU_DIGITAL_MULTIPLIER_LIMIT_CONTROL 0x012FU -#define VIDEO_SET_CUR_PU_HUE_AUTO_CONTROL 0x0130U -#if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5 -#define VIDEO_SET_CUR_PU_CONTRAST_AUTO_CONTROL 0x0131U -#endif - -#define VIDEO_SET_CUR_CT_SCANNING_MODE_CONTROL 0x0141U -#define VIDEO_SET_CUR_CT_AE_MODE_CONTROL 0x0142U -#define VIDEO_SET_CUR_CT_AE_PRIORITY_CONTROL 0x0143U -#define VIDEO_SET_CUR_CT_EXPOSURE_TIME_ABSOLUTE_CONTROL 0x0144U -#define VIDEO_SET_CUR_CT_EXPOSURE_TIME_RELATIVE_CONTROL 0x0145U -#define VIDEO_SET_CUR_CT_FOCUS_ABSOLUTE_CONTROL 0x0146U -#define VIDEO_SET_CUR_CT_FOCUS_RELATIVE_CONTROL 0x0147U -#define VIDEO_SET_CUR_CT_FOCUS_AUTO_CONTROL 0x0148U -#define VIDEO_SET_CUR_CT_IRIS_ABSOLUTE_CONTROL 0x0149U -#define VIDEO_SET_CUR_CT_IRIS_RELATIVE_CONTROL 0x014AU -#define VIDEO_SET_CUR_CT_ZOOM_ABSOLUTE_CONTROL 0x014BU -#define VIDEO_SET_CUR_CT_ZOOM_RELATIVE_CONTROL 0x014CU -#define VIDEO_SET_CUR_CT_PANTILT_ABSOLUTE_CONTROL 0x014DU -#define VIDEO_SET_CUR_CT_PANTILT_RELATIVE_CONTROL 0x014EU -#define VIDEO_SET_CUR_CT_ROLL_ABSOLUTE_CONTROL 0x014FU -#define VIDEO_SET_CUR_CT_ROLL_RELATIVE_CONTROL 0x0150U -#define VIDEO_SET_CUR_CT_PRIVACY_CONTROL 0x0151U -#if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5 -#define VIDEO_SET_CUR_CT_FOCUS_SIMPLE_CONTROL 0x0152U -#define VIDEO_SET_CUR_CT_DIGITAL_WINDOW_CONTROL 0x0153U -#define VIDEO_SET_CUR_CT_REGION_OF_INTEREST_CONTROL 0x0154U -#endif - -#define VIDEO_SET_CUR_VS_PROBE_CONTROL 0x0161U -#define VIDEO_SET_CUR_VS_COMMIT_CONTROL 0x0162U -#define VIDEO_SET_CUR_VS_STILL_PROBE_CONTROL 0x0163U -#define VIDEO_SET_CUR_VS_STILL_COMMIT_CONTROL 0x0164U -#define VIDEO_SET_CUR_VS_STILL_IMAGE_TRIGGER_CONTROL 0x0165U -#define VIDEO_SET_CUR_VS_STREAM_ERROR_CODE_CONTROL 0x0166U -#define VIDEO_SET_CUR_VS_GENERATE_KEY_FRAME_CONTROL 0x0167U -#define VIDEO_SET_CUR_VS_UPDATE_FRAME_SEGMENT_CONTROL 0x0168U -#define VIDEO_SET_CUR_VS_SYNCH_DELAY_CONTROL 0x0169U - -#if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5 -#define VIDEO_SET_CUR_EU_SELECT_LAYER_CONTROL 0x0181U -#define VIDEO_SET_CUR_EU_PROFILE_TOOLSET_CONTROL 0x0182U -#define VIDEO_SET_CUR_EU_VIDEO_RESOLUTION_CONTROL 0x0183U -#define VIDEO_SET_CUR_EU_MIN_FRAME_INTERVAL_CONTROL 0x0184U -#define VIDEO_SET_CUR_EU_SLICE_MODE_CONTROL 0x0185U -#define VIDEO_SET_CUR_EU_RATE_CONTROL_MODE_CONTROL 0x0186U -#define VIDEO_SET_CUR_EU_AVERAGE_BITRATE_CONTROL 0x0187U -#define VIDEO_SET_CUR_EU_CPB_SIZE_CONTROL 0x0188U -#define VIDEO_SET_CUR_EU_PEAK_BIT_RATE_CONTROL 0x0189U -#define VIDEO_SET_CUR_EU_QUANTIZATION_PARAMS_CONTROL 0x018AU -#define VIDEO_SET_CUR_EU_SYNC_REF_FRAME_CONTROL 0x018BU -#define VIDEO_SET_CUR_EU_LTR_BUFFER_CONTROL 0x018CU -#define VIDEO_SET_CUR_EU_LTR_PICTURE_CONTROL 0x018DU -#define VIDEO_SET_CUR_EU_LTR_VALIDATION_CONTROL 0x018EU -#define VIDEO_SET_CUR_EU_LEVEL_IDC_LIMIT_CONTROL 0x018FU -#define VIDEO_SET_CUR_EU_SEI_PAYLOADTYPE_CONTROL 0x0190U -#define VIDEO_SET_CUR_EU_QP_RANGE_CONTROL 0x0191U -#define VIDEO_SET_CUR_EU_PRIORITY_CONTROL 0x0192U -#define VIDEO_SET_CUR_EU_START_OR_STOP_LAYER_CONTROL 0x0193U -#define VIDEO_SET_CUR_EU_ERROR_RESILIENCY_CONTROL 0x0194U -#endif - -/*! @brief The payload header structure for MJPEG payload format. */ -struct video_mjpeg_payload_header { - uint8_t bHeaderLength; /*!< The payload header length. */ - union { - uint8_t bmheaderInfo; /*!< The payload header bitmap field. */ - struct - { - uint8_t frameIdentifier : 1U; /*!< Frame Identifier. This bit toggles at each frame start boundary and stays - constant for the rest of the frame.*/ - uint8_t endOfFrame : 1U; /*!< End of Frame. This bit indicates the end of a video frame and is set in the - last video sample that belongs to a frame.*/ - uint8_t - presentationTimeStamp : 1U; /*!< Presentation Time Stamp. This bit, when set, indicates the presence of - a PTS field.*/ - uint8_t sourceClockReference : 1U; /*!< Source Clock Reference. This bit, when set, indicates the presence - of a SCR field.*/ - uint8_t reserved : 1U; /*!< Reserved. Set to 0. */ - uint8_t stillImage : 1U; /*!< Still Image. This bit, when set, identifies a video sample that belongs to a - still image.*/ - uint8_t errorBit : 1U; /*!< Error Bit. This bit, when set, indicates an error in the device streaming.*/ - uint8_t endOfHeader : 1U; /*!< End of Header. This bit, when set, indicates the end of the BFH fields.*/ - } headerInfoBits; - struct - { - uint8_t FID : 1U; /*!< Frame Identifier. This bit toggles at each frame start boundary and stays constant - for the rest of the frame.*/ - uint8_t EOI : 1U; /*!< End of Frame. This bit indicates the end of a video frame and is set in the last - video sample that belongs to a frame.*/ - uint8_t PTS : 1U; /*!< Presentation Time Stamp. This bit, when set, indicates the presence of a PTS field.*/ - uint8_t SCR : 1U; /*!< Source Clock Reference. This bit, when set, indicates the presence of a SCR field.*/ - uint8_t RES : 1U; /*!< Reserved. Set to 0. */ - uint8_t STI : 1U; /*!< Still Image. This bit, when set, identifies a video sample that belongs to a still - image.*/ - uint8_t ERR : 1U; /*!< Error Bit. This bit, when set, indicates an error in the device streaming.*/ - uint8_t EOH : 1U; /*!< End of Header. This bit, when set, indicates the end of the BFH fields.*/ - } headerInfoBitmap; - } headerInfoUnion; - uint32_t dwPresentationTime; /*!< Presentation time stamp (PTS) field.*/ - uint8_t bSourceClockReference[6]; /*!< Source clock reference (SCR) field.*/ -} __packed; - -/*! @brief The Video probe and commit controls structure.*/ -struct video_probe_and_commit_controls { - union { - uint8_t bmHint; /*!< Bit-field control indicating to the function what fields shall be kept fixed. */ - struct - { - uint8_t dwFrameInterval : 1U; /*!< dwFrameInterval field.*/ - uint8_t wKeyFrameRate : 1U; /*!< wKeyFrameRate field.*/ - uint8_t wPFrameRate : 1U; /*!< wPFrameRate field.*/ - uint8_t wCompQuality : 1U; /*!< wCompQuality field.*/ - uint8_t wCompWindowSize : 1U; /*!< wCompWindowSize field.*/ - uint8_t reserved : 3U; /*!< Reserved field.*/ - } hintBitmap; - } hintUnion; - union { - uint8_t bmHint; /*!< Bit-field control indicating to the function what fields shall be kept fixed. */ - struct - { - uint8_t reserved : 8U; /*!< Reserved field.*/ - } hintBitmap; - } hintUnion1; - uint8_t bFormatIndex; /*!< Video format index from a format descriptor.*/ - uint8_t bFrameIndex; /*!< Video frame index from a frame descriptor.*/ - uint32_t dwFrameInterval; /*!< Frame interval in 100ns units.*/ - uint16_t wKeyFrameRate; /*!< Key frame rate in key-frame per video-frame units.*/ - uint16_t wPFrameRate; /*!< PFrame rate in PFrame/key frame units.*/ - uint16_t wCompQuality; /*!< Compression quality control in abstract units 0U (lowest) to 10000U (highest).*/ - uint16_t wCompWindowSize; /*!< Window size for average bit rate control.*/ - uint16_t wDelay; /*!< Internal video streaming interface latency in ms from video data capture to presentation on - the USB.*/ - uint32_t dwMaxVideoFrameSize; /*!< Maximum video frame or codec-specific segment size in bytes.*/ - uint32_t dwMaxPayloadTransferSize; /*!< Specifies the maximum number of bytes that the device can transmit or - receive in a single payload transfer.*/ - uint32_t dwClockFrequency; /*!< The device clock frequency in Hz for the specified format. This specifies the - units used for the time information fields in the Video Payload Headers in the data - stream.*/ - uint8_t bmFramingInfo; /*!< Bit-field control supporting the following values: D0 Frame ID, D1 EOF.*/ - uint8_t bPreferedVersion; /*!< The preferred payload format version supported by the host or device for the - specified bFormatIndex value.*/ - uint8_t bMinVersion; /*!< The minimum payload format version supported by the device for the specified bFormatIndex - value.*/ - uint8_t bMaxVersion; /*!< The maximum payload format version supported by the device for the specified bFormatIndex - value.*/ -#if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5 - uint8_t bUsage; /*!< This bitmap enables features reported by the bmUsages field of the Video Frame Descriptor.*/ - uint8_t - bBitDepthLuma; /*!< Represents bit_depth_luma_minus8 + 8U, which must be the same as bit_depth_chroma_minus8 + - 8.*/ - uint8_t bmSettings; /*!< A bitmap of flags that is used to discover and control specific features of a temporally - encoded video stream.*/ - uint8_t bMaxNumberOfRefFramesPlus1; /*!< Host indicates the maximum number of frames stored for use as references.*/ - uint16_t bmRateControlModes; /*!< This field contains 4U sub-fields, each of which is a 4U bit number.*/ - uint64_t bmLayoutPerStream; /*!< This field contains 4U sub-fields, each of which is a 2U byte number.*/ -#endif -} __packed; - -/*! @brief The Video still probe and still commit controls structure.*/ -struct video_still_probe_and_commit_controls { - uint8_t bFormatIndex; /*!< Video format index from a format descriptor.*/ - uint8_t bFrameIndex; /*!< Video frame index from a frame descriptor.*/ - uint8_t bCompressionIndex; /*!< Compression index from a frame descriptor.*/ - uint32_t dwMaxVideoFrameSize; /*!< Maximum still image size in bytes.*/ - uint32_t dwMaxPayloadTransferSize; /*!< Specifies the maximum number of bytes that the device can transmit or - receive in a single payload transfer.*/ -} __packed; - void usbd_video_sof_callback(void); void usbd_video_set_interface_callback(uint8_t value); void usbd_video_add_interface(usbd_class_t *class, usbd_interface_t *intf); @@ -818,4 +23,4 @@ void usbd_video_add_interface(usbd_class_t *class, usbd_interface_t *intf); } #endif -#endif /* USB_VIDEO_H_ */ +#endif /* USBD_VIDEO_H_ */ diff --git a/class/webusb/usbd_webusb.h b/class/webusb/usbd_webusb.h deleted file mode 100644 index d94d1702..00000000 --- a/class/webusb/usbd_webusb.h +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef _USBD_WEBUSB_H -#define _USBD_WEBUSB_H - -/* WebUSB Descriptor Types */ -#define WEBUSB_DESCRIPTOR_SET_HEADER_TYPE 0x00 -#define WEBUSB_CONFIGURATION_SUBSET_HEADER_TYPE 0x01 -#define WEBUSB_FUNCTION_SUBSET_HEADER_TYPE 0x02 -#define WEBUSB_URL_TYPE 0x03 - -/* WebUSB Request Codes */ -#define WEBUSB_REQUEST_GET_URL 0x02 - -/* bScheme in URL descriptor */ -#define WEBUSB_URL_SCHEME_HTTP 0x00 -#define WEBUSB_URL_SCHEME_HTTPS 0x01 - -/* WebUSB Descriptor sizes */ -#define WEBUSB_DESCRIPTOR_SET_HEADER_SIZE 5 -#define WEBUSB_CONFIGURATION_SUBSET_HEADER_SIZE 4 -#define WEBUSB_FUNCTION_SUBSET_HEADER_SIZE 3 - -#endif \ No newline at end of file diff --git a/class/winusb/usbd_winusb.h b/class/winusb/usbd_winusb.h deleted file mode 100644 index dc4a51dd..00000000 --- a/class/winusb/usbd_winusb.h +++ /dev/null @@ -1,26 +0,0 @@ -#ifndef _USBD_WINUSB_H -#define _USBD_WINUSB_H - -/* WinUSB Microsoft OS 2.0 descriptor request codes */ -#define WINUSB_REQUEST_GET_DESCRIPTOR_SET 0x07 -#define WINUSB_REQUEST_SET_ALT_ENUM 0x08 - -/* WinUSB Microsoft OS 2.0 descriptor sizes */ -#define WINUSB_DESCRIPTOR_SET_HEADER_SIZE 10 -#define WINUSB_FUNCTION_SUBSET_HEADER_SIZE 8 -#define WINUSB_FEATURE_COMPATIBLE_ID_SIZE 20 - -/* WinUSB Microsoft OS 2.0 Descriptor Types */ -#define WINUSB_SET_HEADER_DESCRIPTOR_TYPE 0x00 -#define WINUSB_SUBSET_HEADER_CONFIGURATION_TYPE 0x01 -#define WINUSB_SUBSET_HEADER_FUNCTION_TYPE 0x02 -#define WINUSB_FEATURE_COMPATIBLE_ID_TYPE 0x03 -#define WINUSB_FEATURE_REG_PROPERTY_TYPE 0x04 -#define WINUSB_FEATURE_MIN_RESUME_TIME_TYPE 0x05 -#define WINUSB_FEATURE_MODEL_ID_TYPE 0x06 -#define WINUSB_FEATURE_CCGP_DEVICE_TYPE 0x07 - -#define WINUSB_PROP_DATA_TYPE_REG_SZ 0x01 -#define WINUSB_PROP_DATA_TYPE_REG_MULTI_SZ 0x07 - -#endif \ No newline at end of file diff --git a/common/usb_dc.h b/common/usb_dc.h index bb838382..10efd9d2 100644 --- a/common/usb_dc.h +++ b/common/usb_dc.h @@ -1,7 +1,7 @@ #ifndef _USB_DC_H #define _USB_DC_H -#include "stdint.h" +#include #ifdef __cplusplus extern "C" { @@ -25,6 +25,13 @@ extern "C" { /** True if the endpoint is an OUT endpoint */ #define USB_EP_DIR_IS_OUT(ep) (USB_EP_GET_DIR(ep) == USB_EP_DIR_OUT) +/* Default USB control EP, always 0 and 0x80 */ +#define USB_CONTROL_OUT_EP0 0 +#define USB_CONTROL_IN_EP0 0x80 + +/**< maximum packet size (MPS) for EP 0 */ +#define USB_CTRL_EP_MPS 64 + /** * USB endpoint Transfer Type mask. */ @@ -34,32 +41,6 @@ extern "C" { #define USBD_EP_TYPE_INTR 3 #define USBD_EP_TYPE_MASK 3 -/* Default USB control EP, always 0 and 0x80 */ -#define USB_CONTROL_OUT_EP0 0 -#define USB_CONTROL_IN_EP0 0x80 - -/** - * @brief USB Device Controller API - * @defgroup _usb_device_controller_api USB Device Controller API - * @{ - */ -/**< maximum packet size (MPS) for EP 0 */ -#define USB_CTRL_EP_MPS 64 - -/** - * @brief USB Endpoint Transfer Type - */ -enum usb_dc_ep_transfer_type { - /** Control type endpoint */ - USB_DC_EP_CONTROL = 0, - /** Isochronous type endpoint */ - USB_DC_EP_ISOCHRONOUS, - /** Bulk type endpoint */ - USB_DC_EP_BULK, - /** Interrupt type endpoint */ - USB_DC_EP_INTERRUPT -}; - /** * @brief USB Endpoint Configuration. * @@ -72,12 +53,12 @@ struct usbd_endpoint_cfg { * OUT EP = 0x00 | \ */ uint8_t ep_addr; - /** Endpoint max packet size */ - uint16_t ep_mps; /** Endpoint Transfer Type. * May be Bulk, Interrupt, Control or Isochronous */ - enum usb_dc_ep_transfer_type ep_type; + uint8_t ep_type; + /** Endpoint max packet size */ + uint16_t ep_mps; }; /** diff --git a/common/usb_def.h b/common/usb_def.h index 57903f6b..0667a33e 100644 --- a/common/usb_def.h +++ b/common/usb_def.h @@ -1,5 +1,5 @@ -#ifndef USB_REQUEST_H -#define USB_REQUEST_H +#ifndef USB_DEF_H +#define USB_DEF_H /* Useful define */ #define USB_1_1 0x0110 @@ -7,45 +7,56 @@ /* Set USB version to 2.1 so that the host will request the BOS descriptor */ #define USB_2_1 0x0210 -// USB Speed -#define USB_SPEED_LOW 0U -#define USB_SPEED_FULL 1U -#define USB_SPEED_HIGH 2U +/* Device speeds */ +#define USB_SPEED_UNKNOWN 0 /* Transfer rate not yet set */ +#define USB_SPEED_LOW 1 /* USB 1.1 */ +#define USB_SPEED_FULL 2 /* USB 1.1 */ +#define USB_SPEED_HIGH 3 /* USB 2.0 */ +#define USB_SPEED_VARIABLE 4 /* Wireless USB 2.5 */ + +/* Maximum number of devices per controller */ +#define USB_MAX_DEVICES (127) // USB PID Types -#define USB_PID_RESERVED 0U -#define USB_PID_OUT 1U -#define USB_PID_ACK 2U -#define USB_PID_DATA0 3U -#define USB_PID_PING 4U -#define USB_PID_SOF 5U -#define USB_PID_DATA2 7U -#define USB_PID_NYET 6U -#define USB_PID_SPLIT 8U -#define USB_PID_IN 9U -#define USB_PID_NAK 10U -#define USB_PID_DATA1 11U -#define USB_PID_PRE 12U -#define USB_PID_ERR 12U -#define USB_PID_SETUP 13U -#define USB_PID_STALL 14U -#define USB_PID_MDATA 15U +#define USB_PID_OUT (0x01) /* Tokens */ +#define USB_PID_IN (0x09) +#define USB_PID_SOF (0x05) +#define USB_PID_SETUP (0x0d) -// bmRequestType.Dir -#define USB_REQUEST_HOST_TO_DEVICE 0U -#define USB_REQUEST_DEVICE_TO_HOST 1U +#define USB_PID_DATA0 (0x03) /* Data */ +#define USB_PID_DATA1 (0x0b) +#define USB_PID_DATA2 (0x07) +#define USB_PID_MDATA (0x0f) -// bmRequestType.Type -#define USB_REQUEST_STANDARD 0U -#define USB_REQUEST_CLASS 1U -#define USB_REQUEST_VENDOR 2U -#define USB_REQUEST_RESERVED 3U +#define USB_PID_ACK (0x02) /* Handshake */ +#define USB_PID_NAK (0x0a) +#define USB_PID_STALL (0x0e) +#define USB_PID_NYET (0x06) -// bmRequestType.Recipient -#define USB_REQUEST_TO_DEVICE 0U -#define USB_REQUEST_TO_INTERFACE 1U -#define USB_REQUEST_TO_ENDPOINT 2U -#define USB_REQUEST_TO_OTHER 3U +#define USB_PID_PRE (0x0c) /* Special */ +#define USB_PID_ERR (0x0c) +#define USB_PID_SPLIT (0x08) +#define USB_PID_PING (0x04) +#define USB_PID_RESERVED (0x00) + +#define USB_REQUEST_DIR_SHIFT 7U /* Bits 7: Request dir */ +#define USB_REQUEST_DIR_OUT (0U << USB_REQUEST_DIR_SHIFT) /* Bit 7=0: Host-to-device */ +#define USB_REQUEST_DIR_IN (1U << USB_REQUEST_DIR_SHIFT) /* Bit 7=1: Device-to-host */ +#define USB_REQUEST_DIR_MASK (1U << USB_REQUEST_DIR_SHIFT) /* Bit 7=1: Direction bit */ + +#define USB_REQUEST_TYPE_SHIFT 5U /* Bits 5:6: Request type */ +#define USB_REQUEST_STANDARD (0U << USB_REQUEST_TYPE_SHIFT) +#define USB_REQUEST_CLASS (1U << USB_REQUEST_TYPE_SHIFT) +#define USB_REQUEST_VENDOR (2U << USB_REQUEST_TYPE_SHIFT) +#define USB_REQUEST_RESERVED (3U << USB_REQUEST_TYPE_SHIFT) +#define USB_REQUEST_TYPE_MASK (3U << USB_REQUEST_TYPE_SHIFT) + +#define USB_REQUEST_RECIPIENT_SHIFT 0U /* Bits 0:4: Recipient */ +#define USB_REQUEST_TO_DEVICE (0U << USB_REQUEST_RECIPIENT_SHIFT) +#define USB_REQUEST_TO_INTERFACE (1U << USB_REQUEST_RECIPIENT_SHIFT) +#define USB_REQUEST_TO_ENDPOINT (2U << USB_REQUEST_RECIPIENT_SHIFT) +#define USB_REQUEST_TO_OTHER (3U << USB_REQUEST_RECIPIENT_SHIFT) +#define USB_REQUEST_RECIPIENT_MASK (3U << USB_REQUEST_RECIPIENT_SHIFT) /* USB Standard Request Codes */ #define USB_REQUEST_GET_STATUS 0x00 @@ -73,27 +84,22 @@ #define USB_REQUEST_LOOPBACK_DATA_READ 0x16 #define USB_REQUEST_SET_INTERFACE_DS 0x17 -/* USB GET_STATUS Bit Values */ -#define USB_GETSTATUS_SELF_POWERED 0x01 -#define USB_GETSTATUS_REMOTE_WAKEUP 0x02 -#define USB_GETSTATUS_ENDPOINT_STALL 0x01 - /* USB Standard Feature selectors */ -#define USB_FEATURE_ENDPOINT_STALL 0 +#define USB_FEATURE_ENDPOINT_HALT 0 +#define USB_FEATURE_SELF_POWERED 0 #define USB_FEATURE_REMOTE_WAKEUP 1 #define USB_FEATURE_TEST_MODE 2 +#define USB_FEATURE_BATTERY 2 +#define USB_FEATURE_BHNPENABLE 3 +#define USB_FEATURE_WUSBDEVICE 3 +#define USB_FEATURE_AHNPSUPPORT 4 +#define USB_FEATURE_AALTHNPSUPPORT 5 +#define USB_FEATURE_DEBUGMODE 6 -/* Descriptor size in bytes */ -#define USB_DEVICE_DESC_SIZE 0x12 -#define USB_CONFIGURATION_DESC_SIZE 0x09 -#define USB_INTERFACE_DESC_SIZE 0x09 -#define USB_ENDPOINT_DESC_SIZE 0x07 -#define USB_LANGID_STRING_DESC_SIZE 0x04 -#define USB_OTHER_SPEED_DESC_SIZE 0x09 -#define USB_DEVICE_QUAL_DESC_SIZE 0x0A -#define USB_INTERFACE_ASSOC_DESC_SIZE 0x08 -#define USB_FUNCTION_DESC_SIZE 0x03 -#define USB_OTG_DESC_SIZE 0x03 +/* USB GET_STATUS Bit Values */ +#define USB_GETSTATUS_ENDPOINT_HALT 0x01 +#define USB_GETSTATUS_SELF_POWERED 0x01 +#define USB_GETSTATUS_REMOTE_WAKEUP 0x02 /* USB Descriptor Types */ #define USB_DESCRIPTOR_TYPE_DEVICE 0x01U @@ -109,10 +115,9 @@ #define USB_DESCRIPTOR_TYPE_INTERFACE_ASSOCIATION 0x0BU #define USB_DESCRIPTOR_TYPE_BINARY_OBJECT_STORE 0x0FU #define USB_DESCRIPTOR_TYPE_DEVICE_CAPABILITY 0x10U +#define USB_DESCRIPTOR_TYPE_WIRELESS_ENDPOINTCOMP 0x11U -#define USB_DESCRIPTOR_TYPE_FUNCTIONAL 0x21U - -// Class Specific Descriptor +/* Class Specific Descriptor */ #define USB_CS_DESCRIPTOR_TYPE_DEVICE 0x21U #define USB_CS_DESCRIPTOR_TYPE_CONFIGURATION 0x22U #define USB_CS_DESCRIPTOR_TYPE_STRING 0x23U @@ -161,10 +166,10 @@ #define USB_OSDESC_STRING_DESC_INDEX 0xEE /* bmAttributes in Configuration Descriptor */ +#define USB_CONFIG_REMOTE_WAKEUP 0x20 #define USB_CONFIG_POWERED_MASK 0x40 #define USB_CONFIG_BUS_POWERED 0x80 #define USB_CONFIG_SELF_POWERED 0xC0 -#define USB_CONFIG_REMOTE_WAKEUP 0x20 /* bMaxPower in Configuration Descriptor */ #define USB_CONFIG_POWER_MA(mA) ((mA) / 2) @@ -175,21 +180,27 @@ #define USB_ENDPOINT_IN(addr) ((addr) | 0x80) /* bmAttributes in Endpoint Descriptor */ -#define USB_ENDPOINT_TYPE_MASK 0x03 -#define USB_ENDPOINT_TYPE_CONTROL 0x00 -#define USB_ENDPOINT_TYPE_ISOCHRONOUS 0x01 -#define USB_ENDPOINT_TYPE_BULK 0x02 -#define USB_ENDPOINT_TYPE_INTERRUPT 0x03 -#define USB_ENDPOINT_SYNC_MASK 0x0C -#define USB_ENDPOINT_SYNC_NO_SYNCHRONIZATION 0x00 -#define USB_ENDPOINT_SYNC_ASYNCHRONOUS 0x04 -#define USB_ENDPOINT_SYNC_ADAPTIVE 0x08 -#define USB_ENDPOINT_SYNC_SYNCHRONOUS 0x0C -#define USB_ENDPOINT_USAGE_MASK 0x30 -#define USB_ENDPOINT_USAGE_DATA 0x00 -#define USB_ENDPOINT_USAGE_FEEDBACK 0x10 -#define USB_ENDPOINT_USAGE_IMPLICIT_FEEDBACK 0x20 -#define USB_ENDPOINT_USAGE_RESERVED 0x30 +#define USB_ENDPOINT_TYPE_SHIFT 0 +#define USB_ENDPOINT_TYPE_CONTROL (0 << USB_ENDPOINT_TYPE_SHIFT) +#define USB_ENDPOINT_TYPE_ISOCHRONOUS (1 << USB_ENDPOINT_TYPE_SHIFT) +#define USB_ENDPOINT_TYPE_BULK (2 << USB_ENDPOINT_TYPE_SHIFT) +#define USB_ENDPOINT_TYPE_INTERRUPT (3 << USB_ENDPOINT_TYPE_SHIFT) +#define USB_ENDPOINT_TYPE_MASK (3 << USB_ENDPOINT_TYPE_SHIFT) + +#define USB_ENDPOINT_SYNC_SHIFT 2 +#define USB_ENDPOINT_SYNC_NO_SYNCHRONIZATION (0 << USB_ENDPOINT_SYNC_SHIFT) +#define USB_ENDPOINT_SYNC_ASYNCHRONOUS (1 << USB_ENDPOINT_SYNC_SHIFT) +#define USB_ENDPOINT_SYNC_ADAPTIVE (2 << USB_ENDPOINT_SYNC_SHIFT) +#define USB_ENDPOINT_SYNC_SYNCHRONOUS (3 << USB_ENDPOINT_SYNC_SHIFT) +#define USB_ENDPOINT_SYNC_MASK (3 << USB_ENDPOINT_SYNC_SHIFT) + +#define USB_ENDPOINT_USAGE_SHIFT 4 +#define USB_ENDPOINT_USAGE_DATA (0 << USB_ENDPOINT_USAGE_SHIFT) +#define USB_ENDPOINT_USAGE_FEEDBACK (1 << USB_ENDPOINT_USAGE_SHIFT) +#define USB_ENDPOINT_USAGE_IMPLICIT_FEEDBACK (2 << USB_ENDPOINT_USAGE_SHIFT) +#define USB_ENDPOINT_USAGE_MASK (3 << USB_ENDPOINT_USAGE_SHIFT) + +#define USB_ENDPOINT_MAX_ADJUSTABLE (1 << 7) /* bDevCapabilityType in Device Capability Descriptor */ #define USB_DEVICE_CAPABILITY_WIRELESS_USB 1 @@ -208,36 +219,79 @@ #define USB_BOS_CAPABILITY_EXTENSION 0x02 #define USB_BOS_CAPABILITY_PLATFORM 0x05 +/* OTG SET FEATURE Constants */ +#define USB_OTG_FEATURE_B_HNP_ENABLE 3 /* Enable B device to perform HNP */ +#define USB_OTG_FEATURE_A_HNP_SUPPORT 4 /* A device supports HNP */ +#define USB_OTG_FEATURE_A_ALT_HNP_SUPPORT 5 /* Another port on the A device supports HNP */ + +/* WinUSB Microsoft OS 2.0 descriptor request codes */ +#define WINUSB_REQUEST_GET_DESCRIPTOR_SET 0x07 +#define WINUSB_REQUEST_SET_ALT_ENUM 0x08 + +/* WinUSB Microsoft OS 2.0 descriptor sizes */ +#define WINUSB_DESCRIPTOR_SET_HEADER_SIZE 10 +#define WINUSB_FUNCTION_SUBSET_HEADER_SIZE 8 +#define WINUSB_FEATURE_COMPATIBLE_ID_SIZE 20 + +/* WinUSB Microsoft OS 2.0 Descriptor Types */ +#define WINUSB_SET_HEADER_DESCRIPTOR_TYPE 0x00 +#define WINUSB_SUBSET_HEADER_CONFIGURATION_TYPE 0x01 +#define WINUSB_SUBSET_HEADER_FUNCTION_TYPE 0x02 +#define WINUSB_FEATURE_COMPATIBLE_ID_TYPE 0x03 +#define WINUSB_FEATURE_REG_PROPERTY_TYPE 0x04 +#define WINUSB_FEATURE_MIN_RESUME_TIME_TYPE 0x05 +#define WINUSB_FEATURE_MODEL_ID_TYPE 0x06 +#define WINUSB_FEATURE_CCGP_DEVICE_TYPE 0x07 + +#define WINUSB_PROP_DATA_TYPE_REG_SZ 0x01 +#define WINUSB_PROP_DATA_TYPE_REG_MULTI_SZ 0x07 + +/* WebUSB Descriptor Types */ +#define WEBUSB_DESCRIPTOR_SET_HEADER_TYPE 0x00 +#define WEBUSB_CONFIGURATION_SUBSET_HEADER_TYPE 0x01 +#define WEBUSB_FUNCTION_SUBSET_HEADER_TYPE 0x02 +#define WEBUSB_URL_TYPE 0x03 + +/* WebUSB Request Codes */ +#define WEBUSB_REQUEST_GET_URL 0x02 + +/* bScheme in URL descriptor */ +#define WEBUSB_URL_SCHEME_HTTP 0x00 +#define WEBUSB_URL_SCHEME_HTTPS 0x01 + +/* WebUSB Descriptor sizes */ +#define WEBUSB_DESCRIPTOR_SET_HEADER_SIZE 5 +#define WEBUSB_CONFIGURATION_SUBSET_HEADER_SIZE 4 +#define WEBUSB_FUNCTION_SUBSET_HEADER_SIZE 3 + /* Setup packet definition used to read raw data from USB line */ struct usb_setup_packet { - __packed union { - uint8_t bmRequestType; /* bmRequestType */ - struct - { - uint8_t Recipient : 5; /* D4..0: Recipient */ - uint8_t Type : 2; /* D6..5: Type */ - uint8_t Dir : 1; /* D7: Data Phase Txsfer Direction */ - } bmRequestType_b; - }; + /** Request type. Bits 0:4 determine recipient, see + * \ref usb_request_recipient. Bits 5:6 determine type, see + * \ref usb_request_type. Bit 7 determines data transfer direction, see + * \ref usb_endpoint_direction. + */ + uint8_t bmRequestType; + + /** Request. If the type bits of bmRequestType are equal to + * \ref usb_request_type::LIBUSB_REQUEST_TYPE_STANDARD + * "USB_REQUEST_TYPE_STANDARD" then this field refers to + * \ref usb_standard_request. For other cases, use of this field is + * application-specific. */ uint8_t bRequest; - __packed union { - uint16_t wValue; /* wValue */ - struct - { - uint8_t wValueL; - uint8_t wValueH; - }; - }; - __packed union { - uint16_t wIndex; /* wIndex */ - struct - { - uint8_t wIndexL; - uint8_t wIndexH; - }; - }; + + /** Value. Varies according to request */ + uint16_t wValue; + + /** Index. Varies according to request, typically used to pass an index + * or offset */ + uint16_t wIndex; + + /** Number of bytes to transfer */ uint16_t wLength; -} __packed; +} __PACKED; + +#define USB_SIZEOF_SETUP_PACKET 8 /** Standard Device Descriptor */ struct usb_device_descriptor { @@ -255,20 +309,9 @@ struct usb_device_descriptor { uint8_t iProduct; /* Index to product string */ uint8_t iSerialNumber; /* Index to serial number string */ uint8_t bNumConfigurations; /* Number of possible configurations */ -} __packed; +} __PACKED; -/** USB device_qualifier descriptor */ -struct usb_device_qualifier_descriptor { - uint8_t bLength; /* Descriptor size in bytes = 10 */ - uint8_t bDescriptorType; /* DEVICE QUALIFIER type = 6 */ - uint16_t bcdUSB; /* USB spec in BCD, e.g. 0x0200 */ - uint8_t bDeviceClass; /* Class code, if 0 see interface */ - uint8_t bDeviceSubClass; /* Sub-Class code, 0 if class = 0 */ - uint8_t bDeviceProtocol; /* Protocol, if 0 see interface */ - uint8_t bMaxPacketSize; /* Endpoint 0 max. size */ - uint8_t bNumConfigurations; /* Number of possible configurations */ - uint8_t bReserved; /* Reserved = 0 */ -} __packed; +#define USB_SIZEOF_DEVICE_DESC 18 /** Standard Configuration Descriptor */ struct usb_configuration_descriptor { @@ -280,7 +323,9 @@ struct usb_configuration_descriptor { uint8_t iConfiguration; /* Index to configuration string */ uint8_t bmAttributes; /* Config. characteristics */ uint8_t bMaxPower; /* Max.power from bus, 2mA units */ -} __packed; +} __PACKED; + +#define USB_SIZEOF_CONFIG_DESC 9 /** Standard Interface Descriptor */ struct usb_interface_descriptor { @@ -293,7 +338,9 @@ struct usb_interface_descriptor { uint8_t bInterfaceSubClass; /* Sub-Class code, 0 if class = 0 */ uint8_t bInterfaceProtocol; /* Protocol, 0xFF = vendor */ uint8_t iInterface; /* Index to interface string */ -} __packed; +} __PACKED; + +#define USB_SIZEOF_INTERFACE_DESC 9 /** Standard Endpoint Descriptor */ struct usb_endpoint_descriptor { @@ -303,14 +350,18 @@ struct usb_endpoint_descriptor { uint8_t bmAttributes; /* Transfer type */ uint16_t wMaxPacketSize; /* Bits 10:0 = max. packet size */ uint8_t bInterval; /* Polling interval in (micro) frames */ -} __packed; +} __PACKED; + +#define USB_SIZEOF_ENDPOINT_DESC 7 /** Unicode (UTF16LE) String Descriptor */ struct usb_string_descriptor { uint8_t bLength; uint8_t bDescriptorType; uint16_t bString; -} __packed; +} __PACKED; + +#define USB_SIZEOF_STRING_LANGID_DESC 4 /* USB Interface Association Descriptor */ struct usb_interface_association_descriptor { @@ -322,7 +373,38 @@ struct usb_interface_association_descriptor { uint8_t bFunctionSubClass; uint8_t bFunctionProtocol; uint8_t iFunction; -} __packed; +} __PACKED; + +#define USB_SIZEOF_IAD_DESC 8 + +/** USB device_qualifier descriptor */ +struct usb_device_qualifier_descriptor { + uint8_t bLength; /* Descriptor size in bytes = 10 */ + uint8_t bDescriptorType; /* DEVICE QUALIFIER type = 6 */ + uint16_t bcdUSB; /* USB spec in BCD, e.g. 0x0200 */ + uint8_t bDeviceClass; /* Class code, if 0 see interface */ + uint8_t bDeviceSubClass; /* Sub-Class code, 0 if class = 0 */ + uint8_t bDeviceProtocol; /* Protocol, if 0 see interface */ + uint8_t bMaxPacketSize; /* Endpoint 0 max. size */ + uint8_t bNumConfigurations; /* Number of possible configurations */ + uint8_t bReserved; /* Reserved = 0 */ +} __PACKED; + +#define USB_SIZEOF_DEVICE_QUALIFIER_DESC 10 + +/* Microsoft OS function descriptor. + * This can be used to request a specific driver (such as WINUSB) to be + * loaded on Windows. Unlike other descriptors, it is requested by a special + * request USB_REQ_GETMSFTOSDESCRIPTOR. + * More details: + * https://msdn.microsoft.com/en-us/windows/hardware/gg463179 + * And excellent explanation: + * https://github.com/pbatard/libwdi/wiki/WCID-Devices + * + * The device will have exactly one "Extended Compat ID Feature Descriptor", + * which may contain multiple "Function Descriptors" associated with + * different interfaces. + */ /* MS OS 1.0 string descriptor */ struct usb_msosv1_string_descriptor { @@ -331,7 +413,7 @@ struct usb_msosv1_string_descriptor { uint8_t bString[14]; uint8_t bMS_VendorCode; /* Vendor Code, used for a control request */ uint8_t bPad; /* Padding byte for VendorCode look as UTF16 */ -} __packed; +} __PACKED; /* MS OS 1.0 Header descriptor */ struct usb_msosv1_compat_id_header_descriptor { @@ -340,7 +422,7 @@ struct usb_msosv1_compat_id_header_descriptor { uint16_t wIndex; uint8_t bCount; uint8_t reserved[7]; -} __packed; +} __PACKED; /* MS OS 1.0 Function descriptor */ struct usb_msosv1_comp_id_function_descriptor { @@ -349,7 +431,7 @@ struct usb_msosv1_comp_id_function_descriptor { uint8_t compatibleID[8]; uint8_t subCompatibleID[8]; uint8_t reserved2[6]; -} __packed; +} __PACKED; #define usb_msosv1_comp_id_create(x) \ struct usb_msosv1_comp_id { \ @@ -373,7 +455,7 @@ struct usb_msosv2_header_descriptor { uint16_t bcdVersion; uint16_t wIndex; uint8_t bCount; -} __packed; +} __PACKED; /*Microsoft OS 2.0 set header descriptor*/ struct usb_msosv2_set_header_descriptor { @@ -381,7 +463,7 @@ struct usb_msosv2_set_header_descriptor { uint16_t wDescriptorType; uint32_t dwWindowsVersion; uint16_t wDescriptorSetTotalLength; -} __packed; +} __PACKED; /* Microsoft OS 2.0 compatibleID descriptor*/ struct usb_msosv2_comp_id_descriptor { @@ -389,7 +471,7 @@ struct usb_msosv2_comp_id_descriptor { uint16_t wDescriptorType; uint8_t compatibleID[8]; uint8_t subCompatibleID[8]; -} __packed; +} __PACKED; /* MS OS 2.0 property descriptor */ struct usb_msosv2_property_descriptor { @@ -409,7 +491,7 @@ struct usb_msosv2_subset_function_descriptor { uint8_t bFirstInterface; uint8_t bReserved; uint16_t wSubsetLength; -} __packed; +} __PACKED; struct usb_msosv2_descriptor { uint8_t *compat_id; @@ -423,7 +505,7 @@ struct usb_bos_header_descriptor { uint8_t bDescriptorType; uint16_t wTotalLength; uint8_t bNumDeviceCaps; -} __packed; +} __PACKED; /* BOS Capability platform Descriptor */ struct usb_bos_capability_platform_descriptor { @@ -432,7 +514,7 @@ struct usb_bos_capability_platform_descriptor { uint8_t bDevCapabilityType; uint8_t bReserved; uint8_t PlatformCapabilityUUID[16]; -} __packed; +} __PACKED; /* BOS Capability MS OS Descriptors version 2 */ struct usb_bos_capability_msosv2_descriptor { @@ -440,14 +522,14 @@ struct usb_bos_capability_msosv2_descriptor { uint16_t wMSOSDescriptorSetTotalLength; uint8_t bVendorCode; uint8_t bAltEnumCode; -} __packed; +} __PACKED; /* BOS Capability webusb */ struct usb_bos_capability_webusb_descriptor { uint16_t bcdVersion; uint8_t bVendorCode; uint8_t iLandingPage; -} __packed; +} __PACKED; /* BOS Capability extension Descriptor*/ struct usb_bos_capability_extension_descriptor { @@ -455,7 +537,7 @@ struct usb_bos_capability_extension_descriptor { uint8_t bDescriptorType; uint8_t bDevCapabilityType; uint32_t bmAttributes; -} __packed; +} __PACKED; /* Microsoft OS 2.0 Platform Capability Descriptor * See https://docs.microsoft.com/en-us/windows-hardware/drivers/usbcon/ @@ -467,7 +549,7 @@ struct usb_bos_capability_extension_descriptor { struct usb_bos_capability_platform_msosv2_descriptor { struct usb_bos_capability_platform_descriptor platform_msos; struct usb_bos_capability_msosv2_descriptor data_msosv2; -} __packed; +} __PACKED; /* WebUSB Platform Capability Descriptor: * https://wicg.github.io/webusb/#webusb-platform-capability-descriptor @@ -475,14 +557,14 @@ struct usb_bos_capability_platform_msosv2_descriptor { struct usb_bos_capability_platform_webusb_descriptor { struct usb_bos_capability_platform_descriptor platform_webusb; struct usb_bos_capability_webusb_descriptor data_webusb; -} __packed; +} __PACKED; struct usb_webusb_url_descriptor { uint8_t bLength; uint8_t bDescriptorType; uint8_t bScheme; char URL[]; -} __packed; +} __PACKED; struct usb_bos_descriptor { uint8_t *string; @@ -494,7 +576,7 @@ struct usb_device_capability_descriptor { uint8_t bLength; uint8_t bDescriptorType; uint8_t bDevCapabilityType; -} __packed; +} __PACKED; /** USB descriptor header */ struct usb_desc_header { @@ -563,4 +645,5 @@ struct usb_desc_header { USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ \ WBVAL(id) /* wLangID0 */ // clang-format on -#endif \ No newline at end of file + +#endif diff --git a/common/usb_slist.h b/common/usb_slist.h index 357df1be..093d845e 100644 --- a/common/usb_slist.h +++ b/common/usb_slist.h @@ -1,8 +1,8 @@ #ifndef __USB_SLIST_H__ #define __USB_SLIST_H__ -#include "string.h" -#include "stdint.h" +#include +#include #ifdef __cplusplus extern "C" { @@ -221,4 +221,4 @@ static inline int usb_slist_isempty(usb_slist_t *l) } #endif -#endif \ No newline at end of file +#endif diff --git a/common/usb_util.h b/common/usb_util.h index d3d575e5..4c2f6743 100644 --- a/common/usb_util.h +++ b/common/usb_util.h @@ -1,42 +1,108 @@ #ifndef _USB_UTIL_H #define _USB_UTIL_H -#include "stdbool.h" -#include "string.h" -#include "stdint.h" -#include "stdio.h" -#include "stdlib.h" +#include +#include +#include +#include +#include #include "usb_slist.h" -#ifndef __packed -#define __packed __attribute__((__packed__)) +#if defined(__CC_ARM) +#ifndef __USED +#define __USED __attribute__((used)) #endif -#ifndef __aligned -#define __aligned(x) __attribute__((__aligned__(x))) +#ifndef __WEAK +#define __WEAK __attribute__((weak)) #endif -#define __may_alias __attribute__((__may_alias__)) -#ifndef __printf_like -#define __printf_like(f, a) __attribute__((format(printf, f, a))) +#ifndef __PACKED +#define __PACKED __attribute__((packed)) #endif -#define __used __attribute__((__used__)) -#ifndef __deprecated -#define __deprecated __attribute__((deprecated)) +#ifndef __PACKED_STRUCT +#define __PACKED_STRUCT __packed struct +#endif +#ifndef __PACKED_UNION +#define __PACKED_UNION __packed union +#endif +#ifndef __ALIGNED +#define __ALIGNED(x) __attribute__((aligned(x))) +#endif +#elif defined(__GNUC__) +#ifndef __USED +#define __USED __attribute__((used)) +#endif +#ifndef __WEAK +#define __WEAK __attribute__((weak)) +#endif +#ifndef __PACKED +#define __PACKED __attribute__((packed, aligned(1))) +#endif +#ifndef __PACKED_STRUCT +#define __PACKED_STRUCT struct __attribute__((packed, aligned(1))) +#endif +#ifndef __PACKED_UNION +#define __PACKED_UNION union __attribute__((packed, aligned(1))) +#endif +#ifndef __ALIGNED +#define __ALIGNED(x) __attribute__((aligned(x))) +#endif +#elif defined(__ICCARM__) +#ifndef __USED +#if __ICCARM_V8 +#define __USED __attribute__((used)) +#else +#define __USED _Pragma("__root") +#endif +#endif + +#ifndef __WEAK +#if __ICCARM_V8 +#define __WEAK __attribute__((weak)) +#else +#define __WEAK _Pragma("__weak") +#endif +#endif + +#ifndef __PACKED +#if __ICCARM_V8 +#define __PACKED __attribute__((packed, aligned(1))) +#else +/* Needs IAR language extensions */ +#define __PACKED __packed +#endif +#endif + +#ifndef __PACKED_STRUCT +#if __ICCARM_V8 +#define __PACKED_STRUCT struct __attribute__((packed, aligned(1))) +#else +/* Needs IAR language extensions */ +#define __PACKED_STRUCT __packed struct +#endif +#endif + +#ifndef __PACKED_UNION +#if __ICCARM_V8 +#define __PACKED_UNION union __attribute__((packed, aligned(1))) +#else +/* Needs IAR language extensions */ +#define __PACKED_UNION __packed union +#endif +#endif + +#ifndef __ALIGNED +#if __ICCARM_V8 +#define __ALIGNED(x) __attribute__((aligned(x))) +#elif (__VER__ >= 7080000) +/* Needs IAR language extensions */ +#define __ALIGNED(x) __attribute__((aligned(x))) +#else +#warning No compiler specific solution for __ALIGNED.__ALIGNED is ignored. +#define __ALIGNED(x) #endif -#define ARG_UNUSED(x) (void)(x) - -// #define likely(x) __builtin_expect((bool)!!(x), true) -// #define unlikely(x) __builtin_expect((bool)!!(x), false) - -#define popcount(x) __builtin_popcount(x) - -#ifndef __no_optimization -#define __no_optimization __attribute__((optimize("-O0"))) #endif -#ifndef __weak -#define __weak __attribute__((__weak__)) #endif -#define __unused __attribute__((__unused__)) #ifndef __ALIGN_BEGIN #define __ALIGN_BEGIN @@ -45,6 +111,10 @@ #define __ALIGN_END __attribute__((aligned(4))) #endif +#ifndef ARG_UNUSED +#define ARG_UNUSED(x) (void)(x) +#endif + #ifndef LO_BYTE #define LO_BYTE(x) ((uint8_t)(x & 0x00FF)) #endif @@ -133,12 +203,13 @@ #define WBVAL(x) (x & 0xFF), ((x >> 8) & 0xFF) #define DBVAL(x) (x & 0xFF), ((x >> 8) & 0xFF), ((x >> 16) & 0xFF), ((x >> 24) & 0xFF) -#define USB_DESC_SECTION __attribute__((section("usb_desc"))) __used __aligned(1) +#define USB_DESC_SECTION __attribute__((section("usb_desc"))) __USED __ALIGNED(1) #if 0 -#define USBD_LOG_WRN(a, ...) printf(a, ##__VA_ARGS__) -#define USBD_LOG_DBG(a, ...) printf(a, ##__VA_ARGS__) -#define USBD_LOG_ERR(a, ...) printf(a, ##__VA_ARGS__) +#define USBD_LOG_INFO(a, ...) printf(a, ##__VA_ARGS__) +#define USBD_LOG_DBG(a, ...) printf(a, ##__VA_ARGS__) +#define USBD_LOG_WRN(a, ...) printf(a, ##__VA_ARGS__) +#define USBD_LOG_ERR(a, ...) printf(a, ##__VA_ARGS__) #else #define USBD_LOG_INFO(a, ...) printf(a, ##__VA_ARGS__) #define USBD_LOG_DBG(a, ...) @@ -146,4 +217,4 @@ #define USBD_LOG_ERR(a, ...) printf(a, ##__VA_ARGS__) #endif -#endif \ No newline at end of file +#endif diff --git a/core/usbd_core.c b/core/usbd_core.c index 47929088..56d8f156 100644 --- a/core/usbd_core.c +++ b/core/usbd_core.c @@ -21,7 +21,6 @@ * */ #include "usbd_core.h" -#include "usbd_winusb.h" #define USBD_EP_CALLBACK_LIST_SEARCH 0 #define USBD_EP_CALLBACK_ARR_SEARCH 1 @@ -60,12 +59,10 @@ static struct usbd_core_cfg_priv { /* Buffer used for storing standard, class and vendor request data */ uint8_t req_data[USB_REQUEST_BUFFER_SIZE]; -#if USBD_EP_CALLBACK_SEARCH_METHOD == 1 +#if USBD_EP_CALLBACK_SEARCH_METHOD == USBD_EP_CALLBACK_ARR_SEARCH usbd_endpoint_callback in_ep_cb[USB_EP_IN_NUM]; usbd_endpoint_callback out_ep_cb[USB_EP_OUT_NUM]; #endif - /** Variable to check whether the usb has been enabled */ - bool enabled; /** Variable to check whether the usb has been configured */ bool configured; /** Currently selected configuration */ @@ -156,7 +153,7 @@ static bool is_ep_valid(uint8_t ep) return true; } -#if USBD_EP_CALLBACK_SEARCH_METHOD == 1 +#if USBD_EP_CALLBACK_SEARCH_METHOD == USBD_EP_CALLBACK_ARR_SEARCH static void usbd_ep_callback_register(void) { usb_slist_t *i, *j, *k; @@ -243,9 +240,8 @@ static bool usbd_reset_endpoint(const struct usb_endpoint_descriptor *ep_desc) * to find the specified USB descriptor. * * @param [in] type_index Type and index of the descriptor - * @param [in] lang_id Language ID of the descriptor (currently unused) - * @param [out] len Descriptor length * @param [out] data Descriptor data + * @param [out] len Descriptor length * * @return true if the descriptor was found, false otherwise */ @@ -457,7 +453,7 @@ static bool usbd_set_interface(uint8_t iface, uint8_t alt_setting) p += p[DESC_bLength]; } - usbd_event_notify_handler(USB_EVENT_SET_INTERFACE, (void *)if_desc); + usbd_event_notify_handler(USBD_EVENT_SET_INTERFACE, (void *)if_desc); return ret; } @@ -466,8 +462,8 @@ static bool usbd_set_interface(uint8_t iface, uint8_t alt_setting) * @brief handle a standard device request * * @param [in] setup The setup packet + * @param [in,out] data Data buffer * @param [in,out] len Pointer to data length - * @param [in,out] ep0_data_buf Data buffer * * @return true if the request was handled successfully */ @@ -493,7 +489,7 @@ static bool usbd_std_device_req_handler(struct usb_setup_packet *setup, uint8_t if (value == USB_FEATURE_REMOTE_WAKEUP) { usbd_core_cfg.remote_wakeup = 0; - usbd_event_notify_handler(USB_EVENT_CLEAR_REMOTE_WAKEUP, NULL); + usbd_event_notify_handler(USBD_EVENT_CLEAR_REMOTE_WAKEUP, NULL); ret = true; } @@ -505,7 +501,7 @@ static bool usbd_std_device_req_handler(struct usb_setup_packet *setup, uint8_t if (value == USB_FEATURE_REMOTE_WAKEUP) { usbd_core_cfg.remote_wakeup = 1; - usbd_event_notify_handler(USB_EVENT_SET_REMOTE_WAKEUP, NULL); + usbd_event_notify_handler(USBD_EVENT_SET_REMOTE_WAKEUP, NULL); ret = true; } @@ -549,7 +545,7 @@ static bool usbd_std_device_req_handler(struct usb_setup_packet *setup, uint8_t * update current configuration */ usbd_core_cfg.configuration = value; - usbd_event_notify_handler(USB_EVENT_CONFIGURED, NULL); + usbd_event_notify_handler(USBD_EVENT_CONFIGURED, NULL); } break; @@ -573,8 +569,8 @@ static bool usbd_std_device_req_handler(struct usb_setup_packet *setup, uint8_t * @brief handle a standard interface request * * @param [in] setup The setup packet + * @param [in,out] data Data buffer * @param [in,out] len Pointer to data length - * @param [in] ep0_data_buf Data buffer * * @return true if the request was handled successfully */ @@ -630,8 +626,8 @@ static bool usbd_std_interface_req_handler(struct usb_setup_packet *setup, * @brief handle a standard endpoint request * * @param [in] setup The setup packet + * @param [in,out] data Data buffer * @param [in,out] len Pointer to data length - * @param [in] ep0_data_buf Data buffer * * @return true if the request was handled successfully */ @@ -666,7 +662,7 @@ static bool usbd_std_endpoint_req_handler(struct usb_setup_packet *setup, uint8_ return false; case USB_REQUEST_CLEAR_FEATURE: - if (setup->wValue == USB_FEATURE_ENDPOINT_STALL) { + if (setup->wValue == USB_FEATURE_ENDPOINT_HALT) { /** This request is valid for Control Endpoints when * the device is not yet configured. For other * Endpoints the device must be configured. @@ -677,7 +673,7 @@ static bool usbd_std_endpoint_req_handler(struct usb_setup_packet *setup, uint8_ if (((ep & 0x7f) == 0) || is_device_configured()) { USBD_LOG_ERR("ep:%x clear halt\r\n", ep); usbd_ep_clear_stall(ep); - usbd_event_notify_handler(USB_EVENT_CLEAR_HALT, NULL); + usbd_event_notify_handler(USBD_EVENT_CLEAR_HALT, NULL); break; } } @@ -686,7 +682,7 @@ static bool usbd_std_endpoint_req_handler(struct usb_setup_packet *setup, uint8_ return false; case USB_REQUEST_SET_FEATURE: - if (setup->wValue == USB_FEATURE_ENDPOINT_STALL) { + if (setup->wValue == USB_FEATURE_ENDPOINT_HALT) { /** This request is valid for Control Endpoints when * the device is not yet configured. For other * Endpoints the device must be configured. @@ -698,7 +694,7 @@ static bool usbd_std_endpoint_req_handler(struct usb_setup_packet *setup, uint8_ /* set HALT by stalling */ USBD_LOG_ERR("ep:%x set halt\r\n", ep); usbd_ep_set_stall(ep); - usbd_event_notify_handler(USB_EVENT_SET_HALT, NULL); + usbd_event_notify_handler(USBD_EVENT_SET_HALT, NULL); break; } } @@ -730,7 +726,7 @@ static bool usbd_std_endpoint_req_handler(struct usb_setup_packet *setup, uint8_ * If a custom request handler was installed, this handler is called first. * * @param [in] setup The setup packet - * @param [in] ep0_data_buf Data buffer + * @param [in,out] data Data buffer * @param [in,out] len Pointer to data length * * @return true if the request was handled successfully @@ -739,7 +735,7 @@ static int usbd_standard_request_handler(struct usb_setup_packet *setup, uint8_t { int rc = 0; - switch (setup->bmRequestType_b.Recipient) { + switch (setup->bmRequestType & USB_REQUEST_RECIPIENT_MASK) { case USB_REQUEST_TO_DEVICE: if (usbd_std_device_req_handler(setup, data, len) == false) { rc = -1; @@ -768,22 +764,22 @@ static int usbd_standard_request_handler(struct usb_setup_packet *setup, uint8_t return rc; } -/* - * The functions usbd_class_request_handler(), usbd_custom_request_handler() and usbd_vendor_request_handler() - * go through the interfaces one after the other and compare the - * bInterfaceNumber with the wIndex and and then call the appropriate - * callback of the USB function. - * Note, a USB function can have more than one interface and the - * request does not have to be directed to the first interface (unlikely). - * These functions can be simplified and moved to usb_handle_request() - * when legacy initialization throgh the usb_set_config() and - * usb_enable() is no longer needed. +/** + * @brief handler for class requests + * + * If a custom request handler was installed, this handler is called first. + * + * @param [in] setup The setup packet + * @param [in,out] data Data buffer + * @param [in,out] len Pointer to data length + * + * @return true if the request was handled successfully */ static int usbd_class_request_handler(struct usb_setup_packet *setup, uint8_t **data, uint32_t *len) { USBD_LOG_DBG("bRequest 0x%02x, wIndex 0x%04x\r\n", setup->bRequest, setup->wIndex); - if (setup->bmRequestType_b.Recipient != USB_REQUEST_TO_INTERFACE) { + if ((setup->bmRequestType & USB_REQUEST_RECIPIENT_MASK) != USB_REQUEST_TO_INTERFACE) { return -1; } @@ -804,11 +800,22 @@ static int usbd_class_request_handler(struct usb_setup_packet *setup, uint8_t ** return -1; } +/** + * @brief handler for vendor requests + * + * If a custom request handler was installed, this handler is called first. + * + * @param [in] setup The setup packet + * @param [in,out] data Data buffer + * @param [in,out] len Pointer to data length + * + * @return true if the request was handled successfully + */ static int usbd_vendor_request_handler(struct usb_setup_packet *setup, uint8_t **data, uint32_t *len) { USBD_LOG_DBG("bRequest 0x%02x, wValue0x%04x, wIndex 0x%04x\r\n", setup->bRequest, setup->wValue, setup->wIndex); - // if(setup->bmRequestType_b.Recipient != USB_REQUEST_TO_DEVICE) + // if((setup->bmRequestType & USB_REQUEST_RECIPIENT_MASK) != USB_REQUEST_TO_DEVICE) // { // return -1; // } @@ -867,11 +874,22 @@ static int usbd_vendor_request_handler(struct usb_setup_packet *setup, uint8_t * return -1; } +/** + * @brief handler for special requests + * + * If a custom request handler was installed, this handler is called first. + * + * @param [in] setup The setup packet + * @param [in,out] data Data buffer + * @param [in,out] len Pointer to data length + * + * @return true if the request was handled successfully + */ static int usbd_custom_request_handler(struct usb_setup_packet *setup, uint8_t **data, uint32_t *len) { USBD_LOG_DBG("bRequest 0x%02x, wIndex 0x%04x\r\n", setup->bRequest, setup->wIndex); - if (setup->bmRequestType_b.Recipient != USB_REQUEST_TO_INTERFACE) { + if ((setup->bmRequestType & USB_REQUEST_RECIPIENT_MASK) != USB_REQUEST_TO_INTERFACE) { return -1; } @@ -909,13 +927,13 @@ static int usbd_custom_request_handler(struct usb_setup_packet *setup, uint8_t * */ static bool usbd_setup_request_handler(struct usb_setup_packet *setup, uint8_t **data, uint32_t *len) { - uint8_t type = setup->bmRequestType_b.Type; + uint8_t type = setup->bmRequestType & USB_REQUEST_TYPE_MASK; + + if (!usbd_custom_request_handler(setup, data, len)) { + return true; + } if (type == USB_REQUEST_STANDARD) { - if (!usbd_custom_request_handler(setup, data, len)) { - return true; - } - if (usbd_standard_request_handler(setup, data, len) < 0) { USBD_LOG_ERR("Handler Error %d\r\n", type); usbd_print_setup(setup); @@ -996,7 +1014,7 @@ static void usbd_ep0_setup_handler(void) //usbd_print_setup(setup); if (setup->wLength > USB_REQUEST_BUFFER_SIZE) { - if (setup->bmRequestType_b.Dir != USB_REQUEST_DEVICE_TO_HOST) { + if ((setup->bmRequestType & USB_REQUEST_DIR_MASK) == USB_REQUEST_DIR_OUT) { USBD_LOG_ERR("Request buffer too small\r\n"); usbd_ep_set_stall(USB_CONTROL_IN_EP0); return; @@ -1010,7 +1028,7 @@ static void usbd_ep0_setup_handler(void) /* this maybe set code in class request code */ if (setup->wLength && - setup->bmRequestType_b.Dir == USB_REQUEST_HOST_TO_DEVICE) { + (setup->bmRequestType & USB_REQUEST_DIR_MASK) == USB_REQUEST_DIR_OUT) { USBD_LOG_DBG("prepare to out data\r\n"); return; } @@ -1094,7 +1112,7 @@ static void usbd_ep0_in_handler(void) static void usbd_ep_out_handler(uint8_t ep) { -#if USBD_EP_CALLBACK_SEARCH_METHOD == 0 +#if USBD_EP_CALLBACK_SEARCH_METHOD == USBD_EP_CALLBACK_LIST_SEARCH usb_slist_t *i, *j, *k; usb_slist_for_each(i, &usbd_class_head) { @@ -1125,7 +1143,7 @@ static void usbd_ep_out_handler(uint8_t ep) static void usbd_ep_in_handler(uint8_t ep) { -#if USBD_EP_CALLBACK_SEARCH_METHOD == 0 +#if USBD_EP_CALLBACK_SEARCH_METHOD == USBD_EP_CALLBACK_LIST_SEARCH usb_slist_t *i, *j, *k; usb_slist_for_each(i, &usbd_class_head) { @@ -1175,44 +1193,56 @@ static void usbd_class_event_notify_handler(uint8_t event, void *arg) void usbd_event_notify_handler(uint8_t event, void *arg) { switch (event) { - case USB_EVENT_RESET: + case USBD_EVENT_RESET: usbd_set_address(0); -#if USBD_EP_CALLBACK_SEARCH_METHOD == 1 + usbd_core_cfg.configured = 0; + usbd_core_cfg.configuration = 0; + struct usbd_endpoint_cfg ep0_cfg; + ep0_cfg.ep_mps = USB_CTRL_EP_MPS; + ep0_cfg.ep_type = USBD_EP_TYPE_CTRL; + ep0_cfg.ep_addr = USB_CONTROL_IN_EP0; + /*set USB_CONTROL_IN_EP0 nak*/ + usbd_ep_open(&ep0_cfg); + + ep0_cfg.ep_addr = USB_CONTROL_OUT_EP0; + /*set USB_CONTROL_OUT_EP0 ack to prepare receiving setup data*/ + usbd_ep_open(&ep0_cfg); +#if USBD_EP_CALLBACK_SEARCH_METHOD == USBD_EP_CALLBACK_ARR_SEARCH usbd_ep_callback_register(); #endif - case USB_EVENT_ERROR: - case USB_EVENT_SOF: - case USB_EVENT_CONNECTED: - case USB_EVENT_CONFIGURED: - case USB_EVENT_SUSPEND: - case USB_EVENT_DISCONNECTED: - case USB_EVENT_RESUME: - case USB_EVENT_SET_INTERFACE: - case USB_EVENT_SET_REMOTE_WAKEUP: - case USB_EVENT_CLEAR_REMOTE_WAKEUP: - case USB_EVENT_SET_HALT: - case USB_EVENT_CLEAR_HALT: + case USBD_EVENT_ERROR: + case USBD_EVENT_SOF: + case USBD_EVENT_CONNECTED: + case USBD_EVENT_CONFIGURED: + case USBD_EVENT_SUSPEND: + case USBD_EVENT_DISCONNECTED: + case USBD_EVENT_RESUME: + case USBD_EVENT_SET_INTERFACE: + case USBD_EVENT_SET_REMOTE_WAKEUP: + case USBD_EVENT_CLEAR_REMOTE_WAKEUP: + case USBD_EVENT_SET_HALT: + case USBD_EVENT_CLEAR_HALT: usbd_class_event_notify_handler(event, arg); break; - case USB_EVENT_SETUP_NOTIFY: + case USBD_EVENT_SETUP_NOTIFY: usbd_ep0_setup_handler(); break; - case USB_EVENT_EP0_IN_NOTIFY: + case USBD_EVENT_EP0_IN_NOTIFY: usbd_ep0_in_handler(); break; - case USB_EVENT_EP0_OUT_NOTIFY: + case USBD_EVENT_EP0_OUT_NOTIFY: usbd_ep0_out_handler(); break; - case USB_EVENT_EP_IN_NOTIFY: + case USBD_EVENT_EP_IN_NOTIFY: usbd_ep_in_handler((uint32_t)arg); break; - case USB_EVENT_EP_OUT_NOTIFY: + case USBD_EVENT_EP_OUT_NOTIFY: usbd_ep_out_handler((uint32_t)arg); break; diff --git a/core/usbd_core.h b/core/usbd_core.h index 6884a76e..18b0dcdb 100644 --- a/core/usbd_core.h +++ b/core/usbd_core.h @@ -30,46 +30,46 @@ extern "C" { #include "usb_def.h" #include "usb_dc.h" -enum usb_event_type { +enum usbd_event_type { /** USB error reported by the controller */ - USB_EVENT_ERROR, + USBD_EVENT_ERROR, /** USB reset */ - USB_EVENT_RESET, + USBD_EVENT_RESET, /** Start of Frame received */ - USB_EVENT_SOF, + USBD_EVENT_SOF, /** USB connection established, hardware enumeration is completed */ - USB_EVENT_CONNECTED, + USBD_EVENT_CONNECTED, /** USB configuration done */ - USB_EVENT_CONFIGURED, + USBD_EVENT_CONFIGURED, /** USB connection suspended by the HOST */ - USB_EVENT_SUSPEND, + USBD_EVENT_SUSPEND, /** USB connection lost */ - USB_EVENT_DISCONNECTED, + USBD_EVENT_DISCONNECTED, /** USB connection resumed by the HOST */ - USB_EVENT_RESUME, + USBD_EVENT_RESUME, /** USB interface selected */ - USB_EVENT_SET_INTERFACE, + USBD_EVENT_SET_INTERFACE, /** USB interface selected */ - USB_EVENT_SET_REMOTE_WAKEUP, + USBD_EVENT_SET_REMOTE_WAKEUP, /** USB interface selected */ - USB_EVENT_CLEAR_REMOTE_WAKEUP, + USBD_EVENT_CLEAR_REMOTE_WAKEUP, /** Set Feature ENDPOINT_HALT received */ - USB_EVENT_SET_HALT, + USBD_EVENT_SET_HALT, /** Clear Feature ENDPOINT_HALT received */ - USB_EVENT_CLEAR_HALT, + USBD_EVENT_CLEAR_HALT, /** setup packet received */ - USB_EVENT_SETUP_NOTIFY, + USBD_EVENT_SETUP_NOTIFY, /** ep0 in packet received */ - USB_EVENT_EP0_IN_NOTIFY, + USBD_EVENT_EP0_IN_NOTIFY, /** ep0 out packet received */ - USB_EVENT_EP0_OUT_NOTIFY, + USBD_EVENT_EP0_OUT_NOTIFY, /** ep in packet except ep0 received */ - USB_EVENT_EP_IN_NOTIFY, + USBD_EVENT_EP_IN_NOTIFY, /** ep out packet except ep0 received */ - USB_EVENT_EP_OUT_NOTIFY, + USBD_EVENT_EP_OUT_NOTIFY, /** Initial USB connection status */ - USB_EVENT_UNKNOWN + USBD_EVENT_UNKNOWN }; /** @@ -102,7 +102,7 @@ typedef struct usbd_endpoint { typedef struct usbd_interface { usb_slist_t list; - /** Handler for USB Class specific Control (EP 0) communications */ + /** Handler for USB Class specific commands*/ usbd_request_handler class_handler; /** Handler for USB Vendor specific commands */ usbd_request_handler vendor_handler; diff --git a/demo/stm32/stm32f103c8t6/MDK-ARM/stm32f103c8t6.uvoptx b/demo/stm32/stm32f103c8t6/MDK-ARM/stm32f103c8t6.uvoptx index 3284555a..cc4f0569 100644 --- a/demo/stm32/stm32f103c8t6/MDK-ARM/stm32f103c8t6.uvoptx +++ b/demo/stm32/stm32f103c8t6/MDK-ARM/stm32f103c8t6.uvoptx @@ -284,7 +284,7 @@ Drivers/STM32F1xx_HAL_Driver - 1 + 0 0 0 0 @@ -539,8 +539,8 @@ 0 0 0 - ..\..\..\..\core\usbd_core.c - usbd_core.c + ..\..\..\..\class\msc\usbd_msc.c + usbd_msc.c 0 0 @@ -563,11 +563,35 @@ 0 0 0 + ..\..\..\..\core\usbd_core.c + usbd_core.c + 0 + 0 + + + 5 + 27 + 1 + 0 + 0 + 0 ..\..\..\..\port\stm32\usb_dc_nohal.c usb_dc_nohal.c 0 0 + + 5 + 28 + 1 + 0 + 0 + 0 + ..\..\..\..\port\stm32\usb_dc_hal.c + usb_dc_hal.c + 0 + 0 + @@ -578,7 +602,7 @@ 0 6 - 27 + 29 1 0 0 @@ -590,7 +614,7 @@ 6 - 28 + 30 1 0 0 @@ -602,7 +626,7 @@ 6 - 29 + 31 1 0 0 @@ -614,7 +638,7 @@ 6 - 30 + 32 1 0 0 @@ -624,6 +648,18 @@ 0 0 + + 6 + 33 + 1 + 0 + 0 + 0 + ..\example\msc_ram\msc_ram_init.c + msc_ram_init.c + 0 + 0 + diff --git a/demo/stm32/stm32f103c8t6/MDK-ARM/stm32f103c8t6.uvprojx b/demo/stm32/stm32f103c8t6/MDK-ARM/stm32f103c8t6.uvprojx index c34884f8..9f3cb73b 100644 --- a/demo/stm32/stm32f103c8t6/MDK-ARM/stm32f103c8t6.uvprojx +++ b/demo/stm32/stm32f103c8t6/MDK-ARM/stm32f103c8t6.uvprojx @@ -340,7 +340,7 @@ USE_HAL_DRIVER,STM32F103xB,STM32F1 - ../Core/Inc;../Drivers/STM32F1xx_HAL_Driver/Inc;../Drivers/STM32F1xx_HAL_Driver/Inc/Legacy;../Drivers/CMSIS/Device/ST/STM32F1xx/Include;../Drivers/CMSIS/Include;..\..\..\..\common;..\..\..\..\core;..\..\..\..\class\cdc;..\..\..\..\class\winusb;..\example\hid_custom;..\example\cdc;..\example\hid_keyboard;..\example\hid_mouse;..\..\..\..\class\hid;..\example + ../Core/Inc;../Drivers/STM32F1xx_HAL_Driver/Inc;../Drivers/STM32F1xx_HAL_Driver/Inc/Legacy;../Drivers/CMSIS/Device/ST/STM32F1xx/Include;../Drivers/CMSIS/Include;..\..\..\..\common;..\..\..\..\core;..\..\..\..\class\cdc;..\..\..\..\class\msc;..\..\..\..\class\hid;..\example @@ -520,20 +520,81 @@ ..\..\..\..\class\cdc\usbd_cdc.c - usbd_core.c + usbd_msc.c 1 - ..\..\..\..\core\usbd_core.c + ..\..\..\..\class\msc\usbd_msc.c usbd_hid.c 1 ..\..\..\..\class\hid\usbd_hid.c + + usbd_core.c + 1 + ..\..\..\..\core\usbd_core.c + usb_dc_nohal.c 1 ..\..\..\..\port\stm32\usb_dc_nohal.c + + usb_dc_hal.c + 1 + ..\..\..\..\port\stm32\usb_dc_hal.c + + + 2 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + @@ -556,7 +617,7 @@ 0 0 0 - 1 + 2 2 2 2 @@ -617,7 +678,7 @@ 0 0 0 - 1 + 2 2 2 2 @@ -661,6 +722,11 @@ + + msc_ram_init.c + 1 + ..\example\msc_ram\msc_ram_init.c + diff --git a/demo/stm32/stm32f103c8t6/example/cdc/cdc_init.c b/demo/stm32/stm32f103c8t6/example/cdc/cdc_init.c index c7c9bd06..d1238294 100644 --- a/demo/stm32/stm32f103c8t6/example/cdc/cdc_init.c +++ b/demo/stm32/stm32f103c8t6/example/cdc/cdc_init.c @@ -128,6 +128,7 @@ void usbd_cdc_acm_out(uint8_t ep) usbd_ep_read(ep, data, 64, &read_byte); printf("out\r\n"); printf("read len:%d\r\n", read_byte); + usbd_ep_read(ep, NULL, 0, NULL); } void usbd_cdc_acm_in(uint8_t ep) @@ -163,4 +164,4 @@ void cdc_test(void) uint8_t data_buffer[10] = { 0x31, 0x32, 0x33, 0x34, 0x35, 0x31, 0x32, 0x33, 0x34, 0x35 }; usbd_ep_write(CDC_IN_EP, data_buffer, 10, NULL); HAL_Delay(500); -} \ No newline at end of file +} diff --git a/demo/stm32/stm32f103c8t6/example/example_select.h b/demo/stm32/stm32f103c8t6/example/example_select.h index 325ea792..b424a8f3 100644 --- a/demo/stm32/stm32f103c8t6/example/example_select.h +++ b/demo/stm32/stm32f103c8t6/example/example_select.h @@ -2,7 +2,7 @@ /*!< Use macros to select the examples to test */ /*!< cdc */ -//#define USB_CDC +#define USB_CDC /*!< hid keyboard */ //#define USB_HID_KEYBOARD @@ -14,4 +14,5 @@ //#define USB_HID_CUSTOM /*!< msc ram */ -#define USB_MSC_RAM \ No newline at end of file +//#define USB_MSC_RAM + diff --git a/demo/stm32/stm32f103c8t6/example/hid_keyboard/hid_keyboard_init.c b/demo/stm32/stm32f103c8t6/example/hid_keyboard/hid_keyboard_init.c index 0fe851a5..7f8ca1b3 100644 --- a/demo/stm32/stm32f103c8t6/example/hid_keyboard/hid_keyboard_init.c +++ b/demo/stm32/stm32f103c8t6/example/hid_keyboard/hid_keyboard_init.c @@ -266,4 +266,4 @@ void hid_keyboard_test(void) uint8_t sendbuffer[8] = { 0x00, 0x00, HID_KEY_A, 0x00, 0x00, 0x00, 0x00, 0x00 }; //A hid_keyboard_send_report(HID_INT_EP, sendbuffer, HID_INT_EP_SIZE); HAL_Delay(1000); -} \ No newline at end of file +} diff --git a/demo/stm32/stm32f103c8t6/example/msc_ram/msc_ram_init.c b/demo/stm32/stm32f103c8t6/example/msc_ram/msc_ram_init.c index 026b7e04..768bef83 100644 --- a/demo/stm32/stm32f103c8t6/example/msc_ram/msc_ram_init.c +++ b/demo/stm32/stm32f103c8t6/example/msc_ram/msc_ram_init.c @@ -1,13 +1,13 @@ /** @mainpage msc_ram_demo_init * - *
Project msc_ram_demo - *
Author LiGuo 1570139720@qq.com + *
Project msc_ram_demo + *
Author LiGuo 1570139720@qq.com *
* @section msc ram init demo - * - * + * + * * @section 版本更新历史 - * + * * 版本|作者|时间|描述 * ----|----|----|---- * 1.0|LiGuo|2021.11.19|creat project @@ -23,9 +23,8 @@ #include "usbd_core.h" #include "usbd_msc.h" - -#define MSC_IN_EP 0x85 -#define MSC_OUT_EP 0x04 +#define MSC_IN_EP 0x81 +#define MSC_OUT_EP 0x01 #define USBD_VID 0xFFFF #define USBD_PID 0xFFFF @@ -111,31 +110,31 @@ const uint8_t msc_ram_descriptor[] = { }; #define BLOCK_SIZE 512 -#define BLOCK_COUNT 2 +#define BLOCK_COUNT 10 typedef struct { uint8_t BlockSpace[BLOCK_SIZE]; } BLOCK_TYPE; -// The CDC recv buffer size should equal to the out endpoint size -// or we will need a timeout to flush the recv buffer BLOCK_TYPE mass_block[BLOCK_COUNT]; void usbd_msc_get_cap(uint8_t lun, uint32_t *block_num, uint16_t *block_size) { - *block_num = BLOCK_COUNT; + *block_num = 1000; //Pretend having so many buffer,not has actually. *block_size = BLOCK_SIZE; } int usbd_msc_sector_read(uint32_t sector, uint8_t *buffer, uint32_t length) { - memcpy(buffer, mass_block[sector].BlockSpace, length); + if (sector < 10) + memcpy(buffer, mass_block[sector].BlockSpace, length); return 0; } int usbd_msc_sector_write(uint32_t sector, uint8_t *buffer, uint32_t length) { - memcpy(mass_block[sector].BlockSpace, buffer, length); + if (sector < 10) + memcpy(mass_block[sector].BlockSpace, buffer, length); return 0; } @@ -150,4 +149,4 @@ void msc_ram_init(void) { usbd_desc_register(msc_ram_descriptor); usbd_msc_class_init(MSC_OUT_EP, MSC_IN_EP); -} \ No newline at end of file +}