00001
00002
00003
00004
00005
00006
00007
00008
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00047 #ifndef _CSL_DMA_H_
00048 #define _CSL_DMA_H_
00049
00050 #ifdef __cplusplus
00051 extern "C" {
00052 #endif
00053
00054 #include <cslr_dma.h>
00055 #include <cslr_sysctrl.h>
00056 #include <tistdtypes.h>
00057 #include <csl_types.h>
00058 #include <csl_error.h>
00059 #include <soc.h>
00060 #include <csl_general.h>
00061
00087
00088
00089
00090
00094 #define CSL_DMA_MIN_TX_SIZE (4)
00095
00096 #define CSL_DMA_CHAN_MAX (16)
00097
00098 #define CSL_DMA_CHAN_COUNT (4)
00099
00100 #define CSL_DMA_CHANNEL_BUSY (1)
00101
00102 #define CSL_DMA_CHANNEL_FREE (0)
00103
00104 #define CSL_DMA_CHANNEL_ENABLE (Uint16)1
00105
00106 #define CSL_DMA_CHANNEL_DISABLE (Uint16)0
00107
00108 #define CSL_DMA_DMATCR2_DMASTART_SYNC_MASK (0x8004)
00109
00110 #define CSL_DMA_UINT16_MASK (0xFFFF)
00111
00112 #define CSL_DMA_UINT16_NUMBER_BITS (0x0010)
00113
00114 #define CSL_DMA_RESET_CLOCK_CYCLE (0x20)
00115
00116 #define CSL_DMA_ADDR_MODE_FIXED (0x02)
00117
00118 #define CSL_DMA_ADDR_MODE_INCREMENT (0x00)
00119
00120 #define CSL_DMA_ADDR_SHIFT (0x01)
00121
00122 #define CSL_DMA_DARAM_START_ADDR (0x00060)
00123
00124 #define CSL_DMA_DARAM_END_ADDR (0x07FFF)
00125
00126 #define CSL_DMA_SARAM_START_ADDR (0x08000)
00127
00128 #define CSL_DMA_SARAM_END_ADDR (0x27FFF)
00129
00130 #define CSL_DMA_DARAM_ADDR_OFFSET (0x010000)
00131
00132 #define CSL_DMA_SARAM_ADDR_OFFSET (0x080000)
00133
00134 #define CSL_DMA_16BIT_MASK (0xFFFFu)
00135
00136 #define CSL_DMA_16BIT_SHIFT (16u)
00137
00140
00141
00142
00143
00152 typedef enum
00153 {
00154 CSL_DMA_ENGINE0 = 0,
00155 CSL_DMA_ENGINE1,
00156 CSL_DMA_ENGINE2,
00157 CSL_DMA_ENGINE3,
00158 CSL_DMA_ENGINEINV
00159 } CSL_DMAEngineId;
00160
00166 typedef enum
00167 {
00168 CSL_DMA_CHAN0 = 0,
00169 CSL_DMA_CHAN1,
00170 CSL_DMA_CHAN2,
00171 CSL_DMA_CHAN3,
00172 CSL_DMA_CHAN4,
00173 CSL_DMA_CHAN5,
00174 CSL_DMA_CHAN6,
00175 CSL_DMA_CHAN7,
00176 CSL_DMA_CHAN8,
00177 CSL_DMA_CHAN9,
00178 CSL_DMA_CHAN10,
00179 CSL_DMA_CHAN11,
00180 CSL_DMA_CHAN12,
00181 CSL_DMA_CHAN13,
00182 CSL_DMA_CHAN14,
00183 CSL_DMA_CHAN15,
00184 CSL_DMA_CHAN_INV
00185 } CSL_DMAChanNum;
00186
00193 typedef enum
00194 {
00195 CSL_DMA_AUTORELOAD_DISABLE,
00196 CSL_DMA_AUTORELOAD_ENABLE
00197 } CSL_DMAAutoReloadMode;
00198
00205 typedef enum
00206 {
00207 CSL_DMA_TXBURST_1WORD,
00208 CSL_DMA_TXBURST_2WORD,
00209 CSL_DMA_TXBURST_4WORD,
00210 CSL_DMA_TXBURST_8WORD,
00211 CSL_DMA_TXBURST_16WORD
00212 } CSL_DMATxBurstLen;
00213
00220 typedef enum
00221 {
00222 CSL_DMA_TRANSFER_COMPLETE,
00223 CSL_DMA_TRANSFER_ERROR
00224 } CSL_DMATransferStatus;
00225
00231 typedef enum
00232 {
00233 CSL_DMA_EVT_NONE = 0,
00234 CSL_DMA_EVT_I2S0_TX = 1,
00235 CSL_DMA_EVT_I2S0_RX = 2,
00236 CSL_DMA_EVT_I2S1_TX = 1,
00237 CSL_DMA_EVT_I2S1_RX = 2,
00238 CSL_DMA_EVT_I2S2_TX = 1,
00239 CSL_DMA_EVT_I2S2_RX = 2,
00240 CSL_DMA_EVT_I2S3_TX = 4,
00241 CSL_DMA_EVT_I2S3_RX = 5,
00242 CSL_DMA_EVT_MMC_SD0_TX = 5,
00243 CSL_DMA_EVT_MMC_SD0_RX = 6,
00244 CSL_DMA_EVT_MMC_SD1_TX = 7,
00245 CSL_DMA_EVT_MMC_SD1_RX = 8,
00246 CSL_DMA_EVT_TIMER0 = 12,
00247 CSL_DMA_EVT_TIMER1 = 13,
00248 CSL_DMA_EVT_TIMER2 = 14,
00249 CSL_DMA_EVT_UART_TX = 5,
00250 CSL_DMA_EVT_UART_RX = 6,
00251 CSL_DMA_EVT_I2C_TX = 1,
00252 CSL_DMA_EVT_I2C_RX = 2,
00253 CSL_DMA_EVT_SAR_AD = 3,
00254 CSL_DMA_EVT_INVALID
00255 } CSL_DMAEvtType;
00256
00263 typedef enum
00264 {
00265 CSL_DMA_READ,
00266 CSL_DMA_WRITE
00267 } CSL_DMAChanDir;
00268
00275 typedef enum
00276 {
00277 CSL_DMA_TRANSFER_IO_MEMORY,
00278 CSL_DMA_TRANSFER_MEMORY
00279 } CSL_DMATransferType;
00280
00287 typedef enum
00288 {
00289 CSL_DMA_SOFTWARE_TRIGGER,
00290 CSL_DMA_EVENT_TRIGGER
00291 } CSL_DMATriggerType;
00292
00299 typedef enum
00300 {
00301 CSL_DMA_INTERRUPT_DISABLE,
00302 CSL_DMA_INTERRUPT_ENABLE
00303 } CSL_DMAInterruptState;
00304
00305 #if (defined(CHIP_C5505_C5515) || defined(CHIP_C5504_C5514))
00306
00313 typedef enum
00314 {
00315 CSL_DMA_PING_PONG_DISABLE,
00316 CSL_DMA_PING_PONG_ENABLE
00317 } CSL_DMAPingPongMode;
00318
00319 #endif
00320
00333 typedef struct
00334 {
00335 CSL_DmaRegsOvly dmaRegs;
00336 CSL_DMAChanNum chanNum;
00337 CSL_DMAEngineId dmaInstNum;
00338 Bool isChanFree;
00339 CSL_DMAChanDir chanDir;
00340 CSL_DMATriggerType trigger;
00341 CSL_DMATransferType trfType;
00342 CSL_DMAInterruptState dmaInt;
00344 #if (defined(CHIP_C5505_C5515) || defined(CHIP_C5504_C5514))
00345 Bool pingPongEnabled;
00346 #endif
00347
00351 } CSL_DMA_ChannelObj;
00352
00357 typedef CSL_DMA_ChannelObj *CSL_DMA_Handle;
00358
00365 typedef struct
00366 {
00367 #if (defined(CHIP_C5505_C5515) || defined(CHIP_C5504_C5514))
00368 CSL_DMAPingPongMode pingPongMode;
00369 #endif
00370
00371 CSL_DMAAutoReloadMode autoMode;
00372 CSL_DMATxBurstLen burstLen;
00373 CSL_DMATriggerType trigger;
00374 CSL_DMAEvtType dmaEvt;
00375 CSL_DMAInterruptState dmaInt;
00376 CSL_DMAChanDir chanDir;
00377 CSL_DMATransferType trfType;
00378 Uint16 dataLen;
00380 Uint32 srcAddr;
00381 Uint32 destAddr;
00382 } CSL_DMA_Config;
00383
00388
00389
00390
00391
00431 CSL_Status DMA_init (void);
00432
00480 CSL_DMA_Handle DMA_open (
00481 CSL_DMAChanNum chanNum,
00482 CSL_DMA_ChannelObj *pDmaChanObj,
00483 CSL_Status *status
00484 );
00485
00527 CSL_Status DMA_close (
00528 CSL_DMA_Handle hDMA
00529 );
00530
00600 CSL_Status DMA_config (
00601 CSL_DMA_Handle hDMA,
00602 CSL_DMA_Config *pConfig
00603 );
00604
00647 CSL_Status DMA_getConfig (
00648 CSL_DMA_Handle hDMA,
00649 CSL_DMA_Config *pConfig
00650 );
00651
00717 CSL_Status DMA_start (
00721 CSL_DMA_Handle hDMA
00722 );
00723
00794 CSL_Status DMA_stop (
00798 CSL_DMA_Handle hDMA
00799 );
00800
00839 CSL_Status DMA_reset (
00840 CSL_DMA_Handle hDMA
00841 );
00842
00879 CSL_Status DMA_swapWords (Uint16 *dataBuffer,
00880 Uint32 dataLength);
00881
00882 #if (defined(CHIP_C5505_C5515) || defined(CHIP_C5504_C5514))
00883
00927 Bool DMA_getLastTransferType (CSL_DMA_Handle hDMA,
00928 CSL_Status *status);
00929 #endif
00930
00933
00934
00935
01007 static inline
01008 Int DMA_getStatus (
01012 CSL_DMA_Handle hDMA
01013 )
01014 {
01015 Int status;
01016 Uint16 chanNum;
01017
01018 if(hDMA != NULL)
01019 {
01020 chanNum = hDMA->chanNum;
01021
01022 while(chanNum >= CSL_DMA_PER_CNT)
01023 {
01024 chanNum = chanNum - CSL_DMA_PER_CNT;
01025 }
01026
01027 switch((CSL_DMAChanNum)chanNum)
01028 {
01029 case CSL_DMA_CHAN0:
01030 status = CSL_FEXT(hDMA->dmaRegs->DMACH0TCR2, DMA_DMACH0TCR2_EN);
01031 break;
01032 case CSL_DMA_CHAN1:
01033 status = CSL_FEXT(hDMA->dmaRegs->DMACH1TCR2, DMA_DMACH1TCR2_EN);
01034 break;
01035 case CSL_DMA_CHAN2:
01036 status = CSL_FEXT(hDMA->dmaRegs->DMACH2TCR2, DMA_DMACH2TCR2_EN);
01037 break;
01038 case CSL_DMA_CHAN3:
01039 status = CSL_FEXT(hDMA->dmaRegs->DMACH3TCR2, DMA_DMACH3TCR2_EN);
01040 break;
01041 }
01042 }
01043 else
01044 {
01045 status = CSL_ESYS_BADHANDLE;
01046 }
01047
01048 return status;
01049 }
01053 #ifdef __cplusplus
01054 }
01055 #endif
01056
01057 #endif
01058