00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101 #include "board.h"
00102
00103 #include "USBD_LEDs.h"
00104 #include "USBD_Config.h"
00105
00106 #include "AUDDSpeakerDriver.h"
00107
00108 #include <stdio.h>
00109 #include <stdbool.h>
00110 #include <stdint.h>
00111 #include <string.h>
00112
00113
00114
00115
00116
00117
00118 #define BUFFER_NUMBER 500
00119
00120 #define BUFFER_SIZE (AUDDevice_BYTESPERFRAME)
00121
00122
00123
00124 #define DAC_DELAY 2
00125
00126
00127 #define SLOT_BY_FRAME (2)
00128
00129 #define BITS_BY_SLOT (16)
00130 #define I2S_SLAVE_TX_SETTING ((SSC_TCMR_CKS_TK) | \
00131 (SSC_TCMR_CKO_NONE) | \
00132 (SSC_TCMR_START_TF_EDGE) | \
00133 (SSC_TCMR_STTDLY(1)) | \
00134 (SSC_TCMR_PERIOD(0)))
00135
00136 #define I2S_SLAVE_TX_FRM_SETTING ((SSC_TFMR_DATLEN(BITS_BY_SLOT - 1)) | \
00137 (SSC_TFMR_MSBF) | \
00138 (SSC_TFMR_DATNB(SLOT_BY_FRAME - 1)) | \
00139 (SSC_TFMR_FSOS_NONE))
00140
00141
00142 #define I2S_SLAVE_RX_SETTING ((SSC_RCMR_CKS_TK) | \
00143 (SSC_RCMR_CKO_NONE) | \
00144 (SSC_RCMR_CKI) | \
00145 (SSC_RCMR_START_RF_EDGE) | \
00146 (SSC_RCMR_STTDLY(1)) | \
00147 (SSC_RCMR_PERIOD(0)))
00148
00149 #define I2S_SLAVE_RX_FRM_SETTING ((SSC_RFMR_DATLEN(BITS_BY_SLOT - 1)) | \
00150 (SSC_RFMR_MSBF) | \
00151 (SSC_RFMR_DATNB(SLOT_BY_FRAME - 1)) | \
00152 (SSC_RFMR_FSOS_NONE))
00153
00154
00155 #define TWI_CLOCK 400000
00156
00157 #define SAMPLE_RATE (48000)
00158
00159
00160
00161
00162
00163
00164 extern const USBDDriverDescriptors auddSpeakerDriverDescriptors;
00165
00166
00167
00168
00169
00170
00171
00172 static uint8_t buffers[BUFFER_NUMBER][BUFFER_SIZE];
00173
00174
00175 static volatile uint32_t bufferSizes[BUFFER_NUMBER];
00176
00177 static volatile uint32_t inBufferIndex = 0;
00178
00179 static uint32_t outBufferIndex = 0;
00180
00181 static volatile uint32_t numBuffersToSend = 0;
00182
00183
00184 static volatile uint32_t isDacActive = 0;
00185 static volatile uint32_t isFirstFrame = 1;
00186
00187 static volatile uint32_t dacDelay;
00188
00189
00190 static Twid twid;
00191
00192 static sXdmad dmad;
00193
00194 static uint32_t sscDmaTxChannel;
00195
00196
00197 static const Pin pinsAudio[] = { PIN_TWI_TWD0,
00198 PIN_TWI_TWCK0,
00199 PIN_SSC_TD,
00200 PIN_SSC_TK,
00201 PIN_SSC_TF,
00202 PIN_SSC_RD,
00203 PIN_SSC_RK,
00204 PIN_SSC_RF,
00205 PIN_PCK2};
00206
00207
00208
00209
00210
00211
00212
00213 void XDMAC_Handler( void )
00214 {
00215 XDMAD_Handler( &dmad );
00216 }
00217
00218
00219
00220
00221 static void _SscDma(volatile uint32_t *pReg, uint32_t dmaChannel,
00222 void* pBuffer, uint16_t wSize)
00223 {
00224 sXdmad *pDmad = &dmad;
00225 sXdmadCfg xdmadCfg;
00226
00227 xdmadCfg.mbr_ubc = wSize ;
00228 xdmadCfg.mbr_sa = (uint32_t) pBuffer;
00229 xdmadCfg.mbr_da = (uint32_t) pReg;
00230 xdmadCfg.mbr_cfg = XDMAC_CC_TYPE_PER_TRAN
00231 | XDMAC_CC_MBSIZE_SINGLE
00232 | XDMAC_CC_DSYNC_MEM2PER
00233 | XDMAC_CC_CSIZE_CHK_1
00234 | XDMAC_CC_DWIDTH_HALFWORD
00235 | XDMAC_CC_SIF_AHB_IF0
00236 | XDMAC_CC_DIF_AHB_IF1
00237 | XDMAC_CC_SAM_INCREMENTED_AM
00238 | XDMAC_CC_DAM_FIXED_AM
00239 | XDMAC_CC_PERID(XDMAIF_Get_ChannelNumber(
00240 ID_SSC, XDMAD_TRANSFER_TX));
00241 xdmadCfg.mbr_bc = 0;
00242 xdmadCfg.mbr_ds = 0;
00243 xdmadCfg.mbr_sus = 0;
00244 xdmadCfg.mbr_dus = 0;
00245
00246 memory_sync();
00247 XDMAD_ConfigureTransfer( pDmad, dmaChannel, &xdmadCfg, 0, 0,(XDMAC_CIE_BIE |
00248 XDMAC_CIE_DIE |
00249 XDMAC_CIE_FIE |
00250 XDMAC_CIE_RBIE |
00251 XDMAC_CIE_WBIE |
00252 XDMAC_CIE_ROIE));
00253
00254 SCB_CleanDCache();
00255 XDMAD_StartTransfer( pDmad, dmaChannel );
00256
00257 }
00258
00259
00260
00261
00262 static void _SscTxCallback(uint8_t status, void* pArg)
00263 {
00264 sXdmad *pDmad = &dmad;
00265 Xdmac *pXdmac = pDmad->pXdmacs;
00266 if (status != XDMAD_OK) return;
00267 pArg = pArg;
00268 if (numBuffersToSend == 0) {
00269
00270 isDacActive = 0;
00271 return;
00272 }
00273
00274
00275 XDMAC_SetSourceAddr(pXdmac, sscDmaTxChannel, (uint32_t) buffers[outBufferIndex]);
00276 XDMAC_SetMicroblockControl(pXdmac, sscDmaTxChannel, bufferSizes[outBufferIndex]);
00277 outBufferIndex = (outBufferIndex + 1) % BUFFER_NUMBER;
00278 numBuffersToSend --;
00279 memory_sync();
00280 XDMAD_StartTransfer( pDmad, sscDmaTxChannel );
00281 }
00282
00283
00284
00285
00286 static void _ConfigureDma( void )
00287 {
00288 sXdmad *pDmad = &dmad;
00289
00290 XDMAD_Initialize( pDmad, 0 );
00291
00292 NVIC_ClearPendingIRQ(XDMAC_IRQn);
00293 NVIC_SetPriority(XDMAC_IRQn, 1);
00294 NVIC_EnableIRQ(XDMAC_IRQn);
00295
00296
00297 sscDmaTxChannel = XDMAD_AllocateChannel( pDmad, XDMAD_TRANSFER_MEMORY, ID_SSC);
00298 if (sscDmaTxChannel == XDMAD_ALLOC_FAILED ) {
00299 printf("xDMA channel allocation error\n\r");
00300 while(1);
00301 }
00302
00303
00304 XDMAD_SetCallback(pDmad, sscDmaTxChannel,(XdmadTransferCallback)_SscTxCallback, 0);
00305 XDMAD_PrepareChannel(pDmad, sscDmaTxChannel );
00306 }
00307
00308
00309
00310
00311 static void AudioPlayEnable(uint8_t enable)
00312 {
00313 if (enable == 1) {
00314 SSC_EnableTransmitter(SSC);
00315 } else if (enable == 0) {
00316 SSC_DisableTransmitter(SSC);
00317 }
00318 }
00319
00320
00321
00322
00323
00324 static void _SyncAdjust(int32_t adjust)
00325 {
00326 if (adjust > 0) {
00327
00328 WM8904_Write(&twid, WM8904_SLAVE_ADDRESS, WM8904_REG_FLL_CRTL3, 0xFF00);
00329
00330 return;
00331 }
00332 if (adjust < 0) {
00333
00334 WM8904_Write(&twid, WM8904_SLAVE_ADDRESS, WM8904_REG_FLL_CRTL3, 0x5000);
00335
00336 return;
00337 }
00338
00339
00340
00341
00342 WM8904_Write(&twid, WM8904_SLAVE_ADDRESS, WM8904_REG_FLL_CRTL3, 0x8000 + 0x3000);
00343
00344 return;
00345 }
00346
00347
00348
00349
00350
00351
00352 static void _ConfigureAudioPlay(uint32_t sampleRate, uint32_t mck)
00353 {
00354
00355 PIO_Configure(pinsAudio, PIO_LISTSIZE(pinsAudio));
00356
00357
00358 sampleRate = sampleRate;
00359 SSC_Configure(SSC,0, mck);
00360 SSC_DisableTransmitter(SSC);
00361 SSC_ConfigureTransmitter(SSC, I2S_SLAVE_TX_SETTING,I2S_SLAVE_TX_FRM_SETTING);
00362 SSC_ConfigureReceiver(SSC,I2S_SLAVE_RX_SETTING,I2S_SLAVE_RX_FRM_SETTING);
00363
00364
00365 PMC_EnablePeripheral(ID_TWIHS0);
00366
00367 TWI_ConfigureMaster(TWIHS0, TWI_CLOCK, mck);
00368 TWID_Initialize(&twid, TWIHS0);
00369
00370
00371
00372
00373 WM8904_Write(&twid, WM8904_SLAVE_ADDRESS, WM8904_REG_RESET, 0);
00374 Wait(100);
00375
00376 if(WM8904_Read(&twid, WM8904_SLAVE_ADDRESS, 0)!=0x8904) {
00377 printf("WM8904 not found!\n\r");
00378 while(1);
00379 }
00380 WM8904_Init(&twid, WM8904_SLAVE_ADDRESS,PMC_MCKR_CSS_SLOW_CLK);
00381 _SyncAdjust(0);
00382 PMC_ConfigurePCK2(PMC_MCKR_CSS_SLOW_CLK, PMC_MCKR_PRES_CLK_1 );
00383
00384 AudioPlayEnable(0);
00385 }
00386
00387
00388
00389
00390 static void FrameReceived(uint32_t unused,
00391 uint8_t status,
00392 uint32_t transferred,
00393 uint32_t remaining)
00394 {
00395 unused = unused;
00396 remaining = remaining;
00397 if (status == USBD_STATUS_SUCCESS) {
00398 bufferSizes[inBufferIndex] = transferred / AUDDevice_BYTESPERSAMPLE;
00399 inBufferIndex = (inBufferIndex + 1) % BUFFER_NUMBER;
00400 numBuffersToSend++;
00401
00402 if (!isDacActive) {
00403 dacDelay = DAC_DELAY;
00404 isDacActive = 1;
00405 } else if (dacDelay > 0) {
00406
00407 dacDelay--;
00408 } else if (isFirstFrame) {
00409
00410 isFirstFrame = 0;
00411 AudioPlayEnable(1);
00412 _SscDma(&(SSC->SSC_THR), sscDmaTxChannel,
00413 buffers[outBufferIndex], bufferSizes[outBufferIndex]);
00414 outBufferIndex = (outBufferIndex + 1) % BUFFER_NUMBER;
00415 numBuffersToSend --;
00416 }
00417 } else if (status == USBD_STATUS_ABORTED) {
00418
00419 bufferSizes[inBufferIndex] = 0;
00420 } else {
00421
00422 }
00423
00424 AUDDSpeakerDriver_Read(buffers[inBufferIndex],
00425 AUDDevice_BYTESPERFRAME,
00426 (TransferCallback) FrameReceived,
00427 0);
00428 }
00429
00430
00431
00432
00433
00434
00435
00436
00437 void USBDDriverCallbacks_ConfigurationChanged(unsigned char cfgnum)
00438 {
00439 AUDDSpeakerDriver_ConfigurationChangeHandler(cfgnum);
00440 }
00441
00442
00443
00444
00445
00446
00447
00448 void USBDDriverCallbacks_InterfaceSettingChanged(unsigned char interface,
00449 unsigned char setting)
00450 {
00451 AUDDSpeakerDriver_InterfaceSettingChangedHandler(interface, setting);
00452 }
00453
00454
00455
00456
00457
00458 void USBDCallbacks_RequestReceived(const USBGenericRequest *request)
00459 {
00460 AUDDSpeakerDriver_RequestHandler(request);
00461 }
00462
00463
00464
00465
00466
00467
00468
00469 void AUDDSpeakerDriver_MuteChanged(uint8_t channel, uint8_t muted)
00470 {
00471
00472 if (channel == AUDDSpeakerDriver_MASTERCHANNEL) {
00473 if (muted) {
00474 AudioPlayEnable(0);
00475 TRACE_WARNING("MuteMaster ");
00476 } else {
00477 TRACE_INFO("UnmuteMaster ");
00478 AudioPlayEnable(1);
00479 }
00480 }
00481 }
00482
00483
00484
00485
00486
00487
00488 void AUDDSpeakerDriver_StreamSettingChanged(uint8_t newSetting)
00489 {
00490 if (newSetting) {
00491 LED_Set(USBD_LEDOTHER);
00492 numBuffersToSend = 0;
00493 } else {
00494 LED_Clear(USBD_LEDOTHER);
00495 }
00496 }
00497
00498
00499
00500
00501 static void _ConfigureUsbhs(void)
00502 {
00503
00504
00505 PMC->PMC_SCDR = PMC_SCDR_USBCLK;
00506
00507 PMC->PMC_USB = PMC_USB_USBS;
00508
00509 PMC_EnablePeripheral(ID_USBHS);
00510 USBHS->USBHS_CTRL = USBHS_CTRL_UIMOD_DEVICE;
00511
00512 PMC->CKGR_UCKR = CKGR_UCKR_UPLLEN | CKGR_UCKR_UPLLCOUNT(0xF);
00513
00514 while( !(PMC->PMC_SR & PMC_SR_LOCKU) );
00515
00516 NVIC_EnableIRQ(USBHS_IRQn) ;
00517 }
00518
00519
00520
00521
00522
00523
00524
00525
00526
00527 int main(void)
00528 {
00529 volatile uint8_t usbConn = 0;
00530 volatile uint8_t audioOn = 0;
00531 volatile uint32_t num = 0;
00532 int32_t numDiff = 0, prevDiff = 0;
00533 int8_t clockAdjust = 0;
00534
00535
00536 WDT_Disable( WDT );
00537
00538 printf("-- USB Device Audio Speaker Example %s --\n\r", SOFTPACK_VERSION);
00539 printf("-- %s\n\r", BOARD_NAME);
00540 printf( "-- Compiled: %s %s With %s--\n\r", __DATE__, __TIME__ , COMPILER_NAME) ;
00541
00542 SCB_EnableICache();
00543 SCB_EnableDCache();
00544
00545
00546 LED_Configure(LED_YELLOW0);
00547
00548 TimeTick_Configure();
00549
00550 NVIC_SetPriority( USBHS_IRQn, 2 );
00551
00552
00553 _ConfigureUsbhs();
00554
00555 _ConfigureAudioPlay(AUDDevice_SAMPLERATE, BOARD_MCK);
00556
00557
00558 _ConfigureDma();
00559
00560
00561 AUDDSpeakerDriver_Initialize(&auddSpeakerDriverDescriptors);
00562
00563
00564 USBD_Connect();
00565
00566
00567 while (1) {
00568 if (USBD_GetState() < USBD_STATE_CONFIGURED) {
00569 usbConn = 0;
00570 continue;
00571 }
00572 if (audioOn) {
00573 if(isDacActive == 0) {
00574 AudioPlayEnable(0);
00575 printf("audE ");
00576 isFirstFrame = 1;
00577 audioOn = 0;
00578 } else {
00579 if (num != numBuffersToSend) {
00580 num = numBuffersToSend;
00581 }
00582 numDiff = numBuffersToSend - DAC_DELAY;
00583 if (prevDiff != numDiff) {
00584 prevDiff = numDiff;
00585 if (numDiff > 0 && clockAdjust != 1) {
00586 printf("+");
00587
00588 clockAdjust = 1;
00589 _SyncAdjust(1);
00590 }
00591 if (numDiff < 0 && clockAdjust != -1) {
00592 printf("-");
00593
00594 clockAdjust = -1;
00595 _SyncAdjust(-1);
00596 }
00597 if (numDiff == 0 && clockAdjust != 0) {
00598 clockAdjust = 0;
00599 _SyncAdjust(0);
00600 }
00601 }
00602 }
00603 } else if (isDacActive) {
00604 printf("audS ");
00605 audioOn = 1;
00606 }
00607
00608 if (usbConn == 0) {
00609 usbConn = 1;
00610
00611 AUDDSpeakerDriver_Read(buffers[inBufferIndex],
00612 AUDDevice_BYTESPERFRAME,
00613 (TransferCallback) FrameReceived,
00614 0);
00615 }
00616 }
00617 }
00618