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,22 +412,6 @@
#define SPDIF_TX_INDEX (0) #define SPDIF_TX_INDEX (0)
#endif #endif
/**
* @brief Enables ADAT Tx. Default: 0 (Disabled)
*/
#ifndef XUA_ADAT_TX_EN
#define XUA_ADAT_TX_EN (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) * @brief Enables SPDIF Rx. Default: 0 (Disabled)
*/ */
@@ -435,24 +419,6 @@
#define XUA_SPDIF_RX_EN (0) #define XUA_SPDIF_RX_EN (0)
#endif #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
#else
#define ADAT_RX_MAX_CHANS (0)
#endif
/**
* @brief Enables ADAT Rx. Default: 0 (Disabled)
*/
#ifndef XUA_ADAT_RX_EN
#define XUA_ADAT_RX_EN (0)
#endif
/** /**
* @brief S/PDIF Rx first channel index, defines which channels S/PDIF will be input on. * @brief S/PDIF Rx first channel index, defines which channels S/PDIF will be input on.
@@ -467,6 +433,59 @@
#endif #endif
#endif #endif
/**
* @brief Enables ADAT Tx. Default: 0 (Disabled)
*/
#ifndef XUA_ADAT_TX_EN
#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])
* */
#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
#endif
/**
* @brief Enables ADAT Rx. Default: 0 (Disabled)
*/
#ifndef XUA_ADAT_RX_EN
#define XUA_ADAT_RX_EN (0)
#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
/** /**
* @brief ADAT Rx first channel index. defines which channels ADAT will be input on. * @brief ADAT Rx first channel index. defines which channels ADAT will be input on.
* Note, indexed from 0. * Note, indexed from 0.
@@ -480,13 +499,13 @@
#endif #endif
#if (ADAT_RX_INDEX + ADAT_RX_MAX_CHANS > NUM_USB_CHAN_IN) #if (ADAT_RX_INDEX + ADAT_RX_MAX_CHANS > NUM_USB_CHAN_IN)
#error Not enough channels for ADAT #error Not enough channels for ADAT Rx
#endif #endif
#endif #endif
#if (XUA_ADAT_RX_EN)
/* Setup input stream formats for ADAT */ /* Setup input stream formats for ADAT */
#if (XUA_ADAT_RX_EN)
#if (MAX_FREQ > 96000) #if (MAX_FREQ > 96000)
#if (MIN_FREQ > 96000) #if (MIN_FREQ > 96000)
#define INPUT_FORMAT_COUNT 1 #define INPUT_FORMAT_COUNT 1
@@ -514,7 +533,40 @@
#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
#endif #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

@@ -1461,7 +1461,7 @@ USB_Config_Descriptor_Audio2_t cfgDesc_Audio2=
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 *),
}, },
@@ -1552,7 +1552,7 @@ USB_Config_Descriptor_Audio2_t cfgDesc_Audio2=
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 *)),
}, },
@@ -1643,7 +1643,7 @@ USB_Config_Descriptor_Audio2_t cfgDesc_Audio2=
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 *),
}, },