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
* ADDED: MIDI unit and subsystem tests
* 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
in decoupler to fix buffer underflow seen in ADAT tests
* FIXED: Initialise SMUX based on DEFAULT_FREQ in clockgen

View File

@@ -412,6 +412,28 @@
#define SPDIF_TX_INDEX (0)
#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)
*/
@@ -419,32 +441,35 @@
#define XUA_ADAT_TX_EN (0)
#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.
*
* Default: 0 (i.e. channels [0:7])
* */
#ifndef ADAT_TX_INDEX
#define ADAT_TX_INDEX (0)
#endif
/**
* @brief Enables SPDIF Rx. Default: 0 (Disabled)
*/
#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)
#if (XUA_ADAT_TX_EN) || defined(__DOXYGEN__)
#ifndef ADAT_TX_INDEX
#define ADAT_TX_INDEX (0)
#endif
#if (ADAT_TX_INDEX + ADAT_TX_MAX_CHANS > NUM_USB_CHAN_OUT)
#error Not enough channels for ADAT Tx
#endif
#else
#define ADAT_RX_MAX_CHANS (0)
#endif
/**
@@ -454,17 +479,11 @@
#define XUA_ADAT_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
/* Set the maximum number of channels for ADAT */
#if XUA_ADAT_RX_EN
#define ADAT_RX_MAX_CHANS ADAT_MAX_CHANS
#else
#define ADAT_RX_MAX_CHANS (0)
#endif
/**
@@ -474,47 +493,80 @@
* Default: NONE (Must be defined by app when XUA_ADAT_RX_EN is true)
*/
#if (XUA_ADAT_RX_EN) || defined(__DOXYGEN__)
#ifndef ADAT_RX_INDEX
#error ADAT_RX_INDEX not defined and XUA_ADAT_RX_EN is true
#define ADAT_RX_INDEX (0) /* Default define for doxygen */
#ifndef ADAT_RX_INDEX
#error ADAT_RX_INDEX not defined and XUA_ADAT_RX_EN is true
#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
#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 */
#if (MAX_FREQ > 96000)
#if (MIN_FREQ > 96000)
#if (XUA_ADAT_RX_EN)
#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 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 HS_STREAM_FORMAT_INPUT_1_CHAN_COUNT NUM_USB_CHAN_IN
#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
/**
@@ -991,7 +1043,18 @@
#define HS_STREAM_FORMAT_INPUT_3_CHAN_COUNT NUM_USB_CHAN_IN
#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

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.bBitResolution = HS_STREAM_FORMAT_OUTPUT_1_RESOLUTION_BITS;
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
#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.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_ClassStreamInterface_2.bNrChannels = NUM_USB_CHAN_OUT;
cfgDesc_Audio2.Audio_Out_ClassStreamInterface_2.bNrChannels = HS_STREAM_FORMAT_OUTPUT_2_CHAN_COUNT;
#endif
#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.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_ClassStreamInterface_3.bNrChannels = NUM_USB_CHAN_OUT;
cfgDesc_Audio2.Audio_Out_ClassStreamInterface_3.bNrChannels = HS_STREAM_FORMAT_OUTPUT_3_CHAN_COUNT;
#endif
#endif
#if (NUM_USB_CHAN_IN > 0)

View File

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