forked from PAWPAW-Mirror/lib_xua
Merge pull request #388 from ed-xmos/fetaure/multi_interface
Changes for variable channel count ADAT Tx interfaces
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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 *),
|
||||
},
|
||||
|
||||
|
||||
Reference in New Issue
Block a user