Description
Source
Call Graph
Start Line: 981
int main()
{
TRACE_CONFIGURE(DBGU_STANDARD, 115200, BOARD_MCK);
printf("-- USB Composite Device Project %s --\n\r", SOFTPACK_VERSION);
printf("-- %s\n\r", BOARD_NAME);
printf("-- Compiled: %s %s --\n\r", __DATE__, __TIME__);
#if defined(at91sam9260)
// Switch to slow clock oscillator
AT91C_BASE_PMC->PMC_MCKR = (AT91C_BASE_PMC->PMC_MCKR & ~AT91C_PMC_CSS)
| AT91C_PMC_CSS_SLOW_CLK;
while ((AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY) != AT91C_PMC_MCKRDY);
// Configure PLLA at 147.456MHz
AT91C_BASE_PMC->PMC_PLLAR = 0x20073F01;
while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_LOCKA));
// Switch to slow clock + prescaler
AT91C_BASE_PMC->PMC_MCKR = AT91C_PMC_MDIV_2;
while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY));
// Switch to PLL + prescaler
AT91C_BASE_PMC->PMC_MCKR |= AT91C_PMC_CSS_PLLA_CLK;
while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY));
// Enable the DAC master clock
AT91C_BASE_PMC->PMC_PCKR[0] = AT91C_PMC_CSS_PLLA_CLK
| AT91C_PMC_PRES_CLK_8;
AT91C_BASE_PMC->PMC_SCER = AT91C_PMC_PCK0;
while ((AT91C_BASE_PMC->PMC_SR & AT91C_PMC_PCK0RDY) == 0);
#else
NormalPowerMode();
#endif
TRACE_CONFIGURE(DBGU_STANDARD, 115200, MCK);
// If they are present, configure Vbus & Wake-up pins
PIO_InitializeInterrupts(0);
// ----- CDC Function Initialize
// Configure USART
PIO_Configure(pinsUsart, PIO_LISTSIZE(pinsUsart));
AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_US0;
AT91C_BASE_US0->US_IDR = 0xFFFFFFFF;
USART_Configure(AT91C_BASE_US0,
USART_MODE_ASYNCHRONOUS,
115200,
MCK);
USART_SetTransmitterEnabled(AT91C_BASE_US0, 1);
USART_SetReceiverEnabled(AT91C_BASE_US0, 1);
AIC_ConfigureIT(AT91C_ID_US0, 0, ISR_Usart0);
AIC_EnableIT(AT91C_ID_US0);
// Configure timer 0
AT91C_BASE_PMC->PMC_PCER = (1 << AT91C_ID_TC0);
AT91C_BASE_TC0->TC_CCR = AT91C_TC_CLKDIS;
AT91C_BASE_TC0->TC_IDR = 0xFFFFFFFF;
AT91C_BASE_TC0->TC_CMR = AT91C_TC_CLKS_TIMER_DIV5_CLOCK
| AT91C_TC_CPCSTOP
| AT91C_TC_CPCDIS
| AT91C_TC_WAVESEL_UP_AUTO
| AT91C_TC_WAVE;
AT91C_BASE_TC0->TC_RC = 0x00FF;
AT91C_BASE_TC0->TC_IER = AT91C_TC_CPCS;
AIC_ConfigureIT(AT91C_ID_TC0, 0, ISR_Timer0);
AIC_EnableIT(AT91C_ID_TC0);
// ----- AUDIO Function Initialize
// Initialize all PIOs
PIO_Configure(pinsAud, PIO_LISTSIZE(pinsAud));
// Configure and enable the SPI (required for accessing the DAC)
SPI_Configure(BOARD_AT73C213_SPI,
BOARD_AT73C213_SPI_ID,
SPI_CONFIGURATION);
SPI_Enable(BOARD_AT73C213_SPI);
// Initialize the audio DAC
// Configure and enable the DAC
AT73C213_Enable(AUDD_SAMPLERATE,
AUDD_BYTESPERSAMPLE,
AUDD_NUMCHANNELS,
1, // MCK = 384 * Fs
MCK);
// Configure and enable the SSC interrupt
AIC_ConfigureIT(BOARD_AT73C213_SSC_ID,
AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL | SSC_PRIORITY,
ISR_SSC);
AIC_EnableIT(BOARD_AT73C213_SSC_ID);
// USB COMPOSITE driver initialization
COMPOSITEDDriver_Initialize();
// connect if needed
VBUS_CONFIGURE();
// Driver loop
while (1) {
// Device is not configured
if (USBD_GetState() < USBD_STATE_CONFIGURED) {
// Connect pull-up, wait for configuration
USBD_Connect();
while (USBD_GetState() < USBD_STATE_CONFIGURED);
// Start receiving data on the USART
usartCurrentBuffer = 0;
USART_ReadBuffer(AT91C_BASE_US0, usartBuffers[0], DATABUFFERSIZE);
USART_ReadBuffer(AT91C_BASE_US0, usartBuffers[1], DATABUFFERSIZE);
AT91C_BASE_US0->US_IER = AT91C_US_ENDRX
| AT91C_US_FRAME
| AT91C_US_OVER;
AT91C_BASE_TC0->TC_CCR = AT91C_TC_CLKEN | AT91C_TC_SWTRG;
// Start receiving data on the USB
CDCDSerialDriver_Read(0, usbSerialBuffer0,
DATABUFFERSIZE,
(TransferCallback) UsbDataReceived0,
0);
}
else {
// Read the incoming audio stream
AUDDSpeakerDriver_Read(usbAudBuffers[inBufferIndex],
AUDD_BYTESPERFRAME,
(TransferCallback) FrameReceived,
0); // No optional argument
}
if( USBState == STATE_SUSPEND ) {
TRACE_DEBUG("suspend !\n\r");
LowPowerMode();
USBState = STATE_IDLE;
}
if( USBState == STATE_RESUME ) {
// Return in normal MODE
TRACE_DEBUG("resume !\n\r");
NormalPowerMode();
USBState = STATE_IDLE;
}
}
}