Merge pull request #388 from ed-xmos/fetaure/multi_interface

Changes for variable channel count ADAT Tx interfaces
This commit is contained in:
Ed
2024-05-14 17:06:15 +01:00
committed by GitHub
4 changed files with 155 additions and 90 deletions

View File

@@ -11,6 +11,8 @@ UNRELEASED
* FIXED: Incorrect internal input EP count for input only devices * FIXED: Incorrect internal input EP count for input only devices
* ADDED: MIDI unit and subsystem tests * ADDED: MIDI unit and subsystem tests
* FIXED: ADAT Tx called too frequently * FIXED: ADAT Tx called too frequently
* CHANGED: ADAT Tx presents different channel count interfaces based on sample
rate
* CHANGED: aud_to_host buffer size and the condition to come out of underflow * CHANGED: aud_to_host buffer size and the condition to come out of underflow
in decoupler to fix buffer underflow seen in ADAT tests in decoupler to fix buffer underflow seen in ADAT tests
* FIXED: Initialise SMUX based on DEFAULT_FREQ in clockgen * FIXED: Initialise SMUX based on DEFAULT_FREQ in clockgen

View File

@@ -412,6 +412,28 @@
#define SPDIF_TX_INDEX (0) #define SPDIF_TX_INDEX (0)
#endif #endif
/**
* @brief Enables SPDIF Rx. Default: 0 (Disabled)
*/
#ifndef XUA_SPDIF_RX_EN
#define XUA_SPDIF_RX_EN (0)
#endif
/**
* @brief S/PDIF Rx first channel index, defines which channels S/PDIF will be input on.
* Note, indexed from 0.
*
* Default: NONE (Must be defined by app when SPDIF_RX enabled)
*/
#if (XUA_SPDIF_RX_EN) || defined (__DOXYGEN__)
#ifndef SPDIF_RX_INDEX
#error SPDIF_RX_INDEX not defined and XUA_SPDIF_RX_EN defined
#define SPDIF_RX_INDEX 0 /* Default define for doxygen */
#endif
#endif
/** /**
* @brief Enables ADAT Tx. Default: 0 (Disabled) * @brief Enables ADAT Tx. Default: 0 (Disabled)
*/ */
@@ -419,32 +441,35 @@
#define XUA_ADAT_TX_EN (0) #define XUA_ADAT_TX_EN (0)
#endif #endif
/* Calculate max ADAT channels based on sample rate range. Used for Tx and Rx */
#if (MIN_FREQ < 88200)
#define ADAT_MAX_CHANS (8)
#elif (MIN_FREQ < 176400)
#define ADAT_MAX_CHANS (4)
#else
#define ADAT_MAX_CHANS (2)
#endif
/* Set the maximum number of channels for ADAT */
#if XUA_ADAT_TX_EN
#define ADAT_TX_MAX_CHANS ADAT_MAX_CHANS
#else
#define ADAT_TX_MAX_CHANS (0)
#endif
/** /**
* @brief Defines which output channels (8) should be output on ADAT. Note, Output channels indexed from 0. * @brief Defines which output channels (8) should be output on ADAT. Note, Output channels indexed from 0.
* *
* Default: 0 (i.e. channels [0:7]) * Default: 0 (i.e. channels [0:7])
* */ * */
#ifndef ADAT_TX_INDEX #if (XUA_ADAT_TX_EN) || defined(__DOXYGEN__)
#define ADAT_TX_INDEX (0) #ifndef ADAT_TX_INDEX
#endif #define ADAT_TX_INDEX (0)
#endif
/**
* @brief Enables SPDIF Rx. Default: 0 (Disabled) #if (ADAT_TX_INDEX + ADAT_TX_MAX_CHANS > NUM_USB_CHAN_OUT)
*/ #error Not enough channels for ADAT Tx
#ifndef XUA_SPDIF_RX_EN
#define XUA_SPDIF_RX_EN (0)
#endif
#if XUA_ADAT_RX_EN
#if (MIN_FREQ < 88200)
#define ADAT_RX_MAX_CHANS (8)
#elif (MIN_FREQ < 176400)
#define ADAT_RX_MAX_CHANS (4)
#else
#define ADAT_RX_MAX_CHANS (2)
#endif #endif
#else
#define ADAT_RX_MAX_CHANS (0)
#endif #endif
/** /**
@@ -454,17 +479,11 @@
#define XUA_ADAT_RX_EN (0) #define XUA_ADAT_RX_EN (0)
#endif #endif
/** /* Set the maximum number of channels for ADAT */
* @brief S/PDIF Rx first channel index, defines which channels S/PDIF will be input on. #if XUA_ADAT_RX_EN
* Note, indexed from 0. #define ADAT_RX_MAX_CHANS ADAT_MAX_CHANS
* #else
* Default: NONE (Must be defined by app when SPDIF_RX enabled) #define ADAT_RX_MAX_CHANS (0)
*/
#if (XUA_SPDIF_RX_EN) || defined (__DOXYGEN__)
#ifndef SPDIF_RX_INDEX
#error SPDIF_RX_INDEX not defined and XUA_SPDIF_RX_EN defined
#define SPDIF_RX_INDEX 0 /* Default define for doxygen */
#endif
#endif #endif
/** /**
@@ -474,47 +493,80 @@
* Default: NONE (Must be defined by app when XUA_ADAT_RX_EN is true) * Default: NONE (Must be defined by app when XUA_ADAT_RX_EN is true)
*/ */
#if (XUA_ADAT_RX_EN) || defined(__DOXYGEN__) #if (XUA_ADAT_RX_EN) || defined(__DOXYGEN__)
#ifndef ADAT_RX_INDEX #ifndef ADAT_RX_INDEX
#error ADAT_RX_INDEX not defined and XUA_ADAT_RX_EN is true #error ADAT_RX_INDEX not defined and XUA_ADAT_RX_EN is true
#define ADAT_RX_INDEX (0) /* Default define for doxygen */ #define ADAT_RX_INDEX (0) /* Default define for doxygen */
#endif
#if (ADAT_RX_INDEX + ADAT_RX_MAX_CHANS > NUM_USB_CHAN_IN)
#error Not enough channels for ADAT Rx
#endif
#endif #endif
#if (ADAT_RX_INDEX + ADAT_RX_MAX_CHANS > NUM_USB_CHAN_IN)
#error Not enough channels for ADAT
#endif
#endif
#if (XUA_ADAT_RX_EN)
/* Setup input stream formats for ADAT */ /* Setup input stream formats for ADAT */
#if (MAX_FREQ > 96000) #if (XUA_ADAT_RX_EN)
#if (MIN_FREQ > 96000) #if (MAX_FREQ > 96000)
#if (MIN_FREQ > 96000)
#define INPUT_FORMAT_COUNT 1
#define HS_STREAM_FORMAT_INPUT_1_CHAN_COUNT NUM_USB_CHAN_IN
#elif (MIN_FREQ > 48000)
#define INPUT_FORMAT_COUNT 2
#define HS_STREAM_FORMAT_INPUT_1_CHAN_COUNT NUM_USB_CHAN_IN
#define HS_STREAM_FORMAT_INPUT_2_CHAN_COUNT (NUM_USB_CHAN_IN - 2)
#else
#define INPUT_FORMAT_COUNT 3
#define HS_STREAM_FORMAT_INPUT_1_CHAN_COUNT NUM_USB_CHAN_IN
#define HS_STREAM_FORMAT_INPUT_2_CHAN_COUNT (NUM_USB_CHAN_IN - 4)
#define HS_STREAM_FORMAT_INPUT_3_CHAN_COUNT (NUM_USB_CHAN_IN - 6)
#endif
#elif (MAX_FREQ > 48000)
#if (MIN_FREQ > 48000)
#define INPUT_FORMAT_COUNT 1
#define HS_STREAM_FORMAT_INPUT_1_CHAN_COUNT NUM_USB_CHAN_IN
#else
#define INPUT_FORMAT_COUNT 2
#define HS_STREAM_FORMAT_INPUT_1_CHAN_COUNT NUM_USB_CHAN_IN
#define HS_STREAM_FORMAT_INPUT_2_CHAN_COUNT (NUM_USB_CHAN_IN - 4)
#endif
#else
#define INPUT_FORMAT_COUNT 1 #define INPUT_FORMAT_COUNT 1
#define HS_STREAM_FORMAT_INPUT_1_CHAN_COUNT NUM_USB_CHAN_IN #define HS_STREAM_FORMAT_INPUT_1_CHAN_COUNT NUM_USB_CHAN_IN
#elif (MIN_FREQ > 48000)
#define INPUT_FORMAT_COUNT 2
#define HS_STREAM_FORMAT_INPUT_1_CHAN_COUNT NUM_USB_CHAN_IN
#define HS_STREAM_FORMAT_INPUT_2_CHAN_COUNT (NUM_USB_CHAN_IN - 2)
#else
#define INPUT_FORMAT_COUNT 3
#define HS_STREAM_FORMAT_INPUT_1_CHAN_COUNT NUM_USB_CHAN_IN
#define HS_STREAM_FORMAT_INPUT_2_CHAN_COUNT (NUM_USB_CHAN_IN - 4)
#define HS_STREAM_FORMAT_INPUT_3_CHAN_COUNT (NUM_USB_CHAN_IN - 6)
#endif #endif
#elif (MAX_FREQ > 48000)
#if (MIN_FREQ > 48000)
#define INPUT_FORMAT_COUNT 1
#define HS_STREAM_FORMAT_INPUT_1_CHAN_COUNT NUM_USB_CHAN_IN
#else
#define INPUT_FORMAT_COUNT 2
#define HS_STREAM_FORMAT_INPUT_1_CHAN_COUNT NUM_USB_CHAN_IN
#define HS_STREAM_FORMAT_INPUT_2_CHAN_COUNT (NUM_USB_CHAN_IN - 4)
#endif
#else
#define INPUT_FORMAT_COUNT 1
#define HS_STREAM_FORMAT_INPUT_1_CHAN_COUNT NUM_USB_CHAN_IN
#endif #endif
/* Setup output stream formats for ADAT */
#if (XUA_ADAT_TX_EN)
#if (MAX_FREQ > 96000)
#if (MIN_FREQ > 96000)
#define OUTPUT_FORMAT_COUNT 1
#define HS_STREAM_FORMAT_OUTPUT_1_CHAN_COUNT NUM_USB_CHAN_OUT
#elif (MIN_FREQ > 48000)
#define OUTPUT_FORMAT_COUNT 2
#define HS_STREAM_FORMAT_OUTPUT_1_CHAN_COUNT NUM_USB_CHAN_OUT
#define HS_STREAM_FORMAT_OUTPUT_2_CHAN_COUNT (NUM_USB_CHAN_OUT - 2)
#else
#define OUTPUT_FORMAT_COUNT 3
#define HS_STREAM_FORMAT_OUTPUT_1_CHAN_COUNT NUM_USB_CHAN_OUT
#define HS_STREAM_FORMAT_OUTPUT_2_CHAN_COUNT (NUM_USB_CHAN_OUT - 4)
#define HS_STREAM_FORMAT_OUTPUT_3_CHAN_COUNT (NUM_USB_CHAN_OUT - 6)
#endif
#elif (MAX_FREQ > 48000)
#if (MIN_FREQ > 48000)
#define OUTPUT_FORMAT_COUNT 1
#define HS_STREAM_FORMAT_OUTPUT_1_CHAN_COUNT NUM_USB_CHAN_OUT
#else
#define OUTPUT_FORMAT_COUNT 2
#define HS_STREAM_FORMAT_OUTPUT_1_CHAN_COUNT NUM_USB_CHAN_OUT
#define HS_STREAM_FORMAT_OUTPUT_2_CHAN_COUNT (NUM_USB_CHAN_OUT - 4)
#endif
#else
#define OUTPUT_FORMAT_COUNT 1
#define HS_STREAM_FORMAT_OUTPUT_1_CHAN_COUNT NUM_USB_CHAN_OUT
#endif
#define STREAM_FORMAT_OUTPUT_1_RESOLUTION_BITS 24
#define STREAM_FORMAT_OUTPUT_2_RESOLUTION_BITS 24
#define STREAM_FORMAT_OUTPUT_3_RESOLUTION_BITS 24
#endif #endif
/** /**
@@ -991,7 +1043,18 @@
#define HS_STREAM_FORMAT_INPUT_3_CHAN_COUNT NUM_USB_CHAN_IN #define HS_STREAM_FORMAT_INPUT_3_CHAN_COUNT NUM_USB_CHAN_IN
#endif #endif
/* Channel count defines for output streams */
#ifndef HS_STREAM_FORMAT_OUTPUT_1_CHAN_COUNT
#define HS_STREAM_FORMAT_OUTPUT_1_CHAN_COUNT NUM_USB_CHAN_OUT
#endif
#ifndef HS_STREAM_FORMAT_OUTPUT_2_CHAN_COUNT
#define HS_STREAM_FORMAT_OUTPUT_2_CHAN_COUNT NUM_USB_CHAN_OUT
#endif
#ifndef HS_STREAM_FORMAT_OUTPUT_3_CHAN_COUNT
#define HS_STREAM_FORMAT_OUTPUT_3_CHAN_COUNT NUM_USB_CHAN_OUT
#endif
/** /**
* @brief Sample sub-slot size (bytes) of input stream Alternate 1 when running in high-speed * @brief Sample sub-slot size (bytes) of input stream Alternate 1 when running in high-speed

View File

@@ -968,20 +968,20 @@ void XUA_Endpoint0_loop(XUD_Result_t result, USB_SetupPacket_t sp, chanend c_ep0
cfgDesc_Audio2.Audio_Out_Format.bSubslotSize = HS_STREAM_FORMAT_OUTPUT_1_SUBSLOT_BYTES; cfgDesc_Audio2.Audio_Out_Format.bSubslotSize = HS_STREAM_FORMAT_OUTPUT_1_SUBSLOT_BYTES;
cfgDesc_Audio2.Audio_Out_Format.bBitResolution = HS_STREAM_FORMAT_OUTPUT_1_RESOLUTION_BITS; cfgDesc_Audio2.Audio_Out_Format.bBitResolution = HS_STREAM_FORMAT_OUTPUT_1_RESOLUTION_BITS;
cfgDesc_Audio2.Audio_Out_Endpoint.wMaxPacketSize = HS_STREAM_FORMAT_OUTPUT_1_MAXPACKETSIZE; cfgDesc_Audio2.Audio_Out_Endpoint.wMaxPacketSize = HS_STREAM_FORMAT_OUTPUT_1_MAXPACKETSIZE;
cfgDesc_Audio2.Audio_Out_ClassStreamInterface.bNrChannels = NUM_USB_CHAN_OUT; cfgDesc_Audio2.Audio_Out_ClassStreamInterface.bNrChannels = HS_STREAM_FORMAT_OUTPUT_1_CHAN_COUNT;
#endif #endif
#if (OUTPUT_FORMAT_COUNT > 1) #if (OUTPUT_FORMAT_COUNT > 1)
cfgDesc_Audio2.Audio_Out_Format_2.bSubslotSize = HS_STREAM_FORMAT_OUTPUT_2_SUBSLOT_BYTES; cfgDesc_Audio2.Audio_Out_Format_2.bSubslotSize = HS_STREAM_FORMAT_OUTPUT_2_SUBSLOT_BYTES;
cfgDesc_Audio2.Audio_Out_Format_2.bBitResolution = HS_STREAM_FORMAT_OUTPUT_2_RESOLUTION_BITS; cfgDesc_Audio2.Audio_Out_Format_2.bBitResolution = HS_STREAM_FORMAT_OUTPUT_2_RESOLUTION_BITS;
cfgDesc_Audio2.Audio_Out_Endpoint_2.wMaxPacketSize = HS_STREAM_FORMAT_OUTPUT_2_MAXPACKETSIZE; cfgDesc_Audio2.Audio_Out_Endpoint_2.wMaxPacketSize = HS_STREAM_FORMAT_OUTPUT_2_MAXPACKETSIZE;
cfgDesc_Audio2.Audio_Out_ClassStreamInterface_2.bNrChannels = NUM_USB_CHAN_OUT; cfgDesc_Audio2.Audio_Out_ClassStreamInterface_2.bNrChannels = HS_STREAM_FORMAT_OUTPUT_2_CHAN_COUNT;
#endif #endif
#if (OUTPUT_FORMAT_COUNT > 2) #if (OUTPUT_FORMAT_COUNT > 2)
cfgDesc_Audio2.Audio_Out_Format_3.bSubslotSize = HS_STREAM_FORMAT_OUTPUT_3_SUBSLOT_BYTES; cfgDesc_Audio2.Audio_Out_Format_3.bSubslotSize = HS_STREAM_FORMAT_OUTPUT_3_SUBSLOT_BYTES;
cfgDesc_Audio2.Audio_Out_Format_3.bBitResolution = HS_STREAM_FORMAT_OUTPUT_3_RESOLUTION_BITS; cfgDesc_Audio2.Audio_Out_Format_3.bBitResolution = HS_STREAM_FORMAT_OUTPUT_3_RESOLUTION_BITS;
cfgDesc_Audio2.Audio_Out_Endpoint_3.wMaxPacketSize = HS_STREAM_FORMAT_OUTPUT_3_MAXPACKETSIZE; cfgDesc_Audio2.Audio_Out_Endpoint_3.wMaxPacketSize = HS_STREAM_FORMAT_OUTPUT_3_MAXPACKETSIZE;
cfgDesc_Audio2.Audio_Out_ClassStreamInterface_3.bNrChannels = NUM_USB_CHAN_OUT; cfgDesc_Audio2.Audio_Out_ClassStreamInterface_3.bNrChannels = HS_STREAM_FORMAT_OUTPUT_3_CHAN_COUNT;
#endif #endif
#endif #endif
#if (NUM_USB_CHAN_IN > 0) #if (NUM_USB_CHAN_IN > 0)

View File

@@ -1454,15 +1454,15 @@ USB_Config_Descriptor_Audio2_t cfgDesc_Audio2=
/* Class Specific AS Interface Descriptor */ /* Class Specific AS Interface Descriptor */
.Audio_Out_ClassStreamInterface = .Audio_Out_ClassStreamInterface =
{ {
0x10, /* 0 bLength: 16 */ 0x10, /* 0 bLength: 16 */
UAC_CS_DESCTYPE_INTERFACE, /* 1 bDescriptorType: 0x24 */ UAC_CS_DESCTYPE_INTERFACE, /* 1 bDescriptorType: 0x24 */
UAC_CS_AS_INTERFACE_SUBTYPE_AS_GENERAL, /* 2 bDescriptorSubType */ UAC_CS_AS_INTERFACE_SUBTYPE_AS_GENERAL, /* 2 bDescriptorSubType */
ID_IT_USB, /* 3 bTerminalLink (Linked to USB input terminal) */ ID_IT_USB, /* 3 bTerminalLink (Linked to USB input terminal) */
0x00, /* 4 bmControls */ 0x00, /* 4 bmControls */
UAC_FORMAT_TYPE_I, /* 5 bFormatType */ UAC_FORMAT_TYPE_I, /* 5 bFormatType */
STREAM_FORMAT_OUTPUT_1_DATAFORMAT,/* 6:10 bmFormats (note this is a bitmap) */ STREAM_FORMAT_OUTPUT_1_DATAFORMAT, /* 6:10 bmFormats (note this is a bitmap) */
NUM_USB_CHAN_OUT, /* 11 bNrChannels */ HS_STREAM_FORMAT_OUTPUT_1_CHAN_COUNT, /* 11 bNrChannels */
0x00000000, /* 12:14: bmChannelConfig */ 0x00000000, /* 12:14: bmChannelConfig */
.iChannelNames = offsetof(StringDescTable_t, outputChanStr_1)/sizeof(char *), .iChannelNames = offsetof(StringDescTable_t, outputChanStr_1)/sizeof(char *),
}, },
@@ -1545,15 +1545,15 @@ USB_Config_Descriptor_Audio2_t cfgDesc_Audio2=
/* Class Specific AS Interface Descriptor */ /* Class Specific AS Interface Descriptor */
.Audio_Out_ClassStreamInterface_2 = .Audio_Out_ClassStreamInterface_2 =
{ {
0x10, /* 0 bLength: 16 */ 0x10, /* 0 bLength: 16 */
UAC_CS_DESCTYPE_INTERFACE, /* 1 bDescriptorType: 0x24 */ UAC_CS_DESCTYPE_INTERFACE, /* 1 bDescriptorType: 0x24 */
UAC_CS_AS_INTERFACE_SUBTYPE_AS_GENERAL, /* 2 bDescriptorSubType */ UAC_CS_AS_INTERFACE_SUBTYPE_AS_GENERAL, /* 2 bDescriptorSubType */
ID_IT_USB, /* 3 bTerminalLink (Linked to USB input terminal) */ ID_IT_USB, /* 3 bTerminalLink (Linked to USB input terminal) */
0x00, /* 4 bmControls */ 0x00, /* 4 bmControls */
UAC_FORMAT_TYPE_I, /* 5 bFormatType */ UAC_FORMAT_TYPE_I, /* 5 bFormatType */
STREAM_FORMAT_OUTPUT_2_DATAFORMAT,/* 6:10 bmFormats (note this is a bitmap) */ STREAM_FORMAT_OUTPUT_2_DATAFORMAT, /* 6:10 bmFormats (note this is a bitmap) */
NUM_USB_CHAN_OUT, /* 11 bNrChannels */ HS_STREAM_FORMAT_OUTPUT_2_CHAN_COUNT, /* 11 bNrChannels */
0x00000000, /* 12:14: bmChannelConfig */ 0x00000000, /* 12:14: bmChannelConfig */
.iChannelNames = (offsetof(StringDescTable_t, outputChanStr_1)/sizeof(char *)), .iChannelNames = (offsetof(StringDescTable_t, outputChanStr_1)/sizeof(char *)),
}, },
@@ -1636,15 +1636,15 @@ USB_Config_Descriptor_Audio2_t cfgDesc_Audio2=
/* Class Specific AS Interface Descriptor */ /* Class Specific AS Interface Descriptor */
.Audio_Out_ClassStreamInterface_3 = .Audio_Out_ClassStreamInterface_3 =
{ {
0x10, /* 0 bLength: 16 */ 0x10, /* 0 bLength: 16 */
UAC_CS_DESCTYPE_INTERFACE, /* 1 bDescriptorType: 0x24 */ UAC_CS_DESCTYPE_INTERFACE, /* 1 bDescriptorType: 0x24 */
UAC_CS_AS_INTERFACE_SUBTYPE_AS_GENERAL, /* 2 bDescriptorSubType */ UAC_CS_AS_INTERFACE_SUBTYPE_AS_GENERAL, /* 2 bDescriptorSubType */
ID_IT_USB, /* 3 bTerminalLink (Linked to USB input terminal) */ ID_IT_USB, /* 3 bTerminalLink (Linked to USB input terminal) */
0x00, /* 4 bmControls */ 0x00, /* 4 bmControls */
UAC_FORMAT_TYPE_I, /* 5 bFormatType */ UAC_FORMAT_TYPE_I, /* 5 bFormatType */
STREAM_FORMAT_OUTPUT_3_DATAFORMAT,/* 6:10 bmFormats (note this is a bitmap) */ STREAM_FORMAT_OUTPUT_3_DATAFORMAT, /* 6:10 bmFormats (note this is a bitmap) */
NUM_USB_CHAN_OUT, /* 11 bNrChannels */ HS_STREAM_FORMAT_OUTPUT_3_CHAN_COUNT, /* 11 bNrChannels */
0x00000000, /* 12:14: bmChannelConfig */ 0x00000000, /* 12:14: bmChannelConfig */
.iChannelNames = offsetof(StringDescTable_t, outputChanStr_1)/sizeof(char *), .iChannelNames = offsetof(StringDescTable_t, outputChanStr_1)/sizeof(char *),
}, },