[PATCH v1 5/8] lsusb: Add descriptor definitions for UAC3.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



---
 desc-defs.c | 277 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++----
 desc-defs.h |   3 +
 desc-dump.c |   5 ++
 3 files changed, 270 insertions(+), 15 deletions(-)

diff --git a/desc-defs.c b/desc-defs.c
index 6bc558e..3b5ea1e 100644
--- a/desc-defs.c
+++ b/desc-defs.c
@@ -61,6 +61,16 @@ static const char * const uac2_input_term_bmcontrols[] = {
 	NULL
 };
 
+/* USB DCD for Audio Devices Release 3.0: Section 4.5.2.1, Table 4-16, pp67 */
+static const char * const uac3_input_term_bmcontrols[] = {
+	"Insertion",
+	"Overload",
+	"Underflow",
+	"Overflow",
+	"Underflow",
+	NULL
+};
+
 static const char * const uac2_output_term_bmcontrols[] = {
 	"Copy Protect",
 	"Connector",
@@ -70,6 +80,15 @@ static const char * const uac2_output_term_bmcontrols[] = {
 	NULL
 };
 
+/* USB DCD for Audio Devices Release 3.0: Section 4.5.2.2, Table 4-17, pp69 */
+static const char * const uac3_output_term_bmcontrols[] = {
+	"Insertion",
+	"Overload",
+	"Underflow",
+	"Overflow",
+	NULL
+};
+
 static const char * const uac2_mixer_unit_bmcontrols[] = {
 	"Cluster",
 	"Underflow",
@@ -77,6 +96,13 @@ static const char * const uac2_mixer_unit_bmcontrols[] = {
 	NULL
 };
 
+/* USB DCD for Audio Devices Release 3.0: Section 4.5.2.5, Table 4-29, pp79 */
+static const char * const uac3_mixer_unit_bmcontrols[] = {
+	"Underflow",
+	"Overflow",
+	NULL
+};
+
 static const char * const uac2_extension_unit_bmcontrols[] = {
 	"Enable",
 	"Cluster",
@@ -85,6 +111,13 @@ static const char * const uac2_extension_unit_bmcontrols[] = {
 	NULL
 };
 
+/* USB DCD for Audio Devices Release 3.0: Section 4.5.2.11, Table 4-42, pp91 */
+static const char * const uac3_extension_unit_bmcontrols[] = {
+	"Underflow",
+	"Overflow",
+	NULL
+};
+
 static const char * const uac2_clock_source_bmcontrols[] = {
 	"Clock Frequency",
 	"Clock Validity",
@@ -146,10 +179,18 @@ static const struct desc desc_audio_2_ac_header[] = {
 			.bmcontrol = uac2_interface_header_bmcontrols },
 	{ .field = NULL }
 };
+/** UAC3: 4.5.2 Class-Specific AC Interface Descriptor; Table 4-15. */
+static const struct desc desc_audio_3_ac_header[] = {
+	{ .field = "bCategory",    .size = 1, .type = DESC_CONSTANT },
+	{ .field = "wTotalLength", .size = 2, .type = DESC_NUMBER },
+	{ .field = "bmControls",   .size = 4, .type = DESC_BMCONTROL_2,
+			.bmcontrol = uac2_interface_header_bmcontrols },
+	{ .field = NULL }
+};
 const struct desc * const desc_audio_ac_header[3] = {
 	desc_audio_1_ac_header,
 	desc_audio_2_ac_header,
-	NULL, /* UAC3 not implemented yet */
+	desc_audio_3_ac_header,
 };
 
 /** UAC2: 4.7.2.10 Effect Unit Descriptor; Table 4-15. */
@@ -162,10 +203,20 @@ static const struct desc desc_audio_2_ac_effect_unit[] = {
 	{ .field = "iEffects",    .size = 1, .type = DESC_STR_DESC_INDEX },
 	{ .field = NULL }
 };
+/** UAC3: 4.5.2.9 Effect Unit Descriptor; Table 4-33. */
+static const struct desc desc_audio_3_ac_effect_unit[] = {
+	{ .field = "bUnitID",          .size = 1, .type = DESC_NUMBER },
+	{ .field = "wEffectType",      .size = 2, .type = DESC_CONSTANT },
+	{ .field = "bSourceID",        .size = 1, .type = DESC_CONSTANT },
+	{ .field = "bmaControls",      .size = 4, .type = DESC_BITMAP,
+			.array = { .array = true } },
+	{ .field = "wEffectsDescrStr", .size = 2, .type = DESC_CS_STR_DESC_ID },
+	{ .field = NULL }
+};
 const struct desc * const desc_audio_ac_effect_unit[3] = {
 	NULL, /* UAC1 not supported */
 	desc_audio_2_ac_effect_unit,
-	NULL, /* UAC3 not implemented yet */
+	desc_audio_3_ac_effect_unit,
 };
 
 
@@ -196,10 +247,24 @@ static const struct desc desc_audio_2_ac_input_terminal[] = {
 	{ .field = "iTerminal",       .size = 1, .type = DESC_STR_DESC_INDEX },
 	{ .field = NULL }
 };
+/** UAC3: 4.5.2.1 Input Terminal Descriptor; Table 4-16. */
+static const struct desc desc_audio_3_ac_input_terminal[] = {
+	{ .field = "bTerminalID",        .size = 1, .type = DESC_NUMBER },
+	{ .field = "wTerminalType",      .size = 2, .type = DESC_TERMINAL_STR },
+	{ .field = "bAssocTerminal",     .size = 1, .type = DESC_NUMBER },
+	{ .field = "bCSourceID",         .size = 1, .type = DESC_NUMBER },
+	{ .field = "bmControls",         .size = 4, .type = DESC_BMCONTROL_2,
+			.bmcontrol = uac3_input_term_bmcontrols },
+	{ .field = "wClusterDescrID",    .size = 2, .type = DESC_NUMBER },
+	{ .field = "wExTerminalDescrID", .size = 2, .type = DESC_NUMBER },
+	{ .field = "wConnectorsDescrID", .size = 2, .type = DESC_NUMBER },
+	{ .field = "wTerminalDescrStr",  .size = 2, .type = DESC_CS_STR_DESC_ID },
+	{ .field = NULL }
+};
 const struct desc * const desc_audio_ac_input_terminal[3] = {
 	desc_audio_1_ac_input_terminal,
 	desc_audio_2_ac_input_terminal,
-	NULL, /* UAC3 not implemented yet */
+	desc_audio_3_ac_input_terminal,
 };
 
 
@@ -224,10 +289,55 @@ static const struct desc desc_audio_2_ac_output_terminal[] = {
 	{ .field = "iTerminal",      .size = 1, .type = DESC_STR_DESC_INDEX },
 	{ .field = NULL }
 };
+/** UAC3: 4.5.2.2 Output Terminal Descriptor; Table 4-17. */
+static const struct desc desc_audio_3_ac_output_terminal[] = {
+	{ .field = "bTerminalID",        .size = 1, .type = DESC_NUMBER },
+	{ .field = "wTerminalType",      .size = 2, .type = DESC_TERMINAL_STR },
+	{ .field = "bAssocTerminal",     .size = 1, .type = DESC_NUMBER },
+	{ .field = "bSourceID",          .size = 1, .type = DESC_NUMBER },
+	{ .field = "bCSourceID",         .size = 1, .type = DESC_NUMBER },
+	{ .field = "bmControls",         .size = 4, .type = DESC_BMCONTROL_2,
+			.bmcontrol = uac3_output_term_bmcontrols },
+	{ .field = "wExTerminalDescrID", .size = 2, .type = DESC_NUMBER },
+	{ .field = "wConnectorsDescrID", .size = 2, .type = DESC_NUMBER },
+	{ .field = "wTerminalDescrStr",  .size = 2, .type = DESC_CS_STR_DESC_ID },
+	{ .field = NULL }
+};
 const struct desc * const desc_audio_ac_output_terminal[3] = {
 	desc_audio_1_ac_output_terminal,
 	desc_audio_2_ac_output_terminal,
-	NULL, /* UAC3 not implemented yet */
+	desc_audio_3_ac_output_terminal,
+};
+
+
+/** UAC3: 4.5.2.3.1 Extended Terminal Header Descriptor; Table 4-18. */
+static const struct desc desc_audio_3_ac_extended_terminal_header[] = {
+	{ .field = "wDescriptorID", .size = 2, .type = DESC_NUMBER },
+	{ .field = "bNrChannels",   .size = 1, .type = DESC_NUMBER },
+	{ .field = NULL }
+};
+const struct desc * const desc_audio_ac_extended_terminal[3] = {
+	NULL, /* UAC1 not supported */
+	NULL, /* UAC2 not supported */
+	desc_audio_3_ac_extended_terminal_header,
+};
+
+
+/** UAC3: 4.5.2.15 Power Domain Descriptor; Table 4-46. */
+static const struct desc desc_audio_3_ac_power_domain[] = {
+	{ .field = "bPowerDomainID",    .size = 1, .type = DESC_NUMBER },
+	{ .field = "waRecoveryTime(1)", .size = 2, .type = DESC_NUMBER },
+	{ .field = "waRecoveryTime(2)", .size = 2, .type = DESC_NUMBER },
+	{ .field = "bNrEntities",       .size = 1, .type = DESC_NUMBER },
+	{ .field = "baEntityID",        .size = 1, .type = DESC_NUMBER,
+			.array = { .array = true, .length_field1 = "bNrEntities" } },
+	{ .field = "wPDomainDescrStr",  .size = 2, .type = DESC_CS_STR_DESC_ID },
+	{ .field = NULL }
+};
+const struct desc * const desc_audio_ac_power_domain[3] = {
+	NULL, /* UAC1 not supported */
+	NULL, /* UAC2 not supported */
+	desc_audio_3_ac_power_domain,
 };
 
 
@@ -267,10 +377,24 @@ static const struct desc desc_audio_2_ac_mixer_unit[] = {
 	{ .field = "iMixer",         .size = 1, .type = DESC_STR_DESC_INDEX },
 	{ .field = NULL }
 };
+/** UAC3: 4.5.2.5 Mixer Unit Descriptor; Table 4-29. */
+static const struct desc desc_audio_3_ac_mixer_unit[] = {
+	{ .field = "bUnitID",        .size = 1, .type = DESC_NUMBER },
+	{ .field = "bNrInPins",      .size = 1, .type = DESC_NUMBER },
+	{ .field = "baSourceID",     .size = 1, .type = DESC_NUMBER,
+			.array = { .array = true, .length_field1 = "bNrInPins" } },
+	{ .field = "wClusterDescrID",.size = 2, .type = DESC_NUMBER },
+	{ .field = "bmMixerControls",.size = 1, .type = DESC_BITMAP,
+			.array = { .array = true } },
+	{ .field = "bmControls",     .size = 4, .type = DESC_BMCONTROL_2,
+			.bmcontrol = uac3_mixer_unit_bmcontrols },
+	{ .field = "wMixerDescrStr", .size = 2, .type = DESC_CS_STR_DESC_ID },
+	{ .field = NULL }
+};
 const struct desc * const desc_audio_ac_mixer_unit[3] = {
 	desc_audio_1_ac_mixer_unit,
 	desc_audio_2_ac_mixer_unit,
-	NULL, /* UAC3 not implemented yet */
+	desc_audio_3_ac_mixer_unit,
 };
 
 
@@ -294,10 +418,21 @@ static const struct desc desc_audio_2_ac_selector_unit[] = {
 	{ .field = "iSelector",  .size = 1, .type = DESC_STR_DESC_INDEX },
 	{ .field = NULL }
 };
+/** UAC3: 4.5.2.6 Selector Unit Descriptor; Table 4-30. */
+static const struct desc desc_audio_3_ac_selector_unit[] = {
+	{ .field = "bUnitID",           .size = 1, .type = DESC_NUMBER },
+	{ .field = "bNrInPins",         .size = 1, .type = DESC_NUMBER },
+	{ .field = "baSourceID",        .size = 1, .type = DESC_NUMBER,
+			.array = { .array = true, .length_field1 = "bNrInPins" } },
+	{ .field = "bmControls",        .size = 4, .type = DESC_BMCONTROL_2,
+			.bmcontrol = uac2_selector_bmcontrols },
+	{ .field = "wSelectorDescrStr", .size = 2, .type = DESC_CS_STR_DESC_ID },
+	{ .field = NULL }
+};
 const struct desc * const desc_audio_ac_selector_unit[3] = {
 	desc_audio_1_ac_selector_unit,
 	desc_audio_2_ac_selector_unit,
-	NULL, /* UAC3 not implemented yet */
+	desc_audio_3_ac_selector_unit,
 };
 
 
@@ -339,10 +474,22 @@ static const struct desc desc_audio_2_ac_processing_unit[] = {
 			.array = { .array = true } },
 	{ .field = NULL }
 };
+/** UAC3: 4.5.2.10 Processing Unit Descriptor; Table 4-38. */
+static const struct desc desc_audio_3_ac_processing_unit[] = {
+	{ .field = "bUnitID",             .size = 1, .type = DESC_NUMBER },
+	{ .field = "wProcessType",        .size = 2, .type = DESC_CONSTANT },
+	{ .field = "bNrInPins",           .size = 1, .type = DESC_NUMBER },
+	{ .field = "baSourceID",          .size = 1, .type = DESC_NUMBER,
+			.array = { .array = true, .length_field1 = "bNrInPins" } },
+	{ .field = "wProcessingDescrStr", .size = 2, .type = DESC_CS_STR_DESC_ID },
+	{ .field = "Process-specific",    .size = 1, .type = DESC_BITMAP,
+			.array = { .array = true } },
+	{ .field = NULL }
+};
 const struct desc * const desc_audio_ac_processing_unit[3] = {
 	desc_audio_1_ac_processing_unit,
 	desc_audio_2_ac_processing_unit,
-	NULL, /* UAC3 not implemented yet */
+	desc_audio_3_ac_processing_unit,
 };
 
 
@@ -365,10 +512,19 @@ static const struct desc desc_audio_2_ac_feature_unit[] = {
 	{ .field = "iFeature",    .size = 1, .type = DESC_STR_DESC_INDEX },
 	{ .field = NULL }
 };
+/** UAC3: 4.5.2.7 Feature Unit Descriptor; Table 4-31. */
+static const struct desc desc_audio_3_ac_feature_unit[] = {
+	{ .field = "bUnitID",          .size = 1, .type = DESC_NUMBER },
+	{ .field = "bSourceID",        .size = 1, .type = DESC_NUMBER },
+	{ .field = "bmaControls",      .size = 4, .type = DESC_BMCONTROL_2,
+			.bmcontrol = uac_feature_unit_bmcontrols, .array = { .array = true } },
+	{ .field = "wFeatureDescrStr", .size = 2, .type = DESC_CS_STR_DESC_ID },
+	{ .field = NULL }
+};
 const struct desc * const desc_audio_ac_feature_unit[3] = {
 	desc_audio_1_ac_feature_unit,
 	desc_audio_2_ac_feature_unit,
-	NULL, /* UAC3 not implemented yet */
+	desc_audio_3_ac_feature_unit,
 };
 
 
@@ -405,10 +561,23 @@ static const struct desc desc_audio_2_ac_extension_unit[] = {
 	{ .field = "iExtension",      .size = 1, .type = DESC_STR_DESC_INDEX },
 	{ .field = NULL }
 };
+/** UAC3: 4.5.2.11 Extension Unit Descriptor; Table 4-42. */
+static const struct desc desc_audio_3_ac_extension_unit[] = {
+	{ .field = "bUnitID",            .size = 1, .type = DESC_NUMBER },
+	{ .field = "wExtensionCode",     .size = 2, .type = DESC_CONSTANT },
+	{ .field = "bNrInPins",          .size = 1, .type = DESC_NUMBER },
+	{ .field = "baSourceID",         .size = 1, .type = DESC_NUMBER,
+			.array = { .array = true, .length_field1 = "bNrInPins" } },
+	{ .field = "wExtensionDescrStr", .size = 2, .type = DESC_CS_STR_DESC_ID },
+	{ .field = "bmControls",         .size = 4, .type = DESC_BMCONTROL_2,
+			.bmcontrol = uac3_extension_unit_bmcontrols },
+	{ .field = "wClusterDescrID",    .size = 2, .type = DESC_NUMBER },
+	{ .field = NULL }
+};
 const struct desc * const desc_audio_ac_extension_unit[3] = {
 	desc_audio_1_ac_extension_unit,
 	desc_audio_2_ac_extension_unit,
-	NULL, /* UAC3 not implemented yet */
+	desc_audio_3_ac_extension_unit,
 };
 
 
@@ -435,6 +604,16 @@ static void desc_snowflake_dump_uac2_clk_src_bmattr(
 			(value & 0x4) ? uac3_clk_src_bmattr[3] : "");
 }
 
+/** Special rendering function for UAC3 clock source bmAttributes */
+static void desc_snowflake_dump_uac3_clk_src_bmattr(
+		unsigned long long value,
+		unsigned int indent)
+{
+	printf(" %s clock %s\n",
+			uac3_clk_src_bmattr[(value & 0x1)],
+			uac3_clk_src_bmattr[0x2 | ((value & 0x2) >> 1)]);
+}
+
 /** UAC2: 4.7.2.1 Clock Source Descriptor; Table 4-6. */
 static const struct desc desc_audio_2_ac_clock_source[] = {
 	{ .field = "bClockID",       .size = 1, .type = DESC_CONSTANT },
@@ -446,10 +625,21 @@ static const struct desc desc_audio_2_ac_clock_source[] = {
 	{ .field = "iClockSource",   .size = 1, .type = DESC_STR_DESC_INDEX },
 	{ .field = NULL }
 };
+/** UAC3: 4.5.2.12 Clock Source Descriptor; Table 4-43. */
+static const struct desc desc_audio_3_ac_clock_source[] = {
+	{ .field = "bClockID",           .size = 1, .type = DESC_NUMBER },
+	{ .field = "bmAttributes",       .size = 1, .type = DESC_SNOWFLAKE,
+			.snowflake = desc_snowflake_dump_uac3_clk_src_bmattr },
+	{ .field = "bmControls",         .size = 4, .type = DESC_BMCONTROL_2,
+			.bmcontrol = uac2_clock_source_bmcontrols },
+	{ .field = "bReferenceTerminal", .size = 1, .type = DESC_NUMBER },
+	{ .field = "wClockSourceStr",    .size = 2, .type = DESC_CS_STR_DESC_ID },
+	{ .field = NULL }
+};
 const struct desc * const desc_audio_ac_clock_source[3] = {
 	NULL, /* UAC1 not supported */
 	desc_audio_2_ac_clock_source,
-	NULL, /* UAC3 not implemented yet */
+	desc_audio_3_ac_clock_source,
 };
 
 
@@ -464,10 +654,21 @@ static const struct desc desc_audio_2_ac_clock_selector[] = {
 	{ .field = "iClockSelector", .size = 1, .type = DESC_STR_DESC_INDEX },
 	{ .field = NULL }
 };
+/** UAC3: 4.5.2.13 Clock Selector Descriptor; Table 4-44. */
+static const struct desc desc_audio_3_ac_clock_selector[] = {
+	{ .field = "bClockID",           .size = 1, .type = DESC_NUMBER },
+	{ .field = "bNrInPins",          .size = 1, .type = DESC_NUMBER },
+	{ .field = "baCSourceID",        .size = 1, .type = DESC_NUMBER,
+			.array = { .array = true, .length_field1 = "bNrInPins" } },
+	{ .field = "bmControls",         .size = 4, .type = DESC_BMCONTROL_2,
+			.bmcontrol = uac2_clock_selector_bmcontrols },
+	{ .field = "wCSelectorDescrStr", .size = 2, .type = DESC_CS_STR_DESC_ID },
+	{ .field = NULL }
+};
 const struct desc * const desc_audio_ac_clock_selector[3] = {
 	NULL, /* UAC1 not supported */
 	desc_audio_2_ac_clock_selector,
-	NULL, /* UAC3 not implemented yet */
+	desc_audio_3_ac_clock_selector,
 };
 
 
@@ -480,10 +681,19 @@ static const struct desc desc_audio_2_ac_clock_multiplier[] = {
 	{ .field = "iClockMultiplier", .size = 1, .type = DESC_STR_DESC_INDEX },
 	{ .field = NULL }
 };
+/** UAC3: 4.5.2.14 Clock Multiplier Descriptor; Table 4-45. */
+static const struct desc desc_audio_3_ac_clock_multiplier[] = {
+	{ .field = "bClockID",             .size = 1, .type = DESC_NUMBER },
+	{ .field = "bCSourceID",           .size = 1, .type = DESC_NUMBER },
+	{ .field = "bmControls",           .size = 4, .type = DESC_BMCONTROL_2,
+			.bmcontrol = uac2_clock_multiplier_bmcontrols },
+	{ .field = "wCMultiplierDescrStr", .size = 2, .type = DESC_CS_STR_DESC_ID },
+	{ .field = NULL }
+};
 const struct desc * const desc_audio_ac_clock_multiplier[3] = {
 	NULL, /* UAC1 not supported */
 	desc_audio_2_ac_clock_multiplier,
-	NULL, /* UAC3 not implemented yet */
+	desc_audio_3_ac_clock_multiplier,
 };
 
 
@@ -496,10 +706,19 @@ static const struct desc desc_audio_2_ac_sample_rate_converter[] = {
 	{ .field = "iSRC",          .size = 1, .type = DESC_STR_DESC_INDEX },
 	{ .field = NULL }
 };
+/** UAC3: 4.5.2.8 Sampling Rate Converter Descriptor; Table 4-32. */
+static const struct desc desc_audio_3_ac_sample_rate_converter[] = {
+	{ .field = "bUnitID",       .size = 1, .type = DESC_NUMBER },
+	{ .field = "bSourceID",     .size = 1, .type = DESC_NUMBER },
+	{ .field = "bCSourceInID",  .size = 1, .type = DESC_NUMBER },
+	{ .field = "bCSourceOutID", .size = 1, .type = DESC_NUMBER },
+	{ .field = "wSRCDescrStr",  .size = 2, .type = DESC_CS_STR_DESC_ID },
+	{ .field = NULL }
+};
 const struct desc * const desc_audio_ac_sample_rate_converter[3] = {
 	NULL, /* UAC1 not supported */
 	desc_audio_2_ac_sample_rate_converter,
-	NULL, /* UAC3 not implemented yet */
+	desc_audio_3_ac_sample_rate_converter,
 };
 
 
@@ -508,6 +727,12 @@ static const char * const uac2_as_interface_bmcontrols[] = {
 	"Valid Alternate Setting",
 	NULL
 };
+static const char * const uac3_as_interface_bmcontrols[] = {
+	"Active Alternate Setting",
+	"Valid Alternate Setting",
+	"Audio Data Format Control",
+	NULL
+};
 static const char * const audio_data_format_type_i[] = {
 	"TYPE_I_UNDEFINED",
 	"PCM",
@@ -591,10 +816,23 @@ static const struct desc desc_audio_2_as_interface[] = {
 	{ .field = "iChannelNames",   .size = 1, .type = DESC_STR_DESC_INDEX },
 	{ .field = NULL }
 };
+/** UAC3: 4.7.2 Class-Specific AS Interface Descriptor; Table 4-49. */
+static const struct desc desc_audio_3_as_interface[] = {
+	{ .field = "bTerminalLink",   .size = 1, .type = DESC_NUMBER },
+	{ .field = "bmControls",      .size = 4, .type = DESC_BMCONTROL_2,
+			.bmcontrol = uac3_as_interface_bmcontrols },
+	{ .field = "wClusterDescrID", .size = 2, .type = DESC_NUMBER },
+	{ .field = "bmFormats",       .size = 8, .type = DESC_BITMAP },
+	{ .field = "bSubslotSize",    .size = 1, .type = DESC_NUMBER },
+	{ .field = "bBitResolution",  .size = 1, .type = DESC_NUMBER },
+	{ .field = "bmAuxProtocols",  .size = 2, .type = DESC_BITMAP },
+	{ .field = "bControlSize",    .size = 1, .type = DESC_NUMBER },
+	{ .field = NULL }
+};
 const struct desc * const desc_audio_as_interface[3] = {
 	desc_audio_1_as_interface,
 	desc_audio_2_as_interface,
-	NULL, /* UAC3 not implemented yet */
+	desc_audio_3_as_interface,
 };
 
 
@@ -640,8 +878,17 @@ static const struct desc desc_audio_2_as_isochronous_audio_data_endpoint[] = {
 	{ .field = "wLockDelay",      .size = 2, .type = DESC_NUMBER },
 	{ .field = NULL }
 };
+/** UAC3: 4.8.1.2 Class-Specific AS Isochronous Audio Data Endpoint Descriptor; Table 4-52. */
+static const struct desc desc_audio_3_as_isochronous_audio_data_endpoint[] = {
+	{ .field = "bmControls",      .size = 4, .type = DESC_BMCONTROL_2,
+			.bmcontrol = uac2_as_isochronous_audio_data_endpoint_bmcontrols },
+	{ .field = "bLockDelayUnits", .size = 1, .type = DESC_NUMBER_STRINGS,
+			.number_strings = uac_as_isochronous_audio_data_endpoint_blockdelayunits },
+	{ .field = "wLockDelay",      .size = 2, .type = DESC_NUMBER },
+	{ .field = NULL }
+};
 const struct desc * const desc_audio_as_isochronous_audio_data_endpoint[3] = {
 	desc_audio_1_as_isochronous_audio_data_endpoint,
 	desc_audio_2_as_isochronous_audio_data_endpoint,
-	NULL, /* UAC3 not implemented yet */
+	desc_audio_3_as_isochronous_audio_data_endpoint,
 };
diff --git a/desc-defs.h b/desc-defs.h
index 759ac4c..d88ebd8 100644
--- a/desc-defs.h
+++ b/desc-defs.h
@@ -43,6 +43,7 @@ enum desc_type {
 	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. */
@@ -134,6 +135,8 @@ 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];
diff --git a/desc-dump.c b/desc-dump.c
index eb79eaf..5c2a488 100644
--- a/desc-dump.c
+++ b/desc-dump.c
@@ -272,6 +272,11 @@ static void value_renderer(
 		}
 		break;
 	}
+	case DESC_CS_STR_DESC_ID:
+		number_renderer(buf, size_chars, offset, current_size);
+		/* TODO: Add support for UAC3 class-specific String descriptor */
+		printf("\n");
+		break;
 	case DESC_TERMINAL_STR:
 		number_renderer(buf, size_chars, offset, current_size);
 		printf(" %s\n", names_audioterminal(
-- 
2.11.0

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux