00001
00002
00003
00004
00005
00006
00007
00008
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifndef _CSL_USBAUX_H_
00029 #define _CSL_USBAUX_H_
00030
00031 #ifdef __cplusplus
00032 extern "C" {
00033 #endif
00034
00035 #include <csl_intc.h>
00036 #include <csl_usb.h>
00037
00039 extern CSL_UsbRegsOvly usbRegisters;
00041 extern CSL_SysRegsOvly sysCtrlRegs;
00042
00082 static inline
00083 CSL_Status USB_swapWords (Uint16 *dataBuffer,
00084 Uint32 dataLength)
00085 {
00086 CSL_Status status;
00087 Uint32 looper;
00088 Uint16 tempData;
00089
00090 status = CSL_SOK;
00091
00092
00093 if ((dataBuffer != NULL) && (dataLength > 0))
00094 {
00095
00096 for (looper = 0; looper < dataLength/2; looper++)
00097 {
00098 tempData = *dataBuffer++;
00099 *(dataBuffer -1) = *dataBuffer;
00100 *dataBuffer++ = tempData;
00101 }
00102 }
00103 else
00104 {
00105 status = CSL_ESYS_INVPARAMS;
00106 }
00107
00108 return (status);
00109 }
00110
00148 static inline
00149 void USB_initDma(void)
00150 {
00151 Bool value;
00152
00153
00154
00155
00156 value = IRQ_globalDisable();
00157
00158 usbRegisters->CHANNEL[0].TXGCR1 = CSL_USB_TXGCR1_RESETVAL;
00159
00160
00161 usbRegisters->CHANNEL[0].TXGCR2 = CSL_USB_TXGCR2_TX_ENABLE_MASK;
00162
00163
00164
00165
00166
00167 usbRegisters->CHANNEL[1].RXGCR1 = CSL_USB_RXGCR1_DEFVAL;
00168
00169
00170
00171
00172
00173 usbRegisters->CHANNEL[1].RXGCR2 = CSL_USB_RXGCR2_DEFVAL;
00174
00175 usbRegisters->CHANNEL[1].RXHPCR1A = CSL_USB_RXHPCR1A_RESETVAL;
00176 usbRegisters->CHANNEL[1].RXHPCR2A = CSL_USB_RXHPCR2A_RESETVAL;
00177 usbRegisters->CHANNEL[1].RXHPCR1B = CSL_USB_RXHPCR1B_RESETVAL;
00178 usbRegisters->CHANNEL[1].RXHPCR2B = CSL_USB_RXHPCR2B_RESETVAL;
00179
00180
00181
00182
00183 usbRegisters->CDMASCHETBLWORD[0].ENTRYLSW = CSL_USB_ENTRYLSW_DEFVAL;
00184 usbRegisters->CDMASCHETBLWORD[0].ENTRYMSW = CSL_USB_ENTRYMSW_RESETVAL;
00185
00186
00187 usbRegisters->DMA_SCHED_CTRL1 = CSL_USB_DMA_SCHED_CTRL1_DEFVAL;
00188
00189
00190 usbRegisters->DMA_SCHED_CTRL2 = CSL_USB_DMA_SCHED_CTRL2_ENABLE_MASK;
00191
00192
00193
00194 IRQ_globalRestore(value);
00195 }
00196
00197
00232 static inline
00233 CSL_Status USB_initQueueManager(CSL_UsbHostPktDescr *hpdtx,
00234 Uint32 *pLinkingRam)
00235 {
00236 Uint32 u32Addr;
00237 Uint16 u16CpyReg;
00238 CSL_Status status;
00239 Bool value;
00240
00241 status = CSL_SOK;
00242
00243 if((hpdtx != NULL) && (pLinkingRam != NULL))
00244 {
00245
00246 u32Addr = (Uint32)pLinkingRam;
00247 u16CpyReg = (Uint16)((u32Addr * 2) & CSL_USB_16BIT_REG_MASK);
00248
00249
00250
00251 value = IRQ_globalDisable();
00252 usbRegisters->LRAM0BASE1 = u16CpyReg;
00253 u16CpyReg = (Uint16)(((u32Addr * 2) >> CSL_USB_16BIT_REG_SHIFT) &
00254 CSL_USB_16BIT_REG_MASK);
00255
00256 usbRegisters->LRAM0BASE2 = u16CpyReg | 8;
00257
00258 usbRegisters->LRAM0SIZE = CSL_USB_LRAM0SIZE_DEFVAL;
00259
00260
00261 u32Addr = (Uint32)pLinkingRam;
00262 u16CpyReg = (Uint16)((u32Addr * 2) & CSL_USB_16BIT_REG_MASK);
00263 usbRegisters->LRAM1BASE1 = (Uint16)u16CpyReg;
00264 u16CpyReg = (Uint16)(((u32Addr * 2) >> CSL_USB_16BIT_REG_SHIFT) &
00265 CSL_USB_16BIT_REG_MASK);
00266
00267 usbRegisters->LRAM1BASE2 = u16CpyReg | 8;
00268
00269
00270 u32Addr = (Uint32)(hpdtx);
00271 u16CpyReg = (Uint16)((u32Addr * 2) & CSL_USB_16BIT_REG_MASK);
00272 usbRegisters->QMMEMREGR[0].QMEMRBASE1 = u16CpyReg;
00273
00274
00275 u16CpyReg = (Uint16)( ((u32Addr * 2) >> CSL_USB_16BIT_REG_SHIFT) &
00276 CSL_USB_16BIT_REG_MASK);
00277 usbRegisters->QMMEMREGR[0].QMEMRBASE2 = u16CpyReg | 8;
00278
00279
00280 usbRegisters->QMMEMREGR[0].QMEMRCTRL1 = 0x0000;
00281 usbRegisters->QMMEMREGR[0].QMEMRCTRL2 = CSL_USB_QMEMRCTRL2_DEFVAL;
00282
00283 IRQ_globalRestore(value);
00284 }
00285 else
00286 {
00287 status = CSL_ESYS_INVPARAMS;
00288 }
00289
00290 return(status);
00291 }
00292
00325 static inline
00326 void USB_dmaPopQue(Uint16 queueNum)
00327 {
00328 Uint16 descTemp, countTemp;
00329
00330 countTemp = usbRegisters->QMQNS[queueNum].QSTATA;
00331
00332 while (countTemp > 0)
00333 {
00334 descTemp = usbRegisters->QMQN[queueNum].CTRL1D;
00335 countTemp = usbRegisters->QMQNS[queueNum].QSTATA;
00336
00337
00338 descTemp= descTemp;
00339 countTemp = countTemp;
00340 }
00341 }
00342
00383 static inline
00384 void USB_dmaRxStart(DWORD dwEndpoint)
00385 {
00386 Uint16 saveIndex;
00387
00388
00389 saveIndex = usbRegisters->INDEX_TESTMODE;
00390
00391
00392 usbRegisters->INDEX_TESTMODE &= ~CSL_USB_INDEX_TESTMODE_EPSEL_MASK;
00393 usbRegisters->INDEX_TESTMODE |= dwEndpoint;
00394
00395
00396 usbRegisters->PERI_RXCSR_INDX &= 0x6FFF;
00397
00398
00399 usbRegisters->PERI_RXCSR_INDX |= CSL_USB_PERI_RXCSR_DMAEN_MASK;
00400
00401
00402 usbRegisters->INDEX_TESTMODE = saveIndex;
00403 }
00404
00446 static inline
00447 CSL_Status USB_confDmaRx(CSL_UsbHostPktDescr *hpdrx,
00448 Uint32 packetsize,
00449 Uint16 *pRxBuffer)
00450 {
00451 volatile Uint16 index;
00452 CSL_Status status;
00453 Bool value;
00454
00455 status = CSL_SOK;
00456
00457 if((hpdrx != NULL) && (pRxBuffer != NULL))
00458 {
00459
00460 hpdrx->PacketInfoWord0 = 0x80000000 | packetsize;
00461
00462 hpdrx->PacketInfoWord1 = 0;
00463
00464
00465
00466
00467 hpdrx->PacketInfoWord2 = 0x1400001A;
00468 hpdrx->Buffer0InfoWord0 = packetsize;
00469
00470
00471 hpdrx->Buffer0InfoWord1 = ((Uint32)pRxBuffer) << 1 | 0x80000;
00472
00473
00474 hpdrx->LinkingWord = 0;
00475 hpdrx->OriginalBuffer0InfoWord0 = packetsize;
00476
00477
00478 hpdrx->OriginalBuffer0InfoWord1 = ((Uint32)pRxBuffer) << 1 | 0x80000;
00479
00480
00481
00482 value = IRQ_globalDisable();
00483 usbRegisters->QMQN[0].CTRL1D = ((((Uint32)hpdrx) << 1) &
00484 CSL_USB_16BIT_REG_MASK) | 2;
00485 usbRegisters->QMQN[0].CTRL2D = (((((Uint32)hpdrx) >> 15) &
00486 CSL_USB_16BIT_REG_MASK) | 8);
00487
00488 IRQ_globalRestore(value);
00489 }
00490 else
00491 {
00492 status = CSL_ESYS_INVPARAMS;
00493 }
00494
00495 return(status);
00496 }
00497
00498
00544 static inline
00545 CSL_Status USB_confDmaTx(CSL_UsbHostPktDescr *hpdtx,
00546 Uint32 packetsize,
00547 Uint16 *pTxBuffer,
00548 Bool swapWords)
00549 {
00550 CSL_Status status;
00551 Bool value;
00552
00553 status = CSL_SOK;
00554
00555 if((hpdtx != NULL) && (pTxBuffer != NULL))
00556 {
00557
00558 if(TRUE == swapWords)
00559 {
00560
00561
00562
00563
00564
00565
00566 USB_swapWords (pTxBuffer, packetsize/2);
00567 }
00568
00569
00570 hpdtx->PacketInfoWord0 = 0x80000000 | packetsize;
00571
00572 hpdtx->PacketInfoWord1 = 0;
00573
00574
00575
00576
00577 hpdtx->PacketInfoWord2 = 0x14000018;
00578 hpdtx->Buffer0InfoWord0 = packetsize;
00579
00580
00581 hpdtx->Buffer0InfoWord1 = ((Uint32)pTxBuffer) << 1 | 0x80000;
00582
00583
00584 hpdtx->LinkingWord = 0;
00585 hpdtx->OriginalBuffer0InfoWord0 = packetsize;
00586
00587
00588 hpdtx->OriginalBuffer0InfoWord1 = ((Uint32)pTxBuffer) << 1 | 0x80000;
00589
00590
00591
00592 value = IRQ_globalDisable();
00593
00594 usbRegisters->QMQN[16].CTRL1D = ((((Uint32)hpdtx) << 1) &
00595 CSL_USB_16BIT_REG_MASK) | 2;
00596 usbRegisters->QMQN[16].CTRL2D = (((((Uint32)hpdtx) >> 15) &
00597 CSL_USB_16BIT_REG_MASK) | 8);
00598
00599 IRQ_globalRestore(value);
00600 }
00601 else
00602 {
00603 status = CSL_ESYS_INVPARAMS;
00604 }
00605
00606 return(status);
00607 }
00608
00654 static inline
00655 void USB_dmaRxStop(DWORD dwEndpoint,
00656 Uint16 *pRxBuffer,
00657 Uint32 packetsize,
00658 Bool swapWords)
00659 {
00660 Uint16 saveIndex = 0;
00661
00662
00663 saveIndex = usbRegisters->INDEX_TESTMODE;
00664
00665
00666 usbRegisters->INDEX_TESTMODE &= ~CSL_USB_INDEX_TESTMODE_EPSEL_MASK;
00667 usbRegisters->INDEX_TESTMODE |= dwEndpoint;
00668
00669 usbRegisters->PERI_RXCSR_INDX &= ~CSL_USB_PERI_RXCSR_DMAEN_MASK;
00670
00671
00672 usbRegisters->INDEX_TESTMODE = saveIndex;
00673
00674 if(swapWords == TRUE)
00675 {
00676
00677
00678
00679
00680
00681
00682
00683 USB_swapWords (pRxBuffer, packetsize/2);
00684 }
00685 }
00686
00729 static inline
00730 void USB_dmaTxStart(DWORD dwEndpoint)
00731 {
00732 Uint16 saveIndex;
00733
00734
00735 saveIndex = usbRegisters->INDEX_TESTMODE;
00736
00737
00738 usbRegisters->INDEX_TESTMODE &= ~CSL_USB_INDEX_TESTMODE_EPSEL_MASK;
00739 usbRegisters->INDEX_TESTMODE |= dwEndpoint;
00740
00741
00742 CSL_FINS(usbRegisters->PERI_CSR0_INDX, USB_PERI_TXCSR_FLUSHFIFO, TRUE);
00743
00744
00745 usbRegisters->PERI_CSR0_INDX &= 0x7FFF;
00746 usbRegisters->PERI_CSR0_INDX |= 0x1000;
00747
00748
00749 usbRegisters->PERI_CSR0_INDX |= CSL_USB_PERI_TXCSR_DMAEN_MASK;
00750
00751
00752 usbRegisters->INDEX_TESTMODE = saveIndex;
00753 }
00754
00755
00795 static inline
00796 void USB_dmaTxStop(DWORD dwEndpoint)
00797 {
00798 Uint16 saveIndex;
00799
00800
00801 saveIndex = usbRegisters->INDEX_TESTMODE;
00802
00803
00804 usbRegisters->INDEX_TESTMODE &= ~CSL_USB_INDEX_TESTMODE_EPSEL_MASK;
00805 usbRegisters->INDEX_TESTMODE |= dwEndpoint;
00806
00807
00808 usbRegisters->PERI_CSR0_INDX &= ~CSL_USB_PERI_TXCSR_DMAEN_MASK;
00809
00810
00811 usbRegisters->INDEX_TESTMODE = saveIndex;
00812 }
00813
00880 static inline
00881 CSL_Status USB_handleTx(pUsbContext pContext,
00882 DWORD dwEndpoint)
00883 {
00884 DWORD cbToWrite;
00885 WORD *pwBuffer;
00886 DWORD cbBuffer;
00887 DWORD cbWritten;
00888 Uint16 count;
00889 Uint16 saveIndex;
00890 CSL_Status status;
00891 pUsbEpStatus peps;
00892 pUsbTransfer pTransfer;
00893 volatile ioport Uint16 *pFifoAddr;
00894 volatile Uint32 delay;
00895
00896 status = CSL_SOK;
00897 count = 0;
00898 saveIndex = 0;
00899 cbWritten =0;
00900
00901 if(pContext != NULL)
00902 {
00903 peps = &pContext->pEpStatus[dwEndpoint];
00904 pTransfer = peps->pTransfer;
00905
00906 if((pTransfer != NULL) && (pTransfer->fComplete == FALSE))
00907 {
00908 pwBuffer = (WORD*)pTransfer->pvBuffer + pTransfer->cbTransferred/2;
00909 cbBuffer = (pTransfer->cbBuffer - pTransfer->cbTransferred);
00910 pFifoAddr = (volatile ioport Uint16*)peps->pFifoAddr;
00911
00912
00913 cbToWrite = CSL_USB_MIN(cbBuffer, peps->dwPacketSizeAssigned);
00914
00915
00916 if(pTransfer->ioFlags == CSL_USB_IOFLAG_NOT)
00917 {
00918 pTransfer->fComplete = TRUE;
00919 }
00920 else
00921 {
00922 if(peps->fStalled != TRUE)
00923 {
00924
00925 if(((cbToWrite == 512) || (cbToWrite == 64)) &&
00926 ((pContext->opMode == CSL_USB_OPMODE_DMA) ||
00927 (pContext->opMode == CSL_USB_OPMODE_DMA_TXONLY)))
00928 {
00929 pTransfer->cbTransferred += cbToWrite;
00930 pTransfer->prevTxferLen = cbToWrite;
00931
00932 USB_dmaTxStart(dwEndpoint);
00933
00934 if (pTransfer->cbTransferred == pTransfer->cbBuffer)
00935 {
00936 pTransfer->fComplete = TRUE;
00937 }
00938 else
00939 {
00940 status = pContext->completeTransferCallback(pContext, peps);
00941 }
00942 }
00943 else
00944 {
00945
00946 #if ((defined(CSL_MSC_TEST)) || (defined(CSL_AC_TEST)))
00947
00948
00949
00950 if((cbToWrite != 512) && ((cbToWrite != 64)))
00951 {
00952 pwBuffer++;
00953 }
00954 #endif
00955
00956
00957 saveIndex = usbRegisters->INDEX_TESTMODE;
00958
00959
00960 CSL_FINS(usbRegisters->INDEX_TESTMODE,
00961 USB_INDEX_TESTMODE_EPSEL,
00962 CSL_USB_INDEX_TESTMODE_EPSEL_RESETVAL);
00963
00964 CSL_FINS(usbRegisters->INDEX_TESTMODE,
00965 USB_INDEX_TESTMODE_EPSEL,
00966 dwEndpoint);
00967
00968
00969 CSL_FINS(usbRegisters->PERI_CSR0_INDX,
00970 USB_PERI_TXCSR_FLUSHFIFO, TRUE);
00971
00972 if(cbToWrite > 0)
00973 {
00974
00975 cbWritten = cbToWrite;
00976
00977 for(count = 0; count < (cbToWrite/2); count++)
00978 {
00979 *pFifoAddr = *pwBuffer++;
00980 }
00981
00982 if(cbToWrite % 2)
00983 {
00984
00985 CSL_FINST(sysCtrlRegs->USBSCR,
00986 SYS_USBSCR_BYTEMODE, LOWER);
00987 CSL_FINS(*pFifoAddr, USB_FIFO1R1_DATA,
00988 *pwBuffer);
00989
00990 CSL_FINST(sysCtrlRegs->USBSCR,
00991 SYS_USBSCR_BYTEMODE, FULL);
00992 }
00993 }
00994
00995 if(peps->xferType == CSL_USB_ISO)
00996 {
00997 usbRegisters->PERI_CSR0_INDX |=
00998 CSL_USB_PERI_TXCSR_CLRDATATOG_MASK;
00999 }
01000
01001
01002 CSL_FINS(usbRegisters->PERI_CSR0_INDX,
01003 USB_PERI_CSR0_INDX_RXPKTRDY, TRUE);
01004
01005
01006 usbRegisters->INDEX_TESTMODE = saveIndex;
01007
01008
01009 pTransfer->cbTransferred += cbWritten;
01010 pTransfer->prevTxferLen = cbWritten;
01011
01012 if((pTransfer->cbTransferred == pTransfer->cbBuffer) ||
01013 (cbWritten == 0))
01014 {
01015 pTransfer->fComplete = TRUE;
01016 }
01017 }
01018 }
01019 }
01020
01021 if (pTransfer->fComplete)
01022 {
01023 pContext->fWaitingOnFlagA = FALSE;
01024 status = pContext->completeTransferCallback(pContext, peps);
01025 }
01026 }
01027 else
01028 {
01029 status = CSL_ESYS_INVPARAMS;
01030 }
01031 }
01032 else
01033 {
01034 status = CSL_ESYS_INVPARAMS;
01035 }
01036
01037 return(status);
01038 }
01039
01106 static inline
01107 CSL_Status USB_handleRx(pUsbContext pContext,
01108 DWORD dwEndpoint)
01109 {
01110 DWORD cbToRead;
01111 DWORD cbBuffer;
01112 DWORD dwBytesRead;
01113 WORD *pwBuffer;
01114 pUsbTransfer pTransfer;
01115 CSL_Status status;
01116 Uint16 saveIndex;
01117 pUsbEpStatus peps;
01118 volatile Uint16 count;
01119 volatile ioport Uint16 *pFifoAddr;
01120
01121 status = CSL_SOK;
01122 dwBytesRead = 0;
01123
01124 if(pContext != NULL)
01125 {
01126 peps = &pContext->pEpStatus[dwEndpoint];
01127 pTransfer = peps->pTransfer;
01128
01129 if((pTransfer != NULL) && (pTransfer->fComplete == FALSE))
01130 {
01131 cbBuffer = pTransfer->cbBuffer - pTransfer->cbTransferred;
01132 pwBuffer = (WORD*)pTransfer->pvBuffer + pTransfer->cbTransferred/2;
01133 pFifoAddr = (volatile ioport Uint16*)peps->pFifoAddr;
01134
01135
01136 cbToRead = CSL_USB_MIN(cbBuffer, peps->dwPacketSizeAssigned);
01137
01138 if(((cbToRead == 512) || (cbToRead == 64)) &&
01139 (pContext->opMode == CSL_USB_OPMODE_DMA))
01140 {
01141 pTransfer->cbTransferred += cbToRead;
01142 pTransfer->prevTxferLen = cbToRead;
01143
01144 USB_dmaRxStart(dwEndpoint);
01145
01146 if (pTransfer->cbTransferred == pTransfer->cbBuffer)
01147 {
01148 pTransfer->fComplete = TRUE;
01149 pContext->fWaitingOnFlagB = FALSE;
01150 }
01151
01152 status = pContext->completeTransferCallback(pContext, peps);
01153 }
01154 else
01155 {
01156
01157 #if ((defined(CSL_MSC_TEST)) || (defined(CSL_AC_TEST)))
01158
01159
01160 if((cbToRead != 512) && ((cbToRead != 64)))
01161 {
01162 pwBuffer++;
01163 }
01164 #endif
01165
01166 if(cbToRead > 0)
01167 {
01168
01169 dwBytesRead = cbToRead;
01170
01171 for(count = 0; count < (cbToRead/2); count++)
01172 {
01173 *pwBuffer++ = *pFifoAddr;
01174 }
01175
01176 if(cbToRead % 2)
01177 {
01178
01179 CSL_FINST(sysCtrlRegs->USBSCR,
01180 SYS_USBSCR_BYTEMODE, LOWER);
01181 *pwBuffer = *pFifoAddr & 0xFF;
01182
01183
01184 CSL_FINST(sysCtrlRegs->USBSCR,
01185 SYS_USBSCR_BYTEMODE, FULL);
01186 }
01187 }
01188
01189 pTransfer->cbTransferred += dwBytesRead;
01190 pTransfer->prevTxferLen = dwBytesRead;
01191
01192 if((pTransfer->cbTransferred == pTransfer->cbBuffer) ||
01193 (dwBytesRead == 0))
01194 {
01195 pTransfer->fComplete = TRUE;
01196 }
01197
01198
01199 saveIndex = usbRegisters->INDEX_TESTMODE;
01200
01201 CSL_FINS(usbRegisters->INDEX_TESTMODE,
01202 USB_INDEX_TESTMODE_EPSEL,
01203 CSL_USB_INDEX_TESTMODE_EPSEL_RESETVAL);
01204
01205 CSL_FINS(usbRegisters->INDEX_TESTMODE,
01206 USB_INDEX_TESTMODE_EPSEL, dwEndpoint);
01207
01208 if(peps->xferType == CSL_USB_ISO)
01209 {
01210
01211 usbRegisters->PERI_RXCSR_INDX |= (CSL_USB_PERI_RXCSR_CLRDATATOG_MASK);
01212 }
01213
01214
01215 CSL_FINS(usbRegisters->PERI_RXCSR_INDX,
01216 USB_PERI_RXCSR_RXPKTRDY, FALSE);
01217
01218
01219 usbRegisters->INDEX_TESTMODE = saveIndex;
01220
01221 if(pTransfer->fComplete == TRUE)
01222 {
01223 pContext->fWaitingOnFlagB = FALSE;
01224
01225
01226 #if ((defined(CSL_MSC_TEST)) || (defined(CSL_AC_TEST)))
01227
01228 if((cbToRead != 512) && (cbToRead != 64))
01229 {
01230 *(PWORD)pTransfer->pvBuffer = pTransfer->cbTransferred;
01231 }
01232 #endif
01233
01234 status = pContext->completeTransferCallback(pContext, peps);
01235 }
01236 }
01237 }
01238 else
01239 {
01240 status = CSL_ESYS_INVPARAMS;
01241 }
01242 }
01243 else
01244 {
01245 status = CSL_ESYS_INVPARAMS;
01246 }
01247
01248 return(status);
01249 }
01250
01296 static inline
01297 CSL_Status USB_processEP0Out(pUsbContext pContext)
01298 {
01299 pUsbEpStatus peps;
01300 pUsbTransfer pTransfer;
01301 WORD *pwBuffer;
01302 CSL_Status status;
01303
01304 status = CSL_SOK;
01305
01306 if(pContext != NULL)
01307 {
01308 peps = &pContext->pEpStatus[CSL_USB_EP0];
01309 pTransfer = peps->pTransfer;
01310
01311 if((pTransfer != NULL) && (pTransfer->fComplete == FALSE))
01312 {
01313
01314 pwBuffer = (WORD*)pTransfer->pvBuffer + pTransfer->cbTransferred/2;
01315
01316 #if ((defined(CSL_MSC_TEST)) || (defined(CSL_AC_TEST)))
01317
01318
01319 (WORD*)pwBuffer++;
01320 #endif
01321
01322
01323 pTransfer->cbTransferred = CSL_USB_MIN(pContext->cbOutEP0Buf,
01324 pTransfer->cbBuffer);
01325
01326 memcpy(pwBuffer, (PVOID)pContext->dwOutEP0Buf,
01327 (pTransfer->cbTransferred+1)/2);
01328
01329 pContext->fOutPhaseCmd = FALSE;
01330 pTransfer->fComplete = TRUE;
01331 pTransfer->prevTxferLen = pTransfer->cbTransferred;
01332
01333 #if ((defined(CSL_MSC_TEST)) || (defined(CSL_AC_TEST)))
01334
01335 *(PWORD)pTransfer->pvBuffer = pTransfer->cbTransferred;
01336 #endif
01337 status = pContext->completeTransferCallback(pContext, peps);
01338 }
01339 else
01340 {
01341 status = CSL_ESYS_INVPARAMS;
01342 }
01343 }
01344 else
01345 {
01346 status = CSL_ESYS_INVPARAMS;
01347 }
01348 return(status);
01349 }
01350
01396 #if 1
01397 static inline
01398 CSL_Status USB_processEP0In(pUsbContext pContext)
01399 {
01400 pUsbEpStatus peps;
01401 pUsbTransfer pTransfer;
01402 CSL_Status status;
01403 PWORD pwBuffer;
01404 DWORD cbBuffer;
01405 WORD cbToWrite;
01406 Uint16 count;
01407 Uint16 flag;
01408 Uint16 saveIndex;
01409
01410 flag = 0;
01411 status = CSL_SOK;
01412
01413 if(pContext != NULL)
01414 {
01415 peps = &pContext->pEpStatus[CSL_USB_EP0];
01416 pTransfer = peps->pTransfer;
01417
01418 if((pTransfer != NULL) && (pTransfer->fComplete == FALSE))
01419 {
01420
01421 pwBuffer = (PWORD)pTransfer->pvBuffer + pTransfer->cbTransferred/2;
01422 cbBuffer = pTransfer->cbBuffer - pTransfer->cbTransferred;
01423
01424 #if ((defined(CSL_MSC_TEST)) || (defined(CSL_AC_TEST)))
01425
01426 pwBuffer++;
01427 #endif
01428
01429
01430 cbToWrite = CSL_USB_MIN(cbBuffer, peps->dwPacketSizeAssigned);
01431
01432 while(TRUE)
01433 {
01434
01435 for(count = 0; count < cbToWrite/2;count++)
01436 {
01437 usbRegisters->FIFO0R1 = (*pwBuffer);
01438 pwBuffer++;
01439 }
01440
01441 if(cbToWrite % 2 == TRUE)
01442 {
01443
01444 CSL_FINST(sysCtrlRegs->USBSCR, SYS_USBSCR_BYTEMODE, LOWER);
01445 usbRegisters->FIFO0R1 = (*pwBuffer);
01446
01447 CSL_FINST(sysCtrlRegs->USBSCR, SYS_USBSCR_BYTEMODE, FULL);
01448 }
01449
01450
01451 if(cbToWrite <= CSL_USB_MAX_EP0_FIFO_LEN)
01452 {
01453 break;
01454 }
01455 else
01456 {
01457 cbToWrite -= CSL_USB_MAX_EP0_FIFO_LEN;
01458 }
01459 }
01460
01461 pContext->fEP0BUFAvailable = FALSE;
01462
01463 pTransfer->cbTransferred += cbToWrite;
01464 pTransfer->prevTxferLen = cbToWrite;
01465 if(pTransfer->cbTransferred == pTransfer->cbBuffer)
01466 {
01467 pTransfer->fComplete = TRUE;
01468 }
01469
01470
01471 saveIndex = usbRegisters->INDEX_TESTMODE;
01472
01473
01474 CSL_FINS(usbRegisters->INDEX_TESTMODE,
01475 USB_INDEX_TESTMODE_EPSEL,
01476 CSL_USB_INDEX_TESTMODE_EPSEL_RESETVAL);
01477
01478
01479 CSL_FINS(usbRegisters->INDEX_TESTMODE,
01480 USB_INDEX_TESTMODE_EPSEL,
01481 CSL_USB_EP0);
01482
01483 if(pTransfer->fComplete == TRUE)
01484 {
01485 pContext->fWaitingOnEP0BUFAvail = FALSE;
01486
01487
01488 flag = (CSL_USB_PERI_CSR0_INDX_DATAEND_MASK |
01489 CSL_USB_PERI_CSR0_INDX_TXPKTRDY_MASK);
01490
01491 pContext->ep0State = CSL_USB_EP0_IDLE;
01492
01493 usbRegisters->PERI_CSR0_INDX |= flag;
01494
01495 status = pContext->completeTransferCallback(pContext, peps);
01496 }
01497 else
01498 {
01499
01500 flag = CSL_USB_PERI_CSR0_INDX_TXPKTRDY_MASK;
01501
01502
01503 usbRegisters->PERI_CSR0_INDX |= flag;
01504 }
01505
01506
01507 usbRegisters->INDEX_TESTMODE = saveIndex;
01508 }
01509 else
01510 {
01511 status = CSL_ESYS_INVPARAMS;
01512 }
01513 }
01514 else
01515 {
01516 status = CSL_ESYS_INVPARAMS;
01517 }
01518
01519 return(status);
01520 }
01521 #endif
01522
01569 static inline
01570 void USB_handleRxIntr(pUsbContext pContext)
01571 {
01572 Uint16 saveIndex;
01573 pUsbEpStatus peps;
01574
01575 peps = &pContext->pEpStatus[CSL_USB_EP2];
01576 saveIndex = 0;
01577
01578
01579 saveIndex = usbRegisters->INDEX_TESTMODE;
01580
01581 usbRegisters->INDEX_TESTMODE &= ~CSL_USB_INDEX_TESTMODE_EPSEL_MASK;
01582 usbRegisters->INDEX_TESTMODE |= CSL_USB_EP2;
01583
01584
01585 if((usbRegisters->PERI_RXCSR_INDX & CSL_USB_PERI_RXCSR_RXPKTRDY_MASK)
01586 == CSL_USB_PERI_RXCSR_RXPKTRDY_MASK)
01587 {
01588 if(peps->xferType == CSL_USB_ISO)
01589 {
01590 pContext->fSetupPktCmd = TRUE;
01591 }
01592 else
01593 {
01594 pContext->fWaitingOnFlagB = TRUE;
01595 }
01596 }
01597
01598
01599 usbRegisters->INDEX_TESTMODE = saveIndex;
01600 }
01601
01645 static inline
01646 void USB_handleTxIntr(pUsbContext pContext)
01647 {
01648 Uint16 saveIndex;
01649
01650 saveIndex = 0;
01651
01652
01653 saveIndex = usbRegisters->INDEX_TESTMODE;
01654
01655 usbRegisters->INDEX_TESTMODE &= ~CSL_USB_INDEX_TESTMODE_EPSEL_MASK;
01656 usbRegisters->INDEX_TESTMODE |= CSL_USB_EP1;
01657
01658
01659 if((usbRegisters->PERI_CSR0_INDX & CSL_USB_PERI_TXCSR_INDX_SENDSTALL_MASK)
01660 == CSL_USB_PERI_TXCSR_INDX_SENDSTALL_MASK)
01661 {
01662 CSL_FINS(usbRegisters->PERI_CSR0_INDX, USB_PERI_TXCSR_SENDSTALL, FALSE);
01663 }
01664
01665
01666 usbRegisters->INDEX_TESTMODE = saveIndex;
01667 }
01668
01717 static inline
01718 Bool USB_checkSpeed(pUsbContext pContext,
01719 CSL_UsbBusSpeed *pBusSpeed)
01720 {
01721 Uint16 wPower;
01722
01723 wPower = usbRegisters->FADDR_POWER;
01724
01725 if((wPower == 0) || (pBusSpeed == NULL))
01726 {
01727 return (FALSE);
01728 }
01729
01730
01731
01732
01733
01734 if((usbRegisters->FADDR_POWER & CSL_USB_FADDR_POWER_HSMODE_MASK) != 0)
01735 {
01736 *pBusSpeed = CSL_USB_BS_HIGH_SPEED;
01737 }
01738 else
01739 {
01740 *pBusSpeed = CSL_USB_BS_FULL_SPEED;
01741 }
01742
01743 return (TRUE);
01744 }
01745
01792 static inline
01793 void USB_readEP0Buf(pUsbContext pContext,
01794 DWORD *pBuf)
01795 {
01796 WORD packetSize;
01797 Uint16 saveIndex;
01798 WORD count = 0;
01799 Uint32 tempStore;
01800 Uint16 flag;
01801
01802 saveIndex = 0;
01803 packetSize = 0;
01804 flag = 0;
01805
01806
01807 saveIndex = (usbRegisters->INDEX_TESTMODE &
01808 CSL_USB_INDEX_TESTMODE_EPSEL_MASK);
01809
01810
01811 usbRegisters->INDEX_TESTMODE &= ~(CSL_USB_INDEX_TESTMODE_EPSEL_MASK);
01812
01813 packetSize = ((usbRegisters->COUNT0_INDX) &
01814 CSL_USB_COUNT0_INDX_EP0RXCOUNT_MASK);
01815
01816 if((packetSize > CSL_USB_MAX_EP0_FIFO_LEN) ||
01817 (packetSize > pContext->cbOutEP0DataReceived))
01818 {
01819
01820 usbRegisters->INDEX_TESTMODE &= ~(CSL_USB_INDEX_TESTMODE_EPSEL_MASK);
01821 usbRegisters->INDEX_TESTMODE |= saveIndex;
01822 return;
01823 }
01824
01825 pBuf = pContext->dwOutEP0Buf;
01826
01827 for(count = 0; count < packetSize; count += 4)
01828 {
01829 *pBuf = 0;
01830 tempStore = 0;
01831 *pBuf = usbRegisters->FIFO0R1;
01832 tempStore = usbRegisters->FIFO0R1;
01833 *pBuf |= (tempStore << 16);
01834 pBuf++;
01835 }
01836
01837 pContext->cbOutEP0DataReceived -= packetSize;
01838
01839 if(pContext->cbOutEP0DataReceived == 0)
01840 {
01841
01842 flag = CSL_USB_PERI_CSR0_INDX_DATAEND_MASK;
01843 }
01844
01845
01846 flag |= CSL_USB_PERI_CSR0_INDX_SERV_RXPKTRDY_MASK;
01847 usbRegisters->PERI_CSR0_INDX |= flag;
01848
01849
01850 usbRegisters->INDEX_TESTMODE &= ~(CSL_USB_INDEX_TESTMODE_EPSEL_MASK);
01851 usbRegisters->INDEX_TESTMODE |= saveIndex;
01852 }
01853
01901 static inline
01902 void USB_setConfiguration(CSL_UsbDevNum devNum,
01903 Uint16 confVal)
01904 {
01905 Uint16 saveIndex;
01906 Uint16 tempVal;
01907
01908 saveIndex = 0;
01909
01910
01911 saveIndex = usbRegisters->INDEX_TESTMODE;
01912
01913
01914
01915 usbRegisters->INDEX_TESTMODE &= ~CSL_USB_INDEX_TESTMODE_EPSEL_MASK;
01916 usbRegisters->INDEX_TESTMODE |= CSL_USB_EP1;
01917
01918
01919 usbRegisters->PERI_CSR0_INDX |= (CSL_USB_PERI_TXCSR_CLRDATATOG_MASK);
01920
01921 usbRegisters->PERI_RXCSR_INDX |= (CSL_USB_PERI_RXCSR_CLRDATATOG_MASK);
01922
01923
01924 if((usbRegisters->PERI_CSR0_INDX & CSL_USB_PERI_TXCSR_FIFONOTEMPTY_MASK) ==
01925 CSL_USB_PERI_TXCSR_FIFONOTEMPTY_MASK)
01926 {
01927
01928
01929 tempVal = usbRegisters->PERI_CSR0_INDX;
01930
01931 tempVal |= CSL_USB_PERI_TXCSR_FLUSHFIFO_MASK;
01932 tempVal &= ~(0x03);
01933
01934 usbRegisters->PERI_CSR0_INDX = tempVal;
01935 }
01936
01937
01938
01939 usbRegisters->INDEX_TESTMODE &= ~CSL_USB_INDEX_TESTMODE_EPSEL_MASK;
01940 usbRegisters->INDEX_TESTMODE |= CSL_USB_EP2;
01941
01942
01943 usbRegisters->PERI_CSR0_INDX |= (CSL_USB_PERI_TXCSR_CLRDATATOG_MASK);
01944
01945 usbRegisters->PERI_RXCSR_INDX |= (CSL_USB_PERI_RXCSR_CLRDATATOG_MASK);
01946
01947
01948 if((usbRegisters->PERI_CSR0_INDX & CSL_USB_PERI_TXCSR_FIFONOTEMPTY_MASK) ==
01949 CSL_USB_PERI_TXCSR_FIFONOTEMPTY_MASK)
01950 {
01951
01952
01953 tempVal = usbRegisters->PERI_CSR0_INDX;
01954
01955 tempVal |= CSL_USB_PERI_TXCSR_FLUSHFIFO_MASK;
01956 tempVal &= ~(0x03);
01957
01958 usbRegisters->PERI_CSR0_INDX = tempVal;
01959 }
01960
01961
01962
01963 usbRegisters->INDEX_TESTMODE &= ~CSL_USB_INDEX_TESTMODE_EPSEL_MASK;
01964 usbRegisters->INDEX_TESTMODE |= CSL_USB_EP3;
01965
01966
01967 usbRegisters->PERI_CSR0_INDX |= (CSL_USB_PERI_TXCSR_CLRDATATOG_MASK);
01968
01969 usbRegisters->PERI_RXCSR_INDX |= (CSL_USB_PERI_RXCSR_CLRDATATOG_MASK);
01970
01971
01972 if((usbRegisters->PERI_CSR0_INDX & CSL_USB_PERI_TXCSR_FIFONOTEMPTY_MASK) ==
01973 CSL_USB_PERI_TXCSR_FIFONOTEMPTY_MASK)
01974 {
01975
01976
01977 tempVal = usbRegisters->PERI_CSR0_INDX;
01978
01979 tempVal |= CSL_USB_PERI_TXCSR_FLUSHFIFO_MASK;
01980 tempVal &= ~(0x03);
01981
01982 usbRegisters->PERI_CSR0_INDX = tempVal;
01983 }
01984
01985
01986
01987 usbRegisters->INDEX_TESTMODE &= ~CSL_USB_INDEX_TESTMODE_EPSEL_MASK;
01988 usbRegisters->INDEX_TESTMODE |= CSL_USB_EP4;
01989
01990
01991 usbRegisters->PERI_CSR0_INDX |= (CSL_USB_PERI_TXCSR_CLRDATATOG_MASK);
01992
01993 usbRegisters->PERI_RXCSR_INDX |= (CSL_USB_PERI_RXCSR_CLRDATATOG_MASK);
01994
01995
01996 if((usbRegisters->PERI_CSR0_INDX & CSL_USB_PERI_TXCSR_FIFONOTEMPTY_MASK) ==
01997 CSL_USB_PERI_TXCSR_FIFONOTEMPTY_MASK)
01998 {
01999
02000
02001 tempVal = usbRegisters->PERI_CSR0_INDX;
02002
02003 tempVal |= CSL_USB_PERI_TXCSR_FLUSHFIFO_MASK;
02004 tempVal &= ~(0x03);
02005
02006 usbRegisters->PERI_CSR0_INDX = tempVal;
02007 }
02008
02009
02010 usbRegisters->INDEX_TESTMODE = saveIndex;
02011 }
02012
02060 static inline
02061 Bool USB_isValidDataInFifoOut(pUsbEpStatus peps)
02062 {
02063 Uint16 saveIndex;
02064 Uint16 wByteCount;
02065 Uint16 flag;
02066
02067 saveIndex = 0;
02068 wByteCount = 0;
02069 flag = FALSE;
02070
02071 if(CSL_USB_EP2 == peps->dwEndpoint)
02072 {
02073
02074 saveIndex = usbRegisters->INDEX_TESTMODE;
02075
02076 usbRegisters->INDEX_TESTMODE &= ~CSL_USB_INDEX_TESTMODE_EPSEL_MASK;
02077 usbRegisters->INDEX_TESTMODE |= CSL_USB_EP2;
02078
02079
02080 if((usbRegisters->PERI_RXCSR_INDX & CSL_USB_PERI_RXCSR_RXPKTRDY_MASK) ==
02081 CSL_USB_PERI_RXCSR_RXPKTRDY_MASK)
02082 {
02083 wByteCount = usbRegisters->COUNT0_INDX & 0xFF;
02084 peps->dataReadFromFifo = wByteCount;
02085
02086 if(peps->xferType != CSL_USB_ISO)
02087 {
02088 if((wByteCount <= peps->dwPacketSizeAssigned))
02089 {
02090
02091
02092 flag = TRUE;
02093 }
02094 }
02095 else
02096 {
02097 flag = TRUE;
02098 }
02099 }
02100
02101
02102 usbRegisters->INDEX_TESTMODE = saveIndex;
02103 }
02104
02105 return(flag);
02106 }
02107
02142 static inline
02143 void USB_flushFifo(DWORD dwEndpoint,
02144 Bool fifoDirFlag)
02145 {
02146 Uint16 saveIndex;
02147 Uint16 tempVal;
02148
02149 saveIndex = 0;
02150
02151
02152 saveIndex = usbRegisters->INDEX_TESTMODE;
02153
02154
02155 usbRegisters->INDEX_TESTMODE &= ~CSL_USB_INDEX_TESTMODE_EPSEL_MASK;
02156 usbRegisters->INDEX_TESTMODE |= dwEndpoint;
02157
02158 if (dwEndpoint == CSL_USB_EP0)
02159 {
02160
02161 usbRegisters->PERI_CSR0_INDX |= CSL_USB_PERI_CSR0_INDX_FLUSHFIFO_MASK;
02162 }
02163 else
02164 {
02165 if (1 == fifoDirFlag)
02166 {
02167
02168
02169 tempVal = usbRegisters->PERI_CSR0_INDX;
02170
02171 tempVal |= CSL_USB_PERI_TXCSR_FLUSHFIFO_MASK;
02172 tempVal &= ~(0x03);
02173
02174 usbRegisters->PERI_CSR0_INDX = tempVal;
02175 }
02176 else
02177 {
02178
02179 usbRegisters->PERI_RXCSR_INDX |=CSL_USB_PERI_RXCSR_FLUSHFIFO_MASK;
02180 }
02181 }
02182
02183
02184 usbRegisters->INDEX_TESTMODE = saveIndex;
02185 }
02186
02219 static inline
02220 void USB_serviceEp0RxPkt(Uint16 periCsr0Val)
02221 {
02222 usbRegisters->PERI_CSR0_INDX |= periCsr0Val;
02223 }
02224
02225 static inline
02226 void USB_sendEpZLP(DWORD dwEndpoint)
02227 {
02228 Uint16 saveIndex;
02229
02230
02231 saveIndex = usbRegisters->INDEX_TESTMODE;
02232
02233
02234 usbRegisters->INDEX_TESTMODE &= ~CSL_USB_INDEX_TESTMODE_EPSEL_MASK;
02235 usbRegisters->INDEX_TESTMODE |= dwEndpoint;
02236
02237
02238 CSL_FINS(usbRegisters->PERI_CSR0_INDX,
02239 USB_PERI_CSR0_INDX_TXPKTRDY, TRUE);
02240 CSL_FINS(usbRegisters->PERI_CSR0_INDX,
02241 USB_PERI_CSR0_INDX_DATAEND, TRUE);
02242
02243
02244 usbRegisters->INDEX_TESTMODE = saveIndex;
02245 }
02246
02247 static inline
02248 void USB_clearEpRxPktRdy(DWORD dwEndpoint)
02249 {
02250 Uint16 saveIndex;
02251
02252
02253 saveIndex = usbRegisters->INDEX_TESTMODE;
02254
02255
02256 usbRegisters->INDEX_TESTMODE &= ~CSL_USB_INDEX_TESTMODE_EPSEL_MASK;
02257 usbRegisters->INDEX_TESTMODE |= dwEndpoint;
02258
02259
02260 CSL_FINS(usbRegisters->PERI_CSR0_INDX,
02261 USB_PERI_CSR0_INDX_SERV_RXPKTRDY, TRUE);
02262 CSL_FINS(usbRegisters->PERI_CSR0_INDX,
02263 USB_PERI_CSR0_INDX_DATAEND, TRUE);
02264
02265
02266 usbRegisters->INDEX_TESTMODE = saveIndex;
02267 }
02268
02269 #ifdef __cplusplus
02270 }
02271 #endif
02272
02273 #endif //_CSL_USBAUX_H_
02274