blob: 27891bcf81d08758c50dc8f29b591c918648a9ac [file] [log] [blame]
// SPDX-License-Identifier: GPL-2.0-or-later
/*
* USB descriptor definitions
*
* Copyright (C) 2017-2018 Michael Drake <michael.drake@codethink.co.uk>
*/
#ifndef _DESC_DEFS_H
#define _DESC_DEFS_H
/* ---------------------------------------------------------------------- */
/**
* Descriptor field value type.
*
* Note that there are more types here than exist in the descriptor definitions
* in the specifications. This is because the type here is used to do `lsusb`
* specific rendering of certain fields.
*
* Note that the use of certain types mandates the setting of various entries
* in the type-specific anonymous union in `struct desc`.
*/
enum desc_type {
DESC_CONSTANT, /** Plain numerical value; no annotation. */
DESC_NUMBER, /** Plain numerical value; no annotation. */
DESC_NUMBER_POSTFIX, /**< Number with a postfix string. */
DESC_BITMAP, /**< Plain hex rendered value; no annotation. */
DESC_BCD, /**< Binary coded decimal */
DESC_BMCONTROL_1, /**< UAC1 style bmControl field */
DESC_BMCONTROL_2, /**< UAC2/UAC3 style bmControl field */
DESC_STR_DESC_INDEX, /**< String index. */
DESC_CS_STR_DESC_ID, /**< UAC3 style class-specific string request. */
DESC_TERMINAL_STR, /**< Audio terminal string. */
DESC_BITMAP_STRINGS, /**< Bitfield with string per bit. */
DESC_NUMBER_STRINGS, /**< Use for enum-style value to string. */
DESC_EXTENSION, /**< Various possible descriptor extensions. */
DESC_SNOWFLAKE, /**< Value with custom annotation callback function. */
};
/**
* Callback function for the DESC_SNOWFLAKE descriptor field value type.
*
* This is used when some special rendering of the value is required, which
* is specific to the field in question, so no generic type's rendering is
* suitable.
*
* The core descriptor dumping code will have already dumped the numerical
* value for the field, but not the trailing newline character. It is up
* to the callback function to ensure it always finishes by writing a '\n'
* character to stdout.
*
* \param[in] value The value to dump a human-readable representation of.
* \param[in] indent The current indent level.
*/
typedef void (*desc_snowflake_dump_fn)(
unsigned long long value,
unsigned int indent);
/**
* Descriptor field definition.
*
* Whole descriptors can be defined as NULL terminated arrays of these
* structures.
*/
struct desc {
const char *field; /**< Field's name */
unsigned int size; /**< Byte size of field, if (size_field == NULL) */
const char *size_field; /**< Name of field specifying field size. */
enum desc_type type; /**< Field's value type. */
/** Anonymous union containing type-specific data. */
union {
/**
* Corresponds to types DESC_BMCONTROL_1 and DESC_BMCONTROL_2.
*
* Must be a NULL terminated array of '\0' terminated strings.
*/
const char * const *bmcontrol;
/** Corresponds to type DESC_BITMAP_STRINGS */
struct {
/** Must contain '\0' terminated strings. */
const char * const *strings;
/** Number of strings in strings array. */
unsigned int count;
} bitmap_strings;
/**
* Corresponds to type DESC_NUMBER_STRINGS.
*
* Must be a NULL terminated array of '\0' terminated strings.
*/
const char * const *number_strings;
/**
* Corresponds to type DESC_NUMBER_POSTFIX.
*
* Must be a '\0' terminated string.
*/
const char *number_postfix;
/**
* Corresponds to type DESC_EXTENSION.
*
* This allows the value of this field to be processed by
* another descriptor definition. The definition used to
* process the value of this field can be controlled by
* the value of another field.
*/
struct {
/**
* Name of field specifying descriptor type to select.
*/
const char *type_field;
/**
* Array of descriptor definitions and their
* associated types values. Array must be terminated
* by entry with NULL `desc` member.
*/
const struct desc_ext {
/**
* Array of descriptor field definitions.
* Terminated by entry with NULL `field` member.
*/
const struct desc *desc;
/**
* Type value for this descriptor definition.
* If it matches the type read from the
* field `type_field`, then this descriptor
* definition will be used to decode this value.
*/
unsigned int type;
} *d;
} extension;
/**
* Corresponds to type DESC_SNOWFLAKE.
*
* Callback function called to annotate snowflake value type.
*/
desc_snowflake_dump_fn snowflake;
};
/** Grouping of array-specific fields. */
struct {
bool array; /**< True if entry is an array. */
bool bits; /**< True if array length is specified in bits */
/** Name of field specifying the array entry count. */
const char *length_field1;
/** Name of field specifying multiplier for array entry count. */
const char *length_field2;
} array;
};
/* ---------------------------------------------------------------------- */
/* Undefined descriptor */
extern const struct desc desc_undefined[];
/* Audio Control (AC) descriptor definitions */
extern const struct desc * const desc_audio_ac_header[3];
extern const struct desc * const desc_audio_ac_effect_unit[3];
extern const struct desc * const desc_audio_ac_input_terminal[3];
extern const struct desc * const desc_audio_ac_output_terminal[3];
extern const struct desc * const desc_audio_ac_extended_terminal[3];
extern const struct desc * const desc_audio_ac_power_domain[3];
extern const struct desc * const desc_audio_ac_mixer_unit[3];
extern const struct desc * const desc_audio_ac_selector_unit[3];
extern const struct desc * const desc_audio_ac_processing_unit[3];
extern const struct desc * const desc_audio_ac_feature_unit[3];
extern const struct desc * const desc_audio_ac_extension_unit[3];
extern const struct desc * const desc_audio_ac_clock_source[3];
extern const struct desc * const desc_audio_ac_clock_selector[3];
extern const struct desc * const desc_audio_ac_clock_multiplier[3];
extern const struct desc * const desc_audio_ac_sample_rate_converter[3];
/* Audio Streaming (AS) descriptor definitions */
extern const struct desc * const desc_audio_as_interface[3];
extern const struct desc * const desc_audio_as_isochronous_audio_data_endpoint[3];
/* Device Capability (DC) descriptor definitions */
extern const struct desc desc_usb3_dc_configuration_summary[];
/* ---------------------------------------------------------------------- */
#endif /* _DESC_DEFS_H */