Main() now makes calls to two funcions (with their own pars). Also added USER_MAIN_DECLARIONS and USER_MAIN_CORES

This commit is contained in:
Ross Owen
2013-11-29 12:36:14 +00:00
parent edca022c50
commit 3d92d4b79f

View File

@@ -182,6 +182,7 @@ XUD_EpType epTypeTableIn[EP_CNT_IN] = { XUD_EPTYPE_CTL | XUD_STATUS_ENABLE,
#endif #endif
}; };
void thread_speed() void thread_speed()
{ {
#ifdef FAST_MODE #ifdef FAST_MODE
@@ -207,74 +208,52 @@ void xscope_user_init()
#define pwrConfig XUD_PWR_BUS #define pwrConfig XUD_PWR_BUS
#endif #endif
/* Core USB Audio functions - must be called on the Tile connected to the USB Phy */
int main() void usb_audio_core(chanend c_mix_out)
{ {
chan c_sof; chan c_sof;
chan c_xud_out[EP_CNT_OUT]; /* Endpoint channels for XUD */ chan c_xud_out[EP_CNT_OUT]; /* Endpoint channels for XUD */
chan c_xud_in[EP_CNT_IN]; chan c_xud_in[EP_CNT_IN];
chan c_aud_ctl; chan c_aud_ctl;
chan c_mix_out;
#ifdef MIDI
chan c_midi;
#endif
#ifdef IAP
chan c_iap;
#endif
#ifdef TEST_MODE_SUPPORT #ifdef TEST_MODE_SUPPORT
#warning Building with test mode support #warning Building with test mode support
chan c_usb_test; chan c_usb_test;
#else #else
#define c_usb_test null #define c_usb_test null
#endif #endif
#ifdef SU1_ADC_ENABLE
chan c_adc;
#else
#define c_adc null
#endif
#ifdef CHAN_BUFF_CTRL #ifdef CHAN_BUFF_CTRL
#warning Using channel to control buffering - this may reduce performance but improve power consumption #warning Using channel to control buffering - this may reduce performance but improve power consumption
chan c_buff_ctrl; chan c_buff_ctrl;
#endif #endif
par par
{ {
/* USB Interface Core */
/* USB Interface */
#if (AUDIO_CLASS==2) #if (AUDIO_CLASS==2)
on tile[0]: XUD_Manager(c_xud_out, EP_CNT_OUT, c_xud_in, EP_CNT_IN, XUD_Manager(c_xud_out, EP_CNT_OUT, c_xud_in, EP_CNT_IN,
c_sof, epTypeTableOut, epTypeTableIn, p_usb_rst, c_sof, epTypeTableOut, epTypeTableIn, p_usb_rst,
clk, 1, XUD_SPEED_HS, c_usb_test, pwrConfig); clk, 1, XUD_SPEED_HS, c_usb_test, pwrConfig);
#else #else
on tile[0]:XUD_Manager(c_xud_out, EP_CNT_OUT, c_xud_in, EP_CNT_IN, XUD_Manager(c_xud_out, EP_CNT_OUT, c_xud_in, EP_CNT_IN,
c_sof, epTypeTableOut, epTypeTableIn, p_usb_rst, c_sof, epTypeTableOut, epTypeTableIn, p_usb_rst,
clk, 1, XUD_SPEED_FS, c_usb_test, pwrConfig); clk, 1, XUD_SPEED_FS, c_usb_test, pwrConfig);
#endif #endif
on tile[0]: /* USB Packet buffering Core */
{ {
unsigned x;
thread_speed(); thread_speed();
/* Attach mclk count port to mclk clock-block (for feedback) */ /* Attach mclk count port to mclk clock-block (for feedback) */
//set_port_clock(p_for_mclk_count, clk_audio_mclk); //set_port_clock(p_for_mclk_count, clk_audio_mclk);
{
unsigned x;
#if(AUDIO_IO_TILE != 0) #if(AUDIO_IO_TILE != 0)
set_clock_src(clk_audio_mclk2, p_mclk_in2); set_clock_src(clk_audio_mclk2, p_mclk_in2);
set_port_clock(p_for_mclk_count, clk_audio_mclk2); set_port_clock(p_for_mclk_count, clk_audio_mclk2);
start_clock(clk_audio_mclk2); start_clock(clk_audio_mclk2);
#else #else
/* Uses same clock-block as I2S */ /* Uses same clock-block as I2S */
asm("ldw %0, dp[clk_audio_mclk]":"=r"(x)); asm("ldw %0, dp[clk_audio_mclk]":"=r"(x));
asm("setclk res[%0], %1"::"r"(p_for_mclk_count), "r"(x)); asm("setclk res[%0], %1"::"r"(p_for_mclk_count), "r"(x));
#endif #endif
}
buffer(c_xud_out[EP_NUM_OUT_AUD],/* Audio Out*/ buffer(c_xud_out[EP_NUM_OUT_AUD],/* Audio Out*/
c_xud_in[EP_NUM_IN_AUD], /* Audio In */ c_xud_in[EP_NUM_IN_AUD], /* Audio In */
c_xud_in[EP_NUM_IN_FB], /* Audio FB */ c_xud_in[EP_NUM_IN_FB], /* Audio FB */
@@ -297,38 +276,39 @@ int main()
#ifdef CHAN_BUFF_CTRL #ifdef CHAN_BUFF_CTRL
, c_buff_ctrl , c_buff_ctrl
#endif #endif
);
}
on tile[AUDIO_IO_TILE]:
{
thread_speed();
/* Audio I/O (pars additional S/PDIF TX thread) */
audio(c_mix_out, null, null, c_adc);
}
on tile[0]:
{
thread_speed();
decouple(c_mix_out, null
#ifdef CHAN_BUFF_CTRL
, c_buff_ctrl
#endif
); );
} }
/* Endpoint 0 */ /* Endpoint 0 Core */
on tile[0]:
{ {
thread_speed(); thread_speed();
Endpoint0( c_xud_out[0], c_xud_in[0], c_aud_ctl, null, null, c_usb_test); Endpoint0( c_xud_out[0], c_xud_in[0], c_aud_ctl, null, null, c_usb_test);
} }
/* Decoupling core */
{
thread_speed();
decouple(c_mix_out, null
#ifdef CHAN_BUFF_CTRL
, c_buff_ctrl
#endif
);
}
}
}
void usb_audio_io(chanend c_mix_out, chanend ?c_adc)
{
par
{
/* Audio I/O Core (pars additional S/PDIF TX Core) */
{
thread_speed();
audio(c_mix_out, null, null, c_adc);
}
/* MIDI/iAP Core */
#if defined (MIDI) || defined IAP #if defined (MIDI) || defined IAP
on tile[AUDIO_IO_TILE]:
{ {
thread_speed(); thread_speed();
#ifdef MIDI #ifdef MIDI
@@ -339,15 +319,49 @@ int main()
} }
#endif #endif
}
}
#ifndef USER_MAIN_DECLARATIONS
#define USER_MAIN_DECLARATIONS
#endif
#ifndef USER_MAIN_CORES
#define USER_MAIN_CORES
#endif
/* Main for USB Audio Applications */
int main()
{
chan c_mix_out;
#ifdef MIDI
chan c_midi;
#endif
#ifdef IAP
chan c_iap;
#endif
#ifdef SU1_ADC_ENABLE
chan c_adc;
#else
#define c_adc null
#endif
USER_MAIN_DECLARATIONS
par
{
on tile[XUD_TILE]: usb_audio_core(c_mix_out);
on tile[AUDIO_IO_TILE]: usb_audio_io(c_mix_out, c_adc);
USER_MAIN_CORES
}
#ifdef SU1_ADC_ENABLE #ifdef SU1_ADC_ENABLE
xs1_su_adc_service(c_adc); xs1_su_adc_service(c_adc);
#endif #endif
}
return 0; return 0;
} }