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
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113 #include "board.h"
00114
00115 #include <HIDAUDDDriver.h>
00116 #include <HIDDKeyboard.h>
00117 #include <AUDDFunction.h>
00118
00119 #include <USBD_Config.h>
00120 #include <USBD_LEDs.h>
00121
00122 #include <string.h>
00123
00124
00125
00126
00127
00128 #define NO_PUSHBUTTON
00129
00130
00131
00132 #define NUM_KEYS 2
00133
00134
00135 #define NUM_NORMAL_KEYS 1
00136
00137
00138 #define NUM_MODIFIER_KEYS (NUM_KEYS - NUM_NORMAL_KEYS)
00139
00140
00141 #define LED_NUMLOCK USBD_LEDOTHER
00142
00143
00144
00145 #define BUFFER_NUMBER 500
00146
00147 #define BUFFER_SIZE (AUDDevice_BYTESPERFRAME)
00148
00149
00150
00151 #define DAC_DELAY 2
00152
00153
00154 #define SLOT_BY_FRAME (2)
00155
00156 #define BITS_BY_SLOT (16)
00157 #define I2S_SLAVE_TX_SETTING ((SSC_TCMR_CKS_TK) | \
00158 (SSC_TCMR_CKO_NONE) | \
00159 (SSC_TCMR_START_TF_EDGE) | \
00160 (SSC_TCMR_STTDLY(1)) | \
00161 (SSC_TCMR_PERIOD(0)))
00162
00163 #define I2S_SLAVE_TX_FRM_SETTING ((SSC_TFMR_DATLEN(BITS_BY_SLOT - 1)) |\
00164 (SSC_TFMR_MSBF) | \
00165 (SSC_TFMR_DATNB(SLOT_BY_FRAME - 1)) |\
00166 (SSC_TFMR_FSOS_NONE))
00167
00168
00169 #define I2S_SLAVE_RX_SETTING ((SSC_RCMR_CKS_TK) | \
00170 (SSC_RCMR_CKO_NONE) | \
00171 (SSC_RCMR_CKI) | \
00172 (SSC_RCMR_START_RF_EDGE) |\
00173 (SSC_RCMR_STTDLY(1)) | \
00174 (SSC_RCMR_PERIOD(0)))
00175
00176 #define I2S_SLAVE_RX_FRM_SETTING ((SSC_RFMR_DATLEN(BITS_BY_SLOT - 1)) |\
00177 (SSC_RFMR_MSBF) | \
00178 (SSC_RFMR_DATNB(SLOT_BY_FRAME - 1)) |\
00179 (SSC_RFMR_FSOS_NONE))
00180
00181
00182 #define TWI_CLOCK 400000
00183
00184 #define SAMPLE_RATE (48000)
00185
00186
00187
00188
00189
00190
00191
00192 extern const USBDDriverDescriptors hidauddDriverDescriptors;
00193
00194
00195
00196
00197
00198
00199
00200 #ifdef NO_PUSHBUTTON
00201 #else
00202
00203 static Pin pinsPushButtons[] = {PINS_PUSHBUTTONS};
00204 #endif
00205
00206
00207 static uint8_t keyCodes[NUM_KEYS] = {
00208 HIDKeypad_A,
00209 HIDKeypad_NUMLOCK,
00210 };
00211
00212
00213 static uint8_t keyStatus[NUM_KEYS];
00214
00215
00216
00217
00218 COMPILER_ALIGNED(32) static uint8_t buffers[BUFFER_NUMBER][BUFFER_SIZE];
00219
00220
00221 static uint32_t bufferSizes[BUFFER_NUMBER];
00222
00223 static uint32_t inBufferIndex = 0;
00224
00225 static uint32_t outBufferIndex = 0;
00226
00227 static volatile uint32_t numBuffersToSend = 0;
00228
00229
00230 static volatile uint32_t isDacActive = 0;
00231 static volatile uint32_t isFirstFrame = 1;
00232
00233 static volatile uint32_t dacDelay;
00234
00235
00236 static Twid twid;
00237
00238 COMPILER_ALIGNED(32) static sXdmad dmad;
00239
00240 static uint32_t sscDmaTxChannel;
00241
00242
00243 static const Pin pinsAudio[] = { PIN_TWI_TWD0,
00244 PIN_TWI_TWCK0,
00245 PIN_SSC_TD,
00246 PIN_SSC_TK,
00247 PIN_SSC_TF,
00248 PIN_SSC_RD,
00249 PIN_SSC_RK,
00250 PIN_SSC_RF,
00251 PIN_PCK2};
00252
00253
00254
00255
00256
00257
00258
00259 void XDMAC_Handler( void )
00260 {
00261 XDMAD_Handler( &dmad );
00262 }
00263
00264
00265
00266
00267 static void _SscDma(volatile uint32_t *pReg, uint32_t dmaChannel,
00268 void* pBuffer, uint16_t wSize)
00269 {
00270 sXdmad *pDmad = &dmad;
00271 sXdmadCfg xdmadCfg;
00272
00273
00274 xdmadCfg.mbr_ubc = wSize ;
00275 xdmadCfg.mbr_sa = (uint32_t) pBuffer;
00276 xdmadCfg.mbr_da = (uint32_t) pReg;
00277 xdmadCfg.mbr_cfg = XDMAC_CC_TYPE_PER_TRAN
00278 | XDMAC_CC_MBSIZE_SINGLE
00279 | XDMAC_CC_DSYNC_MEM2PER
00280 | XDMAC_CC_CSIZE_CHK_1
00281 | XDMAC_CC_DWIDTH_HALFWORD
00282 | XDMAC_CC_SIF_AHB_IF0
00283 | XDMAC_CC_DIF_AHB_IF1
00284 | XDMAC_CC_SAM_INCREMENTED_AM
00285 | XDMAC_CC_DAM_FIXED_AM
00286 | XDMAC_CC_PERID(XDMAIF_Get_ChannelNumber(
00287 ID_SSC, XDMAD_TRANSFER_TX));
00288 xdmadCfg.mbr_bc = 0;
00289 xdmadCfg.mbr_ds = 0;
00290 xdmadCfg.mbr_sus = 0;
00291 xdmadCfg.mbr_dus = 0;
00292
00293 memory_sync();
00294 XDMAD_ConfigureTransfer( pDmad, dmaChannel, &xdmadCfg, 0, 0, (
00295 XDMAC_CIE_BIE |
00296 XDMAC_CIE_DIE |
00297 XDMAC_CIE_FIE |
00298 XDMAC_CIE_RBIE |
00299 XDMAC_CIE_WBIE |
00300 XDMAC_CIE_ROIE));
00301 SCB_CleanInvalidateDCache();
00302 XDMAD_StartTransfer( pDmad, dmaChannel );
00303 SSC_EnableTransmitter(SSC);
00304 }
00305
00306
00307
00308
00309 static void _SscTxCallback(uint8_t status, void* pArg)
00310 {
00311 sXdmad *pDmad = &dmad;
00312 Xdmac *pXdmac = pDmad->pXdmacs;
00313 pArg = pArg;
00314 if (numBuffersToSend == 0)
00315 {
00316
00317 isDacActive = 0;
00318 return;
00319 }
00320
00321 memory_sync();
00322 XDMAC_SetSourceAddr(pXdmac, sscDmaTxChannel, (uint32_t) buffers[outBufferIndex]);
00323 XDMAC_SetMicroblockControl(pXdmac, sscDmaTxChannel, bufferSizes[outBufferIndex]);
00324 outBufferIndex = (outBufferIndex + 1) % BUFFER_NUMBER;
00325 numBuffersToSend --;
00326 XDMAD_StartTransfer( pDmad, sscDmaTxChannel );
00327 }
00328
00329
00330
00331
00332 static void _ConfigureDma( void )
00333 {
00334 sXdmad *pDmad = &dmad;
00335
00336 XDMAD_Initialize( pDmad, 0 );
00337
00338 NVIC_EnableIRQ(XDMAC_IRQn);
00339
00340
00341 sscDmaTxChannel = XDMAD_AllocateChannel( pDmad, XDMAD_TRANSFER_MEMORY, ID_SSC);
00342 if ( sscDmaTxChannel == XDMAD_ALLOC_FAILED ) {
00343 printf("xDMA channel allocation error\n\r");
00344 while(1);
00345 }
00346
00347 XDMAD_SetCallback(pDmad, sscDmaTxChannel,(XdmadTransferCallback)_SscTxCallback, 0);
00348 XDMAD_PrepareChannel(pDmad, sscDmaTxChannel );
00349 }
00350
00351
00352
00353
00354 static void AudioPlayEnable(uint8_t enable)
00355 {
00356 if (enable == 1) {
00357 SSC_EnableTransmitter(SSC);
00358 }
00359 else if (enable == 0) {
00360 SSC_DisableTransmitter(SSC);
00361 }
00362 }
00363
00364
00365
00366
00367
00368 static void _SyncAdjust(int32_t adjust)
00369 {
00370 if (adjust > 0) {
00371
00372 WM8904_Write(&twid, WM8904_SLAVE_ADDRESS, WM8904_REG_FLL_CRTL3, 0xFF00);
00373
00374 return;
00375 }
00376 if (adjust < 0) {
00377
00378 WM8904_Write(&twid, WM8904_SLAVE_ADDRESS, WM8904_REG_FLL_CRTL3, 0x5000);
00379
00380 return;
00381 }
00382
00383
00384
00385
00386 WM8904_Write(&twid, WM8904_SLAVE_ADDRESS, WM8904_REG_FLL_CRTL3, 0x8000 + 0x3000);
00387
00388 return;
00389 }
00390
00391
00392
00393
00394
00395
00396 static void _ConfigureAudioPlay(uint32_t sampleRate, uint32_t mck)
00397 {
00398
00399 PIO_Configure(pinsAudio, PIO_LISTSIZE(pinsAudio));
00400
00401
00402 sampleRate = sampleRate;
00403 SSC_Configure(SSC,0, mck);
00404 SSC_DisableTransmitter(SSC);
00405 SSC_DisableReceiver(SSC);
00406 SSC_ConfigureTransmitter(SSC, I2S_SLAVE_TX_SETTING,I2S_SLAVE_TX_FRM_SETTING);
00407 SSC_DisableTransmitter(SSC);
00408
00409
00410 PMC_EnablePeripheral(ID_TWIHS0);
00411
00412 TWI_ConfigureMaster(TWIHS0, TWI_CLOCK, mck);
00413 TWID_Initialize(&twid, TWIHS0);
00414
00415
00416
00417 WM8904_Write(&twid, WM8904_SLAVE_ADDRESS, WM8904_REG_RESET, 0);
00418 Wait(100);
00419
00420 if(WM8904_Read(&twid, WM8904_SLAVE_ADDRESS, 0)!=0x8904){
00421 printf("WM8904 not found!\n\r");
00422 while(1);
00423 }
00424 WM8904_Init(&twid, WM8904_SLAVE_ADDRESS,PMC_MCKR_CSS_SLOW_CLK);
00425 _SyncAdjust(0);
00426 PMC_ConfigurePCK2(PMC_MCKR_CSS_SLOW_CLK, PMC_MCKR_PRES_CLK_1 );
00427
00428 AudioPlayEnable(0);
00429 }
00430
00431
00432
00433
00434 static void HIDDKeyboardProcessKeys(void)
00435 {
00436 uint32_t i;
00437 uint8_t pressedKeys[NUM_KEYS];
00438 uint8_t pressedKeysSize = 0;
00439 uint8_t releasedKeys[NUM_KEYS];
00440 uint8_t releasedKeysSize = 0;
00441
00442
00443 #ifdef NO_PUSHBUTTON
00444 if (DBG_IsRxReady()) {
00445 uint8_t key = DBG_GetChar();
00446 switch(key) {
00447 case '1': case '2':
00448 i = key - '1';
00449 if (keyStatus[i]) {
00450
00451 TRACE_INFO("Key %u pressed\n\r", (unsigned int)i);
00452 keyStatus[i] = 0;
00453 pressedKeys[pressedKeysSize] = keyCodes[i];
00454 pressedKeysSize ++;
00455 HIDDKeyboard_RemoteWakeUp();
00456 } else {
00457
00458 TRACE_INFO("Key %u released\n\r", (unsigned int)i);
00459 keyStatus[i] = 1;
00460 releasedKeys[releasedKeysSize] = keyCodes[i];
00461 releasedKeysSize++;
00462 }
00463 break;
00464 default: DBG_PutChar(key);
00465 }
00466 }
00467 #else
00468 for (i = 0; i < PIO_LISTSIZE(pinsPushButtons); i++) {
00469
00470 uint8_t isButtonPressed = PIO_Get(&(pinsPushButtons[i]));
00471 if (isButtonPressed != keyStatus[i]) {
00472
00473 if (!isButtonPressed) {
00474
00475 TRACE_INFO("Key %u has been pressed\n\r", i);
00476 keyStatus[i] = 0;
00477 pressedKeys[pressedKeysSize] = keyCodes[i];
00478 pressedKeysSize++;
00479 HIDDKeyboard_RemoteWakeUp();
00480 } else {
00481
00482 TRACE_INFO("Key %u has been released\n\r", i);
00483 keyStatus[i] = 1;
00484 releasedKeys[releasedKeysSize] = keyCodes[i];
00485 releasedKeysSize++;
00486 }
00487 }
00488 }
00489 #endif
00490
00491
00492 if ((pressedKeysSize != 0) || (releasedKeysSize != 0)) {
00493 uint8_t status;
00494 do {
00495 status = HIDDKeyboard_ChangeKeys(pressedKeys,
00496 pressedKeysSize,
00497 releasedKeys,
00498 releasedKeysSize);
00499 } while (status != USBD_STATUS_SUCCESS);
00500 }
00501 }
00502
00503
00504
00505
00506 static void FrameReceived(uint32_t unused,
00507 uint8_t status,
00508 uint32_t transferred,
00509 uint32_t remaining)
00510 {
00511 unused = unused;
00512 remaining = remaining;
00513 if (status == USBD_STATUS_SUCCESS) {
00514 bufferSizes[inBufferIndex] = transferred / AUDDevice_BYTESPERSAMPLE;
00515 inBufferIndex = (inBufferIndex + 1) % BUFFER_NUMBER;
00516 numBuffersToSend++;
00517
00518 if (!isDacActive) {
00519 dacDelay = DAC_DELAY;
00520 isDacActive = 1;
00521 }
00522
00523 else if (dacDelay > 0) {
00524 dacDelay--;
00525 }
00526
00527 else if (isFirstFrame) {
00528 isFirstFrame = 0;
00529
00530 _SscDma(&(SSC->SSC_THR), sscDmaTxChannel, buffers[outBufferIndex],
00531 bufferSizes[outBufferIndex]);
00532 outBufferIndex = (outBufferIndex + 1) % BUFFER_NUMBER;
00533 numBuffersToSend --;
00534 }
00535 }
00536 else if (status == USBD_STATUS_ABORTED) {
00537
00538 bufferSizes[inBufferIndex] = 0;
00539 } else {
00540
00541 }
00542
00543 AUDDFunction_Read(buffers[inBufferIndex],
00544 AUDDevice_BYTESPERFRAME,
00545 (TransferCallback) FrameReceived,
00546 0);
00547 }
00548
00549
00550
00551
00552
00553
00554
00555
00556 void USBDDriverCallbacks_ConfigurationChanged(unsigned char cfgnum)
00557 {
00558 HIDAUDDDriver_ConfigurationChangedHandler(cfgnum);
00559 }
00560
00561
00562
00563
00564
00565
00566
00567 void USBDDriverCallbacks_InterfaceSettingChanged(unsigned char interface,
00568 unsigned char setting)
00569 {
00570 HIDAUDDDriver_InterfaceSettingChangedHandler(interface, setting);
00571 }
00572
00573
00574
00575
00576
00577 void USBDCallbacks_RequestReceived(const USBGenericRequest *request)
00578 {
00579 HIDAUDDDriver_RequestHandler(request);
00580 }
00581
00582
00583
00584
00585
00586
00587
00588
00589
00590
00591
00592
00593 void AUDDFunction_MuteChanged(uint8_t mic, uint8_t channel, uint8_t muted)
00594 {
00595 if (mic) return;
00596
00597
00598 if (channel == AUDD_CH_Master) {
00599 if (muted) {
00600 AudioPlayEnable(0);
00601 TRACE_WARNING("MuteMaster ");
00602 } else {
00603 TRACE_INFO("UnmuteMaster ");
00604 AudioPlayEnable(1);
00605 }
00606 }
00607 }
00608
00609
00610
00611
00612
00613
00614
00615 void AUDDFunction_StreamSettingChanged(uint8_t mic, uint8_t newSetting)
00616 {
00617 mic = mic;
00618 if (newSetting) {
00619 LED_Set(USBD_LEDOTHER);
00620
00621 numBuffersToSend = 0;
00622 }
00623 else LED_Clear(USBD_LEDOTHER);
00624 }
00625
00626
00627
00628
00629
00630
00631
00632
00633 void HIDDKeyboardCallbacks_LedsChanged(
00634 uint8_t numLockStatus,
00635 uint8_t capsLockStatus,
00636 uint8_t scrollLockStatus)
00637 {
00638 capsLockStatus = capsLockStatus;
00639 scrollLockStatus = scrollLockStatus;
00640
00641 if (numLockStatus) {
00642 LED_Set(LED_NUMLOCK);
00643 } else {
00644 LED_Clear(LED_NUMLOCK);
00645 }
00646 }
00647
00648
00649
00650
00651 static void _ConfigureUsbhs(void)
00652 {
00653
00654
00655 PMC->PMC_SCDR = PMC_SCDR_USBCLK;
00656
00657 PMC->PMC_USB = PMC_USB_USBS;
00658
00659 PMC_EnablePeripheral(ID_USBHS);
00660 USBHS->USBHS_CTRL = USBHS_CTRL_UIMOD_DEVICE;
00661
00662 PMC->CKGR_UCKR = CKGR_UCKR_UPLLEN | CKGR_UCKR_UPLLCOUNT(0xF);
00663
00664 while( !(PMC->PMC_SR & PMC_SR_LOCKU) );
00665
00666 NVIC_EnableIRQ(USBHS_IRQn) ;
00667 }
00668
00669
00670
00671
00672
00673
00674
00675
00676
00677 int main(void)
00678 {
00679 volatile uint8_t usbConn = 0;
00680 volatile uint8_t audioOn = 0;
00681 volatile uint32_t num = 0;
00682 int32_t numDiff = 0, prevDiff = 0;
00683 int8_t clockAdjust = 0;
00684
00685
00686 WDT_Disable( WDT );
00687
00688 SCB_EnableICache();
00689 SCB_EnableDCache();
00690
00691
00692 printf("-- USB HID + Audio Device Example %s --\n\r", SOFTPACK_VERSION);
00693 printf("-- %s\n\r", BOARD_NAME);
00694 printf( "-- Compiled: %s %s With %s--\n\r", __DATE__, __TIME__ , COMPILER_NAME) ;
00695
00696 TimeTick_Configure();
00697
00698 NVIC_SetPriority( USBHS_IRQn, 2 );
00699
00700
00701 PIO_InitializeInterrupts(0);
00702
00703
00704 _ConfigureUsbhs();
00705
00706
00707 #ifdef NO_PUSHBUTTON
00708 printf( "-- : DBG key 1 2 used as buttons\n\r" );
00709 printf( "-- : 1st press to push, 2nd press to release\n\r" );
00710 #else
00711
00712 PIO_Configure(pinsPushButtons, PIO_LISTSIZE(pinsPushButtons));
00713 #endif
00714 memset(keyStatus, 1, NUM_KEYS);
00715
00716
00717
00718 LED_Configure(USBD_LEDOTHER);
00719
00720
00721 _ConfigureAudioPlay(AUDDevice_SAMPLERATE, BOARD_MCK);
00722
00723
00724 _ConfigureDma();
00725
00726
00727 HIDAUDDDriver_Initialize(&hidauddDriverDescriptors);
00728
00729
00730 USBD_Connect();
00731
00732
00733 while (1) {
00734 if (USBD_GetState() < USBD_STATE_CONFIGURED) {
00735 usbConn = 0;
00736 continue;
00737 }
00738 if (audioOn) {
00739 if(isDacActive == 0) {
00740 AudioPlayEnable(0);
00741 printf("audE ");
00742 isFirstFrame = 1;
00743 audioOn = 0;
00744 } else {
00745 if (num != numBuffersToSend) {
00746 num = numBuffersToSend;
00747 }
00748 numDiff = numBuffersToSend - DAC_DELAY;
00749 if (prevDiff != numDiff) {
00750 prevDiff = numDiff;
00751 if (numDiff > 0 && clockAdjust != 1) {
00752 printf("+");
00753
00754 clockAdjust = 1;
00755 _SyncAdjust(1);
00756 }
00757 if (numDiff < 0 && clockAdjust != -1) {
00758 printf("-");
00759
00760 clockAdjust = -1;
00761 _SyncAdjust(-1);
00762 }
00763 if (numDiff == 0 && clockAdjust != 0) {
00764 clockAdjust = 0;
00765 _SyncAdjust(0);
00766 }
00767 }
00768 }
00769 } else if (isDacActive) {
00770 printf("audS ");
00771 audioOn = 1;
00772 }
00773 if (usbConn == 0) {
00774 usbConn = 1;
00775
00776 AUDDFunction_Read(buffers[inBufferIndex],
00777 AUDDevice_BYTESPERFRAME,
00778 (TransferCallback) FrameReceived,
00779 0);
00780 }
00781 HIDDKeyboardProcessKeys();
00782 }
00783 }
00784