forked from PAWPAW-Mirror/lib_xua
Copy across from apps_usb_aud_shared
This commit is contained in:
@@ -12,7 +12,9 @@
|
|||||||
* receiving/transmitting samples
|
* receiving/transmitting samples
|
||||||
* \param c_config An optional channel that will be passed on to the
|
* \param c_config An optional channel that will be passed on to the
|
||||||
* CODEC configuration functions.
|
* CODEC configuration functions.
|
||||||
|
* \param c_i2c An optional channel that will be passed on to the
|
||||||
|
* functions requiring i2c.
|
||||||
*/
|
*/
|
||||||
void audio(chanend c_in, chanend ?c_dig, chanend ?c_config);
|
void audio(chanend c_in, chanend ?c_dig, chanend ?c_config, chanend ?c_i2c);
|
||||||
|
|
||||||
#endif // __audio_h__
|
#endif // __audio_h__
|
||||||
|
|||||||
@@ -12,6 +12,7 @@
|
|||||||
#include <xs1.h>
|
#include <xs1.h>
|
||||||
#include <xclib.h>
|
#include <xclib.h>
|
||||||
#include <print.h>
|
#include <print.h>
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
#include "clocking.h"
|
#include "clocking.h"
|
||||||
#include "audioports.h"
|
#include "audioports.h"
|
||||||
@@ -63,27 +64,24 @@ extern void device_reboot(void);
|
|||||||
unsigned deliver(chanend c_out, chanend c_spd_out, unsigned divide, chanend ?c_dig_rx)
|
unsigned deliver(chanend c_out, chanend c_spd_out, unsigned divide, chanend ?c_dig_rx)
|
||||||
{
|
{
|
||||||
unsigned sample;
|
unsigned sample;
|
||||||
#if NUM_USB_CHAN_OUT > 0
|
|
||||||
unsigned samplesOut[NUM_USB_CHAN_OUT];
|
unsigned samplesOut[NUM_USB_CHAN_OUT];
|
||||||
#endif
|
|
||||||
#if NUM_USB_CHAN_IN > 0
|
|
||||||
unsigned samplesIn[NUM_USB_CHAN_IN];
|
unsigned samplesIn[NUM_USB_CHAN_IN];
|
||||||
unsigned samplesInPrev[NUM_USB_CHAN_IN];
|
unsigned samplesInPrev[NUM_USB_CHAN_IN];
|
||||||
#endif
|
|
||||||
unsigned tmp;
|
unsigned tmp;
|
||||||
unsigned index;
|
unsigned index;
|
||||||
#ifdef RAMP_CHECK
|
#ifdef RAMP_CHECK
|
||||||
unsigned prev=0;
|
unsigned prev=0;
|
||||||
int started = 0;
|
int started = 0;
|
||||||
#endif
|
#endif
|
||||||
|
#ifndef CODEC_SLAVE
|
||||||
|
int oldtime;
|
||||||
|
#endif
|
||||||
|
|
||||||
#if NUM_USB_CHAN_IN > 0
|
|
||||||
for (int i=0;i<NUM_USB_CHAN_IN;i++)
|
for (int i=0;i<NUM_USB_CHAN_IN;i++)
|
||||||
{
|
{
|
||||||
samplesIn[i] = 0;
|
samplesIn[i] = 0;
|
||||||
samplesInPrev[i] = 0;
|
samplesInPrev[i] = 0;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
outuint(c_out, 0);
|
outuint(c_out, 0);
|
||||||
|
|
||||||
/* Check for sample freq change or new samples from mixer*/
|
/* Check for sample freq change or new samples from mixer*/
|
||||||
@@ -98,21 +96,16 @@ unsigned deliver(chanend c_out, chanend c_spd_out, unsigned divide, chanend ?c_d
|
|||||||
#ifndef MIXER // Interfaces straight to decouple()
|
#ifndef MIXER // Interfaces straight to decouple()
|
||||||
(void) inuint(c_out);
|
(void) inuint(c_out);
|
||||||
|
|
||||||
#if NUM_USB_CHAN_IN > 0
|
|
||||||
#pragma loop unroll
|
#pragma loop unroll
|
||||||
for(int i = 0; i < NUM_USB_CHAN_IN; i++)
|
for(int i = 0; i < NUM_USB_CHAN_IN; i++)
|
||||||
{
|
{
|
||||||
outuint(c_out, samplesIn[i]);
|
outuint(c_out, samplesIn[i]);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
#if NUM_USB_CHAN_OUT > 0
|
|
||||||
#pragma loop unroll
|
#pragma loop unroll
|
||||||
for(int i = 0; i < NUM_USB_CHAN_OUT; i++)
|
for(int i = 0; i < NUM_USB_CHAN_OUT; i++)
|
||||||
{
|
{
|
||||||
samplesOut[i] = inuint(c_out);
|
samplesOut[i] = inuint(c_out);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
#else
|
#else
|
||||||
#pragma loop unroll
|
#pragma loop unroll
|
||||||
for(int i = 0; i < NUM_USB_CHAN_OUT; i++)
|
for(int i = 0; i < NUM_USB_CHAN_OUT; i++)
|
||||||
@@ -208,7 +201,6 @@ unsigned deliver(chanend c_out, chanend c_spd_out, unsigned divide, chanend ?c_d
|
|||||||
tmp += 33;
|
tmp += 33;
|
||||||
|
|
||||||
#if (I2S_CHANS_DAC != 0)
|
#if (I2S_CHANS_DAC != 0)
|
||||||
#pragma loop unroll
|
|
||||||
for(int i = 0; i < I2S_WIRES_DAC; i++)
|
for(int i = 0; i < I2S_WIRES_DAC; i++)
|
||||||
{
|
{
|
||||||
p_i2s_dac[i] @ tmp <: 0;
|
p_i2s_dac[i] @ tmp <: 0;
|
||||||
@@ -222,6 +214,7 @@ unsigned deliver(chanend c_out, chanend c_spd_out, unsigned divide, chanend ?c_d
|
|||||||
{
|
{
|
||||||
clearbuf(p_i2s_adc[i]);
|
clearbuf(p_i2s_adc[i]);
|
||||||
}
|
}
|
||||||
|
oldtime = tmp-1+32;
|
||||||
|
|
||||||
/* TODO In master mode, the i/o loop assumes L/RCLK = 32bit clocks. We should check this every interation
|
/* TODO In master mode, the i/o loop assumes L/RCLK = 32bit clocks. We should check this every interation
|
||||||
* and resync if we got a bclk glitch */
|
* and resync if we got a bclk glitch */
|
||||||
@@ -244,22 +237,17 @@ unsigned deliver(chanend c_out, chanend c_spd_out, unsigned divide, chanend ?c_d
|
|||||||
{
|
{
|
||||||
#ifndef MIXER // Interfaces straight to decouple()
|
#ifndef MIXER // Interfaces straight to decouple()
|
||||||
(void) inuint(c_out);
|
(void) inuint(c_out);
|
||||||
|
|
||||||
#if NUM_USB_CHAN_IN > 0
|
|
||||||
#pragma loop unroll
|
#pragma loop unroll
|
||||||
for(int i = 0; i < NUM_USB_CHAN_IN; i++)
|
for(int i = 0; i < NUM_USB_CHAN_IN; i++)
|
||||||
{
|
{
|
||||||
outuint(c_out, samplesIn[i]);
|
outuint(c_out, samplesIn[i]);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
#if NUM_USB_CHAN_OUT > 0
|
|
||||||
#pragma loop unroll
|
#pragma loop unroll
|
||||||
for(int i = 0; i < NUM_USB_CHAN_OUT; i++)
|
for(int i = 0; i < NUM_USB_CHAN_OUT; i++)
|
||||||
{
|
{
|
||||||
samplesOut[i] = inuint(c_out);
|
samplesOut[i] = inuint(c_out);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
#else
|
#else
|
||||||
#pragma loop unroll
|
#pragma loop unroll
|
||||||
for(int i = 0; i < NUM_USB_CHAN_OUT; i++)
|
for(int i = 0; i < NUM_USB_CHAN_OUT; i++)
|
||||||
@@ -309,7 +297,7 @@ unsigned deliver(chanend c_out, chanend c_spd_out, unsigned divide, chanend ?c_d
|
|||||||
|
|
||||||
#pragma xta endpoint "i2s_output_l"
|
#pragma xta endpoint "i2s_output_l"
|
||||||
|
|
||||||
#if (I2S_CHANS_DAC != 0) && (NUM_USB_CHAN_OUT != 0)
|
#if (I2S_CHANS_DAC != 0)
|
||||||
#pragma loop unroll
|
#pragma loop unroll
|
||||||
for(int i = 0; i < I2S_CHANS_DAC; i+=2)
|
for(int i = 0; i < I2S_CHANS_DAC; i+=2)
|
||||||
{
|
{
|
||||||
@@ -367,16 +355,14 @@ unsigned deliver(chanend c_out, chanend c_spd_out, unsigned divide, chanend ?c_d
|
|||||||
for(int i = 1; i < I2S_CHANS_ADC; i += 2)
|
for(int i = 1; i < I2S_CHANS_ADC; i += 2)
|
||||||
{
|
{
|
||||||
p_i2s_adc[index++] :> sample;
|
p_i2s_adc[index++] :> sample;
|
||||||
#if NUM_USB_CHAN_IN > 0
|
|
||||||
samplesIn[i] = bitrev(sample);
|
samplesIn[i] = bitrev(sample);
|
||||||
|
|
||||||
/* Store the previous left in left */
|
/* Store the previous left in left */
|
||||||
samplesIn[i-1] = samplesInPrev[i];
|
samplesIn[i-1] = samplesInPrev[i];
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(SPDIF) && (NUM_USB_CHAN_OUT > 0)
|
#ifdef SPDIF
|
||||||
outuint(c_spd_out, samplesOut[SPDIF_TX_INDEX]); /* Forward sample to SPDIF txt thread */
|
outuint(c_spd_out, samplesOut[SPDIF_TX_INDEX]); /* Forward sample to SPDIF txt thread */
|
||||||
sample = samplesOut[SPDIF_TX_INDEX + 1];
|
sample = samplesOut[SPDIF_TX_INDEX + 1];
|
||||||
outuint(c_spd_out, sample); /* Forward sample to SPDIF txt thread */
|
outuint(c_spd_out, sample); /* Forward sample to SPDIF txt thread */
|
||||||
@@ -399,7 +385,7 @@ unsigned deliver(chanend c_out, chanend c_spd_out, unsigned divide, chanend ?c_d
|
|||||||
|
|
||||||
tmp = 0;
|
tmp = 0;
|
||||||
#pragma xta endpoint "i2s_output_r"
|
#pragma xta endpoint "i2s_output_r"
|
||||||
#if (I2S_CHANS_DAC != 0) && (NUM_USB_CHAN_OUT != 0)
|
#if (I2S_CHANS_DAC != 0)
|
||||||
#pragma loop unroll
|
#pragma loop unroll
|
||||||
for(int i = 1; i < I2S_CHANS_DAC; i+=2)
|
for(int i = 1; i < I2S_CHANS_DAC; i+=2)
|
||||||
{
|
{
|
||||||
@@ -454,10 +440,7 @@ unsigned deliver(chanend c_out, chanend c_spd_out, unsigned divide, chanend ?c_d
|
|||||||
for(int i = 1; i < I2S_CHANS_ADC; i += 2)
|
for(int i = 1; i < I2S_CHANS_ADC; i += 2)
|
||||||
{
|
{
|
||||||
p_i2s_adc[index++] :> sample;
|
p_i2s_adc[index++] :> sample;
|
||||||
|
|
||||||
#if NUM_USB_CHAN_IN > 0
|
|
||||||
samplesInPrev[i] = bitrev(sample);
|
samplesInPrev[i] = bitrev(sample);
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -513,7 +496,7 @@ static unsigned dummy_deliver(chanend c_out) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void audio(chanend c_mix_out, chanend ?c_dig_rx, chanend ?c_config)
|
void audio(chanend c_mix_out, chanend ?c_dig_rx, chanend ?c_config, chanend ?c_i2c)
|
||||||
{
|
{
|
||||||
chan c_spdif_out;
|
chan c_spdif_out;
|
||||||
unsigned curSamFreq = DEFAULT_FREQ;
|
unsigned curSamFreq = DEFAULT_FREQ;
|
||||||
@@ -526,10 +509,10 @@ void audio(chanend c_mix_out, chanend ?c_dig_rx, chanend ?c_config)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Initialise master clock generation */
|
/* Initialise master clock generation */
|
||||||
ClockingInit();
|
ClockingInit(c_i2c);
|
||||||
|
|
||||||
/* Perform required CODEC/ADC/DAC initialisation */
|
/* Perform required CODEC/ADC/DAC initialisation */
|
||||||
CodecInit(c_config);
|
CodecInit(c_config, c_i2c);
|
||||||
|
|
||||||
while(1)
|
while(1)
|
||||||
{
|
{
|
||||||
@@ -548,7 +531,7 @@ void audio(chanend c_mix_out, chanend ?c_dig_rx, chanend ?c_config)
|
|||||||
divide = mClk / ( curSamFreq * 64 );
|
divide = mClk / ( curSamFreq * 64 );
|
||||||
|
|
||||||
/* Configure clocking for required master clock */
|
/* Configure clocking for required master clock */
|
||||||
ClockingConfig(mClk);
|
ClockingConfig(mClk, c_i2c);
|
||||||
|
|
||||||
if(!firstRun)
|
if(!firstRun)
|
||||||
{
|
{
|
||||||
@@ -568,7 +551,7 @@ void audio(chanend c_mix_out, chanend ?c_dig_rx, chanend ?c_config)
|
|||||||
firstRun = 0;
|
firstRun = 0;
|
||||||
|
|
||||||
/* Configure CODEC/DAC/ADC for SampleFreq/MClk */
|
/* Configure CODEC/DAC/ADC for SampleFreq/MClk */
|
||||||
CodecConfig(curSamFreq, mClk, c_config);
|
CodecConfig(curSamFreq, mClk, c_config, c_i2c);
|
||||||
|
|
||||||
/* Configure audio ports */
|
/* Configure audio ports */
|
||||||
ConfigAudioPorts(divide);
|
ConfigAudioPorts(divide);
|
||||||
|
|||||||
@@ -5,10 +5,10 @@
|
|||||||
/* Functions that handle master clock generation. These need modifying for an existing design */
|
/* Functions that handle master clock generation. These need modifying for an existing design */
|
||||||
|
|
||||||
/* Any initialisation required for master clock generation - run once at start up */
|
/* Any initialisation required for master clock generation - run once at start up */
|
||||||
void ClockingInit(void);
|
void ClockingInit(chanend ?c);
|
||||||
|
|
||||||
/* Configuration for a specific master clock frequency - run every sample frequency change */
|
/* Configuration for a specific master clock frequency - run every sample frequency change */
|
||||||
void ClockingConfig(unsigned mClkFreq);
|
void ClockingConfig(unsigned mClkFreq, chanend ?c);
|
||||||
|
|
||||||
|
|
||||||
/** Clock generation and digital audio I/O handling.
|
/** Clock generation and digital audio I/O handling.
|
||||||
|
|||||||
@@ -6,9 +6,9 @@
|
|||||||
/* TODO Are the channel args required? */
|
/* TODO Are the channel args required? */
|
||||||
|
|
||||||
/* Any required CODEC initialisation - run once at start up */
|
/* Any required CODEC initialisation - run once at start up */
|
||||||
void CodecInit(chanend ?c_codec);
|
void CodecInit(chanend ?c_codec, chanend ?c_i2c);
|
||||||
|
|
||||||
/* Configure condec for a specific mClk/Sample frquency - run on every sample frequency change */
|
/* Configure condec for a specific mClk/Sample frquency - run on every sample frequency change */
|
||||||
void CodecConfig(unsigned samFreq, unsigned mClk, chanend ?c_codec);
|
void CodecConfig(unsigned samFreq, unsigned mClk, chanend ?c_codec, chanend ?c_i2c);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -9,27 +9,6 @@
|
|||||||
|
|
||||||
#include "customdefines.h"
|
#include "customdefines.h"
|
||||||
|
|
||||||
/* Tidy up historical INPUT/OUTPUT defines. INPUT/OUTPUT now enabled based on channel count defines */
|
|
||||||
#if !defined(NUM_USB_CHAN_IN)
|
|
||||||
#error NUM_USB_CHAN_IN must be defined!
|
|
||||||
#else
|
|
||||||
#if (NUM_USB_CHAN_IN == 0)
|
|
||||||
#undef INPUT
|
|
||||||
#else
|
|
||||||
#define INPUT 1
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if !defined(NUM_USB_CHAN_OUT)
|
|
||||||
#error NUM_USB_CHAN_OUT must be defined!
|
|
||||||
#else
|
|
||||||
#if (NUM_USB_CHAN_OUT == 0)
|
|
||||||
#undef OUTPUT
|
|
||||||
#else
|
|
||||||
#define OUTPUT 1
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(MIDI) && (MIDI == 0)
|
#if defined(MIDI) && (MIDI == 0)
|
||||||
#undef MIDI
|
#undef MIDI
|
||||||
#endif
|
#endif
|
||||||
@@ -180,6 +159,12 @@
|
|||||||
#define MIDI_INTERFACES (0)
|
#define MIDI_INTERFACES (0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(IAP)
|
||||||
|
#define IAP_INTERFACES (1)
|
||||||
|
#else
|
||||||
|
#define IAP_INTERFACES (0)
|
||||||
|
#endif
|
||||||
|
|
||||||
#define AUDIO_STOP_FOR_DFU (0x12345678)
|
#define AUDIO_STOP_FOR_DFU (0x12345678)
|
||||||
#define AUDIO_START_FROM_DFU (0x87654321)
|
#define AUDIO_START_FROM_DFU (0x87654321)
|
||||||
#define AUDIO_REBOOT_FROM_DFU (0xa5a5a5a5)
|
#define AUDIO_REBOOT_FROM_DFU (0xa5a5a5a5)
|
||||||
@@ -187,8 +172,8 @@
|
|||||||
|
|
||||||
#define MAX_VOL (0x20000000)
|
#define MAX_VOL (0x20000000)
|
||||||
|
|
||||||
#define NUM_EP_OUT 3 /* Max number of device endpoints used */
|
#define NUM_EP_OUT 4 /* Max number of device endpoints used */
|
||||||
#define NUM_EP_IN 5
|
#define NUM_EP_IN 7
|
||||||
/* Length of clock unit/clock-selector units */
|
/* Length of clock unit/clock-selector units */
|
||||||
#if defined(SPDIF_RX) && defined(ADAT_RX)
|
#if defined(SPDIF_RX) && defined(ADAT_RX)
|
||||||
#define NUM_CLOCKS 3
|
#define NUM_CLOCKS 3
|
||||||
@@ -200,7 +185,7 @@
|
|||||||
|
|
||||||
|
|
||||||
/* Total number of USB interfaces this device implements (+1 for required control interface) */
|
/* Total number of USB interfaces this device implements (+1 for required control interface) */
|
||||||
#define NUM_INTERFACES INPUT_INTERFACES + OUTPUT_INTERFACES + DFU_INTERFACES + MIDI_INTERFACES + 1
|
#define NUM_INTERFACES INPUT_INTERFACES + OUTPUT_INTERFACES + DFU_INTERFACES + MIDI_INTERFACES + IAP_INTERFACES + 1
|
||||||
/* Audio Unit ID defines */
|
/* Audio Unit ID defines */
|
||||||
#define FU_USBIN 11 /* Feature Unit: USB Audio device -> host */
|
#define FU_USBIN 11 /* Feature Unit: USB Audio device -> host */
|
||||||
#define FU_USBOUT 10 /* Feature Unit: USB Audio host -> device*/
|
#define FU_USBOUT 10 /* Feature Unit: USB Audio host -> device*/
|
||||||
@@ -214,18 +199,18 @@
|
|||||||
#define ID_CLKSRC_EXT 42 /* Clock source ID (external) */
|
#define ID_CLKSRC_EXT 42 /* Clock source ID (external) */
|
||||||
#define ID_CLKSRC_ADAT 43 /* Clock source ID (external) */
|
#define ID_CLKSRC_ADAT 43 /* Clock source ID (external) */
|
||||||
|
|
||||||
#define ID_XU_MIXSEL 50
|
#define ID_XU_MIXSEL 50
|
||||||
#define ID_XU_OUT 51
|
#define ID_XU_OUT 51
|
||||||
#define ID_XU_IN 52
|
#define ID_XU_IN 52
|
||||||
|
|
||||||
#define ID_MIXER_1 60
|
#define ID_MIXER_1 60
|
||||||
|
|
||||||
#ifndef SERIAL_STR
|
#ifndef SERIAL_STR
|
||||||
#define SERIAL_STR "0000" /* Serial number string */
|
#define SERIAL_STR "0000" /* Serial number string */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define SERIAL_STR_INDEX 0x03
|
#define SERIAL_STR_INDEX 0x03
|
||||||
#define MANUFACTURER_STR_INDEX 0x01
|
#define MANUFACTURER_STR_INDEX 0x01
|
||||||
#define PRODUCT_STR_INDEX 0x02
|
#define PRODUCT_STR_INDEX 0x02
|
||||||
|
|
||||||
/* Mixer defines */
|
/* Mixer defines */
|
||||||
|
|||||||
@@ -35,25 +35,27 @@ extern int volsIn[];
|
|||||||
extern unsigned int mutesIn[];
|
extern unsigned int mutesIn[];
|
||||||
|
|
||||||
/* Mixer settings */
|
/* Mixer settings */
|
||||||
|
#ifdef MIXER
|
||||||
extern unsigned char mixer1Crossbar[];
|
extern unsigned char mixer1Crossbar[];
|
||||||
extern short mixer1Weights[];
|
extern short mixer1Weights[];
|
||||||
|
|
||||||
/* Device channel mapping */
|
/* Device channel mapping */
|
||||||
#if NUM_USB_CHAN_OUT > 0
|
|
||||||
extern unsigned char channelMapAud[NUM_USB_CHAN_OUT];
|
extern unsigned char channelMapAud[NUM_USB_CHAN_OUT];
|
||||||
#endif
|
|
||||||
#if NUM_USB_CHAN_IN > 0
|
|
||||||
extern unsigned char channelMapUsb[NUM_USB_CHAN_IN];
|
extern unsigned char channelMapUsb[NUM_USB_CHAN_IN];
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Mixer input mapping */
|
/* Mixer input mapping */
|
||||||
extern unsigned char mixSel[MIX_INPUTS];
|
extern unsigned char mixSel[MIX_INPUTS];
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Global var for current frequency */
|
/* Global var for current frequency */
|
||||||
extern unsigned int g_curSamFreq;
|
extern unsigned int g_curSamFreq;
|
||||||
extern unsigned int g_curSamFreq48000Family;
|
extern unsigned int g_curSamFreq48000Family;
|
||||||
extern unsigned int g_curSamFreqMultiplier;
|
extern unsigned int g_curSamFreqMultiplier;
|
||||||
|
|
||||||
|
/* Global level data */
|
||||||
|
//unsigned short g_lvlMixOut[MAX_MIX_COUNT];
|
||||||
|
//unsigned short g_lvlMixIn[NUM_USB_CHAN_IN + NUM_USB_CHAN_OUT];
|
||||||
|
|
||||||
/* Store an int into a char array: Note this allows non-word aligned access unlike reinerpret cast */
|
/* Store an int into a char array: Note this allows non-word aligned access unlike reinerpret cast */
|
||||||
void storeInt(unsigned char buffer[], int index, int val)
|
void storeInt(unsigned char buffer[], int index, int val)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -170,6 +170,18 @@ unsigned char devQualDesc_Null[] =
|
|||||||
#define MIDI_LENGTH (0)
|
#define MIDI_LENGTH (0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef MIXER
|
||||||
|
#define MIXER_LENGTH (13+1+18)
|
||||||
|
#else
|
||||||
|
#define MIXER_LENGTH (0)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef IAP
|
||||||
|
#define IAP_LENGTH (30)
|
||||||
|
#else
|
||||||
|
#define IAP_LENGTH (0)
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef AUDIO_PATH_XUS
|
#ifdef AUDIO_PATH_XUS
|
||||||
#define LEN_XU_OUT (16 * OUTPUT_INTERFACES)
|
#define LEN_XU_OUT (16 * OUTPUT_INTERFACES)
|
||||||
#define LEN_XU_IN (16 * INPUT_INTERFACES)
|
#define LEN_XU_IN (16 * INPUT_INTERFACES)
|
||||||
@@ -179,18 +191,9 @@ unsigned char devQualDesc_Null[] =
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef MIXER
|
#ifdef MIXER
|
||||||
#define LEN_XU_MIX (17)
|
#define LEN_XU_MIX (17)
|
||||||
#define MIX_BMCONTROLS_LEN_TMP ((MAX_MIX_COUNT * MIX_INPUTS) / 8)
|
|
||||||
|
|
||||||
#if ((MAX_MIX_COUNT * MIX_INPUTS)%8)==0
|
|
||||||
#define MIX_BMCONTROLS_LEN (MIX_BMCONTROLS_LEN_TMP)
|
|
||||||
#else
|
|
||||||
#define MIX_BMCONTROLS_LEN (MIX_BMCONTROLS_LEN_TMP+1)
|
|
||||||
#endif
|
|
||||||
#define MIXER_LENGTH (13+1+MIX_BMCONTROLS_LEN)
|
|
||||||
#else
|
#else
|
||||||
#define LEN_XU_MIX (0)
|
#define LEN_XU_MIX (0)
|
||||||
#define MIXER_LENGTH (0)
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define LEN_CLK (8)
|
#define LEN_CLK (8)
|
||||||
@@ -216,7 +219,7 @@ unsigned char devQualDesc_Null[] =
|
|||||||
|
|
||||||
|
|
||||||
/* Total length of config descriptor */
|
/* Total length of config descriptor */
|
||||||
#define CFG_TOTAL_LENGTH_A2 (7 + 26 + (INPUT_INTERFACES * 55) + (OUTPUT_INTERFACES * 62) + (MIDI_LENGTH) + (DFU_INTERFACES * 18) + TLEN_AC + (MIXER_LENGTH) + INPUT_ALT_LENGTH + OUTPUT_ALT_LENGTH)
|
#define CFG_TOTAL_LENGTH_A2 (7 + 26 + (INPUT_INTERFACES * 55) + (OUTPUT_INTERFACES * 62) + (MIDI_LENGTH) + (DFU_INTERFACES * 16) + TLEN_AC + (MIXER_LENGTH) + IAP_LENGTH + INPUT_ALT_LENGTH + OUTPUT_ALT_LENGTH)
|
||||||
|
|
||||||
/* Define for number of audio interfaces (+1 for mandatory control interface) */
|
/* Define for number of audio interfaces (+1 for mandatory control interface) */
|
||||||
#define AUDIO_INTERFACES (INPUT_INTERFACES + OUTPUT_INTERFACES + 1)
|
#define AUDIO_INTERFACES (INPUT_INTERFACES + OUTPUT_INTERFACES + 1)
|
||||||
@@ -233,7 +236,7 @@ unsigned char cfgDesc_Audio2[] =
|
|||||||
0x00, /* 6 iConfiguration */
|
0x00, /* 6 iConfiguration */
|
||||||
#ifdef SELF_POWERED
|
#ifdef SELF_POWERED
|
||||||
192, /* 7 bmAttributes */
|
192, /* 7 bmAttributes */
|
||||||
5, /* 8 bMaxPower */
|
1, /* 8 bMaxPower */
|
||||||
#else
|
#else
|
||||||
128, /* 7 bmAttributes */
|
128, /* 7 bmAttributes */
|
||||||
250, /* 8 bMaxPower */
|
250, /* 8 bMaxPower */
|
||||||
@@ -362,7 +365,7 @@ unsigned char cfgDesc_Audio2[] =
|
|||||||
ID_CLKSEL, /* 7 bCSourceID: ID of Clock Entity */
|
ID_CLKSEL, /* 7 bCSourceID: ID of Clock Entity */
|
||||||
NUM_USB_CHAN_OUT, /* 8 bNrChannels */
|
NUM_USB_CHAN_OUT, /* 8 bNrChannels */
|
||||||
0,0,0,0, /* 9 bmChannelConfig */
|
0,0,0,0, /* 9 bmChannelConfig */
|
||||||
15, /* 13 iChannelNames */
|
13, /* 13 iChannelNames */
|
||||||
0x00, 0x00, /* 14 bmControls */
|
0x00, 0x00, /* 14 bmControls */
|
||||||
6, /* 16 iTerminal */
|
6, /* 16 iTerminal */
|
||||||
|
|
||||||
@@ -481,7 +484,7 @@ unsigned char cfgDesc_Audio2[] =
|
|||||||
ID_CLKSEL, /* 7 bCSourceID: ID of Clock Entity */
|
ID_CLKSEL, /* 7 bCSourceID: ID of Clock Entity */
|
||||||
NUM_USB_CHAN_IN, /* 8 bNrChannels */
|
NUM_USB_CHAN_IN, /* 8 bNrChannels */
|
||||||
0,0,0,0, /* 9 bmChannelConfig */
|
0,0,0,0, /* 9 bmChannelConfig */
|
||||||
33, /* 13 iChannelNames */
|
31, /* 13 iChannelNames */
|
||||||
0x00, 0x00, /* 14 bmControls */
|
0x00, 0x00, /* 14 bmControls */
|
||||||
0, /* 16 iTerminal */
|
0, /* 16 iTerminal */
|
||||||
|
|
||||||
@@ -601,7 +604,7 @@ unsigned char cfgDesc_Audio2[] =
|
|||||||
2, /* 6 bNrPins */
|
2, /* 6 bNrPins */
|
||||||
ID_IT_USB, /* 7 baSourceId(1) */
|
ID_IT_USB, /* 7 baSourceId(1) */
|
||||||
ID_IT_AUD, /* 7 baSourceId(2) */
|
ID_IT_AUD, /* 7 baSourceId(2) */
|
||||||
MIX_INPUTS, /* 8+p bNrChannels */
|
MIX_INPUTS, /* 8+p bNrChannels */
|
||||||
0, /* 9+p bmChannelConfig */
|
0, /* 9+p bmChannelConfig */
|
||||||
0, /* 10+p bmChannelConfig */
|
0, /* 10+p bmChannelConfig */
|
||||||
0, /* 11+p bmChannelConfig */
|
0, /* 11+p bmChannelConfig */
|
||||||
@@ -615,76 +618,23 @@ unsigned char cfgDesc_Audio2[] =
|
|||||||
|
|
||||||
/* Mixer Unit Descriptors */
|
/* Mixer Unit Descriptors */
|
||||||
|
|
||||||
|
|
||||||
/* N = 144 (18 * 8) */
|
/* N = 144 (18 * 8) */
|
||||||
/* Mixer Unit Bitmap - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
/* Mixer Unit Bitmap - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff */
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff */
|
||||||
MIXER_LENGTH, /* 0 bLength : 13 + num inputs + bit map (inputs * outputs) */
|
0x0D+0x01+0x12, /* 0 bLength : 13 + num inputs + bit map (inputs * outputs) */
|
||||||
CS_INTERFACE, /* 1 bDescriptorType: 0x24 */
|
CS_INTERFACE, /* 1 bDescriptorType: 0x24 */
|
||||||
0x04, /* bDescriptorSubtype: MIXER_UNIT */
|
0x04, /* bDescriptorSubtype: MIXER_UNIT */
|
||||||
ID_MIXER_1, /* Mixer unit id */
|
ID_MIXER_1, /* Mixer unit id */
|
||||||
0x01, /* Number of input pins */
|
0x01, /* Number of input pins */
|
||||||
ID_XU_MIXSEL, /* Connected terminal or unit id for input pin */
|
ID_XU_MIXSEL, /* Connected terminal or unit id for input pin*/
|
||||||
MAX_MIX_COUNT, /* Number of mixer output channels */
|
0x08, /* Number of mixer output channels */
|
||||||
0x00, 0x00, 0x00, 0x00, /* Spacial location ???? */
|
0x00, 0x00, 0x00, 0x00, /* Spacial location ???? */
|
||||||
49, /* Channel name index */
|
49, /* Channel name index */
|
||||||
#if MIX_BMCONTROLS_LEN > 0 /* Mixer programmable control bitmap */
|
0xff, 0xff, 0xff, 0xff, /* Mixer programmable control bitmap */
|
||||||
0xff,
|
0xff, 0xff, 0xff, 0xff,
|
||||||
#endif
|
0xff, 0xff, 0xff, 0xff,
|
||||||
#if MIX_BMCONTROLS_LEN > 1
|
0xff, 0xff, 0xff, 0xff,
|
||||||
0xff,
|
0xff, 0xff,
|
||||||
#endif
|
|
||||||
#if MIX_BMCONTROLS_LEN > 2
|
|
||||||
0xff,
|
|
||||||
#endif
|
|
||||||
#if MIX_BMCONTROLS_LEN > 3
|
|
||||||
0xff,
|
|
||||||
#endif
|
|
||||||
#if MIX_BMCONTROLS_LEN > 4
|
|
||||||
0xff,
|
|
||||||
#endif
|
|
||||||
#if MIX_BMCONTROLS_LEN > 5
|
|
||||||
0xff,
|
|
||||||
#endif
|
|
||||||
#if MIX_BMCONTROLS_LEN > 6
|
|
||||||
0xff,
|
|
||||||
#endif
|
|
||||||
#if MIX_BMCONTROLS_LEN > 7
|
|
||||||
0xff,
|
|
||||||
#endif
|
|
||||||
#if MIX_BMCONTROLS_LEN > 8
|
|
||||||
0xff,
|
|
||||||
#endif
|
|
||||||
#if MIX_BMCONTROLS_LEN > 9
|
|
||||||
0xff,
|
|
||||||
#endif
|
|
||||||
#if MIX_BMCONTROLS_LEN > 10
|
|
||||||
0xff,
|
|
||||||
#endif
|
|
||||||
#if MIX_BMCONTROLS_LEN > 11
|
|
||||||
0xff,
|
|
||||||
#endif
|
|
||||||
#if MIX_BMCONTROLS_LEN > 12
|
|
||||||
0xff,
|
|
||||||
#endif
|
|
||||||
#if MIX_BMCONTROLS_LEN > 13
|
|
||||||
0xff,
|
|
||||||
#endif
|
|
||||||
#if MIX_BMCONTROLS_LEN > 14
|
|
||||||
0xff,
|
|
||||||
#endif
|
|
||||||
#if MIX_BMCONTROLS_LEN > 15
|
|
||||||
0xff,
|
|
||||||
#endif
|
|
||||||
#if MIX_BMCONTROLS_LEN > 16
|
|
||||||
0xff,
|
|
||||||
#endif
|
|
||||||
#if MIX_BMCONTROLS_LEN > 17
|
|
||||||
0xff,
|
|
||||||
#endif
|
|
||||||
#if MIX_BMCONTROLS_LEN > 18
|
|
||||||
#error unxpected BMCONTROLS_LEN
|
|
||||||
#endif
|
|
||||||
0x00, /* bmControls */
|
0x00, /* bmControls */
|
||||||
0, /* Mixer unit string descriptor index */
|
0, /* Mixer unit string descriptor index */
|
||||||
#endif
|
#endif
|
||||||
@@ -730,9 +680,9 @@ unsigned char cfgDesc_Audio2[] =
|
|||||||
0x00, /* 4 bmControls */
|
0x00, /* 4 bmControls */
|
||||||
0x01, /* 5 bFormatType */
|
0x01, /* 5 bFormatType */
|
||||||
PCM, 0x00, 0x00, 0x00, /* 6:10 bmFormats (note this is a bitmap) */
|
PCM, 0x00, 0x00, 0x00, /* 6:10 bmFormats (note this is a bitmap) */
|
||||||
NUM_USB_CHAN_OUT, /* 11 bNrChannels */
|
NUM_USB_CHAN_OUT, /* 11 bNrChannels */
|
||||||
0,0,0,0, /* 12:14: bmChannelConfig */
|
0,0,0,0, /* 12:14: bmChannelConfig */
|
||||||
15, /* 15 iChannelNames */
|
13, /* 15 iChannelNames */
|
||||||
|
|
||||||
/* Type 1 Format Type Descriptor */
|
/* Type 1 Format Type Descriptor */
|
||||||
0x06, /* 0 bLength (in bytes): 6 */
|
0x06, /* 0 bLength (in bytes): 6 */
|
||||||
@@ -765,7 +715,7 @@ unsigned char cfgDesc_Audio2[] =
|
|||||||
0x81, /* 2 bEndpointAddress (D7: 0:out, 1:in) */
|
0x81, /* 2 bEndpointAddress (D7: 0:out, 1:in) */
|
||||||
17, /* 3 bmAttributes (bitmap) */
|
17, /* 3 bmAttributes (bitmap) */
|
||||||
4,0, /* 4 wMaxPacketSize */
|
4,0, /* 4 wMaxPacketSize */
|
||||||
4, /* 6 bInterval. Only values <= 1 frame (8) supported by MS */
|
8, /* 6 bInterval */
|
||||||
|
|
||||||
#ifdef ADAT_TX
|
#ifdef ADAT_TX
|
||||||
/* Standard AS Interface Descriptor (4.9.1) (Alt) */
|
/* Standard AS Interface Descriptor (4.9.1) (Alt) */
|
||||||
@@ -789,7 +739,7 @@ unsigned char cfgDesc_Audio2[] =
|
|||||||
PCM, 0x00, 0x00, 0x00, /* 6:10 bmFormats (note this is a bitmap) */
|
PCM, 0x00, 0x00, 0x00, /* 6:10 bmFormats (note this is a bitmap) */
|
||||||
NUM_USB_CHAN_OUT, /* 11 bNrChannels */
|
NUM_USB_CHAN_OUT, /* 11 bNrChannels */
|
||||||
0,0,0,0, /* 12:14: bmChannelConfig */
|
0,0,0,0, /* 12:14: bmChannelConfig */
|
||||||
15, /* 15 iChannelNames */
|
13, /* 15 iChannelNames */
|
||||||
|
|
||||||
/* Type 1 Format Type Descriptor */
|
/* Type 1 Format Type Descriptor */
|
||||||
0x06, /* 0 bLength (in bytes): 6 */
|
0x06, /* 0 bLength (in bytes): 6 */
|
||||||
@@ -860,7 +810,7 @@ unsigned char cfgDesc_Audio2[] =
|
|||||||
PCM, 0x00, 0x00, 0x00, /* 6:10 bmFormats (note this is a bitmap) */
|
PCM, 0x00, 0x00, 0x00, /* 6:10 bmFormats (note this is a bitmap) */
|
||||||
NUM_USB_CHAN_IN, /* 11 bNrChannels */
|
NUM_USB_CHAN_IN, /* 11 bNrChannels */
|
||||||
0,0,0,0, /* 12:14: bmChannelConfig */
|
0,0,0,0, /* 12:14: bmChannelConfig */
|
||||||
33, /* 15 iChannelNames */
|
31, /* 15 iChannelNames */
|
||||||
|
|
||||||
/* Type 1 Format Type Descriptor */
|
/* Type 1 Format Type Descriptor */
|
||||||
0x06, /* 0 bLength (in bytes): 6 */
|
0x06, /* 0 bLength (in bytes): 6 */
|
||||||
@@ -909,7 +859,7 @@ unsigned char cfgDesc_Audio2[] =
|
|||||||
PCM, 0x00, 0x00, 0x00, /* 6:10 bmFormats (note this is a bitmap) */
|
PCM, 0x00, 0x00, 0x00, /* 6:10 bmFormats (note this is a bitmap) */
|
||||||
NUM_USB_CHAN_IN - 4, /* 11 bNrChannels */
|
NUM_USB_CHAN_IN - 4, /* 11 bNrChannels */
|
||||||
0,0,0,0, /* 12:14: bmChannelConfig */
|
0,0,0,0, /* 12:14: bmChannelConfig */
|
||||||
33, /* 15 iChannelNames */
|
31, /* 15 iChannelNames */
|
||||||
|
|
||||||
/* Type 1 Format Type Descriptor */
|
/* Type 1 Format Type Descriptor */
|
||||||
0x06, /* 0 bLength (in bytes): 6 */
|
0x06, /* 0 bLength (in bytes): 6 */
|
||||||
@@ -1048,7 +998,7 @@ unsigned char cfgDesc_Audio2[] =
|
|||||||
0x02, /* 2 bDescriptorSubtype : MIDI_IN_JACK subtype. (field size 1 bytes) */
|
0x02, /* 2 bDescriptorSubtype : MIDI_IN_JACK subtype. (field size 1 bytes) */
|
||||||
0x02, /* 3 bJackType : EXTERNAL. (field size 1 bytes) */
|
0x02, /* 3 bJackType : EXTERNAL. (field size 1 bytes) */
|
||||||
0x02, /* 4 bJackID : ID of this Jack. (field size 1 bytes) */
|
0x02, /* 4 bJackID : ID of this Jack. (field size 1 bytes) */
|
||||||
14, /* 5 iJack : Unused. (field size 1 bytes) */
|
0x00, /* 5 iJack : Unused. (field size 1 bytes) */
|
||||||
|
|
||||||
/* Table B-9: MIDI Adapter MIDI OUT Jack Descriptor (Embedded) */
|
/* Table B-9: MIDI Adapter MIDI OUT Jack Descriptor (Embedded) */
|
||||||
0x09, /* 0 bLength : Size of this descriptor, in bytes. (field size 1 bytes) */
|
0x09, /* 0 bLength : Size of this descriptor, in bytes. (field size 1 bytes) */
|
||||||
@@ -1070,7 +1020,7 @@ unsigned char cfgDesc_Audio2[] =
|
|||||||
0x01, /* 5 bNrInputPins : Number of Input Pins of this Jack. (field size 1 bytes) */
|
0x01, /* 5 bNrInputPins : Number of Input Pins of this Jack. (field size 1 bytes) */
|
||||||
0x01, /* 6 BaSourceID(1) : ID of the Entity to which this Pin is connected. (field size 1 bytes) */
|
0x01, /* 6 BaSourceID(1) : ID of the Entity to which this Pin is connected. (field size 1 bytes) */
|
||||||
0x01, /* 7 BaSourcePin(1) : Output Pin number of the Entity to which this Input Pin is connected. */
|
0x01, /* 7 BaSourcePin(1) : Output Pin number of the Entity to which this Input Pin is connected. */
|
||||||
13, /* 8 iJack : Unused. (field size 1 bytes) */
|
0x00, /* 8 iJack : Unused. (field size 1 bytes) */
|
||||||
|
|
||||||
/* Table B-11: MIDI Adapter Standard Bulk OUT Endpoint Descriptor */
|
/* Table B-11: MIDI Adapter Standard Bulk OUT Endpoint Descriptor */
|
||||||
0x09, /* 0 bLength : Size of this descriptor, in bytes. (field size 1 bytes) */
|
0x09, /* 0 bLength : Size of this descriptor, in bytes. (field size 1 bytes) */
|
||||||
@@ -1118,31 +1068,58 @@ unsigned char cfgDesc_Audio2[] =
|
|||||||
0x00, /* 4 bNumEndpoints : 0 endpoints. (field size 1 bytes) */
|
0x00, /* 4 bNumEndpoints : 0 endpoints. (field size 1 bytes) */
|
||||||
0xFE, /* 5 bInterfaceClass : DFU. (field size 1 bytes) */
|
0xFE, /* 5 bInterfaceClass : DFU. (field size 1 bytes) */
|
||||||
0x01, /* 6 bInterfaceSubclass : (field size 1 bytes) */
|
0x01, /* 6 bInterfaceSubclass : (field size 1 bytes) */
|
||||||
0x01, /* 7 bInterfaceProtocol : Unused. (field size 1 bytes) */
|
0x00, /* 7 bInterfaceProtocol : Unused. (field size 1 bytes) */
|
||||||
12, /* 8 iInterface : Unused. (field size 1 bytes) */
|
12, /* 8 iInterface : Used. (field size 1 bytes) */
|
||||||
|
|
||||||
#if 0
|
/* Standard DFU class functional descriptor */
|
||||||
/* DFU 1.0 Run-Time DFU Functional Descriptor */
|
|
||||||
0x07,
|
0x07,
|
||||||
0x21,
|
0x21,
|
||||||
0x07,
|
0x07,
|
||||||
0xFA,
|
0xFA,
|
||||||
0x00,
|
0x00,
|
||||||
0x40,
|
0x40,
|
||||||
0x00
|
0x00,
|
||||||
#else
|
|
||||||
/* DFU 1.1 Run-Time DFU Functional Descriptor */
|
|
||||||
0x09, /* 0 Size */
|
|
||||||
0x21, /* 1 bDescriptorType : DFU FUNCTIONAL */
|
|
||||||
0x07, /* 2 bmAttributes */
|
|
||||||
0xFA, /* 3 wDetachTimeOut */
|
|
||||||
0x00, /* 4 wDetachTimeOut */
|
|
||||||
0x40, /* 5 wTransferSize */
|
|
||||||
0x00, /* 6 wTransferSize */
|
|
||||||
0x10, /* 7 bcdDFUVersion */
|
|
||||||
0x01, /* 7 bcdDFUVersion */
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef IAP
|
||||||
|
/* Please write an iAP descriptor here */
|
||||||
|
/* Interface descriptor */
|
||||||
|
0x09, /* 0 bLength : Size of this descriptor, in bytes. (field size 1 bytes) */
|
||||||
|
0x04, /* 1 bDescriptorType : INTERFACE descriptor. (field size 1 bytes) */
|
||||||
|
(INPUT_INTERFACES+OUTPUT_INTERFACES+MIDI_INTERFACES+1+1), /* 2 bInterfaceNumber : Index of this interface. (field size 1 bytes) */
|
||||||
|
0x00, /* 3 bAlternateSetting : Index of this setting. (field size 1 bytes) */
|
||||||
|
0x03, /* 4 bNumEndpoints : 0 endpoints. (field size 1 bytes) */
|
||||||
|
0xFF, /* 5 bInterfaceClass : DFU. (field size 1 bytes) */
|
||||||
|
0xF0, /* 6 bInterfaceSubclass : (field size 1 bytes) */
|
||||||
|
0x00, /* 7 bInterfaceProtocol : Unused. (field size 1 bytes) */
|
||||||
|
57, /* 8 iInterface : Used. (field size 1 bytes) */
|
||||||
|
|
||||||
|
/* iAP Bulk OUT Endpoint Descriptor */
|
||||||
|
0x07, /* 0 bLength : Size of this descriptor, in bytes. (field size 1 bytes) */
|
||||||
|
0x05, /* 1 bDescriptorType : ENDPOINT descriptor. (field size 1 bytes) */
|
||||||
|
0x03, /* 2 bEndpointAddress : OUT Endpoint 3. High bit isIn (field size 1 bytes) */
|
||||||
|
0x02, /* 3 bmAttributes : Bulk, not shared. (field size 1 bytes) */
|
||||||
|
0x00, /* 4 wMaxPacketSize : 64 bytes per packet. (field size 2 bytes) - has to be 0x200 for compliance*/
|
||||||
|
0x02, /* 5 wMaxPacketSize */
|
||||||
|
0x00, /* 6 bInterval : Ignored for Bulk. Set to zero. (field size 1 bytes) */
|
||||||
|
|
||||||
|
/* iAP Bulk IN Endpoint Descriptor */
|
||||||
|
0x07, /* 0 bLength : Size of this descriptor, in bytes. (field size 1 bytes) */
|
||||||
|
0x05, /* 1 bDescriptorType : ENDPOINT descriptor. (field size 1 bytes) */
|
||||||
|
0x85, /* 2 bEndpointAddress : IN Endpoint 5. (field size 1 bytes) */
|
||||||
|
0x02, /* 3 bmAttributes : Bulk, not shared. (field size 1 bytes) */
|
||||||
|
0x00, /* 4 wMaxPacketSize : 64 bytes per packet. (field size 2 bytes) - has to be 0x200 for compliance*/
|
||||||
|
0x02, /* 5 wMaxPacketSize */
|
||||||
|
0x00, /* 6 bInterval : Ignored for Bulk. Set to zero. (field size 1 bytes) */
|
||||||
|
|
||||||
|
/* iAP Interrupt IN Endpoint Descriptor */
|
||||||
|
0x07, /* 0 bLength : Size of this descriptor, in bytes. (field size 1 bytes) */
|
||||||
|
0x05, /* 1 bDescriptorType : ENDPOINT descriptor. (field size 1 bytes) */
|
||||||
|
0x86, /* 2 bEndpointAddress : IN Endpoint 6. (field size 1 bytes) */
|
||||||
|
0x03, /* 3 bmAttributes : Interrupt, not shared. (field size 1 bytes) */
|
||||||
|
0x00, /* 4 wMaxPacketSize : 64 bytes per packet. (field size 2 bytes) - has to be 0x200 for compliance*/
|
||||||
|
0x02, /* 5 wMaxPacketSize */
|
||||||
|
0x08, /* 6 bInterval : in ms must be between 4 and 32ms (field size 1 bytes) */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
};
|
};
|
||||||
@@ -1169,55 +1146,53 @@ static unsigned char strDescs_Audio2[][40] =
|
|||||||
APPEND_VENDOR_STR(ADAT Clock), // 11 iClockSource
|
APPEND_VENDOR_STR(ADAT Clock), // 11 iClockSource
|
||||||
APPEND_VENDOR_STR(DFU), // 12 iInterface for DFU interface
|
APPEND_VENDOR_STR(DFU), // 12 iInterface for DFU interface
|
||||||
|
|
||||||
APPEND_VENDOR_STR(MIDI Out), // 13
|
"Analogue 1", // 13 Output channel name place holders - Get customised at runtime based on device config
|
||||||
APPEND_VENDOR_STR(MIDI In ), // 14
|
"Analogue 2", // 14
|
||||||
|
"Analogue 3", // 15
|
||||||
|
"Analogue 4", // 16
|
||||||
|
"Analogue 5", // 17
|
||||||
|
"Analogue 6", // 18
|
||||||
|
"Analogue 7", // 19
|
||||||
|
"Analogue 8", // 20
|
||||||
|
"Analogue 9", // 21
|
||||||
|
"Analogue 10", // 22
|
||||||
|
"Analogue 11", // 23
|
||||||
|
"Analogue 12", // 24
|
||||||
|
"Analogue 13", // 25
|
||||||
|
"Analogue 14", // 26
|
||||||
|
"Analogue 15", // 27
|
||||||
|
"Analogue 16", // 28
|
||||||
|
"Analogue 17", // 29
|
||||||
|
"Analogue 18", // 30
|
||||||
|
|
||||||
"Analogue 1", // 15 Output channel name place holders - Get customised at runtime based on device config
|
"Analogue 1", // 31 Input channel name place holders - Get customised at runtime based on device config */
|
||||||
"Analogue 2", // 16
|
"Analogue 2", // 32 Input channel name place holders - Get customised at runtime based on device config */
|
||||||
"Analogue 3", // 17
|
"Analogue 3", // 33 Input channel name place holders - Get customised at runtime based on device config */
|
||||||
"Analogue 4", // 18
|
"Analogue 4", // 34 Input channel name place holders - Get customised at runtime based on device config */
|
||||||
"Analogue 5", // 19
|
"Analogue 5", // 35 Input channel name place holders - Get customised at runtime based on device config */
|
||||||
"Analogue 6", // 20
|
"Analogue 6", // 36 Input channel name place holders - Get customised at runtime based on device config */
|
||||||
"Analogue 7", // 21
|
"Analogue 7", // 37 Input channel name place holders - Get customised at runtime based on device config */
|
||||||
"Analogue 8", // 22
|
"Analogue 8", // 38 Input channel name place holders - Get customised at runtime based on device config */
|
||||||
"Analogue 9", // 23
|
"Analogue 9", // 39 Input channel name place holders - Get customised at runtime based on device config */
|
||||||
"Analogue 10", // 24
|
"Analogue 10", // 40 Input channel name place holders - Get customised at runtime based on device config */
|
||||||
"Analogue 11", // 25
|
"Analogue 11", // 41 Input channel name place holders - Get customised at runtime based on device config */
|
||||||
"Analogue 12", // 26
|
"Analogue 12", // 42 Input channel name place holders - Get customised at runtime based on device config */
|
||||||
"Analogue 13", // 27
|
"Analogue 13", // 43 Input channel name place holders - Get customised at runtime based on device config */
|
||||||
"Analogue 14", // 28
|
"Analogue 14", // 44 Input channel name place holders - Get customised at runtime based on device config */
|
||||||
"Analogue 15", // 29
|
"Analogue 15", // 45 Input channel name place holders - Get customised at runtime based on device config */
|
||||||
"Analogue 16", // 30
|
"Analogue 16", // 46 Input channel name place holders - Get customised at runtime based on device config */
|
||||||
"Analogue 17", // 31
|
"Analogue 17", // 47 Input channel name place holders - Get customised at runtime based on device config */
|
||||||
"Analogue 18", // 32
|
"Analogue 18", // 48 Input channel name place holders - Get customised at runtime based on device config */
|
||||||
|
|
||||||
"Analogue 1", // 33 Input channel name place holders - Get customised at runtime based on device config */
|
"Mixer Out 1", // 49/* Mixer output names */
|
||||||
"Analogue 2", // 34 Input channel name place holders - Get customised at runtime based on device config */
|
"Mixer Out 2", // 50 /* Mixer output names */
|
||||||
"Analogue 3", // 35 Input channel name place holders - Get customised at runtime based on device config */
|
"Mixer Out 3", // 51 /* Mixer output names */
|
||||||
"Analogue 4", // 36 Input channel name place holders - Get customised at runtime based on device config */
|
"Mixer Out 4", // 52 /* Mixer output names */
|
||||||
"Analogue 5", // 37 Input channel name place holders - Get customised at runtime based on device config */
|
"Mixer Out 5", // 53 /* Mixer output names */
|
||||||
"Analogue 6", // 38 Input channel name place holders - Get customised at runtime based on device config */
|
"Mixer Out 6", // 54 /* Mixer output names */
|
||||||
"Analogue 7", // 39 Input channel name place holders - Get customised at runtime based on device config */
|
"Mixer Out 7", // 55 /* Mixer output names */
|
||||||
"Analogue 8", // 40 Input channel name place holders - Get customised at runtime based on device config */
|
"Mixer Out 8", // 56 /* Mixer output names */
|
||||||
"Analogue 9", // 41 Input channel name place holders - Get customised at runtime based on device config */
|
"iAP Interface", // 57 /* Required name for iAP interface */
|
||||||
"Analogue 10", // 42 Input channel name place holders - Get customised at runtime based on device config */
|
|
||||||
"Analogue 11", // 43 Input channel name place holders - Get customised at runtime based on device config */
|
|
||||||
"Analogue 12", // 44 Input channel name place holders - Get customised at runtime based on device config */
|
|
||||||
"Analogue 13", // 45 Input channel name place holders - Get customised at runtime based on device config */
|
|
||||||
"Analogue 14", // 46 Input channel name place holders - Get customised at runtime based on device config */
|
|
||||||
"Analogue 15", // 47 Input channel name place holders - Get customised at runtime based on device config */
|
|
||||||
"Analogue 16", // 48 Input channel name place holders - Get customised at runtime based on device config */
|
|
||||||
"Analogue 17", // 49 Input channel name place holders - Get customised at runtime based on device config */
|
|
||||||
"Analogue 18", // 50 Input channel name place holders - Get customised at runtime based on device config */
|
|
||||||
|
|
||||||
"Mixer Out 1", // 51/* Mixer output names */
|
|
||||||
"Mixer Out 2", // 52 /* Mixer output names */
|
|
||||||
"Mixer Out 3", // 53 /* Mixer output names */
|
|
||||||
"Mixer Out 4", // 54 /* Mixer output names */
|
|
||||||
"Mixer Out 5", // 55 /* Mixer output names */
|
|
||||||
"Mixer Out 6", // 56 /* Mixer output names */
|
|
||||||
"Mixer Out 7", // 57 /* Mixer output names */
|
|
||||||
"Mixer Out 8", // 58 /* Mixer output names */
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Configuration Descriptor for Null device */
|
/* Configuration Descriptor for Null device */
|
||||||
@@ -1235,7 +1210,7 @@ unsigned char cfgDesc_Null[] =
|
|||||||
#else
|
#else
|
||||||
128,
|
128,
|
||||||
#endif
|
#endif
|
||||||
250, /* 8 bMaxPower */
|
1, /* 8 bMaxPower */
|
||||||
|
|
||||||
0x09, /* 0 bLength : Size of this descriptor, in bytes. (field size 1 bytes) */
|
0x09, /* 0 bLength : Size of this descriptor, in bytes. (field size 1 bytes) */
|
||||||
0x04, /* 1 bDescriptorType : INTERFACE descriptor. (field size 1 bytes) */
|
0x04, /* 1 bDescriptorType : INTERFACE descriptor. (field size 1 bytes) */
|
||||||
@@ -1282,7 +1257,7 @@ unsigned char oSpeedCfgDesc[] =
|
|||||||
#define STREAMING_INTERFACES (INPUT_INTERFACES + OUTPUT_INTERFACES)
|
#define STREAMING_INTERFACES (INPUT_INTERFACES + OUTPUT_INTERFACES)
|
||||||
|
|
||||||
|
|
||||||
#define CFG_TOTAL_LENGTH_A1 (18 + AC_TOTAL_LENGTH + (INPUT_INTERFACES * 61) + (OUTPUT_INTERFACES * 70) + (DFU_INTERFACES * 18))
|
#define CFG_TOTAL_LENGTH_A1 (18 + AC_TOTAL_LENGTH + (INPUT_INTERFACES * 61) + (OUTPUT_INTERFACES * 70) + (DFU_INTERFACES * 16))
|
||||||
#ifdef AUDIO_CLASS_FALLBACK
|
#ifdef AUDIO_CLASS_FALLBACK
|
||||||
unsigned char cfgDesc_Audio1[] =
|
unsigned char cfgDesc_Audio1[] =
|
||||||
{
|
{
|
||||||
@@ -1299,7 +1274,7 @@ unsigned char cfgDesc_Audio1[] =
|
|||||||
0x00, /* Unused */
|
0x00, /* Unused */
|
||||||
#ifdef SELF_POWERED
|
#ifdef SELF_POWERED
|
||||||
192, /* 7 bmAttributes */
|
192, /* 7 bmAttributes */
|
||||||
5, /* 8 bMaxPower */
|
1, /* 8 bMaxPower */
|
||||||
#else
|
#else
|
||||||
128, /* 7 bmAttributes */
|
128, /* 7 bmAttributes */
|
||||||
250, /* 8 bMaxPower */
|
250, /* 8 bMaxPower */
|
||||||
@@ -1561,19 +1536,19 @@ unsigned char cfgDesc_Audio1[] =
|
|||||||
0x00, 0x00, /* Unused */
|
0x00, 0x00, /* Unused */
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef DFU
|
||||||
/* Standard DFU class Interface descriptor */
|
/* Standard DFU class Interface descriptor */
|
||||||
0x09, /* 0 bLength : Size of this descriptor, in bytes. (field size 1 bytes) */
|
0x09, /* 0 bLength : Size of this descriptor, in bytes. (field size 1 bytes) */
|
||||||
0x04, /* 1 bDescriptorType : INTERFACE descriptor. (field size 1 bytes) */
|
0x04, /* 1 bDescriptorType : INTERFACE descriptor. (field size 1 bytes) */
|
||||||
(INPUT_INTERFACES+OUTPUT_INTERFACES+1), /* 2 bInterfaceNumber : Index of this interface. (field size 1 bytes) */
|
(INPUT_INTERFACES+OUTPUT_INTERFACES+1), /* 2 bInterfaceNumber : Index of this interface. (field size 1 bytes) */
|
||||||
0x00, /* 3 bAlternateSetting : Index of this setting. (field size 1 bytes) */
|
0x00, /* 3 bAlternateSetting : Index of this setting. (field size 1 bytes) */
|
||||||
0x00, /* 4 bNumEndpoints : 0 endpoints. (field size 1 bytes) */
|
0x00, /* 4 bNumEndpoints : 0 endpoints. (field size 1 bytes) */
|
||||||
0xFE, /* 5 bInterfaceClass : DFU. (field size 1 bytes) */
|
0xFE, /* 5 bInterfaceClass : DFU. (field size 1 bytes) */
|
||||||
0x01, /* 6 bInterfaceSubclass : (field size 1 bytes) */
|
0x01, /* 6 bInterfaceSubclass : (field size 1 bytes) */
|
||||||
0x01, /* 7 bInterfaceProtocol : Unused. (field size 1 bytes) */
|
0x00, /* 7 bInterfaceProtocol : Unused. (field size 1 bytes) */
|
||||||
8, /* 8 iInterface : Unused. (field size 1 bytes) */
|
0x08, /* 8 iInterface : Unused. (field size 1 bytes) */
|
||||||
|
|
||||||
#if 0
|
/* Standard DFU class functional descriptor */
|
||||||
/* DFU 1.0 Run-Time DFU Functional Descriptor */
|
|
||||||
0x07,
|
0x07,
|
||||||
0x21,
|
0x21,
|
||||||
0x07,
|
0x07,
|
||||||
@@ -1581,18 +1556,6 @@ unsigned char cfgDesc_Audio1[] =
|
|||||||
0x00,
|
0x00,
|
||||||
0x40,
|
0x40,
|
||||||
0x00
|
0x00
|
||||||
#else
|
|
||||||
/* DFU 1.1 Run-Time DFU Functional Descriptor */
|
|
||||||
0x09, /* 0 Size */
|
|
||||||
0x21, /* 1 bDescriptorType : DFU FUNCTIONAL */
|
|
||||||
0x07, /* 2 bmAttributes */
|
|
||||||
0xFA, /* 3 wDetachTimeOut */
|
|
||||||
0x00, /* 4 wDetachTimeOut */
|
|
||||||
0x40, /* 5 wTransferSize */
|
|
||||||
0x00, /* 6 wTransferSize */
|
|
||||||
0x10, /* 7 bcdDFUVersion */
|
|
||||||
0x01, /* 7 bcdDFUVersion */
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
#include "vendorrequests.h"
|
#include "vendorrequests.h"
|
||||||
#include "dfu_types.h"
|
#include "dfu_types.h"
|
||||||
|
|
||||||
/* Windows does not have a built in DFU driver (windows will prompt), so warn that DFU will not be functional in Audio 1.0 mode.Udi
|
/* Windows does not have a built in DFU driver (windows will prompt), so warn that DFU will not be functional in Audio 1.0 mode.
|
||||||
* Of course, OSX is unaffected.
|
* Of course, OSX is unaffected.
|
||||||
*/
|
*/
|
||||||
#if ((AUDIO_CLASS==1) || defined(AUDIO_CLASS_FALLBACK)) && defined(DFU)
|
#if ((AUDIO_CLASS==1) || defined(AUDIO_CLASS_FALLBACK)) && defined(DFU)
|
||||||
@@ -63,18 +63,17 @@ int volsIn[NUM_USB_CHAN_IN + 1];
|
|||||||
unsigned int mutesIn[NUM_USB_CHAN_IN + 1];
|
unsigned int mutesIn[NUM_USB_CHAN_IN + 1];
|
||||||
//unsigned int multIn[NUM_USB_CHAN_IN + 1];
|
//unsigned int multIn[NUM_USB_CHAN_IN + 1];
|
||||||
|
|
||||||
|
#ifdef MIXER
|
||||||
unsigned char mixer1Crossbar[18];
|
unsigned char mixer1Crossbar[18];
|
||||||
short mixer1Weights[18*8];
|
short mixer1Weights[18*8];
|
||||||
//#define MAX_MIX_COUNT 8
|
//#define MAX_MIX_COUNT 8
|
||||||
|
|
||||||
unsigned char channelMap[NUM_USB_CHAN_OUT + NUM_USB_CHAN_IN + MAX_MIX_COUNT];
|
unsigned char channelMap[NUM_USB_CHAN_OUT + NUM_USB_CHAN_IN + MAX_MIX_COUNT];
|
||||||
#if NUM_USB_CHAN_OUT > 0
|
|
||||||
unsigned char channelMapAud[NUM_USB_CHAN_OUT];
|
unsigned char channelMapAud[NUM_USB_CHAN_OUT];
|
||||||
#endif
|
|
||||||
#if NUM_USB_CHAN_IN > 0
|
|
||||||
unsigned char channelMapUsb[NUM_USB_CHAN_IN];
|
unsigned char channelMapUsb[NUM_USB_CHAN_IN];
|
||||||
#endif
|
|
||||||
unsigned char mixSel[MIX_INPUTS];
|
unsigned char mixSel[MIX_INPUTS];
|
||||||
|
#endif
|
||||||
|
|
||||||
int min(int x, int y);
|
int min(int x, int y);
|
||||||
|
|
||||||
@@ -161,6 +160,7 @@ void Endpoint0( chanend c_ep0_out, chanend c_ep0_in, chanend c_audioControl, cha
|
|||||||
mutesIn[i] = 0;
|
mutesIn[i] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef MIXER
|
||||||
/* Set up mixer default state */
|
/* Set up mixer default state */
|
||||||
for (int i = 0; i < 18*8; i++) {
|
for (int i = 0; i < 18*8; i++) {
|
||||||
mixer1Weights[i] = 0x8001; //-inf
|
mixer1Weights[i] = 0x8001; //-inf
|
||||||
@@ -176,20 +176,17 @@ void Endpoint0( chanend c_ep0_out, chanend c_ep0_in, chanend c_audioControl, cha
|
|||||||
mixer1Weights[54] = 0;
|
mixer1Weights[54] = 0;
|
||||||
mixer1Weights[63] = 0;
|
mixer1Weights[63] = 0;
|
||||||
|
|
||||||
#if NUM_USB_CHAN_OUT > 0
|
|
||||||
/* Setup up audio output channel mapping */
|
/* Setup up audio output channel mapping */
|
||||||
for(int i = 0; i < NUM_USB_CHAN_OUT; i++)
|
for(int i = 0; i < NUM_USB_CHAN_OUT; i++)
|
||||||
{
|
{
|
||||||
channelMapAud[i] = i;
|
channelMapAud[i] = i;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
#if NUM_USB_CHAN_IN > 0
|
|
||||||
for(int i = 0; i < NUM_USB_CHAN_IN; i++)
|
for(int i = 0; i < NUM_USB_CHAN_IN; i++)
|
||||||
{
|
{
|
||||||
channelMapUsb[i] = i + NUM_USB_CHAN_OUT;
|
channelMapUsb[i] = i + NUM_USB_CHAN_OUT;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Set up channel mapping default */
|
/* Set up channel mapping default */
|
||||||
for (int i = 0; i < NUM_USB_CHAN_OUT + NUM_USB_CHAN_IN; i++)
|
for (int i = 0; i < NUM_USB_CHAN_OUT + NUM_USB_CHAN_IN; i++)
|
||||||
@@ -210,6 +207,7 @@ void Endpoint0( chanend c_ep0_out, chanend c_ep0_in, chanend c_audioControl, cha
|
|||||||
{
|
{
|
||||||
mixSel[i] = i;
|
mixSel[i] = i;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Copy langIDs string desc into string[0] */
|
/* Copy langIDs string desc into string[0] */
|
||||||
/* TODO: Macro? */
|
/* TODO: Macro? */
|
||||||
@@ -221,33 +219,33 @@ void Endpoint0( chanend c_ep0_out, chanend c_ep0_in, chanend c_audioControl, cha
|
|||||||
/* Build up channel string table - By default all channels are marked as analogue
|
/* Build up channel string table - By default all channels are marked as analogue
|
||||||
* TODO We really want to do this an build time... */
|
* TODO We really want to do this an build time... */
|
||||||
#if defined(SPDIF_RX) && (SPDIF_RX_INDEX != 0)
|
#if defined(SPDIF_RX) && (SPDIF_RX_INDEX != 0)
|
||||||
safestrcpy(strDescs_Audio2[SPDIF_RX_INDEX + 33], "S/PDIF 1");
|
safestrcpy(strDescs_Audio2[SPDIF_RX_INDEX + 31], "S/PDIF 1");
|
||||||
safestrcpy(strDescs_Audio2[SPDIF_RX_INDEX + 34], "S/PDIF 2");
|
safestrcpy(strDescs_Audio2[SPDIF_RX_INDEX + 32], "S/PDIF 2");
|
||||||
#endif
|
#endif
|
||||||
#if defined(ADAT_RX) && (ADAT_RX_INDEX != 0)
|
#if defined(ADAT_RX) && (ADAT_RX_INDEX != 0)
|
||||||
safestrcpy(strDescs_Audio2[ADAT_RX_INDEX + 33], "ADAT 1");
|
safestrcpy(strDescs_Audio2[ADAT_RX_INDEX + 31], "ADAT 1");
|
||||||
safestrcpy(strDescs_Audio2[ADAT_RX_INDEX + 34], "ADAT 2");
|
safestrcpy(strDescs_Audio2[ADAT_RX_INDEX + 32], "ADAT 2");
|
||||||
safestrcpy(strDescs_Audio2[ADAT_RX_INDEX + 35], "ADAT 3");
|
safestrcpy(strDescs_Audio2[ADAT_RX_INDEX + 33], "ADAT 3");
|
||||||
safestrcpy(strDescs_Audio2[ADAT_RX_INDEX + 36], "ADAT 4");
|
safestrcpy(strDescs_Audio2[ADAT_RX_INDEX + 34], "ADAT 4");
|
||||||
safestrcpy(strDescs_Audio2[ADAT_RX_INDEX + 37], "ADAT 5");
|
safestrcpy(strDescs_Audio2[ADAT_RX_INDEX + 35], "ADAT 5");
|
||||||
safestrcpy(strDescs_Audio2[ADAT_RX_INDEX + 38], "ADAT 6");
|
safestrcpy(strDescs_Audio2[ADAT_RX_INDEX + 36], "ADAT 6");
|
||||||
safestrcpy(strDescs_Audio2[ADAT_RX_INDEX + 39], "ADAT 7");
|
safestrcpy(strDescs_Audio2[ADAT_RX_INDEX + 37], "ADAT 7");
|
||||||
safestrcpy(strDescs_Audio2[ADAT_RX_INDEX + 40], "ADAT 8");
|
safestrcpy(strDescs_Audio2[ADAT_RX_INDEX + 38], "ADAT 8");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(SPDIF) && (SPDIF_TX_INDEX != 0) /* "Analogue naming gets priority */
|
#if defined(SPDIF) && (SPDIF_TX_INDEX != 0) /* "Analogue naming gets priority */
|
||||||
safestrcpy(strDescs_Audio2[SPDIF_TX_INDEX + 15], "S/PDIF 1");
|
safestrcpy(strDescs_Audio2[SPDIF_TX_INDEX + 13], "S/PDIF 1");
|
||||||
safestrcpy(strDescs_Audio2[SPDIF_TX_INDEX + 16], "S/PDIF 2");
|
safestrcpy(strDescs_Audio2[SPDIF_TX_INDEX + 14], "S/PDIF 2");
|
||||||
#endif
|
#endif
|
||||||
#if defined(ADAT_TX) && (ADAT_TX_INDEX != 0)
|
#if defined(ADAT_TX) && (ADAT_TX_INDEX != 0)
|
||||||
safestrcpy(strDescs_Audio2[ADAT_TX_INDEX + 15], "ADAT 1");
|
safestrcpy(strDescs_Audio2[ADAT_TX_INDEX + 13], "ADAT 1");
|
||||||
safestrcpy(strDescs_Audio2[ADAT_TX_INDEX + 16], "ADAT 2");
|
safestrcpy(strDescs_Audio2[ADAT_TX_INDEX + 14], "ADAT 2");
|
||||||
safestrcpy(strDescs_Audio2[ADAT_TX_INDEX + 17], "ADAT 3");
|
safestrcpy(strDescs_Audio2[ADAT_TX_INDEX + 15], "ADAT 3");
|
||||||
safestrcpy(strDescs_Audio2[ADAT_TX_INDEX + 18], "ADAT 4");
|
safestrcpy(strDescs_Audio2[ADAT_TX_INDEX + 16], "ADAT 4");
|
||||||
safestrcpy(strDescs_Audio2[ADAT_TX_INDEX + 19], "ADAT 5");
|
safestrcpy(strDescs_Audio2[ADAT_TX_INDEX + 17], "ADAT 5");
|
||||||
safestrcpy(strDescs_Audio2[ADAT_TX_INDEX + 20], "ADAT 6");
|
safestrcpy(strDescs_Audio2[ADAT_TX_INDEX + 18], "ADAT 6");
|
||||||
safestrcpy(strDescs_Audio2[ADAT_TX_INDEX + 21], "ADAT 7");
|
safestrcpy(strDescs_Audio2[ADAT_TX_INDEX + 19], "ADAT 7");
|
||||||
safestrcpy(strDescs_Audio2[ADAT_TX_INDEX + 22], "ADAT 8");
|
safestrcpy(strDescs_Audio2[ADAT_TX_INDEX + 20], "ADAT 8");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef VENDOR_AUDIO_REQS
|
#ifdef VENDOR_AUDIO_REQS
|
||||||
@@ -492,6 +490,7 @@ void Endpoint0( chanend c_ep0_out, chanend c_ep0_in, chanend c_audioControl, cha
|
|||||||
// Handshake
|
// Handshake
|
||||||
//chkct(c_audioControl, XS1_CT_END);
|
//chkct(c_audioControl, XS1_CT_END);
|
||||||
|
|
||||||
|
//printint(8);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -730,7 +729,7 @@ void Endpoint0( chanend c_ep0_out, chanend c_ep0_in, chanend c_audioControl, cha
|
|||||||
device_reboot();
|
device_reboot();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* TODO we should not make the assumption that all DFU requests are handled */
|
/* TODO we should not make the assumtion that all DFU requests are handled */
|
||||||
retVal = 0;
|
retVal = 0;
|
||||||
}
|
}
|
||||||
/* Check for: Audio interface request - always 0, note we check for DFU first
|
/* Check for: Audio interface request - always 0, note we check for DFU first
|
||||||
@@ -739,7 +738,6 @@ void Endpoint0( chanend c_ep0_out, chanend c_ep0_in, chanend c_audioControl, cha
|
|||||||
|| (request == CLASS_ENDPOINT_REQUEST && ((interfaceNum == 0x82) || (interfaceNum == 0x01))))
|
|| (request == CLASS_ENDPOINT_REQUEST && ((interfaceNum == 0x82) || (interfaceNum == 0x01))))
|
||||||
{
|
{
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if (AUDIO_CLASS == 2) && defined(AUDIO_CLASS_FALLBACK)
|
#if (AUDIO_CLASS == 2) && defined(AUDIO_CLASS_FALLBACK)
|
||||||
if(g_curUsbSpeed == XUD_SPEED_HS)
|
if(g_curUsbSpeed == XUD_SPEED_HS)
|
||||||
{
|
{
|
||||||
@@ -772,6 +770,7 @@ void Endpoint0( chanend c_ep0_out, chanend c_ep0_in, chanend c_audioControl, cha
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
// TODO: STALL
|
||||||
//printstr("unrecognised request\n");
|
//printstr("unrecognised request\n");
|
||||||
//printhexln(sp.bRequest);
|
//printhexln(sp.bRequest);
|
||||||
//printhexln(sp.bmRequestType.Type);
|
//printhexln(sp.bmRequestType.Type);
|
||||||
@@ -793,8 +792,7 @@ void Endpoint0( chanend c_ep0_out, chanend c_ep0_in, chanend c_audioControl, cha
|
|||||||
transfer, and the STALL condition terminates at the beginning of the
|
transfer, and the STALL condition terminates at the beginning of the
|
||||||
next control transfer (Setup). The remainder of this section refers to
|
next control transfer (Setup). The remainder of this section refers to
|
||||||
the general case of a functional stall */
|
the general case of a functional stall */
|
||||||
XUD_SetStall_Out(0);
|
//XUD_ProtocolStall(ep0_out, ep0_in):
|
||||||
XUD_SetStall_In(0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (retVal < 0)
|
if (retVal < 0)
|
||||||
|
|||||||
@@ -1,4 +1,10 @@
|
|||||||
|
|
||||||
|
// Channel interface
|
||||||
|
void I2cRegWriteC(int deviceAdrs, int Adrs, int WrData, chanend c);
|
||||||
|
|
||||||
|
int I2cRegReadC(int deviceAdrs, int Adrs, chanend c);
|
||||||
|
|
||||||
|
// Function interface
|
||||||
void I2cRegWrite(int deviceAdrs, int Adrs, int WrData, port AUD_SCLK, port AUD_SDIN);
|
void I2cRegWrite(int deviceAdrs, int Adrs, int WrData, port AUD_SCLK, port AUD_SDIN);
|
||||||
|
|
||||||
int I2cRegRead(int deviceAdrs, int Adrs, port AUD_SCLK, port AUD_SDIN);
|
int I2cRegRead(int deviceAdrs, int Adrs, port AUD_SCLK, port AUD_SDIN);
|
||||||
|
|||||||
@@ -1,6 +1,28 @@
|
|||||||
#include <xs1.h>
|
#include <xs1.h>
|
||||||
#include <print.h>
|
#include <print.h>
|
||||||
|
|
||||||
|
int I2cRegReadC(int device, int addr, chanend c) {
|
||||||
|
int read;
|
||||||
|
int retVal;
|
||||||
|
c <: 0; // isWrite
|
||||||
|
c <: device;
|
||||||
|
c <: addr;
|
||||||
|
c <: 1; // only ever one byte
|
||||||
|
c :> read;
|
||||||
|
c :> retVal;
|
||||||
|
return read;
|
||||||
|
}
|
||||||
|
|
||||||
|
void I2cRegWriteC(int device, int addr, int data, chanend c) {
|
||||||
|
int retVal;
|
||||||
|
c <: 1; // isWrite
|
||||||
|
c <: device;
|
||||||
|
c <: addr;
|
||||||
|
c <: 1; // only ever one byte
|
||||||
|
c <: data;
|
||||||
|
c :> retVal;
|
||||||
|
}
|
||||||
|
|
||||||
int I2cRegRead(int device, int addr, port scl, port sda)
|
int I2cRegRead(int device, int addr, port scl, port sda)
|
||||||
{
|
{
|
||||||
//int Result;
|
//int Result;
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
void PllInit(void);
|
void PllInit(chanend c);
|
||||||
|
|
||||||
|
|
||||||
void PllMult(unsigned mult);
|
void PllMult(unsigned mult, chanend c);
|
||||||
|
|||||||
@@ -1,24 +1,6 @@
|
|||||||
/**
|
|
||||||
* Module: module_usb_aud_shared
|
|
||||||
* Version: 2v3
|
|
||||||
* Build: 920238b18f6b0967226369682640e1b063865f02
|
|
||||||
* File: decouple.xc
|
|
||||||
*
|
|
||||||
* The copyrights, all other intellectual and industrial
|
|
||||||
* property rights are retained by XMOS and/or its licensors.
|
|
||||||
* Terms and conditions covering the use of this code can
|
|
||||||
* be found in the Xmos End User License Agreement.
|
|
||||||
*
|
|
||||||
* Copyright XMOS Ltd 2010
|
|
||||||
*
|
|
||||||
* In the case where this code is a modification of existing code
|
|
||||||
* under a separate license, the separate license terms are shown
|
|
||||||
* below. The modifications to the code are still covered by the
|
|
||||||
* copyright notice above.
|
|
||||||
*
|
|
||||||
**/
|
|
||||||
#include <xs1.h>
|
#include <xs1.h>
|
||||||
#include <print.h>
|
#include <print.h>
|
||||||
|
#include <assert.h>
|
||||||
#include "xc_ptr.h"
|
#include "xc_ptr.h"
|
||||||
#define NO_INLINE_MIDI_SELECT_HANDLER 1
|
#define NO_INLINE_MIDI_SELECT_HANDLER 1
|
||||||
#include "usb_midi.h"
|
#include "usb_midi.h"
|
||||||
@@ -175,7 +157,7 @@ int int_usb_ep = 0;
|
|||||||
|
|
||||||
unsigned int g_midi_to_host_buffer_A[MAX_USB_MIDI_PACKET_SIZE/4+4];
|
unsigned int g_midi_to_host_buffer_A[MAX_USB_MIDI_PACKET_SIZE/4+4];
|
||||||
unsigned int g_midi_to_host_buffer_B[MAX_USB_MIDI_PACKET_SIZE/4+4];
|
unsigned int g_midi_to_host_buffer_B[MAX_USB_MIDI_PACKET_SIZE/4+4];
|
||||||
int g_midi_from_host_buffer[MAX_USB_MIDI_PACKET_SIZE+4];
|
int g_midi_from_host_buffer[MAX_USB_MIDI_PACKET_SIZE/4+4];
|
||||||
|
|
||||||
// shared global aud buffering variables
|
// shared global aud buffering variables
|
||||||
|
|
||||||
@@ -805,18 +787,12 @@ void decouple(chanend c_mix_out,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Reset OUT buffer state */
|
/* Reset OUT buffer state */
|
||||||
|
outOverflow = 0;
|
||||||
outUnderflow = 1;
|
outUnderflow = 1;
|
||||||
SET_SHARED_GLOBAL(g_aud_from_host_rdptr, aud_from_host_fifo_start);
|
SET_SHARED_GLOBAL(g_aud_from_host_rdptr, aud_from_host_fifo_start);
|
||||||
SET_SHARED_GLOBAL(g_aud_from_host_wrptr, aud_from_host_fifo_start);
|
SET_SHARED_GLOBAL(g_aud_from_host_wrptr, aud_from_host_fifo_start);
|
||||||
SET_SHARED_GLOBAL(aud_data_remaining_to_device, 0);
|
SET_SHARED_GLOBAL(aud_data_remaining_to_device, 0);
|
||||||
|
|
||||||
if(outOverflow)
|
|
||||||
{
|
|
||||||
XUD_SetReady(aud_from_host_usb_ep, 1);
|
|
||||||
outOverflow = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Wait for handshake back and pass back up */
|
/* Wait for handshake back and pass back up */
|
||||||
chkct(c_mix_out, XS1_CT_END);
|
chkct(c_mix_out, XS1_CT_END);
|
||||||
|
|
||||||
|
|||||||
@@ -19,7 +19,7 @@
|
|||||||
void buffer(chanend c_aud_out, chanend c_aud_in, chanend c_aud_fb,
|
void buffer(chanend c_aud_out, chanend c_aud_in, chanend c_aud_fb,
|
||||||
chanend c_midi_from_host,
|
chanend c_midi_from_host,
|
||||||
chanend c_midi_to_host,
|
chanend c_midi_to_host,
|
||||||
chanend c_int,
|
chanend? c_int,
|
||||||
chanend c_sof,
|
chanend c_sof,
|
||||||
chanend c_aud_ctl,
|
chanend c_aud_ctl,
|
||||||
in port p_off_mclk);
|
in port p_off_mclk);
|
||||||
|
|||||||
@@ -73,7 +73,7 @@ extern unsigned g_numUsbChanIn;
|
|||||||
void buffer(register chanend c_aud_out, register chanend c_aud_in, chanend c_aud_fb,
|
void buffer(register chanend c_aud_out, register chanend c_aud_in, chanend c_aud_fb,
|
||||||
chanend c_midi_from_host,
|
chanend c_midi_from_host,
|
||||||
chanend c_midi_to_host,
|
chanend c_midi_to_host,
|
||||||
chanend c_int, chanend c_sof,
|
chanend ?c_int, chanend c_sof,
|
||||||
chanend c_aud_ctl,
|
chanend c_aud_ctl,
|
||||||
in port p_off_mclk
|
in port p_off_mclk
|
||||||
)
|
)
|
||||||
@@ -85,7 +85,9 @@ void buffer(register chanend c_aud_out, register chanend c_aud_in, chanend c_aud
|
|||||||
XUD_ep ep_midi_from_host = XUD_Init_Ep(c_midi_from_host);
|
XUD_ep ep_midi_from_host = XUD_Init_Ep(c_midi_from_host);
|
||||||
XUD_ep ep_midi_to_host = XUD_Init_Ep(c_midi_to_host);
|
XUD_ep ep_midi_to_host = XUD_Init_Ep(c_midi_to_host);
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(SPDIF_RX) || defined(ADAT_RX)
|
||||||
XUD_ep ep_int = XUD_Init_Ep(c_int);
|
XUD_ep ep_int = XUD_Init_Ep(c_int);
|
||||||
|
#endif
|
||||||
|
|
||||||
unsigned datalength;
|
unsigned datalength;
|
||||||
unsigned tmp;
|
unsigned tmp;
|
||||||
@@ -116,7 +118,9 @@ void buffer(register chanend c_aud_out, register chanend c_aud_in, chanend c_aud
|
|||||||
|
|
||||||
set_thread_fast_mode_on();
|
set_thread_fast_mode_on();
|
||||||
|
|
||||||
|
#if defined(SPDIF_RX) || defined(ADAT_RX)
|
||||||
asm("stw %0, dp[int_usb_ep]"::"r"(ep_int));
|
asm("stw %0, dp[int_usb_ep]"::"r"(ep_int));
|
||||||
|
#endif
|
||||||
asm("stw %0, dp[aud_from_host_usb_ep]"::"r"(ep_aud_out));
|
asm("stw %0, dp[aud_from_host_usb_ep]"::"r"(ep_aud_out));
|
||||||
asm("stw %0, dp[aud_to_host_usb_ep]"::"r"(ep_aud_in));
|
asm("stw %0, dp[aud_to_host_usb_ep]"::"r"(ep_aud_in));
|
||||||
asm("stw %0, dp[buffer_aud_ctl_chan]"::"r"(c_aud_ctl));
|
asm("stw %0, dp[buffer_aud_ctl_chan]"::"r"(c_aud_ctl));
|
||||||
@@ -195,6 +199,7 @@ void buffer(register chanend c_aud_out, register chanend c_aud_in, chanend c_aud
|
|||||||
/* Wait for response from XUD and service relevant EP */
|
/* Wait for response from XUD and service relevant EP */
|
||||||
select
|
select
|
||||||
{
|
{
|
||||||
|
#if defined(SPDIF_RX) || defined(ADAT_RX)
|
||||||
/* Interrupt EP, send back interrupt data. Note, request made from decouple */
|
/* Interrupt EP, send back interrupt data. Note, request made from decouple */
|
||||||
case inuint_byref(c_int, tmp):
|
case inuint_byref(c_int, tmp):
|
||||||
{
|
{
|
||||||
@@ -221,6 +226,7 @@ void buffer(register chanend c_aud_out, register chanend c_aud_in, chanend c_aud
|
|||||||
XUD_SetNotReady(ep_int);
|
XUD_SetNotReady(ep_int);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Sample Freq our chan count update from ep 0 */
|
/* Sample Freq our chan count update from ep 0 */
|
||||||
case inuint_byref(c_aud_ctl, tmp):
|
case inuint_byref(c_aud_ctl, tmp):
|
||||||
|
|||||||
Reference in New Issue
Block a user