Linux 6.1.31 headers
This commit is contained in:
638
linux/usb/audio.h
Normal file
638
linux/usb/audio.h
Normal file
@ -0,0 +1,638 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
|
||||
/*
|
||||
* <linux/usb/audio.h> -- USB Audio definitions.
|
||||
*
|
||||
* Copyright (C) 2006 Thumtronics Pty Ltd.
|
||||
* Developed for Thumtronics by Grey Innovation
|
||||
* Ben Williamson <ben.williamson@greyinnovation.com>
|
||||
*
|
||||
* This software is distributed under the terms of the GNU General Public
|
||||
* License ("GPL") version 2, as published by the Free Software Foundation.
|
||||
*
|
||||
* This file holds USB constants and structures defined
|
||||
* by the USB Device Class Definition for Audio Devices.
|
||||
* Comments below reference relevant sections of that document:
|
||||
*
|
||||
* http://www.usb.org/developers/devclass_docs/audio10.pdf
|
||||
*
|
||||
* Types and defines in this file are either specific to version 1.0 of
|
||||
* this standard or common for newer versions.
|
||||
*/
|
||||
|
||||
#ifndef __LINUX_USB_AUDIO_H
|
||||
#define __LINUX_USB_AUDIO_H
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
/* bInterfaceProtocol values to denote the version of the standard used */
|
||||
#define UAC_VERSION_1 0x00
|
||||
#define UAC_VERSION_2 0x20
|
||||
#define UAC_VERSION_3 0x30
|
||||
|
||||
/* A.2 Audio Interface Subclass Codes */
|
||||
#define USB_SUBCLASS_AUDIOCONTROL 0x01
|
||||
#define USB_SUBCLASS_AUDIOSTREAMING 0x02
|
||||
#define USB_SUBCLASS_MIDISTREAMING 0x03
|
||||
|
||||
/* A.5 Audio Class-Specific AC Interface Descriptor Subtypes */
|
||||
#define UAC_HEADER 0x01
|
||||
#define UAC_INPUT_TERMINAL 0x02
|
||||
#define UAC_OUTPUT_TERMINAL 0x03
|
||||
#define UAC_MIXER_UNIT 0x04
|
||||
#define UAC_SELECTOR_UNIT 0x05
|
||||
#define UAC_FEATURE_UNIT 0x06
|
||||
#define UAC1_PROCESSING_UNIT 0x07
|
||||
#define UAC1_EXTENSION_UNIT 0x08
|
||||
|
||||
/* A.6 Audio Class-Specific AS Interface Descriptor Subtypes */
|
||||
#define UAC_AS_GENERAL 0x01
|
||||
#define UAC_FORMAT_TYPE 0x02
|
||||
#define UAC_FORMAT_SPECIFIC 0x03
|
||||
|
||||
/* A.7 Processing Unit Process Types */
|
||||
#define UAC_PROCESS_UNDEFINED 0x00
|
||||
#define UAC_PROCESS_UP_DOWNMIX 0x01
|
||||
#define UAC_PROCESS_DOLBY_PROLOGIC 0x02
|
||||
#define UAC_PROCESS_STEREO_EXTENDER 0x03
|
||||
#define UAC_PROCESS_REVERB 0x04
|
||||
#define UAC_PROCESS_CHORUS 0x05
|
||||
#define UAC_PROCESS_DYN_RANGE_COMP 0x06
|
||||
|
||||
/* A.8 Audio Class-Specific Endpoint Descriptor Subtypes */
|
||||
#define UAC_EP_GENERAL 0x01
|
||||
|
||||
/* A.9 Audio Class-Specific Request Codes */
|
||||
#define UAC_SET_ 0x00
|
||||
#define UAC_GET_ 0x80
|
||||
|
||||
#define UAC__CUR 0x1
|
||||
#define UAC__MIN 0x2
|
||||
#define UAC__MAX 0x3
|
||||
#define UAC__RES 0x4
|
||||
#define UAC__MEM 0x5
|
||||
|
||||
#define UAC_SET_CUR (UAC_SET_ | UAC__CUR)
|
||||
#define UAC_GET_CUR (UAC_GET_ | UAC__CUR)
|
||||
#define UAC_SET_MIN (UAC_SET_ | UAC__MIN)
|
||||
#define UAC_GET_MIN (UAC_GET_ | UAC__MIN)
|
||||
#define UAC_SET_MAX (UAC_SET_ | UAC__MAX)
|
||||
#define UAC_GET_MAX (UAC_GET_ | UAC__MAX)
|
||||
#define UAC_SET_RES (UAC_SET_ | UAC__RES)
|
||||
#define UAC_GET_RES (UAC_GET_ | UAC__RES)
|
||||
#define UAC_SET_MEM (UAC_SET_ | UAC__MEM)
|
||||
#define UAC_GET_MEM (UAC_GET_ | UAC__MEM)
|
||||
|
||||
#define UAC_GET_STAT 0xff
|
||||
|
||||
/* A.10 Control Selector Codes */
|
||||
|
||||
/* A.10.1 Terminal Control Selectors */
|
||||
#define UAC_TERM_COPY_PROTECT 0x01
|
||||
|
||||
/* A.10.2 Feature Unit Control Selectors */
|
||||
#define UAC_FU_MUTE 0x01
|
||||
#define UAC_FU_VOLUME 0x02
|
||||
#define UAC_FU_BASS 0x03
|
||||
#define UAC_FU_MID 0x04
|
||||
#define UAC_FU_TREBLE 0x05
|
||||
#define UAC_FU_GRAPHIC_EQUALIZER 0x06
|
||||
#define UAC_FU_AUTOMATIC_GAIN 0x07
|
||||
#define UAC_FU_DELAY 0x08
|
||||
#define UAC_FU_BASS_BOOST 0x09
|
||||
#define UAC_FU_LOUDNESS 0x0a
|
||||
|
||||
#define UAC_CONTROL_BIT(CS) (1 << ((CS) - 1))
|
||||
|
||||
/* A.10.3.1 Up/Down-mix Processing Unit Controls Selectors */
|
||||
#define UAC_UD_ENABLE 0x01
|
||||
#define UAC_UD_MODE_SELECT 0x02
|
||||
|
||||
/* A.10.3.2 Dolby Prologic (tm) Processing Unit Controls Selectors */
|
||||
#define UAC_DP_ENABLE 0x01
|
||||
#define UAC_DP_MODE_SELECT 0x02
|
||||
|
||||
/* A.10.3.3 3D Stereo Extender Processing Unit Control Selectors */
|
||||
#define UAC_3D_ENABLE 0x01
|
||||
#define UAC_3D_SPACE 0x02
|
||||
|
||||
/* A.10.3.4 Reverberation Processing Unit Control Selectors */
|
||||
#define UAC_REVERB_ENABLE 0x01
|
||||
#define UAC_REVERB_LEVEL 0x02
|
||||
#define UAC_REVERB_TIME 0x03
|
||||
#define UAC_REVERB_FEEDBACK 0x04
|
||||
|
||||
/* A.10.3.5 Chorus Processing Unit Control Selectors */
|
||||
#define UAC_CHORUS_ENABLE 0x01
|
||||
#define UAC_CHORUS_LEVEL 0x02
|
||||
#define UAC_CHORUS_RATE 0x03
|
||||
#define UAC_CHORUS_DEPTH 0x04
|
||||
|
||||
/* A.10.3.6 Dynamic Range Compressor Unit Control Selectors */
|
||||
#define UAC_DCR_ENABLE 0x01
|
||||
#define UAC_DCR_RATE 0x02
|
||||
#define UAC_DCR_MAXAMPL 0x03
|
||||
#define UAC_DCR_THRESHOLD 0x04
|
||||
#define UAC_DCR_ATTACK_TIME 0x05
|
||||
#define UAC_DCR_RELEASE_TIME 0x06
|
||||
|
||||
/* A.10.4 Extension Unit Control Selectors */
|
||||
#define UAC_XU_ENABLE 0x01
|
||||
|
||||
/* MIDI - A.1 MS Class-Specific Interface Descriptor Subtypes */
|
||||
#define UAC_MS_HEADER 0x01
|
||||
#define UAC_MIDI_IN_JACK 0x02
|
||||
#define UAC_MIDI_OUT_JACK 0x03
|
||||
|
||||
/* MIDI - A.1 MS Class-Specific Endpoint Descriptor Subtypes */
|
||||
#define UAC_MS_GENERAL 0x01
|
||||
|
||||
/* Terminals - 2.1 USB Terminal Types */
|
||||
#define UAC_TERMINAL_UNDEFINED 0x100
|
||||
#define UAC_TERMINAL_STREAMING 0x101
|
||||
#define UAC_TERMINAL_VENDOR_SPEC 0x1FF
|
||||
|
||||
/* Terminal Control Selectors */
|
||||
/* 4.3.2 Class-Specific AC Interface Descriptor */
|
||||
struct uac1_ac_header_descriptor {
|
||||
__u8 bLength; /* 8 + n */
|
||||
__u8 bDescriptorType; /* USB_DT_CS_INTERFACE */
|
||||
__u8 bDescriptorSubtype; /* UAC_MS_HEADER */
|
||||
__le16 bcdADC; /* 0x0100 */
|
||||
__le16 wTotalLength; /* includes Unit and Terminal desc. */
|
||||
__u8 bInCollection; /* n */
|
||||
__u8 baInterfaceNr[]; /* [n] */
|
||||
} __attribute__ ((packed));
|
||||
|
||||
#define UAC_DT_AC_HEADER_SIZE(n) (8 + (n))
|
||||
|
||||
/* As above, but more useful for defining your own descriptors: */
|
||||
#define DECLARE_UAC_AC_HEADER_DESCRIPTOR(n) \
|
||||
struct uac1_ac_header_descriptor_##n { \
|
||||
__u8 bLength; \
|
||||
__u8 bDescriptorType; \
|
||||
__u8 bDescriptorSubtype; \
|
||||
__le16 bcdADC; \
|
||||
__le16 wTotalLength; \
|
||||
__u8 bInCollection; \
|
||||
__u8 baInterfaceNr[n]; \
|
||||
} __attribute__ ((packed))
|
||||
|
||||
/* 4.3.2.1 Input Terminal Descriptor */
|
||||
struct uac_input_terminal_descriptor {
|
||||
__u8 bLength; /* in bytes: 12 */
|
||||
__u8 bDescriptorType; /* CS_INTERFACE descriptor type */
|
||||
__u8 bDescriptorSubtype; /* INPUT_TERMINAL descriptor subtype */
|
||||
__u8 bTerminalID; /* Constant uniquely terminal ID */
|
||||
__le16 wTerminalType; /* USB Audio Terminal Types */
|
||||
__u8 bAssocTerminal; /* ID of the Output Terminal associated */
|
||||
__u8 bNrChannels; /* Number of logical output channels */
|
||||
__le16 wChannelConfig;
|
||||
__u8 iChannelNames;
|
||||
__u8 iTerminal;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
#define UAC_DT_INPUT_TERMINAL_SIZE 12
|
||||
|
||||
/* Terminals - 2.2 Input Terminal Types */
|
||||
#define UAC_INPUT_TERMINAL_UNDEFINED 0x200
|
||||
#define UAC_INPUT_TERMINAL_MICROPHONE 0x201
|
||||
#define UAC_INPUT_TERMINAL_DESKTOP_MICROPHONE 0x202
|
||||
#define UAC_INPUT_TERMINAL_PERSONAL_MICROPHONE 0x203
|
||||
#define UAC_INPUT_TERMINAL_OMNI_DIR_MICROPHONE 0x204
|
||||
#define UAC_INPUT_TERMINAL_MICROPHONE_ARRAY 0x205
|
||||
#define UAC_INPUT_TERMINAL_PROC_MICROPHONE_ARRAY 0x206
|
||||
|
||||
/* Terminals - control selectors */
|
||||
|
||||
#define UAC_TERMINAL_CS_COPY_PROTECT_CONTROL 0x01
|
||||
|
||||
/* 4.3.2.2 Output Terminal Descriptor */
|
||||
struct uac1_output_terminal_descriptor {
|
||||
__u8 bLength; /* in bytes: 9 */
|
||||
__u8 bDescriptorType; /* CS_INTERFACE descriptor type */
|
||||
__u8 bDescriptorSubtype; /* OUTPUT_TERMINAL descriptor subtype */
|
||||
__u8 bTerminalID; /* Constant uniquely terminal ID */
|
||||
__le16 wTerminalType; /* USB Audio Terminal Types */
|
||||
__u8 bAssocTerminal; /* ID of the Input Terminal associated */
|
||||
__u8 bSourceID; /* ID of the connected Unit or Terminal*/
|
||||
__u8 iTerminal;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
#define UAC_DT_OUTPUT_TERMINAL_SIZE 9
|
||||
|
||||
/* Terminals - 2.3 Output Terminal Types */
|
||||
#define UAC_OUTPUT_TERMINAL_UNDEFINED 0x300
|
||||
#define UAC_OUTPUT_TERMINAL_SPEAKER 0x301
|
||||
#define UAC_OUTPUT_TERMINAL_HEADPHONES 0x302
|
||||
#define UAC_OUTPUT_TERMINAL_HEAD_MOUNTED_DISPLAY_AUDIO 0x303
|
||||
#define UAC_OUTPUT_TERMINAL_DESKTOP_SPEAKER 0x304
|
||||
#define UAC_OUTPUT_TERMINAL_ROOM_SPEAKER 0x305
|
||||
#define UAC_OUTPUT_TERMINAL_COMMUNICATION_SPEAKER 0x306
|
||||
#define UAC_OUTPUT_TERMINAL_LOW_FREQ_EFFECTS_SPEAKER 0x307
|
||||
|
||||
/* Terminals - 2.4 Bi-directional Terminal Types */
|
||||
#define UAC_BIDIR_TERMINAL_UNDEFINED 0x400
|
||||
#define UAC_BIDIR_TERMINAL_HANDSET 0x401
|
||||
#define UAC_BIDIR_TERMINAL_HEADSET 0x402
|
||||
#define UAC_BIDIR_TERMINAL_SPEAKER_PHONE 0x403
|
||||
#define UAC_BIDIR_TERMINAL_ECHO_SUPPRESSING 0x404
|
||||
#define UAC_BIDIR_TERMINAL_ECHO_CANCELING 0x405
|
||||
|
||||
/* Set bControlSize = 2 as default setting */
|
||||
#define UAC_DT_FEATURE_UNIT_SIZE(ch) (7 + ((ch) + 1) * 2)
|
||||
|
||||
/* As above, but more useful for defining your own descriptors: */
|
||||
#define DECLARE_UAC_FEATURE_UNIT_DESCRIPTOR(ch) \
|
||||
struct uac_feature_unit_descriptor_##ch { \
|
||||
__u8 bLength; \
|
||||
__u8 bDescriptorType; \
|
||||
__u8 bDescriptorSubtype; \
|
||||
__u8 bUnitID; \
|
||||
__u8 bSourceID; \
|
||||
__u8 bControlSize; \
|
||||
__le16 bmaControls[ch + 1]; \
|
||||
__u8 iFeature; \
|
||||
} __attribute__ ((packed))
|
||||
|
||||
/* 4.3.2.3 Mixer Unit Descriptor */
|
||||
struct uac_mixer_unit_descriptor {
|
||||
__u8 bLength;
|
||||
__u8 bDescriptorType;
|
||||
__u8 bDescriptorSubtype;
|
||||
__u8 bUnitID;
|
||||
__u8 bNrInPins;
|
||||
__u8 baSourceID[];
|
||||
} __attribute__ ((packed));
|
||||
|
||||
static __inline__ __u8 uac_mixer_unit_bNrChannels(struct uac_mixer_unit_descriptor *desc)
|
||||
{
|
||||
return desc->baSourceID[desc->bNrInPins];
|
||||
}
|
||||
|
||||
static __inline__ __u32 uac_mixer_unit_wChannelConfig(struct uac_mixer_unit_descriptor *desc,
|
||||
int protocol)
|
||||
{
|
||||
if (protocol == UAC_VERSION_1)
|
||||
return (desc->baSourceID[desc->bNrInPins + 2] << 8) |
|
||||
desc->baSourceID[desc->bNrInPins + 1];
|
||||
else
|
||||
return (desc->baSourceID[desc->bNrInPins + 4] << 24) |
|
||||
(desc->baSourceID[desc->bNrInPins + 3] << 16) |
|
||||
(desc->baSourceID[desc->bNrInPins + 2] << 8) |
|
||||
(desc->baSourceID[desc->bNrInPins + 1]);
|
||||
}
|
||||
|
||||
static __inline__ __u8 uac_mixer_unit_iChannelNames(struct uac_mixer_unit_descriptor *desc,
|
||||
int protocol)
|
||||
{
|
||||
return (protocol == UAC_VERSION_1) ?
|
||||
desc->baSourceID[desc->bNrInPins + 3] :
|
||||
desc->baSourceID[desc->bNrInPins + 5];
|
||||
}
|
||||
|
||||
static __inline__ __u8 *uac_mixer_unit_bmControls(struct uac_mixer_unit_descriptor *desc,
|
||||
int protocol)
|
||||
{
|
||||
switch (protocol) {
|
||||
case UAC_VERSION_1:
|
||||
return &desc->baSourceID[desc->bNrInPins + 4];
|
||||
case UAC_VERSION_2:
|
||||
return &desc->baSourceID[desc->bNrInPins + 6];
|
||||
case UAC_VERSION_3:
|
||||
return &desc->baSourceID[desc->bNrInPins + 2];
|
||||
default:
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
static __inline__ __u16 uac3_mixer_unit_wClusterDescrID(struct uac_mixer_unit_descriptor *desc)
|
||||
{
|
||||
return (desc->baSourceID[desc->bNrInPins + 1] << 8) |
|
||||
desc->baSourceID[desc->bNrInPins];
|
||||
}
|
||||
|
||||
static __inline__ __u8 uac_mixer_unit_iMixer(struct uac_mixer_unit_descriptor *desc)
|
||||
{
|
||||
__u8 *raw = (__u8 *) desc;
|
||||
return raw[desc->bLength - 1];
|
||||
}
|
||||
|
||||
/* 4.3.2.4 Selector Unit Descriptor */
|
||||
struct uac_selector_unit_descriptor {
|
||||
__u8 bLength;
|
||||
__u8 bDescriptorType;
|
||||
__u8 bDescriptorSubtype;
|
||||
__u8 bUintID;
|
||||
__u8 bNrInPins;
|
||||
__u8 baSourceID[];
|
||||
} __attribute__ ((packed));
|
||||
|
||||
static __inline__ __u8 uac_selector_unit_iSelector(struct uac_selector_unit_descriptor *desc)
|
||||
{
|
||||
__u8 *raw = (__u8 *) desc;
|
||||
return raw[desc->bLength - 1];
|
||||
}
|
||||
|
||||
/* 4.3.2.5 Feature Unit Descriptor */
|
||||
struct uac_feature_unit_descriptor {
|
||||
__u8 bLength;
|
||||
__u8 bDescriptorType;
|
||||
__u8 bDescriptorSubtype;
|
||||
__u8 bUnitID;
|
||||
__u8 bSourceID;
|
||||
__u8 bControlSize;
|
||||
__u8 bmaControls[]; /* variable length */
|
||||
} __attribute__((packed));
|
||||
|
||||
static __inline__ __u8 uac_feature_unit_iFeature(struct uac_feature_unit_descriptor *desc)
|
||||
{
|
||||
__u8 *raw = (__u8 *) desc;
|
||||
return raw[desc->bLength - 1];
|
||||
}
|
||||
|
||||
/* 4.3.2.6 Processing Unit Descriptors */
|
||||
struct uac_processing_unit_descriptor {
|
||||
__u8 bLength;
|
||||
__u8 bDescriptorType;
|
||||
__u8 bDescriptorSubtype;
|
||||
__u8 bUnitID;
|
||||
__le16 wProcessType;
|
||||
__u8 bNrInPins;
|
||||
__u8 baSourceID[];
|
||||
} __attribute__ ((packed));
|
||||
|
||||
static __inline__ __u8 uac_processing_unit_bNrChannels(struct uac_processing_unit_descriptor *desc)
|
||||
{
|
||||
return desc->baSourceID[desc->bNrInPins];
|
||||
}
|
||||
|
||||
static __inline__ __u32 uac_processing_unit_wChannelConfig(struct uac_processing_unit_descriptor *desc,
|
||||
int protocol)
|
||||
{
|
||||
if (protocol == UAC_VERSION_1)
|
||||
return (desc->baSourceID[desc->bNrInPins + 2] << 8) |
|
||||
desc->baSourceID[desc->bNrInPins + 1];
|
||||
else
|
||||
return (desc->baSourceID[desc->bNrInPins + 4] << 24) |
|
||||
(desc->baSourceID[desc->bNrInPins + 3] << 16) |
|
||||
(desc->baSourceID[desc->bNrInPins + 2] << 8) |
|
||||
(desc->baSourceID[desc->bNrInPins + 1]);
|
||||
}
|
||||
|
||||
static __inline__ __u8 uac_processing_unit_iChannelNames(struct uac_processing_unit_descriptor *desc,
|
||||
int protocol)
|
||||
{
|
||||
return (protocol == UAC_VERSION_1) ?
|
||||
desc->baSourceID[desc->bNrInPins + 3] :
|
||||
desc->baSourceID[desc->bNrInPins + 5];
|
||||
}
|
||||
|
||||
static __inline__ __u8 uac_processing_unit_bControlSize(struct uac_processing_unit_descriptor *desc,
|
||||
int protocol)
|
||||
{
|
||||
switch (protocol) {
|
||||
case UAC_VERSION_1:
|
||||
return desc->baSourceID[desc->bNrInPins + 4];
|
||||
case UAC_VERSION_2:
|
||||
return 2; /* in UAC2, this value is constant */
|
||||
case UAC_VERSION_3:
|
||||
return 4; /* in UAC3, this value is constant */
|
||||
default:
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
static __inline__ __u8 *uac_processing_unit_bmControls(struct uac_processing_unit_descriptor *desc,
|
||||
int protocol)
|
||||
{
|
||||
switch (protocol) {
|
||||
case UAC_VERSION_1:
|
||||
return &desc->baSourceID[desc->bNrInPins + 5];
|
||||
case UAC_VERSION_2:
|
||||
return &desc->baSourceID[desc->bNrInPins + 6];
|
||||
case UAC_VERSION_3:
|
||||
return &desc->baSourceID[desc->bNrInPins + 2];
|
||||
default:
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
static __inline__ __u8 uac_processing_unit_iProcessing(struct uac_processing_unit_descriptor *desc,
|
||||
int protocol)
|
||||
{
|
||||
__u8 control_size = uac_processing_unit_bControlSize(desc, protocol);
|
||||
|
||||
switch (protocol) {
|
||||
case UAC_VERSION_1:
|
||||
case UAC_VERSION_2:
|
||||
default:
|
||||
return *(uac_processing_unit_bmControls(desc, protocol)
|
||||
+ control_size);
|
||||
case UAC_VERSION_3:
|
||||
return 0; /* UAC3 does not have this field */
|
||||
}
|
||||
}
|
||||
|
||||
static __inline__ __u8 *uac_processing_unit_specific(struct uac_processing_unit_descriptor *desc,
|
||||
int protocol)
|
||||
{
|
||||
__u8 control_size = uac_processing_unit_bControlSize(desc, protocol);
|
||||
|
||||
switch (protocol) {
|
||||
case UAC_VERSION_1:
|
||||
case UAC_VERSION_2:
|
||||
default:
|
||||
return uac_processing_unit_bmControls(desc, protocol)
|
||||
+ control_size + 1;
|
||||
case UAC_VERSION_3:
|
||||
return uac_processing_unit_bmControls(desc, protocol)
|
||||
+ control_size;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Extension Unit (XU) has almost compatible layout with Processing Unit, but
|
||||
* on UAC2, it has a different bmControls size (bControlSize); it's 1 byte for
|
||||
* XU while 2 bytes for PU. The last iExtension field is a one-byte index as
|
||||
* well as iProcessing field of PU.
|
||||
*/
|
||||
static __inline__ __u8 uac_extension_unit_bControlSize(struct uac_processing_unit_descriptor *desc,
|
||||
int protocol)
|
||||
{
|
||||
switch (protocol) {
|
||||
case UAC_VERSION_1:
|
||||
return desc->baSourceID[desc->bNrInPins + 4];
|
||||
case UAC_VERSION_2:
|
||||
return 1; /* in UAC2, this value is constant */
|
||||
case UAC_VERSION_3:
|
||||
return 4; /* in UAC3, this value is constant */
|
||||
default:
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
static __inline__ __u8 uac_extension_unit_iExtension(struct uac_processing_unit_descriptor *desc,
|
||||
int protocol)
|
||||
{
|
||||
__u8 control_size = uac_extension_unit_bControlSize(desc, protocol);
|
||||
|
||||
switch (protocol) {
|
||||
case UAC_VERSION_1:
|
||||
case UAC_VERSION_2:
|
||||
default:
|
||||
return *(uac_processing_unit_bmControls(desc, protocol)
|
||||
+ control_size);
|
||||
case UAC_VERSION_3:
|
||||
return 0; /* UAC3 does not have this field */
|
||||
}
|
||||
}
|
||||
|
||||
/* 4.5.2 Class-Specific AS Interface Descriptor */
|
||||
struct uac1_as_header_descriptor {
|
||||
__u8 bLength; /* in bytes: 7 */
|
||||
__u8 bDescriptorType; /* USB_DT_CS_INTERFACE */
|
||||
__u8 bDescriptorSubtype; /* AS_GENERAL */
|
||||
__u8 bTerminalLink; /* Terminal ID of connected Terminal */
|
||||
__u8 bDelay; /* Delay introduced by the data path */
|
||||
__le16 wFormatTag; /* The Audio Data Format */
|
||||
} __attribute__ ((packed));
|
||||
|
||||
#define UAC_DT_AS_HEADER_SIZE 7
|
||||
|
||||
/* Formats - A.1.1 Audio Data Format Type I Codes */
|
||||
#define UAC_FORMAT_TYPE_I_UNDEFINED 0x0
|
||||
#define UAC_FORMAT_TYPE_I_PCM 0x1
|
||||
#define UAC_FORMAT_TYPE_I_PCM8 0x2
|
||||
#define UAC_FORMAT_TYPE_I_IEEE_FLOAT 0x3
|
||||
#define UAC_FORMAT_TYPE_I_ALAW 0x4
|
||||
#define UAC_FORMAT_TYPE_I_MULAW 0x5
|
||||
|
||||
struct uac_format_type_i_continuous_descriptor {
|
||||
__u8 bLength; /* in bytes: 8 + (ns * 3) */
|
||||
__u8 bDescriptorType; /* USB_DT_CS_INTERFACE */
|
||||
__u8 bDescriptorSubtype; /* FORMAT_TYPE */
|
||||
__u8 bFormatType; /* FORMAT_TYPE_1 */
|
||||
__u8 bNrChannels; /* physical channels in the stream */
|
||||
__u8 bSubframeSize; /* */
|
||||
__u8 bBitResolution;
|
||||
__u8 bSamFreqType;
|
||||
__u8 tLowerSamFreq[3];
|
||||
__u8 tUpperSamFreq[3];
|
||||
} __attribute__ ((packed));
|
||||
|
||||
#define UAC_FORMAT_TYPE_I_CONTINUOUS_DESC_SIZE 14
|
||||
|
||||
struct uac_format_type_i_discrete_descriptor {
|
||||
__u8 bLength; /* in bytes: 8 + (ns * 3) */
|
||||
__u8 bDescriptorType; /* USB_DT_CS_INTERFACE */
|
||||
__u8 bDescriptorSubtype; /* FORMAT_TYPE */
|
||||
__u8 bFormatType; /* FORMAT_TYPE_1 */
|
||||
__u8 bNrChannels; /* physical channels in the stream */
|
||||
__u8 bSubframeSize; /* */
|
||||
__u8 bBitResolution;
|
||||
__u8 bSamFreqType;
|
||||
__u8 tSamFreq[][3];
|
||||
} __attribute__ ((packed));
|
||||
|
||||
#define DECLARE_UAC_FORMAT_TYPE_I_DISCRETE_DESC(n) \
|
||||
struct uac_format_type_i_discrete_descriptor_##n { \
|
||||
__u8 bLength; \
|
||||
__u8 bDescriptorType; \
|
||||
__u8 bDescriptorSubtype; \
|
||||
__u8 bFormatType; \
|
||||
__u8 bNrChannels; \
|
||||
__u8 bSubframeSize; \
|
||||
__u8 bBitResolution; \
|
||||
__u8 bSamFreqType; \
|
||||
__u8 tSamFreq[n][3]; \
|
||||
} __attribute__ ((packed))
|
||||
|
||||
#define UAC_FORMAT_TYPE_I_DISCRETE_DESC_SIZE(n) (8 + (n * 3))
|
||||
|
||||
struct uac_format_type_i_ext_descriptor {
|
||||
__u8 bLength;
|
||||
__u8 bDescriptorType;
|
||||
__u8 bDescriptorSubtype;
|
||||
__u8 bFormatType;
|
||||
__u8 bSubslotSize;
|
||||
__u8 bBitResolution;
|
||||
__u8 bHeaderLength;
|
||||
__u8 bControlSize;
|
||||
__u8 bSideBandProtocol;
|
||||
} __attribute__((packed));
|
||||
|
||||
/* Formats - Audio Data Format Type I Codes */
|
||||
|
||||
#define UAC_FORMAT_TYPE_II_MPEG 0x1001
|
||||
#define UAC_FORMAT_TYPE_II_AC3 0x1002
|
||||
|
||||
struct uac_format_type_ii_discrete_descriptor {
|
||||
__u8 bLength;
|
||||
__u8 bDescriptorType;
|
||||
__u8 bDescriptorSubtype;
|
||||
__u8 bFormatType;
|
||||
__le16 wMaxBitRate;
|
||||
__le16 wSamplesPerFrame;
|
||||
__u8 bSamFreqType;
|
||||
__u8 tSamFreq[][3];
|
||||
} __attribute__((packed));
|
||||
|
||||
struct uac_format_type_ii_ext_descriptor {
|
||||
__u8 bLength;
|
||||
__u8 bDescriptorType;
|
||||
__u8 bDescriptorSubtype;
|
||||
__u8 bFormatType;
|
||||
__le16 wMaxBitRate;
|
||||
__le16 wSamplesPerFrame;
|
||||
__u8 bHeaderLength;
|
||||
__u8 bSideBandProtocol;
|
||||
} __attribute__((packed));
|
||||
|
||||
/* type III */
|
||||
#define UAC_FORMAT_TYPE_III_IEC1937_AC3 0x2001
|
||||
#define UAC_FORMAT_TYPE_III_IEC1937_MPEG1_LAYER1 0x2002
|
||||
#define UAC_FORMAT_TYPE_III_IEC1937_MPEG2_NOEXT 0x2003
|
||||
#define UAC_FORMAT_TYPE_III_IEC1937_MPEG2_EXT 0x2004
|
||||
#define UAC_FORMAT_TYPE_III_IEC1937_MPEG2_LAYER1_LS 0x2005
|
||||
#define UAC_FORMAT_TYPE_III_IEC1937_MPEG2_LAYER23_LS 0x2006
|
||||
|
||||
/* Formats - A.2 Format Type Codes */
|
||||
#define UAC_FORMAT_TYPE_UNDEFINED 0x0
|
||||
#define UAC_FORMAT_TYPE_I 0x1
|
||||
#define UAC_FORMAT_TYPE_II 0x2
|
||||
#define UAC_FORMAT_TYPE_III 0x3
|
||||
#define UAC_EXT_FORMAT_TYPE_I 0x81
|
||||
#define UAC_EXT_FORMAT_TYPE_II 0x82
|
||||
#define UAC_EXT_FORMAT_TYPE_III 0x83
|
||||
|
||||
struct uac_iso_endpoint_descriptor {
|
||||
__u8 bLength; /* in bytes: 7 */
|
||||
__u8 bDescriptorType; /* USB_DT_CS_ENDPOINT */
|
||||
__u8 bDescriptorSubtype; /* EP_GENERAL */
|
||||
__u8 bmAttributes;
|
||||
__u8 bLockDelayUnits;
|
||||
__le16 wLockDelay;
|
||||
} __attribute__((packed));
|
||||
#define UAC_ISO_ENDPOINT_DESC_SIZE 7
|
||||
|
||||
#define UAC_EP_CS_ATTR_SAMPLE_RATE 0x01
|
||||
#define UAC_EP_CS_ATTR_PITCH_CONTROL 0x02
|
||||
#define UAC_EP_CS_ATTR_FILL_MAX 0x80
|
||||
|
||||
/* status word format (3.7.1.1) */
|
||||
|
||||
#define UAC1_STATUS_TYPE_ORIG_MASK 0x0f
|
||||
#define UAC1_STATUS_TYPE_ORIG_AUDIO_CONTROL_IF 0x0
|
||||
#define UAC1_STATUS_TYPE_ORIG_AUDIO_STREAM_IF 0x1
|
||||
#define UAC1_STATUS_TYPE_ORIG_AUDIO_STREAM_EP 0x2
|
||||
|
||||
#define UAC1_STATUS_TYPE_IRQ_PENDING (1 << 7)
|
||||
#define UAC1_STATUS_TYPE_MEM_CHANGED (1 << 6)
|
||||
|
||||
struct uac1_status_word {
|
||||
__u8 bStatusType;
|
||||
__u8 bOriginator;
|
||||
} __attribute__((packed));
|
||||
|
||||
|
||||
#endif /* __LINUX_USB_AUDIO_H */
|
24
linux/usb/cdc-wdm.h
Normal file
24
linux/usb/cdc-wdm.h
Normal file
@ -0,0 +1,24 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
|
||||
/*
|
||||
* USB CDC Device Management userspace API definitions
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* version 2 as published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#ifndef __LINUX_USB_CDC_WDM_H
|
||||
#define __LINUX_USB_CDC_WDM_H
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
/*
|
||||
* This IOCTL is used to retrieve the wMaxCommand for the device,
|
||||
* defining the message limit for both reading and writing.
|
||||
*
|
||||
* For CDC WDM functions this will be the wMaxCommand field of the
|
||||
* Device Management Functional Descriptor.
|
||||
*/
|
||||
#define IOCTL_WDM_MAX_COMMAND _IOR('H', 0xA0, __u16)
|
||||
|
||||
#endif /* __LINUX_USB_CDC_WDM_H */
|
461
linux/usb/cdc.h
Normal file
461
linux/usb/cdc.h
Normal file
@ -0,0 +1,461 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
|
||||
/*
|
||||
* USB Communications Device Class (CDC) definitions
|
||||
*
|
||||
* CDC says how to talk to lots of different types of network adapters,
|
||||
* notably ethernet adapters and various modems. It's used mostly with
|
||||
* firmware based USB peripherals.
|
||||
*/
|
||||
|
||||
#ifndef __UAPI_LINUX_USB_CDC_H
|
||||
#define __UAPI_LINUX_USB_CDC_H
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
#define USB_CDC_SUBCLASS_ACM 0x02
|
||||
#define USB_CDC_SUBCLASS_ETHERNET 0x06
|
||||
#define USB_CDC_SUBCLASS_WHCM 0x08
|
||||
#define USB_CDC_SUBCLASS_DMM 0x09
|
||||
#define USB_CDC_SUBCLASS_MDLM 0x0a
|
||||
#define USB_CDC_SUBCLASS_OBEX 0x0b
|
||||
#define USB_CDC_SUBCLASS_EEM 0x0c
|
||||
#define USB_CDC_SUBCLASS_NCM 0x0d
|
||||
#define USB_CDC_SUBCLASS_MBIM 0x0e
|
||||
|
||||
#define USB_CDC_PROTO_NONE 0
|
||||
|
||||
#define USB_CDC_ACM_PROTO_AT_V25TER 1
|
||||
#define USB_CDC_ACM_PROTO_AT_PCCA101 2
|
||||
#define USB_CDC_ACM_PROTO_AT_PCCA101_WAKE 3
|
||||
#define USB_CDC_ACM_PROTO_AT_GSM 4
|
||||
#define USB_CDC_ACM_PROTO_AT_3G 5
|
||||
#define USB_CDC_ACM_PROTO_AT_CDMA 6
|
||||
#define USB_CDC_ACM_PROTO_VENDOR 0xff
|
||||
|
||||
#define USB_CDC_PROTO_EEM 7
|
||||
|
||||
#define USB_CDC_NCM_PROTO_NTB 1
|
||||
#define USB_CDC_MBIM_PROTO_NTB 2
|
||||
|
||||
/*-------------------------------------------------------------------------*/
|
||||
|
||||
/*
|
||||
* Class-Specific descriptors ... there are a couple dozen of them
|
||||
*/
|
||||
|
||||
#define USB_CDC_HEADER_TYPE 0x00 /* header_desc */
|
||||
#define USB_CDC_CALL_MANAGEMENT_TYPE 0x01 /* call_mgmt_descriptor */
|
||||
#define USB_CDC_ACM_TYPE 0x02 /* acm_descriptor */
|
||||
#define USB_CDC_UNION_TYPE 0x06 /* union_desc */
|
||||
#define USB_CDC_COUNTRY_TYPE 0x07
|
||||
#define USB_CDC_NETWORK_TERMINAL_TYPE 0x0a /* network_terminal_desc */
|
||||
#define USB_CDC_ETHERNET_TYPE 0x0f /* ether_desc */
|
||||
#define USB_CDC_WHCM_TYPE 0x11
|
||||
#define USB_CDC_MDLM_TYPE 0x12 /* mdlm_desc */
|
||||
#define USB_CDC_MDLM_DETAIL_TYPE 0x13 /* mdlm_detail_desc */
|
||||
#define USB_CDC_DMM_TYPE 0x14
|
||||
#define USB_CDC_OBEX_TYPE 0x15
|
||||
#define USB_CDC_NCM_TYPE 0x1a
|
||||
#define USB_CDC_MBIM_TYPE 0x1b
|
||||
#define USB_CDC_MBIM_EXTENDED_TYPE 0x1c
|
||||
|
||||
/* "Header Functional Descriptor" from CDC spec 5.2.3.1 */
|
||||
struct usb_cdc_header_desc {
|
||||
__u8 bLength;
|
||||
__u8 bDescriptorType;
|
||||
__u8 bDescriptorSubType;
|
||||
|
||||
__le16 bcdCDC;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
/* "Call Management Descriptor" from CDC spec 5.2.3.2 */
|
||||
struct usb_cdc_call_mgmt_descriptor {
|
||||
__u8 bLength;
|
||||
__u8 bDescriptorType;
|
||||
__u8 bDescriptorSubType;
|
||||
|
||||
__u8 bmCapabilities;
|
||||
#define USB_CDC_CALL_MGMT_CAP_CALL_MGMT 0x01
|
||||
#define USB_CDC_CALL_MGMT_CAP_DATA_INTF 0x02
|
||||
|
||||
__u8 bDataInterface;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
/* "Abstract Control Management Descriptor" from CDC spec 5.2.3.3 */
|
||||
struct usb_cdc_acm_descriptor {
|
||||
__u8 bLength;
|
||||
__u8 bDescriptorType;
|
||||
__u8 bDescriptorSubType;
|
||||
|
||||
__u8 bmCapabilities;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
/* capabilities from 5.2.3.3 */
|
||||
|
||||
#define USB_CDC_COMM_FEATURE 0x01
|
||||
#define USB_CDC_CAP_LINE 0x02
|
||||
#define USB_CDC_CAP_BRK 0x04
|
||||
#define USB_CDC_CAP_NOTIFY 0x08
|
||||
|
||||
/* "Union Functional Descriptor" from CDC spec 5.2.3.8 */
|
||||
struct usb_cdc_union_desc {
|
||||
__u8 bLength;
|
||||
__u8 bDescriptorType;
|
||||
__u8 bDescriptorSubType;
|
||||
|
||||
__u8 bMasterInterface0;
|
||||
__u8 bSlaveInterface0;
|
||||
/* ... and there could be other slave interfaces */
|
||||
} __attribute__ ((packed));
|
||||
|
||||
/* "Country Selection Functional Descriptor" from CDC spec 5.2.3.9 */
|
||||
struct usb_cdc_country_functional_desc {
|
||||
__u8 bLength;
|
||||
__u8 bDescriptorType;
|
||||
__u8 bDescriptorSubType;
|
||||
|
||||
__u8 iCountryCodeRelDate;
|
||||
__le16 wCountyCode0;
|
||||
/* ... and there can be a lot of country codes */
|
||||
} __attribute__ ((packed));
|
||||
|
||||
/* "Network Channel Terminal Functional Descriptor" from CDC spec 5.2.3.11 */
|
||||
struct usb_cdc_network_terminal_desc {
|
||||
__u8 bLength;
|
||||
__u8 bDescriptorType;
|
||||
__u8 bDescriptorSubType;
|
||||
|
||||
__u8 bEntityId;
|
||||
__u8 iName;
|
||||
__u8 bChannelIndex;
|
||||
__u8 bPhysicalInterface;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
/* "Ethernet Networking Functional Descriptor" from CDC spec 5.2.3.16 */
|
||||
struct usb_cdc_ether_desc {
|
||||
__u8 bLength;
|
||||
__u8 bDescriptorType;
|
||||
__u8 bDescriptorSubType;
|
||||
|
||||
__u8 iMACAddress;
|
||||
__le32 bmEthernetStatistics;
|
||||
__le16 wMaxSegmentSize;
|
||||
__le16 wNumberMCFilters;
|
||||
__u8 bNumberPowerFilters;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
/* "Telephone Control Model Functional Descriptor" from CDC WMC spec 6.3..3 */
|
||||
struct usb_cdc_dmm_desc {
|
||||
__u8 bFunctionLength;
|
||||
__u8 bDescriptorType;
|
||||
__u8 bDescriptorSubtype;
|
||||
__u16 bcdVersion;
|
||||
__le16 wMaxCommand;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
/* "MDLM Functional Descriptor" from CDC WMC spec 6.7.2.3 */
|
||||
struct usb_cdc_mdlm_desc {
|
||||
__u8 bLength;
|
||||
__u8 bDescriptorType;
|
||||
__u8 bDescriptorSubType;
|
||||
|
||||
__le16 bcdVersion;
|
||||
__u8 bGUID[16];
|
||||
} __attribute__ ((packed));
|
||||
|
||||
/* "MDLM Detail Functional Descriptor" from CDC WMC spec 6.7.2.4 */
|
||||
struct usb_cdc_mdlm_detail_desc {
|
||||
__u8 bLength;
|
||||
__u8 bDescriptorType;
|
||||
__u8 bDescriptorSubType;
|
||||
|
||||
/* type is associated with mdlm_desc.bGUID */
|
||||
__u8 bGuidDescriptorType;
|
||||
__u8 bDetailData[];
|
||||
} __attribute__ ((packed));
|
||||
|
||||
/* "OBEX Control Model Functional Descriptor" */
|
||||
struct usb_cdc_obex_desc {
|
||||
__u8 bLength;
|
||||
__u8 bDescriptorType;
|
||||
__u8 bDescriptorSubType;
|
||||
|
||||
__le16 bcdVersion;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
/* "NCM Control Model Functional Descriptor" */
|
||||
struct usb_cdc_ncm_desc {
|
||||
__u8 bLength;
|
||||
__u8 bDescriptorType;
|
||||
__u8 bDescriptorSubType;
|
||||
|
||||
__le16 bcdNcmVersion;
|
||||
__u8 bmNetworkCapabilities;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
/* "MBIM Control Model Functional Descriptor" */
|
||||
struct usb_cdc_mbim_desc {
|
||||
__u8 bLength;
|
||||
__u8 bDescriptorType;
|
||||
__u8 bDescriptorSubType;
|
||||
|
||||
__le16 bcdMBIMVersion;
|
||||
__le16 wMaxControlMessage;
|
||||
__u8 bNumberFilters;
|
||||
__u8 bMaxFilterSize;
|
||||
__le16 wMaxSegmentSize;
|
||||
__u8 bmNetworkCapabilities;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
/* "MBIM Extended Functional Descriptor" from CDC MBIM spec 1.0 errata-1 */
|
||||
struct usb_cdc_mbim_extended_desc {
|
||||
__u8 bLength;
|
||||
__u8 bDescriptorType;
|
||||
__u8 bDescriptorSubType;
|
||||
|
||||
__le16 bcdMBIMExtendedVersion;
|
||||
__u8 bMaxOutstandingCommandMessages;
|
||||
__le16 wMTU;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
/*-------------------------------------------------------------------------*/
|
||||
|
||||
/*
|
||||
* Class-Specific Control Requests (6.2)
|
||||
*
|
||||
* section 3.6.2.1 table 4 has the ACM profile, for modems.
|
||||
* section 3.8.2 table 10 has the ethernet profile.
|
||||
*
|
||||
* Microsoft's RNDIS stack for Ethernet is a vendor-specific CDC ACM variant,
|
||||
* heavily dependent on the encapsulated (proprietary) command mechanism.
|
||||
*/
|
||||
|
||||
#define USB_CDC_SEND_ENCAPSULATED_COMMAND 0x00
|
||||
#define USB_CDC_GET_ENCAPSULATED_RESPONSE 0x01
|
||||
#define USB_CDC_REQ_SET_LINE_CODING 0x20
|
||||
#define USB_CDC_REQ_GET_LINE_CODING 0x21
|
||||
#define USB_CDC_REQ_SET_CONTROL_LINE_STATE 0x22
|
||||
#define USB_CDC_REQ_SEND_BREAK 0x23
|
||||
#define USB_CDC_SET_ETHERNET_MULTICAST_FILTERS 0x40
|
||||
#define USB_CDC_SET_ETHERNET_PM_PATTERN_FILTER 0x41
|
||||
#define USB_CDC_GET_ETHERNET_PM_PATTERN_FILTER 0x42
|
||||
#define USB_CDC_SET_ETHERNET_PACKET_FILTER 0x43
|
||||
#define USB_CDC_GET_ETHERNET_STATISTIC 0x44
|
||||
#define USB_CDC_GET_NTB_PARAMETERS 0x80
|
||||
#define USB_CDC_GET_NET_ADDRESS 0x81
|
||||
#define USB_CDC_SET_NET_ADDRESS 0x82
|
||||
#define USB_CDC_GET_NTB_FORMAT 0x83
|
||||
#define USB_CDC_SET_NTB_FORMAT 0x84
|
||||
#define USB_CDC_GET_NTB_INPUT_SIZE 0x85
|
||||
#define USB_CDC_SET_NTB_INPUT_SIZE 0x86
|
||||
#define USB_CDC_GET_MAX_DATAGRAM_SIZE 0x87
|
||||
#define USB_CDC_SET_MAX_DATAGRAM_SIZE 0x88
|
||||
#define USB_CDC_GET_CRC_MODE 0x89
|
||||
#define USB_CDC_SET_CRC_MODE 0x8a
|
||||
|
||||
/* Line Coding Structure from CDC spec 6.2.13 */
|
||||
struct usb_cdc_line_coding {
|
||||
__le32 dwDTERate;
|
||||
__u8 bCharFormat;
|
||||
#define USB_CDC_1_STOP_BITS 0
|
||||
#define USB_CDC_1_5_STOP_BITS 1
|
||||
#define USB_CDC_2_STOP_BITS 2
|
||||
|
||||
__u8 bParityType;
|
||||
#define USB_CDC_NO_PARITY 0
|
||||
#define USB_CDC_ODD_PARITY 1
|
||||
#define USB_CDC_EVEN_PARITY 2
|
||||
#define USB_CDC_MARK_PARITY 3
|
||||
#define USB_CDC_SPACE_PARITY 4
|
||||
|
||||
__u8 bDataBits;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
/* Control Signal Bitmap Values from 6.2.14 SetControlLineState */
|
||||
#define USB_CDC_CTRL_DTR (1 << 0)
|
||||
#define USB_CDC_CTRL_RTS (1 << 1)
|
||||
|
||||
/* table 62; bits in multicast filter */
|
||||
#define USB_CDC_PACKET_TYPE_PROMISCUOUS (1 << 0)
|
||||
#define USB_CDC_PACKET_TYPE_ALL_MULTICAST (1 << 1) /* no filter */
|
||||
#define USB_CDC_PACKET_TYPE_DIRECTED (1 << 2)
|
||||
#define USB_CDC_PACKET_TYPE_BROADCAST (1 << 3)
|
||||
#define USB_CDC_PACKET_TYPE_MULTICAST (1 << 4) /* filtered */
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------*/
|
||||
|
||||
/*
|
||||
* Class-Specific Notifications (6.3) sent by interrupt transfers
|
||||
*
|
||||
* section 3.8.2 table 11 of the CDC spec lists Ethernet notifications
|
||||
* section 3.6.2.1 table 5 specifies ACM notifications, accepted by RNDIS
|
||||
* RNDIS also defines its own bit-incompatible notifications
|
||||
*/
|
||||
|
||||
#define USB_CDC_NOTIFY_NETWORK_CONNECTION 0x00
|
||||
#define USB_CDC_NOTIFY_RESPONSE_AVAILABLE 0x01
|
||||
#define USB_CDC_NOTIFY_SERIAL_STATE 0x20
|
||||
#define USB_CDC_NOTIFY_SPEED_CHANGE 0x2a
|
||||
|
||||
struct usb_cdc_notification {
|
||||
__u8 bmRequestType;
|
||||
__u8 bNotificationType;
|
||||
__le16 wValue;
|
||||
__le16 wIndex;
|
||||
__le16 wLength;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
/* UART State Bitmap Values from 6.3.5 SerialState */
|
||||
#define USB_CDC_SERIAL_STATE_DCD (1 << 0)
|
||||
#define USB_CDC_SERIAL_STATE_DSR (1 << 1)
|
||||
#define USB_CDC_SERIAL_STATE_BREAK (1 << 2)
|
||||
#define USB_CDC_SERIAL_STATE_RING_SIGNAL (1 << 3)
|
||||
#define USB_CDC_SERIAL_STATE_FRAMING (1 << 4)
|
||||
#define USB_CDC_SERIAL_STATE_PARITY (1 << 5)
|
||||
#define USB_CDC_SERIAL_STATE_OVERRUN (1 << 6)
|
||||
|
||||
struct usb_cdc_speed_change {
|
||||
__le32 DLBitRRate; /* contains the downlink bit rate (IN pipe) */
|
||||
__le32 ULBitRate; /* contains the uplink bit rate (OUT pipe) */
|
||||
} __attribute__ ((packed));
|
||||
|
||||
/*-------------------------------------------------------------------------*/
|
||||
|
||||
/*
|
||||
* Class Specific structures and constants
|
||||
*
|
||||
* CDC NCM NTB parameters structure, CDC NCM subclass 6.2.1
|
||||
*
|
||||
*/
|
||||
|
||||
struct usb_cdc_ncm_ntb_parameters {
|
||||
__le16 wLength;
|
||||
__le16 bmNtbFormatsSupported;
|
||||
__le32 dwNtbInMaxSize;
|
||||
__le16 wNdpInDivisor;
|
||||
__le16 wNdpInPayloadRemainder;
|
||||
__le16 wNdpInAlignment;
|
||||
__le16 wPadding1;
|
||||
__le32 dwNtbOutMaxSize;
|
||||
__le16 wNdpOutDivisor;
|
||||
__le16 wNdpOutPayloadRemainder;
|
||||
__le16 wNdpOutAlignment;
|
||||
__le16 wNtbOutMaxDatagrams;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
/*
|
||||
* CDC NCM transfer headers, CDC NCM subclass 3.2
|
||||
*/
|
||||
|
||||
#define USB_CDC_NCM_NTH16_SIGN 0x484D434E /* NCMH */
|
||||
#define USB_CDC_NCM_NTH32_SIGN 0x686D636E /* ncmh */
|
||||
|
||||
struct usb_cdc_ncm_nth16 {
|
||||
__le32 dwSignature;
|
||||
__le16 wHeaderLength;
|
||||
__le16 wSequence;
|
||||
__le16 wBlockLength;
|
||||
__le16 wNdpIndex;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
struct usb_cdc_ncm_nth32 {
|
||||
__le32 dwSignature;
|
||||
__le16 wHeaderLength;
|
||||
__le16 wSequence;
|
||||
__le32 dwBlockLength;
|
||||
__le32 dwNdpIndex;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
/*
|
||||
* CDC NCM datagram pointers, CDC NCM subclass 3.3
|
||||
*/
|
||||
|
||||
#define USB_CDC_NCM_NDP16_CRC_SIGN 0x314D434E /* NCM1 */
|
||||
#define USB_CDC_NCM_NDP16_NOCRC_SIGN 0x304D434E /* NCM0 */
|
||||
#define USB_CDC_NCM_NDP32_CRC_SIGN 0x316D636E /* ncm1 */
|
||||
#define USB_CDC_NCM_NDP32_NOCRC_SIGN 0x306D636E /* ncm0 */
|
||||
|
||||
#define USB_CDC_MBIM_NDP16_IPS_SIGN 0x00535049 /* IPS<sessionID> : IPS0 for now */
|
||||
#define USB_CDC_MBIM_NDP32_IPS_SIGN 0x00737069 /* ips<sessionID> : ips0 for now */
|
||||
#define USB_CDC_MBIM_NDP16_DSS_SIGN 0x00535344 /* DSS<sessionID> */
|
||||
#define USB_CDC_MBIM_NDP32_DSS_SIGN 0x00737364 /* dss<sessionID> */
|
||||
|
||||
/* 16-bit NCM Datagram Pointer Entry */
|
||||
struct usb_cdc_ncm_dpe16 {
|
||||
__le16 wDatagramIndex;
|
||||
__le16 wDatagramLength;
|
||||
} __attribute__((__packed__));
|
||||
|
||||
/* 16-bit NCM Datagram Pointer Table */
|
||||
struct usb_cdc_ncm_ndp16 {
|
||||
__le32 dwSignature;
|
||||
__le16 wLength;
|
||||
__le16 wNextNdpIndex;
|
||||
struct usb_cdc_ncm_dpe16 dpe16[];
|
||||
} __attribute__ ((packed));
|
||||
|
||||
/* 32-bit NCM Datagram Pointer Entry */
|
||||
struct usb_cdc_ncm_dpe32 {
|
||||
__le32 dwDatagramIndex;
|
||||
__le32 dwDatagramLength;
|
||||
} __attribute__((__packed__));
|
||||
|
||||
/* 32-bit NCM Datagram Pointer Table */
|
||||
struct usb_cdc_ncm_ndp32 {
|
||||
__le32 dwSignature;
|
||||
__le16 wLength;
|
||||
__le16 wReserved6;
|
||||
__le32 dwNextNdpIndex;
|
||||
__le32 dwReserved12;
|
||||
struct usb_cdc_ncm_dpe32 dpe32[];
|
||||
} __attribute__ ((packed));
|
||||
|
||||
/* CDC NCM subclass 3.2.1 and 3.2.2 */
|
||||
#define USB_CDC_NCM_NDP16_INDEX_MIN 0x000C
|
||||
#define USB_CDC_NCM_NDP32_INDEX_MIN 0x0010
|
||||
|
||||
/* CDC NCM subclass 3.3.3 Datagram Formatting */
|
||||
#define USB_CDC_NCM_DATAGRAM_FORMAT_CRC 0x30
|
||||
#define USB_CDC_NCM_DATAGRAM_FORMAT_NOCRC 0X31
|
||||
|
||||
/* CDC NCM subclass 4.2 NCM Communications Interface Protocol Code */
|
||||
#define USB_CDC_NCM_PROTO_CODE_NO_ENCAP_COMMANDS 0x00
|
||||
#define USB_CDC_NCM_PROTO_CODE_EXTERN_PROTO 0xFE
|
||||
|
||||
/* CDC NCM subclass 5.2.1 NCM Functional Descriptor, bmNetworkCapabilities */
|
||||
#define USB_CDC_NCM_NCAP_ETH_FILTER (1 << 0)
|
||||
#define USB_CDC_NCM_NCAP_NET_ADDRESS (1 << 1)
|
||||
#define USB_CDC_NCM_NCAP_ENCAP_COMMAND (1 << 2)
|
||||
#define USB_CDC_NCM_NCAP_MAX_DATAGRAM_SIZE (1 << 3)
|
||||
#define USB_CDC_NCM_NCAP_CRC_MODE (1 << 4)
|
||||
#define USB_CDC_NCM_NCAP_NTB_INPUT_SIZE (1 << 5)
|
||||
|
||||
/* CDC NCM subclass Table 6-3: NTB Parameter Structure */
|
||||
#define USB_CDC_NCM_NTB16_SUPPORTED (1 << 0)
|
||||
#define USB_CDC_NCM_NTB32_SUPPORTED (1 << 1)
|
||||
|
||||
/* CDC NCM subclass Table 6-3: NTB Parameter Structure */
|
||||
#define USB_CDC_NCM_NDP_ALIGN_MIN_SIZE 0x04
|
||||
#define USB_CDC_NCM_NTB_MAX_LENGTH 0x1C
|
||||
|
||||
/* CDC NCM subclass 6.2.5 SetNtbFormat */
|
||||
#define USB_CDC_NCM_NTB16_FORMAT 0x00
|
||||
#define USB_CDC_NCM_NTB32_FORMAT 0x01
|
||||
|
||||
/* CDC NCM subclass 6.2.7 SetNtbInputSize */
|
||||
#define USB_CDC_NCM_NTB_MIN_IN_SIZE 2048
|
||||
#define USB_CDC_NCM_NTB_MIN_OUT_SIZE 2048
|
||||
|
||||
/* NTB Input Size Structure */
|
||||
struct usb_cdc_ncm_ndp_input_size {
|
||||
__le32 dwNtbInMaxSize;
|
||||
__le16 wNtbInMaxDatagrams;
|
||||
__le16 wReserved;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
/* CDC NCM subclass 6.2.11 SetCrcMode */
|
||||
#define USB_CDC_NCM_CRC_NOT_APPENDED 0x00
|
||||
#define USB_CDC_NCM_CRC_APPENDED 0x01
|
||||
|
||||
#endif /* __UAPI_LINUX_USB_CDC_H */
|
307
linux/usb/ch11.h
Normal file
307
linux/usb/ch11.h
Normal file
@ -0,0 +1,307 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
|
||||
/*
|
||||
* This file holds Hub protocol constants and data structures that are
|
||||
* defined in chapter 11 (Hub Specification) of the USB 2.0 specification.
|
||||
*
|
||||
* It is used/shared between the USB core, the HCDs and couple of other USB
|
||||
* drivers.
|
||||
*/
|
||||
|
||||
#ifndef __LINUX_CH11_H
|
||||
#define __LINUX_CH11_H
|
||||
|
||||
#include <linux/types.h> /* __u8 etc */
|
||||
|
||||
/* This is arbitrary.
|
||||
* From USB 2.0 spec Table 11-13, offset 7, a hub can
|
||||
* have up to 255 ports. The most yet reported is 10.
|
||||
*
|
||||
* Current Wireless USB host hardware (Intel i1480 for example) allows
|
||||
* up to 22 devices to connect. Upcoming hardware might raise that
|
||||
* limit. Because the arrays need to add a bit for hub status data, we
|
||||
* use 31, so plus one evens out to four bytes.
|
||||
*/
|
||||
#define USB_MAXCHILDREN 31
|
||||
|
||||
/* See USB 3.1 spec Table 10-5 */
|
||||
#define USB_SS_MAXPORTS 15
|
||||
|
||||
/*
|
||||
* Hub request types
|
||||
*/
|
||||
|
||||
#define USB_RT_HUB (USB_TYPE_CLASS | USB_RECIP_DEVICE)
|
||||
#define USB_RT_PORT (USB_TYPE_CLASS | USB_RECIP_OTHER)
|
||||
|
||||
/*
|
||||
* Port status type for GetPortStatus requests added in USB 3.1
|
||||
* See USB 3.1 spec Table 10-12
|
||||
*/
|
||||
#define HUB_PORT_STATUS 0
|
||||
#define HUB_PORT_PD_STATUS 1
|
||||
#define HUB_EXT_PORT_STATUS 2
|
||||
|
||||
/*
|
||||
* Hub class requests
|
||||
* See USB 2.0 spec Table 11-16
|
||||
*/
|
||||
#define HUB_CLEAR_TT_BUFFER 8
|
||||
#define HUB_RESET_TT 9
|
||||
#define HUB_GET_TT_STATE 10
|
||||
#define HUB_STOP_TT 11
|
||||
|
||||
/*
|
||||
* Hub class additional requests defined by USB 3.0 spec
|
||||
* See USB 3.0 spec Table 10-6
|
||||
*/
|
||||
#define HUB_SET_DEPTH 12
|
||||
#define HUB_GET_PORT_ERR_COUNT 13
|
||||
|
||||
/*
|
||||
* Hub Class feature numbers
|
||||
* See USB 2.0 spec Table 11-17
|
||||
*/
|
||||
#define C_HUB_LOCAL_POWER 0
|
||||
#define C_HUB_OVER_CURRENT 1
|
||||
|
||||
/*
|
||||
* Port feature numbers
|
||||
* See USB 2.0 spec Table 11-17
|
||||
*/
|
||||
#define USB_PORT_FEAT_CONNECTION 0
|
||||
#define USB_PORT_FEAT_ENABLE 1
|
||||
#define USB_PORT_FEAT_SUSPEND 2 /* L2 suspend */
|
||||
#define USB_PORT_FEAT_OVER_CURRENT 3
|
||||
#define USB_PORT_FEAT_RESET 4
|
||||
#define USB_PORT_FEAT_L1 5 /* L1 suspend */
|
||||
#define USB_PORT_FEAT_POWER 8
|
||||
#define USB_PORT_FEAT_LOWSPEED 9 /* Should never be used */
|
||||
#define USB_PORT_FEAT_C_CONNECTION 16
|
||||
#define USB_PORT_FEAT_C_ENABLE 17
|
||||
#define USB_PORT_FEAT_C_SUSPEND 18
|
||||
#define USB_PORT_FEAT_C_OVER_CURRENT 19
|
||||
#define USB_PORT_FEAT_C_RESET 20
|
||||
#define USB_PORT_FEAT_TEST 21
|
||||
#define USB_PORT_FEAT_INDICATOR 22
|
||||
#define USB_PORT_FEAT_C_PORT_L1 23
|
||||
|
||||
/*
|
||||
* Port feature selectors added by USB 3.0 spec.
|
||||
* See USB 3.0 spec Table 10-7
|
||||
*/
|
||||
#define USB_PORT_FEAT_LINK_STATE 5
|
||||
#define USB_PORT_FEAT_U1_TIMEOUT 23
|
||||
#define USB_PORT_FEAT_U2_TIMEOUT 24
|
||||
#define USB_PORT_FEAT_C_PORT_LINK_STATE 25
|
||||
#define USB_PORT_FEAT_C_PORT_CONFIG_ERROR 26
|
||||
#define USB_PORT_FEAT_REMOTE_WAKE_MASK 27
|
||||
#define USB_PORT_FEAT_BH_PORT_RESET 28
|
||||
#define USB_PORT_FEAT_C_BH_PORT_RESET 29
|
||||
#define USB_PORT_FEAT_FORCE_LINKPM_ACCEPT 30
|
||||
|
||||
#define USB_PORT_LPM_TIMEOUT(p) (((p) & 0xff) << 8)
|
||||
|
||||
/* USB 3.0 hub remote wake mask bits, see table 10-14 */
|
||||
#define USB_PORT_FEAT_REMOTE_WAKE_CONNECT (1 << 8)
|
||||
#define USB_PORT_FEAT_REMOTE_WAKE_DISCONNECT (1 << 9)
|
||||
#define USB_PORT_FEAT_REMOTE_WAKE_OVER_CURRENT (1 << 10)
|
||||
|
||||
/*
|
||||
* Hub Status and Hub Change results
|
||||
* See USB 2.0 spec Table 11-19 and Table 11-20
|
||||
* USB 3.1 extends the port status request and may return 4 additional bytes.
|
||||
* See USB 3.1 spec section 10.16.2.6 Table 10-12 and 10-15
|
||||
*/
|
||||
struct usb_port_status {
|
||||
__le16 wPortStatus;
|
||||
__le16 wPortChange;
|
||||
__le32 dwExtPortStatus;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
/*
|
||||
* wPortStatus bit field
|
||||
* See USB 2.0 spec Table 11-21
|
||||
*/
|
||||
#define USB_PORT_STAT_CONNECTION 0x0001
|
||||
#define USB_PORT_STAT_ENABLE 0x0002
|
||||
#define USB_PORT_STAT_SUSPEND 0x0004
|
||||
#define USB_PORT_STAT_OVERCURRENT 0x0008
|
||||
#define USB_PORT_STAT_RESET 0x0010
|
||||
#define USB_PORT_STAT_L1 0x0020
|
||||
/* bits 6 to 7 are reserved */
|
||||
#define USB_PORT_STAT_POWER 0x0100
|
||||
#define USB_PORT_STAT_LOW_SPEED 0x0200
|
||||
#define USB_PORT_STAT_HIGH_SPEED 0x0400
|
||||
#define USB_PORT_STAT_TEST 0x0800
|
||||
#define USB_PORT_STAT_INDICATOR 0x1000
|
||||
/* bits 13 to 15 are reserved */
|
||||
|
||||
/*
|
||||
* Additions to wPortStatus bit field from USB 3.0
|
||||
* See USB 3.0 spec Table 10-10
|
||||
*/
|
||||
#define USB_PORT_STAT_LINK_STATE 0x01e0
|
||||
#define USB_SS_PORT_STAT_POWER 0x0200
|
||||
#define USB_SS_PORT_STAT_SPEED 0x1c00
|
||||
#define USB_PORT_STAT_SPEED_5GBPS 0x0000
|
||||
/* Valid only if port is enabled */
|
||||
/* Bits that are the same from USB 2.0 */
|
||||
#define USB_SS_PORT_STAT_MASK (USB_PORT_STAT_CONNECTION | \
|
||||
USB_PORT_STAT_ENABLE | \
|
||||
USB_PORT_STAT_OVERCURRENT | \
|
||||
USB_PORT_STAT_RESET)
|
||||
|
||||
/*
|
||||
* Definitions for PORT_LINK_STATE values
|
||||
* (bits 5-8) in wPortStatus
|
||||
*/
|
||||
#define USB_SS_PORT_LS_U0 0x0000
|
||||
#define USB_SS_PORT_LS_U1 0x0020
|
||||
#define USB_SS_PORT_LS_U2 0x0040
|
||||
#define USB_SS_PORT_LS_U3 0x0060
|
||||
#define USB_SS_PORT_LS_SS_DISABLED 0x0080
|
||||
#define USB_SS_PORT_LS_RX_DETECT 0x00a0
|
||||
#define USB_SS_PORT_LS_SS_INACTIVE 0x00c0
|
||||
#define USB_SS_PORT_LS_POLLING 0x00e0
|
||||
#define USB_SS_PORT_LS_RECOVERY 0x0100
|
||||
#define USB_SS_PORT_LS_HOT_RESET 0x0120
|
||||
#define USB_SS_PORT_LS_COMP_MOD 0x0140
|
||||
#define USB_SS_PORT_LS_LOOPBACK 0x0160
|
||||
|
||||
/*
|
||||
* wPortChange bit field
|
||||
* See USB 2.0 spec Table 11-22 and USB 2.0 LPM ECN Table-4.10
|
||||
* Bits 0 to 5 shown, bits 6 to 15 are reserved
|
||||
*/
|
||||
#define USB_PORT_STAT_C_CONNECTION 0x0001
|
||||
#define USB_PORT_STAT_C_ENABLE 0x0002
|
||||
#define USB_PORT_STAT_C_SUSPEND 0x0004
|
||||
#define USB_PORT_STAT_C_OVERCURRENT 0x0008
|
||||
#define USB_PORT_STAT_C_RESET 0x0010
|
||||
#define USB_PORT_STAT_C_L1 0x0020
|
||||
/*
|
||||
* USB 3.0 wPortChange bit fields
|
||||
* See USB 3.0 spec Table 10-11
|
||||
*/
|
||||
#define USB_PORT_STAT_C_BH_RESET 0x0020
|
||||
#define USB_PORT_STAT_C_LINK_STATE 0x0040
|
||||
#define USB_PORT_STAT_C_CONFIG_ERROR 0x0080
|
||||
|
||||
/*
|
||||
* USB 3.1 dwExtPortStatus field masks
|
||||
* See USB 3.1 spec 10.16.2.6.3 Table 10-15
|
||||
*/
|
||||
|
||||
#define USB_EXT_PORT_STAT_RX_SPEED_ID 0x0000000f
|
||||
#define USB_EXT_PORT_STAT_TX_SPEED_ID 0x000000f0
|
||||
#define USB_EXT_PORT_STAT_RX_LANES 0x00000f00
|
||||
#define USB_EXT_PORT_STAT_TX_LANES 0x0000f000
|
||||
|
||||
#define USB_EXT_PORT_RX_LANES(p) \
|
||||
(((p) & USB_EXT_PORT_STAT_RX_LANES) >> 8)
|
||||
#define USB_EXT_PORT_TX_LANES(p) \
|
||||
(((p) & USB_EXT_PORT_STAT_TX_LANES) >> 12)
|
||||
|
||||
/*
|
||||
* wHubCharacteristics (masks)
|
||||
* See USB 2.0 spec Table 11-13, offset 3
|
||||
*/
|
||||
#define HUB_CHAR_LPSM 0x0003 /* Logical Power Switching Mode mask */
|
||||
#define HUB_CHAR_COMMON_LPSM 0x0000 /* All ports power control at once */
|
||||
#define HUB_CHAR_INDV_PORT_LPSM 0x0001 /* per-port power control */
|
||||
#define HUB_CHAR_NO_LPSM 0x0002 /* no power switching */
|
||||
|
||||
#define HUB_CHAR_COMPOUND 0x0004 /* hub is part of a compound device */
|
||||
|
||||
#define HUB_CHAR_OCPM 0x0018 /* Over-Current Protection Mode mask */
|
||||
#define HUB_CHAR_COMMON_OCPM 0x0000 /* All ports Over-Current reporting */
|
||||
#define HUB_CHAR_INDV_PORT_OCPM 0x0008 /* per-port Over-current reporting */
|
||||
#define HUB_CHAR_NO_OCPM 0x0010 /* No Over-current Protection support */
|
||||
|
||||
#define HUB_CHAR_TTTT 0x0060 /* TT Think Time mask */
|
||||
#define HUB_CHAR_PORTIND 0x0080 /* per-port indicators (LEDs) */
|
||||
|
||||
struct usb_hub_status {
|
||||
__le16 wHubStatus;
|
||||
__le16 wHubChange;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
/*
|
||||
* Hub Status & Hub Change bit masks
|
||||
* See USB 2.0 spec Table 11-19 and Table 11-20
|
||||
* Bits 0 and 1 for wHubStatus and wHubChange
|
||||
* Bits 2 to 15 are reserved for both
|
||||
*/
|
||||
#define HUB_STATUS_LOCAL_POWER 0x0001
|
||||
#define HUB_STATUS_OVERCURRENT 0x0002
|
||||
#define HUB_CHANGE_LOCAL_POWER 0x0001
|
||||
#define HUB_CHANGE_OVERCURRENT 0x0002
|
||||
|
||||
|
||||
/*
|
||||
* Hub descriptor
|
||||
* See USB 2.0 spec Table 11-13
|
||||
*/
|
||||
|
||||
#define USB_DT_HUB (USB_TYPE_CLASS | 0x09)
|
||||
#define USB_DT_SS_HUB (USB_TYPE_CLASS | 0x0a)
|
||||
#define USB_DT_HUB_NONVAR_SIZE 7
|
||||
#define USB_DT_SS_HUB_SIZE 12
|
||||
|
||||
/*
|
||||
* Hub Device descriptor
|
||||
* USB Hub class device protocols
|
||||
*/
|
||||
|
||||
#define USB_HUB_PR_FS 0 /* Full speed hub */
|
||||
#define USB_HUB_PR_HS_NO_TT 0 /* Hi-speed hub without TT */
|
||||
#define USB_HUB_PR_HS_SINGLE_TT 1 /* Hi-speed hub with single TT */
|
||||
#define USB_HUB_PR_HS_MULTI_TT 2 /* Hi-speed hub with multiple TT */
|
||||
#define USB_HUB_PR_SS 3 /* Super speed hub */
|
||||
|
||||
struct usb_hub_descriptor {
|
||||
__u8 bDescLength;
|
||||
__u8 bDescriptorType;
|
||||
__u8 bNbrPorts;
|
||||
__le16 wHubCharacteristics;
|
||||
__u8 bPwrOn2PwrGood;
|
||||
__u8 bHubContrCurrent;
|
||||
|
||||
/* 2.0 and 3.0 hubs differ here */
|
||||
union {
|
||||
struct {
|
||||
/* add 1 bit for hub status change; round to bytes */
|
||||
__u8 DeviceRemovable[(USB_MAXCHILDREN + 1 + 7) / 8];
|
||||
__u8 PortPwrCtrlMask[(USB_MAXCHILDREN + 1 + 7) / 8];
|
||||
} __attribute__ ((packed)) hs;
|
||||
|
||||
struct {
|
||||
__u8 bHubHdrDecLat;
|
||||
__le16 wHubDelay;
|
||||
__le16 DeviceRemovable;
|
||||
} __attribute__ ((packed)) ss;
|
||||
} u;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
/* port indicator status selectors, tables 11-7 and 11-25 */
|
||||
#define HUB_LED_AUTO 0
|
||||
#define HUB_LED_AMBER 1
|
||||
#define HUB_LED_GREEN 2
|
||||
#define HUB_LED_OFF 3
|
||||
|
||||
enum hub_led_mode {
|
||||
INDICATOR_AUTO = 0,
|
||||
INDICATOR_CYCLE,
|
||||
/* software blinks for attention: software, hardware, reserved */
|
||||
INDICATOR_GREEN_BLINK, INDICATOR_GREEN_BLINK_OFF,
|
||||
INDICATOR_AMBER_BLINK, INDICATOR_AMBER_BLINK_OFF,
|
||||
INDICATOR_ALT_BLINK, INDICATOR_ALT_BLINK_OFF
|
||||
} __attribute__ ((packed));
|
||||
|
||||
/* Transaction Translator Think Times, in bits */
|
||||
#define HUB_TTTT_8_BITS 0x00
|
||||
#define HUB_TTTT_16_BITS 0x20
|
||||
#define HUB_TTTT_24_BITS 0x40
|
||||
#define HUB_TTTT_32_BITS 0x60
|
||||
|
||||
#endif /* __LINUX_CH11_H */
|
1249
linux/usb/ch9.h
Normal file
1249
linux/usb/ch9.h
Normal file
File diff suppressed because it is too large
Load Diff
31
linux/usb/charger.h
Normal file
31
linux/usb/charger.h
Normal file
@ -0,0 +1,31 @@
|
||||
/*
|
||||
* This file defines the USB charger type and state that are needed for
|
||||
* USB device APIs.
|
||||
*/
|
||||
|
||||
#ifndef __LINUX_USB_CHARGER_H
|
||||
#define __LINUX_USB_CHARGER_H
|
||||
|
||||
/*
|
||||
* USB charger type:
|
||||
* SDP (Standard Downstream Port)
|
||||
* DCP (Dedicated Charging Port)
|
||||
* CDP (Charging Downstream Port)
|
||||
* ACA (Accessory Charger Adapters)
|
||||
*/
|
||||
enum usb_charger_type {
|
||||
UNKNOWN_TYPE = 0,
|
||||
SDP_TYPE = 1,
|
||||
DCP_TYPE = 2,
|
||||
CDP_TYPE = 3,
|
||||
ACA_TYPE = 4,
|
||||
};
|
||||
|
||||
/* USB charger state */
|
||||
enum usb_charger_state {
|
||||
USB_CHARGER_DEFAULT = 0,
|
||||
USB_CHARGER_PRESENT = 1,
|
||||
USB_CHARGER_ABSENT = 2,
|
||||
};
|
||||
|
||||
#endif /* __LINUX_USB_CHARGER_H */
|
291
linux/usb/functionfs.h
Normal file
291
linux/usb/functionfs.h
Normal file
@ -0,0 +1,291 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
|
||||
#ifndef __LINUX_FUNCTIONFS_H__
|
||||
#define __LINUX_FUNCTIONFS_H__
|
||||
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/ioctl.h>
|
||||
|
||||
#include <linux/usb/ch9.h>
|
||||
|
||||
|
||||
enum {
|
||||
FUNCTIONFS_DESCRIPTORS_MAGIC = 1,
|
||||
FUNCTIONFS_STRINGS_MAGIC = 2,
|
||||
FUNCTIONFS_DESCRIPTORS_MAGIC_V2 = 3,
|
||||
};
|
||||
|
||||
enum functionfs_flags {
|
||||
FUNCTIONFS_HAS_FS_DESC = 1,
|
||||
FUNCTIONFS_HAS_HS_DESC = 2,
|
||||
FUNCTIONFS_HAS_SS_DESC = 4,
|
||||
FUNCTIONFS_HAS_MS_OS_DESC = 8,
|
||||
FUNCTIONFS_VIRTUAL_ADDR = 16,
|
||||
FUNCTIONFS_EVENTFD = 32,
|
||||
FUNCTIONFS_ALL_CTRL_RECIP = 64,
|
||||
FUNCTIONFS_CONFIG0_SETUP = 128,
|
||||
};
|
||||
|
||||
/* Descriptor of an non-audio endpoint */
|
||||
struct usb_endpoint_descriptor_no_audio {
|
||||
__u8 bLength;
|
||||
__u8 bDescriptorType;
|
||||
|
||||
__u8 bEndpointAddress;
|
||||
__u8 bmAttributes;
|
||||
__le16 wMaxPacketSize;
|
||||
__u8 bInterval;
|
||||
} __attribute__((packed));
|
||||
|
||||
struct usb_functionfs_descs_head_v2 {
|
||||
__le32 magic;
|
||||
__le32 length;
|
||||
__le32 flags;
|
||||
/*
|
||||
* __le32 fs_count, hs_count, fs_count; must be included manually in
|
||||
* the structure taking flags into consideration.
|
||||
*/
|
||||
} __attribute__((packed));
|
||||
|
||||
/* Legacy format, deprecated as of 3.14. */
|
||||
struct usb_functionfs_descs_head {
|
||||
__le32 magic;
|
||||
__le32 length;
|
||||
__le32 fs_count;
|
||||
__le32 hs_count;
|
||||
} __attribute__((packed, deprecated));
|
||||
|
||||
/* MS OS Descriptor header */
|
||||
struct usb_os_desc_header {
|
||||
__u8 interface;
|
||||
__le32 dwLength;
|
||||
__le16 bcdVersion;
|
||||
__le16 wIndex;
|
||||
union {
|
||||
struct {
|
||||
__u8 bCount;
|
||||
__u8 Reserved;
|
||||
};
|
||||
__le16 wCount;
|
||||
};
|
||||
} __attribute__((packed));
|
||||
|
||||
struct usb_ext_compat_desc {
|
||||
__u8 bFirstInterfaceNumber;
|
||||
__u8 Reserved1;
|
||||
__u8 CompatibleID[8];
|
||||
__u8 SubCompatibleID[8];
|
||||
__u8 Reserved2[6];
|
||||
};
|
||||
|
||||
struct usb_ext_prop_desc {
|
||||
__le32 dwSize;
|
||||
__le32 dwPropertyDataType;
|
||||
__le16 wPropertyNameLength;
|
||||
} __attribute__((packed));
|
||||
|
||||
|
||||
/*
|
||||
* Descriptors format:
|
||||
*
|
||||
* | off | name | type | description |
|
||||
* |-----+-----------+--------------+--------------------------------------|
|
||||
* | 0 | magic | LE32 | FUNCTIONFS_DESCRIPTORS_MAGIC_V2 |
|
||||
* | 4 | length | LE32 | length of the whole data chunk |
|
||||
* | 8 | flags | LE32 | combination of functionfs_flags |
|
||||
* | | eventfd | LE32 | eventfd file descriptor |
|
||||
* | | fs_count | LE32 | number of full-speed descriptors |
|
||||
* | | hs_count | LE32 | number of high-speed descriptors |
|
||||
* | | ss_count | LE32 | number of super-speed descriptors |
|
||||
* | | os_count | LE32 | number of MS OS descriptors |
|
||||
* | | fs_descrs | Descriptor[] | list of full-speed descriptors |
|
||||
* | | hs_descrs | Descriptor[] | list of high-speed descriptors |
|
||||
* | | ss_descrs | Descriptor[] | list of super-speed descriptors |
|
||||
* | | os_descrs | OSDesc[] | list of MS OS descriptors |
|
||||
*
|
||||
* Depending on which flags are set, various fields may be missing in the
|
||||
* structure. Any flags that are not recognised cause the whole block to be
|
||||
* rejected with -ENOSYS.
|
||||
*
|
||||
* Legacy descriptors format (deprecated as of 3.14):
|
||||
*
|
||||
* | off | name | type | description |
|
||||
* |-----+-----------+--------------+--------------------------------------|
|
||||
* | 0 | magic | LE32 | FUNCTIONFS_DESCRIPTORS_MAGIC |
|
||||
* | 4 | length | LE32 | length of the whole data chunk |
|
||||
* | 8 | fs_count | LE32 | number of full-speed descriptors |
|
||||
* | 12 | hs_count | LE32 | number of high-speed descriptors |
|
||||
* | 16 | fs_descrs | Descriptor[] | list of full-speed descriptors |
|
||||
* | | hs_descrs | Descriptor[] | list of high-speed descriptors |
|
||||
*
|
||||
* All numbers must be in little endian order.
|
||||
*
|
||||
* Descriptor[] is an array of valid USB descriptors which have the following
|
||||
* format:
|
||||
*
|
||||
* | off | name | type | description |
|
||||
* |-----+-----------------+------+--------------------------|
|
||||
* | 0 | bLength | U8 | length of the descriptor |
|
||||
* | 1 | bDescriptorType | U8 | descriptor type |
|
||||
* | 2 | payload | | descriptor's payload |
|
||||
*
|
||||
* OSDesc[] is an array of valid MS OS Feature Descriptors which have one of
|
||||
* the following formats:
|
||||
*
|
||||
* | off | name | type | description |
|
||||
* |-----+-----------------+------+--------------------------|
|
||||
* | 0 | inteface | U8 | related interface number |
|
||||
* | 1 | dwLength | U32 | length of the descriptor |
|
||||
* | 5 | bcdVersion | U16 | currently supported: 1 |
|
||||
* | 7 | wIndex | U16 | currently supported: 4 |
|
||||
* | 9 | bCount | U8 | number of ext. compat. |
|
||||
* | 10 | Reserved | U8 | 0 |
|
||||
* | 11 | ExtCompat[] | | list of ext. compat. d. |
|
||||
*
|
||||
* | off | name | type | description |
|
||||
* |-----+-----------------+------+--------------------------|
|
||||
* | 0 | inteface | U8 | related interface number |
|
||||
* | 1 | dwLength | U32 | length of the descriptor |
|
||||
* | 5 | bcdVersion | U16 | currently supported: 1 |
|
||||
* | 7 | wIndex | U16 | currently supported: 5 |
|
||||
* | 9 | wCount | U16 | number of ext. compat. |
|
||||
* | 11 | ExtProp[] | | list of ext. prop. d. |
|
||||
*
|
||||
* ExtCompat[] is an array of valid Extended Compatiblity descriptors
|
||||
* which have the following format:
|
||||
*
|
||||
* | off | name | type | description |
|
||||
* |-----+-----------------------+------+-------------------------------------|
|
||||
* | 0 | bFirstInterfaceNumber | U8 | index of the interface or of the 1st|
|
||||
* | | | | interface in an IAD group |
|
||||
* | 1 | Reserved | U8 | 1 |
|
||||
* | 2 | CompatibleID | U8[8]| compatible ID string |
|
||||
* | 10 | SubCompatibleID | U8[8]| subcompatible ID string |
|
||||
* | 18 | Reserved | U8[6]| 0 |
|
||||
*
|
||||
* ExtProp[] is an array of valid Extended Properties descriptors
|
||||
* which have the following format:
|
||||
*
|
||||
* | off | name | type | description |
|
||||
* |-----+-----------------------+------+-------------------------------------|
|
||||
* | 0 | dwSize | U32 | length of the descriptor |
|
||||
* | 4 | dwPropertyDataType | U32 | 1..7 |
|
||||
* | 8 | wPropertyNameLength | U16 | bPropertyName length (NL) |
|
||||
* | 10 | bPropertyName |U8[NL]| name of this property |
|
||||
* |10+NL| dwPropertyDataLength | U32 | bPropertyData length (DL) |
|
||||
* |14+NL| bProperty |U8[DL]| payload of this property |
|
||||
*/
|
||||
|
||||
struct usb_functionfs_strings_head {
|
||||
__le32 magic;
|
||||
__le32 length;
|
||||
__le32 str_count;
|
||||
__le32 lang_count;
|
||||
} __attribute__((packed));
|
||||
|
||||
/*
|
||||
* Strings format:
|
||||
*
|
||||
* | off | name | type | description |
|
||||
* |-----+------------+-----------------------+----------------------------|
|
||||
* | 0 | magic | LE32 | FUNCTIONFS_STRINGS_MAGIC |
|
||||
* | 4 | length | LE32 | length of the data chunk |
|
||||
* | 8 | str_count | LE32 | number of strings |
|
||||
* | 12 | lang_count | LE32 | number of languages |
|
||||
* | 16 | stringtab | StringTab[lang_count] | table of strings per lang |
|
||||
*
|
||||
* For each language there is one stringtab entry (ie. there are lang_count
|
||||
* stringtab entires). Each StringTab has following format:
|
||||
*
|
||||
* | off | name | type | description |
|
||||
* |-----+---------+-------------------+------------------------------------|
|
||||
* | 0 | lang | LE16 | language code |
|
||||
* | 2 | strings | String[str_count] | array of strings in given language |
|
||||
*
|
||||
* For each string there is one strings entry (ie. there are str_count
|
||||
* string entries). Each String is a NUL terminated string encoded in
|
||||
* UTF-8.
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* Events are delivered on the ep0 file descriptor, when the user mode driver
|
||||
* reads from this file descriptor after writing the descriptors. Don't
|
||||
* stop polling this descriptor.
|
||||
*/
|
||||
|
||||
enum usb_functionfs_event_type {
|
||||
FUNCTIONFS_BIND,
|
||||
FUNCTIONFS_UNBIND,
|
||||
|
||||
FUNCTIONFS_ENABLE,
|
||||
FUNCTIONFS_DISABLE,
|
||||
|
||||
FUNCTIONFS_SETUP,
|
||||
|
||||
FUNCTIONFS_SUSPEND,
|
||||
FUNCTIONFS_RESUME
|
||||
};
|
||||
|
||||
/* NOTE: this structure must stay the same size and layout on
|
||||
* both 32-bit and 64-bit kernels.
|
||||
*/
|
||||
struct usb_functionfs_event {
|
||||
union {
|
||||
/* SETUP: packet; DATA phase i/o precedes next event
|
||||
*(setup.bmRequestType & USB_DIR_IN) flags direction */
|
||||
struct usb_ctrlrequest setup;
|
||||
} __attribute__((packed)) u;
|
||||
|
||||
/* enum usb_functionfs_event_type */
|
||||
__u8 type;
|
||||
__u8 _pad[3];
|
||||
} __attribute__((packed));
|
||||
|
||||
|
||||
/* Endpoint ioctls */
|
||||
/* The same as in gadgetfs */
|
||||
|
||||
/* IN transfers may be reported to the gadget driver as complete
|
||||
* when the fifo is loaded, before the host reads the data;
|
||||
* OUT transfers may be reported to the host's "client" driver as
|
||||
* complete when they're sitting in the FIFO unread.
|
||||
* THIS returns how many bytes are "unclaimed" in the endpoint fifo
|
||||
* (needed for precise fault handling, when the hardware allows it)
|
||||
*/
|
||||
#define FUNCTIONFS_FIFO_STATUS _IO('g', 1)
|
||||
|
||||
/* discards any unclaimed data in the fifo. */
|
||||
#define FUNCTIONFS_FIFO_FLUSH _IO('g', 2)
|
||||
|
||||
/* resets endpoint halt+toggle; used to implement set_interface.
|
||||
* some hardware (like pxa2xx) can't support this.
|
||||
*/
|
||||
#define FUNCTIONFS_CLEAR_HALT _IO('g', 3)
|
||||
|
||||
/* Specific for functionfs */
|
||||
|
||||
/*
|
||||
* Returns reverse mapping of an interface. Called on EP0. If there
|
||||
* is no such interface returns -EDOM. If function is not active
|
||||
* returns -ENODEV.
|
||||
*/
|
||||
#define FUNCTIONFS_INTERFACE_REVMAP _IO('g', 128)
|
||||
|
||||
/*
|
||||
* Returns real bEndpointAddress of an endpoint. If endpoint shuts down
|
||||
* during the call, returns -ESHUTDOWN.
|
||||
*/
|
||||
#define FUNCTIONFS_ENDPOINT_REVMAP _IO('g', 129)
|
||||
|
||||
/*
|
||||
* Returns endpoint descriptor. If endpoint shuts down during the call,
|
||||
* returns -ESHUTDOWN.
|
||||
*/
|
||||
#define FUNCTIONFS_ENDPOINT_DESC _IOR('g', 130, \
|
||||
struct usb_endpoint_descriptor)
|
||||
|
||||
|
||||
|
||||
#endif /* __LINUX_FUNCTIONFS_H__ */
|
36
linux/usb/g_printer.h
Normal file
36
linux/usb/g_printer.h
Normal file
@ -0,0 +1,36 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
|
||||
/*
|
||||
* g_printer.h -- Header file for USB Printer gadget driver
|
||||
*
|
||||
* Copyright (C) 2007 Craig W. Nadler
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#ifndef __LINUX_USB_G_PRINTER_H
|
||||
#define __LINUX_USB_G_PRINTER_H
|
||||
|
||||
#define PRINTER_NOT_ERROR 0x08
|
||||
#define PRINTER_SELECTED 0x10
|
||||
#define PRINTER_PAPER_EMPTY 0x20
|
||||
|
||||
/* The 'g' code is also used by gadgetfs ioctl requests.
|
||||
* Don't add any colliding codes to either driver, and keep
|
||||
* them in unique ranges (size 0x20 for now).
|
||||
*/
|
||||
#define GADGET_GET_PRINTER_STATUS _IOR('g', 0x21, unsigned char)
|
||||
#define GADGET_SET_PRINTER_STATUS _IOWR('g', 0x22, unsigned char)
|
||||
|
||||
#endif /* __LINUX_USB_G_PRINTER_H */
|
39
linux/usb/g_uvc.h
Normal file
39
linux/usb/g_uvc.h
Normal file
@ -0,0 +1,39 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
|
||||
/*
|
||||
* g_uvc.h -- USB Video Class Gadget driver API
|
||||
*
|
||||
* Copyright (C) 2009-2010 Laurent Pinchart <laurent.pinchart@ideasonboard.com>
|
||||
*/
|
||||
|
||||
#ifndef __LINUX_USB_G_UVC_H
|
||||
#define __LINUX_USB_G_UVC_H
|
||||
|
||||
#include <linux/ioctl.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/usb/ch9.h>
|
||||
|
||||
#define UVC_EVENT_FIRST (V4L2_EVENT_PRIVATE_START + 0)
|
||||
#define UVC_EVENT_CONNECT (V4L2_EVENT_PRIVATE_START + 0)
|
||||
#define UVC_EVENT_DISCONNECT (V4L2_EVENT_PRIVATE_START + 1)
|
||||
#define UVC_EVENT_STREAMON (V4L2_EVENT_PRIVATE_START + 2)
|
||||
#define UVC_EVENT_STREAMOFF (V4L2_EVENT_PRIVATE_START + 3)
|
||||
#define UVC_EVENT_SETUP (V4L2_EVENT_PRIVATE_START + 4)
|
||||
#define UVC_EVENT_DATA (V4L2_EVENT_PRIVATE_START + 5)
|
||||
#define UVC_EVENT_LAST (V4L2_EVENT_PRIVATE_START + 5)
|
||||
|
||||
struct uvc_request_data {
|
||||
__s32 length;
|
||||
__u8 data[60];
|
||||
};
|
||||
|
||||
struct uvc_event {
|
||||
union {
|
||||
enum usb_device_speed speed;
|
||||
struct usb_ctrlrequest req;
|
||||
struct uvc_request_data data;
|
||||
};
|
||||
};
|
||||
|
||||
#define UVCIOC_SEND_RESPONSE _IOW('U', 1, struct uvc_request_data)
|
||||
|
||||
#endif /* __LINUX_USB_G_UVC_H */
|
89
linux/usb/gadgetfs.h
Normal file
89
linux/usb/gadgetfs.h
Normal file
@ -0,0 +1,89 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
|
||||
/*
|
||||
* Filesystem based user-mode API to USB Gadget controller hardware
|
||||
*
|
||||
* Other than ep0 operations, most things are done by read() and write()
|
||||
* on endpoint files found in one directory. They are configured by
|
||||
* writing descriptors, and then may be used for normal stream style
|
||||
* i/o requests. When ep0 is configured, the device can enumerate;
|
||||
* when it's closed, the device disconnects from usb. Operations on
|
||||
* ep0 require ioctl() operations.
|
||||
*
|
||||
* Configuration and device descriptors get written to /dev/gadget/$CHIP,
|
||||
* which may then be used to read usb_gadgetfs_event structs. The driver
|
||||
* may activate endpoints as it handles SET_CONFIGURATION setup events,
|
||||
* or earlier; writing endpoint descriptors to /dev/gadget/$ENDPOINT
|
||||
* then performing data transfers by reading or writing.
|
||||
*/
|
||||
|
||||
#ifndef __LINUX_USB_GADGETFS_H
|
||||
#define __LINUX_USB_GADGETFS_H
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/ioctl.h>
|
||||
|
||||
#include <linux/usb/ch9.h>
|
||||
|
||||
/*
|
||||
* Events are delivered on the ep0 file descriptor, when the user mode driver
|
||||
* reads from this file descriptor after writing the descriptors. Don't
|
||||
* stop polling this descriptor.
|
||||
*/
|
||||
|
||||
enum usb_gadgetfs_event_type {
|
||||
GADGETFS_NOP = 0,
|
||||
|
||||
GADGETFS_CONNECT,
|
||||
GADGETFS_DISCONNECT,
|
||||
GADGETFS_SETUP,
|
||||
GADGETFS_SUSPEND,
|
||||
/* and likely more ! */
|
||||
};
|
||||
|
||||
/* NOTE: this structure must stay the same size and layout on
|
||||
* both 32-bit and 64-bit kernels.
|
||||
*/
|
||||
struct usb_gadgetfs_event {
|
||||
union {
|
||||
/* NOP, DISCONNECT, SUSPEND: nothing
|
||||
* ... some hardware can't report disconnection
|
||||
*/
|
||||
|
||||
/* CONNECT: just the speed */
|
||||
enum usb_device_speed speed;
|
||||
|
||||
/* SETUP: packet; DATA phase i/o precedes next event
|
||||
*(setup.bmRequestType & USB_DIR_IN) flags direction
|
||||
* ... includes SET_CONFIGURATION, SET_INTERFACE
|
||||
*/
|
||||
struct usb_ctrlrequest setup;
|
||||
} u;
|
||||
enum usb_gadgetfs_event_type type;
|
||||
};
|
||||
|
||||
|
||||
/* The 'g' code is also used by printer gadget ioctl requests.
|
||||
* Don't add any colliding codes to either driver, and keep
|
||||
* them in unique ranges (size 0x20 for now).
|
||||
*/
|
||||
|
||||
/* endpoint ioctls */
|
||||
|
||||
/* IN transfers may be reported to the gadget driver as complete
|
||||
* when the fifo is loaded, before the host reads the data;
|
||||
* OUT transfers may be reported to the host's "client" driver as
|
||||
* complete when they're sitting in the FIFO unread.
|
||||
* THIS returns how many bytes are "unclaimed" in the endpoint fifo
|
||||
* (needed for precise fault handling, when the hardware allows it)
|
||||
*/
|
||||
#define GADGETFS_FIFO_STATUS _IO('g', 1)
|
||||
|
||||
/* discards any unclaimed data in the fifo. */
|
||||
#define GADGETFS_FIFO_FLUSH _IO('g', 2)
|
||||
|
||||
/* resets endpoint halt+toggle; used to implement set_interface.
|
||||
* some hardware (like pxa2xx) can't support this.
|
||||
*/
|
||||
#define GADGETFS_CLEAR_HALT _IO('g', 3)
|
||||
|
||||
#endif /* __LINUX_USB_GADGETFS_H */
|
113
linux/usb/midi.h
Normal file
113
linux/usb/midi.h
Normal file
@ -0,0 +1,113 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
|
||||
/*
|
||||
* <linux/usb/midi.h> -- USB MIDI definitions.
|
||||
*
|
||||
* Copyright (C) 2006 Thumtronics Pty Ltd.
|
||||
* Developed for Thumtronics by Grey Innovation
|
||||
* Ben Williamson <ben.williamson@greyinnovation.com>
|
||||
*
|
||||
* This software is distributed under the terms of the GNU General Public
|
||||
* License ("GPL") version 2, as published by the Free Software Foundation.
|
||||
*
|
||||
* This file holds USB constants and structures defined
|
||||
* by the USB Device Class Definition for MIDI Devices.
|
||||
* Comments below reference relevant sections of that document:
|
||||
*
|
||||
* http://www.usb.org/developers/devclass_docs/midi10.pdf
|
||||
*/
|
||||
|
||||
#ifndef __LINUX_USB_MIDI_H
|
||||
#define __LINUX_USB_MIDI_H
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
/* A.1 MS Class-Specific Interface Descriptor Subtypes */
|
||||
#define USB_MS_HEADER 0x01
|
||||
#define USB_MS_MIDI_IN_JACK 0x02
|
||||
#define USB_MS_MIDI_OUT_JACK 0x03
|
||||
#define USB_MS_ELEMENT 0x04
|
||||
|
||||
/* A.2 MS Class-Specific Endpoint Descriptor Subtypes */
|
||||
#define USB_MS_GENERAL 0x01
|
||||
|
||||
/* A.3 MS MIDI IN and OUT Jack Types */
|
||||
#define USB_MS_EMBEDDED 0x01
|
||||
#define USB_MS_EXTERNAL 0x02
|
||||
|
||||
/* 6.1.2.1 Class-Specific MS Interface Header Descriptor */
|
||||
struct usb_ms_header_descriptor {
|
||||
__u8 bLength;
|
||||
__u8 bDescriptorType;
|
||||
__u8 bDescriptorSubtype;
|
||||
__le16 bcdMSC;
|
||||
__le16 wTotalLength;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
#define USB_DT_MS_HEADER_SIZE 7
|
||||
|
||||
/* 6.1.2.2 MIDI IN Jack Descriptor */
|
||||
struct usb_midi_in_jack_descriptor {
|
||||
__u8 bLength;
|
||||
__u8 bDescriptorType; /* USB_DT_CS_INTERFACE */
|
||||
__u8 bDescriptorSubtype; /* USB_MS_MIDI_IN_JACK */
|
||||
__u8 bJackType; /* USB_MS_EMBEDDED/EXTERNAL */
|
||||
__u8 bJackID;
|
||||
__u8 iJack;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
#define USB_DT_MIDI_IN_SIZE 6
|
||||
|
||||
struct usb_midi_source_pin {
|
||||
__u8 baSourceID;
|
||||
__u8 baSourcePin;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
/* 6.1.2.3 MIDI OUT Jack Descriptor */
|
||||
struct usb_midi_out_jack_descriptor {
|
||||
__u8 bLength;
|
||||
__u8 bDescriptorType; /* USB_DT_CS_INTERFACE */
|
||||
__u8 bDescriptorSubtype; /* USB_MS_MIDI_OUT_JACK */
|
||||
__u8 bJackType; /* USB_MS_EMBEDDED/EXTERNAL */
|
||||
__u8 bJackID;
|
||||
__u8 bNrInputPins; /* p */
|
||||
struct usb_midi_source_pin pins[]; /* [p] */
|
||||
/*__u8 iJack; -- omitted due to variable-sized pins[] */
|
||||
} __attribute__ ((packed));
|
||||
|
||||
#define USB_DT_MIDI_OUT_SIZE(p) (7 + 2 * (p))
|
||||
|
||||
/* As above, but more useful for defining your own descriptors: */
|
||||
#define DECLARE_USB_MIDI_OUT_JACK_DESCRIPTOR(p) \
|
||||
struct usb_midi_out_jack_descriptor_##p { \
|
||||
__u8 bLength; \
|
||||
__u8 bDescriptorType; \
|
||||
__u8 bDescriptorSubtype; \
|
||||
__u8 bJackType; \
|
||||
__u8 bJackID; \
|
||||
__u8 bNrInputPins; \
|
||||
struct usb_midi_source_pin pins[p]; \
|
||||
__u8 iJack; \
|
||||
} __attribute__ ((packed))
|
||||
|
||||
/* 6.2.2 Class-Specific MS Bulk Data Endpoint Descriptor */
|
||||
struct usb_ms_endpoint_descriptor {
|
||||
__u8 bLength; /* 4+n */
|
||||
__u8 bDescriptorType; /* USB_DT_CS_ENDPOINT */
|
||||
__u8 bDescriptorSubtype; /* USB_MS_GENERAL */
|
||||
__u8 bNumEmbMIDIJack; /* n */
|
||||
__u8 baAssocJackID[]; /* [n] */
|
||||
} __attribute__ ((packed));
|
||||
|
||||
#define USB_DT_MS_ENDPOINT_SIZE(n) (4 + (n))
|
||||
|
||||
/* As above, but more useful for defining your own descriptors: */
|
||||
#define DECLARE_USB_MS_ENDPOINT_DESCRIPTOR(n) \
|
||||
struct usb_ms_endpoint_descriptor_##n { \
|
||||
__u8 bLength; \
|
||||
__u8 bDescriptorType; \
|
||||
__u8 bDescriptorSubtype; \
|
||||
__u8 bNumEmbMIDIJack; \
|
||||
__u8 baAssocJackID[n]; \
|
||||
} __attribute__ ((packed))
|
||||
|
||||
#endif /* __LINUX_USB_MIDI_H */
|
249
linux/usb/raw_gadget.h
Normal file
249
linux/usb/raw_gadget.h
Normal file
@ -0,0 +1,249 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
|
||||
/*
|
||||
* USB Raw Gadget driver.
|
||||
*
|
||||
* See Documentation/usb/raw-gadget.rst for more details.
|
||||
*/
|
||||
|
||||
#ifndef __LINUX_USB_RAW_GADGET_H
|
||||
#define __LINUX_USB_RAW_GADGET_H
|
||||
|
||||
#include <asm/ioctl.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/usb/ch9.h>
|
||||
|
||||
/* Maximum length of driver_name/device_name in the usb_raw_init struct. */
|
||||
#define UDC_NAME_LENGTH_MAX 128
|
||||
|
||||
/*
|
||||
* struct usb_raw_init - argument for USB_RAW_IOCTL_INIT ioctl.
|
||||
* @speed: The speed of the emulated USB device, takes the same values as
|
||||
* the usb_device_speed enum: USB_SPEED_FULL, USB_SPEED_HIGH, etc.
|
||||
* @driver_name: The name of the UDC driver.
|
||||
* @device_name: The name of a UDC instance.
|
||||
*
|
||||
* The last two fields identify a UDC the gadget driver should bind to.
|
||||
* For example, Dummy UDC has "dummy_udc" as its driver_name and "dummy_udc.N"
|
||||
* as its device_name, where N in the index of the Dummy UDC instance.
|
||||
* At the same time the dwc2 driver that is used on Raspberry Pi Zero, has
|
||||
* "20980000.usb" as both driver_name and device_name.
|
||||
*/
|
||||
struct usb_raw_init {
|
||||
__u8 driver_name[UDC_NAME_LENGTH_MAX];
|
||||
__u8 device_name[UDC_NAME_LENGTH_MAX];
|
||||
__u8 speed;
|
||||
};
|
||||
|
||||
/* The type of event fetched with the USB_RAW_IOCTL_EVENT_FETCH ioctl. */
|
||||
enum usb_raw_event_type {
|
||||
USB_RAW_EVENT_INVALID = 0,
|
||||
|
||||
/* This event is queued when the driver has bound to a UDC. */
|
||||
USB_RAW_EVENT_CONNECT = 1,
|
||||
|
||||
/* This event is queued when a new control request arrived to ep0. */
|
||||
USB_RAW_EVENT_CONTROL = 2,
|
||||
|
||||
/* The list might grow in the future. */
|
||||
};
|
||||
|
||||
/*
|
||||
* struct usb_raw_event - argument for USB_RAW_IOCTL_EVENT_FETCH ioctl.
|
||||
* @type: The type of the fetched event.
|
||||
* @length: Length of the data buffer. Updated by the driver and set to the
|
||||
* actual length of the fetched event data.
|
||||
* @data: A buffer to store the fetched event data.
|
||||
*
|
||||
* Currently the fetched data buffer is empty for USB_RAW_EVENT_CONNECT,
|
||||
* and contains struct usb_ctrlrequest for USB_RAW_EVENT_CONTROL.
|
||||
*/
|
||||
struct usb_raw_event {
|
||||
__u32 type;
|
||||
__u32 length;
|
||||
__u8 data[];
|
||||
};
|
||||
|
||||
#define USB_RAW_IO_FLAGS_ZERO 0x0001
|
||||
#define USB_RAW_IO_FLAGS_MASK 0x0001
|
||||
|
||||
static __inline__ int usb_raw_io_flags_valid(__u16 flags)
|
||||
{
|
||||
return (flags & ~USB_RAW_IO_FLAGS_MASK) == 0;
|
||||
}
|
||||
|
||||
static __inline__ int usb_raw_io_flags_zero(__u16 flags)
|
||||
{
|
||||
return (flags & USB_RAW_IO_FLAGS_ZERO);
|
||||
}
|
||||
|
||||
/*
|
||||
* struct usb_raw_ep_io - argument for USB_RAW_IOCTL_EP0/EP_WRITE/READ ioctls.
|
||||
* @ep: Endpoint handle as returned by USB_RAW_IOCTL_EP_ENABLE for
|
||||
* USB_RAW_IOCTL_EP_WRITE/READ. Ignored for USB_RAW_IOCTL_EP0_WRITE/READ.
|
||||
* @flags: When USB_RAW_IO_FLAGS_ZERO is specified, the zero flag is set on
|
||||
* the submitted USB request, see include/linux/usb/gadget.h for details.
|
||||
* @length: Length of data.
|
||||
* @data: Data to send for USB_RAW_IOCTL_EP0/EP_WRITE. Buffer to store received
|
||||
* data for USB_RAW_IOCTL_EP0/EP_READ.
|
||||
*/
|
||||
struct usb_raw_ep_io {
|
||||
__u16 ep;
|
||||
__u16 flags;
|
||||
__u32 length;
|
||||
__u8 data[];
|
||||
};
|
||||
|
||||
/* Maximum number of non-control endpoints in struct usb_raw_eps_info. */
|
||||
#define USB_RAW_EPS_NUM_MAX 30
|
||||
|
||||
/* Maximum length of UDC endpoint name in struct usb_raw_ep_info. */
|
||||
#define USB_RAW_EP_NAME_MAX 16
|
||||
|
||||
/* Used as addr in struct usb_raw_ep_info if endpoint accepts any address. */
|
||||
#define USB_RAW_EP_ADDR_ANY 0xff
|
||||
|
||||
/*
|
||||
* struct usb_raw_ep_caps - exposes endpoint capabilities from struct usb_ep
|
||||
* (technically from its member struct usb_ep_caps).
|
||||
*/
|
||||
struct usb_raw_ep_caps {
|
||||
__u32 type_control : 1;
|
||||
__u32 type_iso : 1;
|
||||
__u32 type_bulk : 1;
|
||||
__u32 type_int : 1;
|
||||
__u32 dir_in : 1;
|
||||
__u32 dir_out : 1;
|
||||
};
|
||||
|
||||
/*
|
||||
* struct usb_raw_ep_limits - exposes endpoint limits from struct usb_ep.
|
||||
* @maxpacket_limit: Maximum packet size value supported by this endpoint.
|
||||
* @max_streams: maximum number of streams supported by this endpoint
|
||||
* (actual number is 2^n).
|
||||
* @reserved: Empty, reserved for potential future extensions.
|
||||
*/
|
||||
struct usb_raw_ep_limits {
|
||||
__u16 maxpacket_limit;
|
||||
__u16 max_streams;
|
||||
__u32 reserved;
|
||||
};
|
||||
|
||||
/*
|
||||
* struct usb_raw_ep_info - stores information about a gadget endpoint.
|
||||
* @name: Name of the endpoint as it is defined in the UDC driver.
|
||||
* @addr: Address of the endpoint that must be specified in the endpoint
|
||||
* descriptor passed to USB_RAW_IOCTL_EP_ENABLE ioctl.
|
||||
* @caps: Endpoint capabilities.
|
||||
* @limits: Endpoint limits.
|
||||
*/
|
||||
struct usb_raw_ep_info {
|
||||
__u8 name[USB_RAW_EP_NAME_MAX];
|
||||
__u32 addr;
|
||||
struct usb_raw_ep_caps caps;
|
||||
struct usb_raw_ep_limits limits;
|
||||
};
|
||||
|
||||
/*
|
||||
* struct usb_raw_eps_info - argument for USB_RAW_IOCTL_EPS_INFO ioctl.
|
||||
* eps: Structures that store information about non-control endpoints.
|
||||
*/
|
||||
struct usb_raw_eps_info {
|
||||
struct usb_raw_ep_info eps[USB_RAW_EPS_NUM_MAX];
|
||||
};
|
||||
|
||||
/*
|
||||
* Initializes a Raw Gadget instance.
|
||||
* Accepts a pointer to the usb_raw_init struct as an argument.
|
||||
* Returns 0 on success or negative error code on failure.
|
||||
*/
|
||||
#define USB_RAW_IOCTL_INIT _IOW('U', 0, struct usb_raw_init)
|
||||
|
||||
/*
|
||||
* Instructs Raw Gadget to bind to a UDC and start emulating a USB device.
|
||||
* Returns 0 on success or negative error code on failure.
|
||||
*/
|
||||
#define USB_RAW_IOCTL_RUN _IO('U', 1)
|
||||
|
||||
/*
|
||||
* A blocking ioctl that waits for an event and returns fetched event data to
|
||||
* the user.
|
||||
* Accepts a pointer to the usb_raw_event struct.
|
||||
* Returns 0 on success or negative error code on failure.
|
||||
*/
|
||||
#define USB_RAW_IOCTL_EVENT_FETCH _IOR('U', 2, struct usb_raw_event)
|
||||
|
||||
/*
|
||||
* Queues an IN (OUT for READ) request as a response to the last setup request
|
||||
* received on endpoint 0 (provided that was an IN (OUT for READ) request), and
|
||||
* waits until the request is completed. Copies received data to user for READ.
|
||||
* Accepts a pointer to the usb_raw_ep_io struct as an argument.
|
||||
* Returns length of transferred data on success or negative error code on
|
||||
* failure.
|
||||
*/
|
||||
#define USB_RAW_IOCTL_EP0_WRITE _IOW('U', 3, struct usb_raw_ep_io)
|
||||
#define USB_RAW_IOCTL_EP0_READ _IOWR('U', 4, struct usb_raw_ep_io)
|
||||
|
||||
/*
|
||||
* Finds an endpoint that satisfies the parameters specified in the provided
|
||||
* descriptors (address, transfer type, etc.) and enables it.
|
||||
* Accepts a pointer to the usb_raw_ep_descs struct as an argument.
|
||||
* Returns enabled endpoint handle on success or negative error code on failure.
|
||||
*/
|
||||
#define USB_RAW_IOCTL_EP_ENABLE _IOW('U', 5, struct usb_endpoint_descriptor)
|
||||
|
||||
/*
|
||||
* Disables specified endpoint.
|
||||
* Accepts endpoint handle as an argument.
|
||||
* Returns 0 on success or negative error code on failure.
|
||||
*/
|
||||
#define USB_RAW_IOCTL_EP_DISABLE _IOW('U', 6, __u32)
|
||||
|
||||
/*
|
||||
* Queues an IN (OUT for READ) request as a response to the last setup request
|
||||
* received on endpoint usb_raw_ep_io.ep (provided that was an IN (OUT for READ)
|
||||
* request), and waits until the request is completed. Copies received data to
|
||||
* user for READ.
|
||||
* Accepts a pointer to the usb_raw_ep_io struct as an argument.
|
||||
* Returns length of transferred data on success or negative error code on
|
||||
* failure.
|
||||
*/
|
||||
#define USB_RAW_IOCTL_EP_WRITE _IOW('U', 7, struct usb_raw_ep_io)
|
||||
#define USB_RAW_IOCTL_EP_READ _IOWR('U', 8, struct usb_raw_ep_io)
|
||||
|
||||
/*
|
||||
* Switches the gadget into the configured state.
|
||||
* Returns 0 on success or negative error code on failure.
|
||||
*/
|
||||
#define USB_RAW_IOCTL_CONFIGURE _IO('U', 9)
|
||||
|
||||
/*
|
||||
* Constrains UDC VBUS power usage.
|
||||
* Accepts current limit in 2 mA units as an argument.
|
||||
* Returns 0 on success or negative error code on failure.
|
||||
*/
|
||||
#define USB_RAW_IOCTL_VBUS_DRAW _IOW('U', 10, __u32)
|
||||
|
||||
/*
|
||||
* Fills in the usb_raw_eps_info structure with information about non-control
|
||||
* endpoints available for the currently connected UDC.
|
||||
* Returns the number of available endpoints on success or negative error code
|
||||
* on failure.
|
||||
*/
|
||||
#define USB_RAW_IOCTL_EPS_INFO _IOR('U', 11, struct usb_raw_eps_info)
|
||||
|
||||
/*
|
||||
* Stalls a pending control request on endpoint 0.
|
||||
* Returns 0 on success or negative error code on failure.
|
||||
*/
|
||||
#define USB_RAW_IOCTL_EP0_STALL _IO('U', 12)
|
||||
|
||||
/*
|
||||
* Sets or clears halt or wedge status of the endpoint.
|
||||
* Accepts endpoint handle as an argument.
|
||||
* Returns 0 on success or negative error code on failure.
|
||||
*/
|
||||
#define USB_RAW_IOCTL_EP_SET_HALT _IOW('U', 13, __u32)
|
||||
#define USB_RAW_IOCTL_EP_CLEAR_HALT _IOW('U', 14, __u32)
|
||||
#define USB_RAW_IOCTL_EP_SET_WEDGE _IOW('U', 15, __u32)
|
||||
|
||||
#endif /* __LINUX_USB_RAW_GADGET_H */
|
124
linux/usb/tmc.h
Normal file
124
linux/usb/tmc.h
Normal file
@ -0,0 +1,124 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
|
||||
/*
|
||||
* Copyright (C) 2007 Stefan Kopp, Gechingen, Germany
|
||||
* Copyright (C) 2008 Novell, Inc.
|
||||
* Copyright (C) 2008 Greg Kroah-Hartman <gregkh@suse.de>
|
||||
* Copyright (C) 2015 Dave Penkler <dpenkler@gmail.com>
|
||||
* Copyright (C) 2018 IVI Foundation, Inc.
|
||||
*
|
||||
* This file holds USB constants defined by the USB Device Class
|
||||
* and USB488 Subclass Definitions for Test and Measurement devices
|
||||
* published by the USB-IF.
|
||||
*
|
||||
* It also has the ioctl and capability definitions for the
|
||||
* usbtmc kernel driver that userspace needs to know about.
|
||||
*/
|
||||
|
||||
#ifndef __LINUX_USB_TMC_H
|
||||
#define __LINUX_USB_TMC_H
|
||||
|
||||
#include <linux/types.h> /* __u8 etc */
|
||||
|
||||
/* USB TMC status values */
|
||||
#define USBTMC_STATUS_SUCCESS 0x01
|
||||
#define USBTMC_STATUS_PENDING 0x02
|
||||
#define USBTMC_STATUS_FAILED 0x80
|
||||
#define USBTMC_STATUS_TRANSFER_NOT_IN_PROGRESS 0x81
|
||||
#define USBTMC_STATUS_SPLIT_NOT_IN_PROGRESS 0x82
|
||||
#define USBTMC_STATUS_SPLIT_IN_PROGRESS 0x83
|
||||
|
||||
/* USB TMC requests values */
|
||||
#define USBTMC_REQUEST_INITIATE_ABORT_BULK_OUT 1
|
||||
#define USBTMC_REQUEST_CHECK_ABORT_BULK_OUT_STATUS 2
|
||||
#define USBTMC_REQUEST_INITIATE_ABORT_BULK_IN 3
|
||||
#define USBTMC_REQUEST_CHECK_ABORT_BULK_IN_STATUS 4
|
||||
#define USBTMC_REQUEST_INITIATE_CLEAR 5
|
||||
#define USBTMC_REQUEST_CHECK_CLEAR_STATUS 6
|
||||
#define USBTMC_REQUEST_GET_CAPABILITIES 7
|
||||
#define USBTMC_REQUEST_INDICATOR_PULSE 64
|
||||
#define USBTMC488_REQUEST_READ_STATUS_BYTE 128
|
||||
#define USBTMC488_REQUEST_REN_CONTROL 160
|
||||
#define USBTMC488_REQUEST_GOTO_LOCAL 161
|
||||
#define USBTMC488_REQUEST_LOCAL_LOCKOUT 162
|
||||
|
||||
struct usbtmc_request {
|
||||
__u8 bRequestType;
|
||||
__u8 bRequest;
|
||||
__u16 wValue;
|
||||
__u16 wIndex;
|
||||
__u16 wLength;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
struct usbtmc_ctrlrequest {
|
||||
struct usbtmc_request req;
|
||||
void *data; /* pointer to user space */
|
||||
} __attribute__ ((packed));
|
||||
|
||||
struct usbtmc_termchar {
|
||||
__u8 term_char;
|
||||
__u8 term_char_enabled;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
/*
|
||||
* usbtmc_message->flags:
|
||||
*/
|
||||
#define USBTMC_FLAG_ASYNC 0x0001
|
||||
#define USBTMC_FLAG_APPEND 0x0002
|
||||
#define USBTMC_FLAG_IGNORE_TRAILER 0x0004
|
||||
|
||||
struct usbtmc_message {
|
||||
__u32 transfer_size; /* size of bytes to transfer */
|
||||
__u32 transferred; /* size of received/written bytes */
|
||||
__u32 flags; /* bit 0: 0 = synchronous; 1 = asynchronous */
|
||||
void *message; /* pointer to header and data in user space */
|
||||
} __attribute__ ((packed));
|
||||
|
||||
/* Request values for USBTMC driver's ioctl entry point */
|
||||
#define USBTMC_IOC_NR 91
|
||||
#define USBTMC_IOCTL_INDICATOR_PULSE _IO(USBTMC_IOC_NR, 1)
|
||||
#define USBTMC_IOCTL_CLEAR _IO(USBTMC_IOC_NR, 2)
|
||||
#define USBTMC_IOCTL_ABORT_BULK_OUT _IO(USBTMC_IOC_NR, 3)
|
||||
#define USBTMC_IOCTL_ABORT_BULK_IN _IO(USBTMC_IOC_NR, 4)
|
||||
#define USBTMC_IOCTL_CLEAR_OUT_HALT _IO(USBTMC_IOC_NR, 6)
|
||||
#define USBTMC_IOCTL_CLEAR_IN_HALT _IO(USBTMC_IOC_NR, 7)
|
||||
#define USBTMC_IOCTL_CTRL_REQUEST _IOWR(USBTMC_IOC_NR, 8, struct usbtmc_ctrlrequest)
|
||||
#define USBTMC_IOCTL_GET_TIMEOUT _IOR(USBTMC_IOC_NR, 9, __u32)
|
||||
#define USBTMC_IOCTL_SET_TIMEOUT _IOW(USBTMC_IOC_NR, 10, __u32)
|
||||
#define USBTMC_IOCTL_EOM_ENABLE _IOW(USBTMC_IOC_NR, 11, __u8)
|
||||
#define USBTMC_IOCTL_CONFIG_TERMCHAR _IOW(USBTMC_IOC_NR, 12, struct usbtmc_termchar)
|
||||
#define USBTMC_IOCTL_WRITE _IOWR(USBTMC_IOC_NR, 13, struct usbtmc_message)
|
||||
#define USBTMC_IOCTL_READ _IOWR(USBTMC_IOC_NR, 14, struct usbtmc_message)
|
||||
#define USBTMC_IOCTL_WRITE_RESULT _IOWR(USBTMC_IOC_NR, 15, __u32)
|
||||
#define USBTMC_IOCTL_API_VERSION _IOR(USBTMC_IOC_NR, 16, __u32)
|
||||
|
||||
#define USBTMC488_IOCTL_GET_CAPS _IOR(USBTMC_IOC_NR, 17, unsigned char)
|
||||
#define USBTMC488_IOCTL_READ_STB _IOR(USBTMC_IOC_NR, 18, unsigned char)
|
||||
#define USBTMC488_IOCTL_REN_CONTROL _IOW(USBTMC_IOC_NR, 19, unsigned char)
|
||||
#define USBTMC488_IOCTL_GOTO_LOCAL _IO(USBTMC_IOC_NR, 20)
|
||||
#define USBTMC488_IOCTL_LOCAL_LOCKOUT _IO(USBTMC_IOC_NR, 21)
|
||||
#define USBTMC488_IOCTL_TRIGGER _IO(USBTMC_IOC_NR, 22)
|
||||
#define USBTMC488_IOCTL_WAIT_SRQ _IOW(USBTMC_IOC_NR, 23, __u32)
|
||||
|
||||
#define USBTMC_IOCTL_MSG_IN_ATTR _IOR(USBTMC_IOC_NR, 24, __u8)
|
||||
#define USBTMC_IOCTL_AUTO_ABORT _IOW(USBTMC_IOC_NR, 25, __u8)
|
||||
|
||||
#define USBTMC_IOCTL_GET_STB _IOR(USBTMC_IOC_NR, 26, __u8)
|
||||
#define USBTMC_IOCTL_GET_SRQ_STB _IOR(USBTMC_IOC_NR, 27, __u8)
|
||||
|
||||
/* Cancel and cleanup asynchronous calls */
|
||||
#define USBTMC_IOCTL_CANCEL_IO _IO(USBTMC_IOC_NR, 35)
|
||||
#define USBTMC_IOCTL_CLEANUP_IO _IO(USBTMC_IOC_NR, 36)
|
||||
|
||||
/* Driver encoded usb488 capabilities */
|
||||
#define USBTMC488_CAPABILITY_TRIGGER 1
|
||||
#define USBTMC488_CAPABILITY_SIMPLE 2
|
||||
#define USBTMC488_CAPABILITY_REN_CONTROL 2
|
||||
#define USBTMC488_CAPABILITY_GOTO_LOCAL 2
|
||||
#define USBTMC488_CAPABILITY_LOCAL_LOCKOUT 2
|
||||
#define USBTMC488_CAPABILITY_488_DOT_2 4
|
||||
#define USBTMC488_CAPABILITY_DT1 16
|
||||
#define USBTMC488_CAPABILITY_RL1 32
|
||||
#define USBTMC488_CAPABILITY_SR1 64
|
||||
#define USBTMC488_CAPABILITY_FULL_SCPI 128
|
||||
|
||||
#endif
|
601
linux/usb/video.h
Normal file
601
linux/usb/video.h
Normal file
@ -0,0 +1,601 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
|
||||
/*
|
||||
* USB Video Class definitions.
|
||||
*
|
||||
* Copyright (C) 2009 Laurent Pinchart <laurent.pinchart@skynet.be>
|
||||
*
|
||||
* This file holds USB constants and structures defined by the USB Device
|
||||
* Class Definition for Video Devices. Unless otherwise stated, comments
|
||||
* below reference relevant sections of the USB Video Class 1.1 specification
|
||||
* available at
|
||||
*
|
||||
* http://www.usb.org/developers/devclass_docs/USB_Video_Class_1_1.zip
|
||||
*/
|
||||
|
||||
#ifndef __LINUX_USB_VIDEO_H
|
||||
#define __LINUX_USB_VIDEO_H
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
/* --------------------------------------------------------------------------
|
||||
* UVC constants
|
||||
*/
|
||||
|
||||
/* A.2. Video Interface Subclass Codes */
|
||||
#define UVC_SC_UNDEFINED 0x00
|
||||
#define UVC_SC_VIDEOCONTROL 0x01
|
||||
#define UVC_SC_VIDEOSTREAMING 0x02
|
||||
#define UVC_SC_VIDEO_INTERFACE_COLLECTION 0x03
|
||||
|
||||
/* A.3. Video Interface Protocol Codes */
|
||||
#define UVC_PC_PROTOCOL_UNDEFINED 0x00
|
||||
#define UVC_PC_PROTOCOL_15 0x01
|
||||
|
||||
/* A.5. Video Class-Specific VC Interface Descriptor Subtypes */
|
||||
#define UVC_VC_DESCRIPTOR_UNDEFINED 0x00
|
||||
#define UVC_VC_HEADER 0x01
|
||||
#define UVC_VC_INPUT_TERMINAL 0x02
|
||||
#define UVC_VC_OUTPUT_TERMINAL 0x03
|
||||
#define UVC_VC_SELECTOR_UNIT 0x04
|
||||
#define UVC_VC_PROCESSING_UNIT 0x05
|
||||
#define UVC_VC_EXTENSION_UNIT 0x06
|
||||
|
||||
/* A.6. Video Class-Specific VS Interface Descriptor Subtypes */
|
||||
#define UVC_VS_UNDEFINED 0x00
|
||||
#define UVC_VS_INPUT_HEADER 0x01
|
||||
#define UVC_VS_OUTPUT_HEADER 0x02
|
||||
#define UVC_VS_STILL_IMAGE_FRAME 0x03
|
||||
#define UVC_VS_FORMAT_UNCOMPRESSED 0x04
|
||||
#define UVC_VS_FRAME_UNCOMPRESSED 0x05
|
||||
#define UVC_VS_FORMAT_MJPEG 0x06
|
||||
#define UVC_VS_FRAME_MJPEG 0x07
|
||||
#define UVC_VS_FORMAT_MPEG2TS 0x0a
|
||||
#define UVC_VS_FORMAT_DV 0x0c
|
||||
#define UVC_VS_COLORFORMAT 0x0d
|
||||
#define UVC_VS_FORMAT_FRAME_BASED 0x10
|
||||
#define UVC_VS_FRAME_FRAME_BASED 0x11
|
||||
#define UVC_VS_FORMAT_STREAM_BASED 0x12
|
||||
|
||||
/* A.7. Video Class-Specific Endpoint Descriptor Subtypes */
|
||||
#define UVC_EP_UNDEFINED 0x00
|
||||
#define UVC_EP_GENERAL 0x01
|
||||
#define UVC_EP_ENDPOINT 0x02
|
||||
#define UVC_EP_INTERRUPT 0x03
|
||||
|
||||
/* A.8. Video Class-Specific Request Codes */
|
||||
#define UVC_RC_UNDEFINED 0x00
|
||||
#define UVC_SET_CUR 0x01
|
||||
#define UVC_GET_CUR 0x81
|
||||
#define UVC_GET_MIN 0x82
|
||||
#define UVC_GET_MAX 0x83
|
||||
#define UVC_GET_RES 0x84
|
||||
#define UVC_GET_LEN 0x85
|
||||
#define UVC_GET_INFO 0x86
|
||||
#define UVC_GET_DEF 0x87
|
||||
|
||||
/* A.9.1. VideoControl Interface Control Selectors */
|
||||
#define UVC_VC_CONTROL_UNDEFINED 0x00
|
||||
#define UVC_VC_VIDEO_POWER_MODE_CONTROL 0x01
|
||||
#define UVC_VC_REQUEST_ERROR_CODE_CONTROL 0x02
|
||||
|
||||
/* A.9.2. Terminal Control Selectors */
|
||||
#define UVC_TE_CONTROL_UNDEFINED 0x00
|
||||
|
||||
/* A.9.3. Selector Unit Control Selectors */
|
||||
#define UVC_SU_CONTROL_UNDEFINED 0x00
|
||||
#define UVC_SU_INPUT_SELECT_CONTROL 0x01
|
||||
|
||||
/* A.9.4. Camera Terminal Control Selectors */
|
||||
#define UVC_CT_CONTROL_UNDEFINED 0x00
|
||||
#define UVC_CT_SCANNING_MODE_CONTROL 0x01
|
||||
#define UVC_CT_AE_MODE_CONTROL 0x02
|
||||
#define UVC_CT_AE_PRIORITY_CONTROL 0x03
|
||||
#define UVC_CT_EXPOSURE_TIME_ABSOLUTE_CONTROL 0x04
|
||||
#define UVC_CT_EXPOSURE_TIME_RELATIVE_CONTROL 0x05
|
||||
#define UVC_CT_FOCUS_ABSOLUTE_CONTROL 0x06
|
||||
#define UVC_CT_FOCUS_RELATIVE_CONTROL 0x07
|
||||
#define UVC_CT_FOCUS_AUTO_CONTROL 0x08
|
||||
#define UVC_CT_IRIS_ABSOLUTE_CONTROL 0x09
|
||||
#define UVC_CT_IRIS_RELATIVE_CONTROL 0x0a
|
||||
#define UVC_CT_ZOOM_ABSOLUTE_CONTROL 0x0b
|
||||
#define UVC_CT_ZOOM_RELATIVE_CONTROL 0x0c
|
||||
#define UVC_CT_PANTILT_ABSOLUTE_CONTROL 0x0d
|
||||
#define UVC_CT_PANTILT_RELATIVE_CONTROL 0x0e
|
||||
#define UVC_CT_ROLL_ABSOLUTE_CONTROL 0x0f
|
||||
#define UVC_CT_ROLL_RELATIVE_CONTROL 0x10
|
||||
#define UVC_CT_PRIVACY_CONTROL 0x11
|
||||
|
||||
/* A.9.5. Processing Unit Control Selectors */
|
||||
#define UVC_PU_CONTROL_UNDEFINED 0x00
|
||||
#define UVC_PU_BACKLIGHT_COMPENSATION_CONTROL 0x01
|
||||
#define UVC_PU_BRIGHTNESS_CONTROL 0x02
|
||||
#define UVC_PU_CONTRAST_CONTROL 0x03
|
||||
#define UVC_PU_GAIN_CONTROL 0x04
|
||||
#define UVC_PU_POWER_LINE_FREQUENCY_CONTROL 0x05
|
||||
#define UVC_PU_HUE_CONTROL 0x06
|
||||
#define UVC_PU_SATURATION_CONTROL 0x07
|
||||
#define UVC_PU_SHARPNESS_CONTROL 0x08
|
||||
#define UVC_PU_GAMMA_CONTROL 0x09
|
||||
#define UVC_PU_WHITE_BALANCE_TEMPERATURE_CONTROL 0x0a
|
||||
#define UVC_PU_WHITE_BALANCE_TEMPERATURE_AUTO_CONTROL 0x0b
|
||||
#define UVC_PU_WHITE_BALANCE_COMPONENT_CONTROL 0x0c
|
||||
#define UVC_PU_WHITE_BALANCE_COMPONENT_AUTO_CONTROL 0x0d
|
||||
#define UVC_PU_DIGITAL_MULTIPLIER_CONTROL 0x0e
|
||||
#define UVC_PU_DIGITAL_MULTIPLIER_LIMIT_CONTROL 0x0f
|
||||
#define UVC_PU_HUE_AUTO_CONTROL 0x10
|
||||
#define UVC_PU_ANALOG_VIDEO_STANDARD_CONTROL 0x11
|
||||
#define UVC_PU_ANALOG_LOCK_STATUS_CONTROL 0x12
|
||||
|
||||
/* A.9.7. VideoStreaming Interface Control Selectors */
|
||||
#define UVC_VS_CONTROL_UNDEFINED 0x00
|
||||
#define UVC_VS_PROBE_CONTROL 0x01
|
||||
#define UVC_VS_COMMIT_CONTROL 0x02
|
||||
#define UVC_VS_STILL_PROBE_CONTROL 0x03
|
||||
#define UVC_VS_STILL_COMMIT_CONTROL 0x04
|
||||
#define UVC_VS_STILL_IMAGE_TRIGGER_CONTROL 0x05
|
||||
#define UVC_VS_STREAM_ERROR_CODE_CONTROL 0x06
|
||||
#define UVC_VS_GENERATE_KEY_FRAME_CONTROL 0x07
|
||||
#define UVC_VS_UPDATE_FRAME_SEGMENT_CONTROL 0x08
|
||||
#define UVC_VS_SYNC_DELAY_CONTROL 0x09
|
||||
|
||||
/* B.1. USB Terminal Types */
|
||||
#define UVC_TT_VENDOR_SPECIFIC 0x0100
|
||||
#define UVC_TT_STREAMING 0x0101
|
||||
|
||||
/* B.2. Input Terminal Types */
|
||||
#define UVC_ITT_VENDOR_SPECIFIC 0x0200
|
||||
#define UVC_ITT_CAMERA 0x0201
|
||||
#define UVC_ITT_MEDIA_TRANSPORT_INPUT 0x0202
|
||||
|
||||
/* B.3. Output Terminal Types */
|
||||
#define UVC_OTT_VENDOR_SPECIFIC 0x0300
|
||||
#define UVC_OTT_DISPLAY 0x0301
|
||||
#define UVC_OTT_MEDIA_TRANSPORT_OUTPUT 0x0302
|
||||
|
||||
/* B.4. External Terminal Types */
|
||||
#define UVC_EXTERNAL_VENDOR_SPECIFIC 0x0400
|
||||
#define UVC_COMPOSITE_CONNECTOR 0x0401
|
||||
#define UVC_SVIDEO_CONNECTOR 0x0402
|
||||
#define UVC_COMPONENT_CONNECTOR 0x0403
|
||||
|
||||
/* 2.4.2.2. Status Packet Type */
|
||||
#define UVC_STATUS_TYPE_CONTROL 1
|
||||
#define UVC_STATUS_TYPE_STREAMING 2
|
||||
|
||||
/* 2.4.3.3. Payload Header Information */
|
||||
#define UVC_STREAM_EOH (1 << 7)
|
||||
#define UVC_STREAM_ERR (1 << 6)
|
||||
#define UVC_STREAM_STI (1 << 5)
|
||||
#define UVC_STREAM_RES (1 << 4)
|
||||
#define UVC_STREAM_SCR (1 << 3)
|
||||
#define UVC_STREAM_PTS (1 << 2)
|
||||
#define UVC_STREAM_EOF (1 << 1)
|
||||
#define UVC_STREAM_FID (1 << 0)
|
||||
|
||||
/* 4.1.2. Control Capabilities */
|
||||
#define UVC_CONTROL_CAP_GET (1 << 0)
|
||||
#define UVC_CONTROL_CAP_SET (1 << 1)
|
||||
#define UVC_CONTROL_CAP_DISABLED (1 << 2)
|
||||
#define UVC_CONTROL_CAP_AUTOUPDATE (1 << 3)
|
||||
#define UVC_CONTROL_CAP_ASYNCHRONOUS (1 << 4)
|
||||
|
||||
/* 3.9.2.6 Color Matching Descriptor Values */
|
||||
enum uvc_color_primaries_values {
|
||||
UVC_COLOR_PRIMARIES_UNSPECIFIED,
|
||||
UVC_COLOR_PRIMARIES_BT_709_SRGB,
|
||||
UVC_COLOR_PRIMARIES_BT_470_2_M,
|
||||
UVC_COLOR_PRIMARIES_BT_470_2_B_G,
|
||||
UVC_COLOR_PRIMARIES_SMPTE_170M,
|
||||
UVC_COLOR_PRIMARIES_SMPTE_240M,
|
||||
};
|
||||
|
||||
enum uvc_transfer_characteristics_values {
|
||||
UVC_TRANSFER_CHARACTERISTICS_UNSPECIFIED,
|
||||
UVC_TRANSFER_CHARACTERISTICS_BT_709,
|
||||
UVC_TRANSFER_CHARACTERISTICS_BT_470_2_M,
|
||||
UVC_TRANSFER_CHARACTERISTICS_BT_470_2_B_G,
|
||||
UVC_TRANSFER_CHARACTERISTICS_SMPTE_170M,
|
||||
UVC_TRANSFER_CHARACTERISTICS_SMPTE_240M,
|
||||
UVC_TRANSFER_CHARACTERISTICS_LINEAR,
|
||||
UVC_TRANSFER_CHARACTERISTICS_SRGB,
|
||||
};
|
||||
|
||||
enum uvc_matrix_coefficients {
|
||||
UVC_MATRIX_COEFFICIENTS_UNSPECIFIED,
|
||||
UVC_MATRIX_COEFFICIENTS_BT_709,
|
||||
UVC_MATRIX_COEFFICIENTS_FCC,
|
||||
UVC_MATRIX_COEFFICIENTS_BT_470_2_B_G,
|
||||
UVC_MATRIX_COEFFICIENTS_SMPTE_170M,
|
||||
UVC_MATRIX_COEFFICIENTS_SMPTE_240M,
|
||||
};
|
||||
|
||||
/* ------------------------------------------------------------------------
|
||||
* UVC structures
|
||||
*/
|
||||
|
||||
/* All UVC descriptors have these 3 fields at the beginning */
|
||||
struct uvc_descriptor_header {
|
||||
__u8 bLength;
|
||||
__u8 bDescriptorType;
|
||||
__u8 bDescriptorSubType;
|
||||
} __attribute__((packed));
|
||||
|
||||
/* 3.7.2. Video Control Interface Header Descriptor */
|
||||
struct uvc_header_descriptor {
|
||||
__u8 bLength;
|
||||
__u8 bDescriptorType;
|
||||
__u8 bDescriptorSubType;
|
||||
__le16 bcdUVC;
|
||||
__le16 wTotalLength;
|
||||
__le32 dwClockFrequency;
|
||||
__u8 bInCollection;
|
||||
__u8 baInterfaceNr[];
|
||||
} __attribute__((__packed__));
|
||||
|
||||
#define UVC_DT_HEADER_SIZE(n) (12+(n))
|
||||
|
||||
#define UVC_HEADER_DESCRIPTOR(n) \
|
||||
uvc_header_descriptor_##n
|
||||
|
||||
#define DECLARE_UVC_HEADER_DESCRIPTOR(n) \
|
||||
struct UVC_HEADER_DESCRIPTOR(n) { \
|
||||
__u8 bLength; \
|
||||
__u8 bDescriptorType; \
|
||||
__u8 bDescriptorSubType; \
|
||||
__le16 bcdUVC; \
|
||||
__le16 wTotalLength; \
|
||||
__le32 dwClockFrequency; \
|
||||
__u8 bInCollection; \
|
||||
__u8 baInterfaceNr[n]; \
|
||||
} __attribute__ ((packed))
|
||||
|
||||
/* 3.7.2.1. Input Terminal Descriptor */
|
||||
struct uvc_input_terminal_descriptor {
|
||||
__u8 bLength;
|
||||
__u8 bDescriptorType;
|
||||
__u8 bDescriptorSubType;
|
||||
__u8 bTerminalID;
|
||||
__le16 wTerminalType;
|
||||
__u8 bAssocTerminal;
|
||||
__u8 iTerminal;
|
||||
} __attribute__((__packed__));
|
||||
|
||||
#define UVC_DT_INPUT_TERMINAL_SIZE 8
|
||||
|
||||
/* 3.7.2.2. Output Terminal Descriptor */
|
||||
struct uvc_output_terminal_descriptor {
|
||||
__u8 bLength;
|
||||
__u8 bDescriptorType;
|
||||
__u8 bDescriptorSubType;
|
||||
__u8 bTerminalID;
|
||||
__le16 wTerminalType;
|
||||
__u8 bAssocTerminal;
|
||||
__u8 bSourceID;
|
||||
__u8 iTerminal;
|
||||
} __attribute__((__packed__));
|
||||
|
||||
#define UVC_DT_OUTPUT_TERMINAL_SIZE 9
|
||||
|
||||
/* 3.7.2.3. Camera Terminal Descriptor */
|
||||
struct uvc_camera_terminal_descriptor {
|
||||
__u8 bLength;
|
||||
__u8 bDescriptorType;
|
||||
__u8 bDescriptorSubType;
|
||||
__u8 bTerminalID;
|
||||
__le16 wTerminalType;
|
||||
__u8 bAssocTerminal;
|
||||
__u8 iTerminal;
|
||||
__le16 wObjectiveFocalLengthMin;
|
||||
__le16 wObjectiveFocalLengthMax;
|
||||
__le16 wOcularFocalLength;
|
||||
__u8 bControlSize;
|
||||
__u8 bmControls[3];
|
||||
} __attribute__((__packed__));
|
||||
|
||||
#define UVC_DT_CAMERA_TERMINAL_SIZE(n) (15+(n))
|
||||
|
||||
/* 3.7.2.4. Selector Unit Descriptor */
|
||||
struct uvc_selector_unit_descriptor {
|
||||
__u8 bLength;
|
||||
__u8 bDescriptorType;
|
||||
__u8 bDescriptorSubType;
|
||||
__u8 bUnitID;
|
||||
__u8 bNrInPins;
|
||||
__u8 baSourceID[0];
|
||||
__u8 iSelector;
|
||||
} __attribute__((__packed__));
|
||||
|
||||
#define UVC_DT_SELECTOR_UNIT_SIZE(n) (6+(n))
|
||||
|
||||
#define UVC_SELECTOR_UNIT_DESCRIPTOR(n) \
|
||||
uvc_selector_unit_descriptor_##n
|
||||
|
||||
#define DECLARE_UVC_SELECTOR_UNIT_DESCRIPTOR(n) \
|
||||
struct UVC_SELECTOR_UNIT_DESCRIPTOR(n) { \
|
||||
__u8 bLength; \
|
||||
__u8 bDescriptorType; \
|
||||
__u8 bDescriptorSubType; \
|
||||
__u8 bUnitID; \
|
||||
__u8 bNrInPins; \
|
||||
__u8 baSourceID[n]; \
|
||||
__u8 iSelector; \
|
||||
} __attribute__ ((packed))
|
||||
|
||||
/* 3.7.2.5. Processing Unit Descriptor */
|
||||
struct uvc_processing_unit_descriptor {
|
||||
__u8 bLength;
|
||||
__u8 bDescriptorType;
|
||||
__u8 bDescriptorSubType;
|
||||
__u8 bUnitID;
|
||||
__u8 bSourceID;
|
||||
__le16 wMaxMultiplier;
|
||||
__u8 bControlSize;
|
||||
__u8 bmControls[2];
|
||||
__u8 iProcessing;
|
||||
__u8 bmVideoStandards;
|
||||
} __attribute__((__packed__));
|
||||
|
||||
#define UVC_DT_PROCESSING_UNIT_SIZE(n) (10+(n))
|
||||
|
||||
/* 3.7.2.6. Extension Unit Descriptor */
|
||||
struct uvc_extension_unit_descriptor {
|
||||
__u8 bLength;
|
||||
__u8 bDescriptorType;
|
||||
__u8 bDescriptorSubType;
|
||||
__u8 bUnitID;
|
||||
__u8 guidExtensionCode[16];
|
||||
__u8 bNumControls;
|
||||
__u8 bNrInPins;
|
||||
__u8 baSourceID[0];
|
||||
__u8 bControlSize;
|
||||
__u8 bmControls[0];
|
||||
__u8 iExtension;
|
||||
} __attribute__((__packed__));
|
||||
|
||||
#define UVC_DT_EXTENSION_UNIT_SIZE(p, n) (24+(p)+(n))
|
||||
|
||||
#define UVC_EXTENSION_UNIT_DESCRIPTOR(p, n) \
|
||||
uvc_extension_unit_descriptor_##p_##n
|
||||
|
||||
#define DECLARE_UVC_EXTENSION_UNIT_DESCRIPTOR(p, n) \
|
||||
struct UVC_EXTENSION_UNIT_DESCRIPTOR(p, n) { \
|
||||
__u8 bLength; \
|
||||
__u8 bDescriptorType; \
|
||||
__u8 bDescriptorSubType; \
|
||||
__u8 bUnitID; \
|
||||
__u8 guidExtensionCode[16]; \
|
||||
__u8 bNumControls; \
|
||||
__u8 bNrInPins; \
|
||||
__u8 baSourceID[p]; \
|
||||
__u8 bControlSize; \
|
||||
__u8 bmControls[n]; \
|
||||
__u8 iExtension; \
|
||||
} __attribute__ ((packed))
|
||||
|
||||
/* 3.8.2.2. Video Control Interrupt Endpoint Descriptor */
|
||||
struct uvc_control_endpoint_descriptor {
|
||||
__u8 bLength;
|
||||
__u8 bDescriptorType;
|
||||
__u8 bDescriptorSubType;
|
||||
__le16 wMaxTransferSize;
|
||||
} __attribute__((__packed__));
|
||||
|
||||
#define UVC_DT_CONTROL_ENDPOINT_SIZE 5
|
||||
|
||||
/* 3.9.2.1. Input Header Descriptor */
|
||||
struct uvc_input_header_descriptor {
|
||||
__u8 bLength;
|
||||
__u8 bDescriptorType;
|
||||
__u8 bDescriptorSubType;
|
||||
__u8 bNumFormats;
|
||||
__le16 wTotalLength;
|
||||
__u8 bEndpointAddress;
|
||||
__u8 bmInfo;
|
||||
__u8 bTerminalLink;
|
||||
__u8 bStillCaptureMethod;
|
||||
__u8 bTriggerSupport;
|
||||
__u8 bTriggerUsage;
|
||||
__u8 bControlSize;
|
||||
__u8 bmaControls[];
|
||||
} __attribute__((__packed__));
|
||||
|
||||
#define UVC_DT_INPUT_HEADER_SIZE(n, p) (13+(n*p))
|
||||
|
||||
#define UVC_INPUT_HEADER_DESCRIPTOR(n, p) \
|
||||
uvc_input_header_descriptor_##n_##p
|
||||
|
||||
#define DECLARE_UVC_INPUT_HEADER_DESCRIPTOR(n, p) \
|
||||
struct UVC_INPUT_HEADER_DESCRIPTOR(n, p) { \
|
||||
__u8 bLength; \
|
||||
__u8 bDescriptorType; \
|
||||
__u8 bDescriptorSubType; \
|
||||
__u8 bNumFormats; \
|
||||
__le16 wTotalLength; \
|
||||
__u8 bEndpointAddress; \
|
||||
__u8 bmInfo; \
|
||||
__u8 bTerminalLink; \
|
||||
__u8 bStillCaptureMethod; \
|
||||
__u8 bTriggerSupport; \
|
||||
__u8 bTriggerUsage; \
|
||||
__u8 bControlSize; \
|
||||
__u8 bmaControls[p][n]; \
|
||||
} __attribute__ ((packed))
|
||||
|
||||
/* 3.9.2.2. Output Header Descriptor */
|
||||
struct uvc_output_header_descriptor {
|
||||
__u8 bLength;
|
||||
__u8 bDescriptorType;
|
||||
__u8 bDescriptorSubType;
|
||||
__u8 bNumFormats;
|
||||
__le16 wTotalLength;
|
||||
__u8 bEndpointAddress;
|
||||
__u8 bTerminalLink;
|
||||
__u8 bControlSize;
|
||||
__u8 bmaControls[];
|
||||
} __attribute__((__packed__));
|
||||
|
||||
#define UVC_DT_OUTPUT_HEADER_SIZE(n, p) (9+(n*p))
|
||||
|
||||
#define UVC_OUTPUT_HEADER_DESCRIPTOR(n, p) \
|
||||
uvc_output_header_descriptor_##n_##p
|
||||
|
||||
#define DECLARE_UVC_OUTPUT_HEADER_DESCRIPTOR(n, p) \
|
||||
struct UVC_OUTPUT_HEADER_DESCRIPTOR(n, p) { \
|
||||
__u8 bLength; \
|
||||
__u8 bDescriptorType; \
|
||||
__u8 bDescriptorSubType; \
|
||||
__u8 bNumFormats; \
|
||||
__le16 wTotalLength; \
|
||||
__u8 bEndpointAddress; \
|
||||
__u8 bTerminalLink; \
|
||||
__u8 bControlSize; \
|
||||
__u8 bmaControls[p][n]; \
|
||||
} __attribute__ ((packed))
|
||||
|
||||
/* 3.9.2.6. Color matching descriptor */
|
||||
struct uvc_color_matching_descriptor {
|
||||
__u8 bLength;
|
||||
__u8 bDescriptorType;
|
||||
__u8 bDescriptorSubType;
|
||||
__u8 bColorPrimaries;
|
||||
__u8 bTransferCharacteristics;
|
||||
__u8 bMatrixCoefficients;
|
||||
} __attribute__((__packed__));
|
||||
|
||||
#define UVC_DT_COLOR_MATCHING_SIZE 6
|
||||
|
||||
/* 4.3.1.1. Video Probe and Commit Controls */
|
||||
struct uvc_streaming_control {
|
||||
__u16 bmHint;
|
||||
__u8 bFormatIndex;
|
||||
__u8 bFrameIndex;
|
||||
__u32 dwFrameInterval;
|
||||
__u16 wKeyFrameRate;
|
||||
__u16 wPFrameRate;
|
||||
__u16 wCompQuality;
|
||||
__u16 wCompWindowSize;
|
||||
__u16 wDelay;
|
||||
__u32 dwMaxVideoFrameSize;
|
||||
__u32 dwMaxPayloadTransferSize;
|
||||
__u32 dwClockFrequency;
|
||||
__u8 bmFramingInfo;
|
||||
__u8 bPreferedVersion;
|
||||
__u8 bMinVersion;
|
||||
__u8 bMaxVersion;
|
||||
} __attribute__((__packed__));
|
||||
|
||||
/* Uncompressed Payload - 3.1.1. Uncompressed Video Format Descriptor */
|
||||
struct uvc_format_uncompressed {
|
||||
__u8 bLength;
|
||||
__u8 bDescriptorType;
|
||||
__u8 bDescriptorSubType;
|
||||
__u8 bFormatIndex;
|
||||
__u8 bNumFrameDescriptors;
|
||||
__u8 guidFormat[16];
|
||||
__u8 bBitsPerPixel;
|
||||
__u8 bDefaultFrameIndex;
|
||||
__u8 bAspectRatioX;
|
||||
__u8 bAspectRatioY;
|
||||
__u8 bmInterfaceFlags;
|
||||
__u8 bCopyProtect;
|
||||
} __attribute__((__packed__));
|
||||
|
||||
#define UVC_DT_FORMAT_UNCOMPRESSED_SIZE 27
|
||||
|
||||
/* Uncompressed Payload - 3.1.2. Uncompressed Video Frame Descriptor */
|
||||
struct uvc_frame_uncompressed {
|
||||
__u8 bLength;
|
||||
__u8 bDescriptorType;
|
||||
__u8 bDescriptorSubType;
|
||||
__u8 bFrameIndex;
|
||||
__u8 bmCapabilities;
|
||||
__le16 wWidth;
|
||||
__le16 wHeight;
|
||||
__le32 dwMinBitRate;
|
||||
__le32 dwMaxBitRate;
|
||||
__le32 dwMaxVideoFrameBufferSize;
|
||||
__le32 dwDefaultFrameInterval;
|
||||
__u8 bFrameIntervalType;
|
||||
__le32 dwFrameInterval[];
|
||||
} __attribute__((__packed__));
|
||||
|
||||
#define UVC_DT_FRAME_UNCOMPRESSED_SIZE(n) (26+4*(n))
|
||||
|
||||
#define UVC_FRAME_UNCOMPRESSED(n) \
|
||||
uvc_frame_uncompressed_##n
|
||||
|
||||
#define DECLARE_UVC_FRAME_UNCOMPRESSED(n) \
|
||||
struct UVC_FRAME_UNCOMPRESSED(n) { \
|
||||
__u8 bLength; \
|
||||
__u8 bDescriptorType; \
|
||||
__u8 bDescriptorSubType; \
|
||||
__u8 bFrameIndex; \
|
||||
__u8 bmCapabilities; \
|
||||
__le16 wWidth; \
|
||||
__le16 wHeight; \
|
||||
__le32 dwMinBitRate; \
|
||||
__le32 dwMaxBitRate; \
|
||||
__le32 dwMaxVideoFrameBufferSize; \
|
||||
__le32 dwDefaultFrameInterval; \
|
||||
__u8 bFrameIntervalType; \
|
||||
__le32 dwFrameInterval[n]; \
|
||||
} __attribute__ ((packed))
|
||||
|
||||
/* MJPEG Payload - 3.1.1. MJPEG Video Format Descriptor */
|
||||
struct uvc_format_mjpeg {
|
||||
__u8 bLength;
|
||||
__u8 bDescriptorType;
|
||||
__u8 bDescriptorSubType;
|
||||
__u8 bFormatIndex;
|
||||
__u8 bNumFrameDescriptors;
|
||||
__u8 bmFlags;
|
||||
__u8 bDefaultFrameIndex;
|
||||
__u8 bAspectRatioX;
|
||||
__u8 bAspectRatioY;
|
||||
__u8 bmInterfaceFlags;
|
||||
__u8 bCopyProtect;
|
||||
} __attribute__((__packed__));
|
||||
|
||||
#define UVC_DT_FORMAT_MJPEG_SIZE 11
|
||||
|
||||
/* MJPEG Payload - 3.1.2. MJPEG Video Frame Descriptor */
|
||||
struct uvc_frame_mjpeg {
|
||||
__u8 bLength;
|
||||
__u8 bDescriptorType;
|
||||
__u8 bDescriptorSubType;
|
||||
__u8 bFrameIndex;
|
||||
__u8 bmCapabilities;
|
||||
__le16 wWidth;
|
||||
__le16 wHeight;
|
||||
__le32 dwMinBitRate;
|
||||
__le32 dwMaxBitRate;
|
||||
__le32 dwMaxVideoFrameBufferSize;
|
||||
__le32 dwDefaultFrameInterval;
|
||||
__u8 bFrameIntervalType;
|
||||
__le32 dwFrameInterval[];
|
||||
} __attribute__((__packed__));
|
||||
|
||||
#define UVC_DT_FRAME_MJPEG_SIZE(n) (26+4*(n))
|
||||
|
||||
#define UVC_FRAME_MJPEG(n) \
|
||||
uvc_frame_mjpeg_##n
|
||||
|
||||
#define DECLARE_UVC_FRAME_MJPEG(n) \
|
||||
struct UVC_FRAME_MJPEG(n) { \
|
||||
__u8 bLength; \
|
||||
__u8 bDescriptorType; \
|
||||
__u8 bDescriptorSubType; \
|
||||
__u8 bFrameIndex; \
|
||||
__u8 bmCapabilities; \
|
||||
__le16 wWidth; \
|
||||
__le16 wHeight; \
|
||||
__le32 dwMinBitRate; \
|
||||
__le32 dwMaxBitRate; \
|
||||
__le32 dwMaxVideoFrameBufferSize; \
|
||||
__le32 dwDefaultFrameInterval; \
|
||||
__u8 bFrameIntervalType; \
|
||||
__le32 dwFrameInterval[n]; \
|
||||
} __attribute__ ((packed))
|
||||
|
||||
#endif /* __LINUX_USB_VIDEO_H */
|
||||
|
Reference in New Issue
Block a user