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 #ifndef _XDMAD_H
00031 #define _XDMAD_H
00032
00033
00034
00035
00036
00037
00038 #include "chip.h"
00039 #include <assert.h>
00040
00041
00042
00043
00044
00045
00046
00047 #define XDMAD_TRANSFER_MEMORY 0xFF
00048 #define XDMAD_ALLOC_FAILED 0xFFFF
00049
00050 #define XDMAD_TRANSFER_TX 0
00051 #define XDMAD_TRANSFER_RX 1
00052
00053
00054 #define XDMA_UBC_NDE (0x1u << 24)
00055 #define XDMA_UBC_NDE_FETCH_DIS (0x0u << 24)
00056 #define XDMA_UBC_NDE_FETCH_EN (0x1u << 24)
00057 #define XDMA_UBC_NSEN (0x1u << 25)
00058 #define XDMA_UBC_NSEN_UNCHANGED (0x0u << 25)
00059 #define XDMA_UBC_NSEN_UPDATED (0x1u << 25)
00060 #define XDMA_UBC_NDEN (0x1u << 26)
00061 #define XDMA_UBC_NDEN_UNCHANGED (0x0u << 26)
00062 #define XDMA_UBC_NDEN_UPDATED (0x1u << 26)
00063 #define XDMA_UBC_NVIEW_Pos 27
00064 #define XDMA_UBC_NVIEW_Msk (0x3u << XDMA_UBC_NVIEW_Pos)
00065 #define XDMA_UBC_NVIEW_NDV0 (0x0u << XDMA_UBC_NVIEW_Pos)
00066 #define XDMA_UBC_NVIEW_NDV1 (0x1u << XDMA_UBC_NVIEW_Pos)
00067 #define XDMA_UBC_NVIEW_NDV2 (0x2u << XDMA_UBC_NVIEW_Pos)
00068 #define XDMA_UBC_NVIEW_NDV3 (0x3u << XDMA_UBC_NVIEW_Pos)
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083 typedef enum _XdmadStatus {
00084 XDMAD_OK = 0,
00085 XDMAD_PARTIAL_DONE,
00086 XDMAD_DONE,
00087 XDMAD_BUSY,
00088 XDMAD_ERROR,
00089 XDMAD_CANCELED
00090 } eXdmadStatus, eXdmadRC;
00091
00092
00093 typedef enum _XdmadState {
00094 XDMAD_STATE_FREE = 0,
00095 XDMAD_STATE_ALLOCATED,
00096 XDMAD_STATE_START,
00097 XDMAD_STATE_IN_XFR,
00098 XDMAD_STATE_DONE,
00099 XDMAD_STATE_HALTED,
00100 } eXdmadState;
00101
00102
00103 typedef enum _XdmadProgState {
00104 XDMAD_SINGLE= 0,
00105 XDMAD_MULTI,
00106 XDMAD_LLI,
00107 } eXdmadProgState;
00108
00109
00110 typedef void (*XdmadTransferCallback)(uint32_t Channel, void* pArg);
00111
00112
00113 typedef struct _XdmadChannel {
00114 XdmadTransferCallback fCallback;
00115 void* pArg;
00116 uint8_t bIrqOwner;
00117 uint8_t bSrcPeriphID;
00118 uint8_t bDstPeriphID;
00119 uint8_t bSrcTxIfID;
00120 uint8_t bSrcRxIfID;
00121 uint8_t bDstTxIfID;
00122 uint8_t bDstRxIfID;
00123 volatile uint8_t state;
00124 } sXdmadChannel;
00125
00126
00127 typedef struct _Xdmad {
00128 Xdmac *pXdmacs;
00129 sXdmadChannel XdmaChannels[XDMACCHID_NUMBER];
00130 uint8_t numControllers;
00131 uint8_t numChannels;
00132 uint8_t pollingMode;
00133 uint8_t pollingTimeout;
00134 uint8_t xdmaMutex;
00135 } sXdmad;
00136
00137 typedef struct _XdmadCfg {
00138
00139 uint32_t mbr_ubc;
00140
00141 uint32_t mbr_sa;
00142
00143 uint32_t mbr_da;
00144
00145 uint32_t mbr_cfg;
00146
00147 uint32_t mbr_bc;
00148
00149 uint32_t mbr_ds;
00150
00151 uint32_t mbr_sus;
00152
00153 uint32_t mbr_dus;
00154 } sXdmadCfg;
00155
00156
00157
00158 typedef struct _LinkedListDescriporView0
00159 {
00160
00161 uint32_t mbr_nda;
00162
00163 uint32_t mbr_ubc;
00164
00165 uint32_t mbr_ta;
00166 }LinkedListDescriporView0;
00167
00168
00169
00170 typedef struct _LinkedListDescriporView1
00171 {
00172
00173 uint32_t mbr_nda;
00174
00175 uint32_t mbr_ubc;
00176
00177 uint32_t mbr_sa;
00178
00179 uint32_t mbr_da;
00180 }LinkedListDescriporView1;
00181
00182
00183
00184 typedef struct _LinkedListDescriporView2
00185 {
00186
00187 uint32_t mbr_nda;
00188
00189 uint32_t mbr_ubc;
00190
00191 uint32_t mbr_sa;
00192
00193 uint32_t mbr_da;
00194
00195 uint32_t mbr_cfg;
00196 }LinkedListDescriporView2;
00197
00198
00199
00200 typedef struct _LinkedListDescriporView3
00201 {
00202
00203 uint32_t mbr_nda;
00204
00205 uint32_t mbr_ubc;
00206
00207 uint32_t mbr_sa;
00208
00209 uint32_t mbr_da;
00210
00211 uint32_t mbr_cfg;
00212
00213 uint32_t mbr_bc;
00214
00215 uint32_t mbr_ds;
00216
00217 uint32_t mbr_sus;
00218
00219 uint32_t mbr_dus;
00220 }LinkedListDescriporView3;
00221
00222
00223
00224
00225
00226
00227
00228
00229 extern void XDMAD_Initialize( sXdmad *pXdmad,
00230 uint8_t bPollingMode );
00231
00232 extern void XDMAD_Handler( sXdmad *pDmad);
00233
00234 extern uint32_t XDMAD_AllocateChannel( sXdmad *pXdmad,
00235 uint8_t bSrcID, uint8_t bDstID);
00236 extern eXdmadRC XDMAD_FreeChannel( sXdmad *pXdmad, uint32_t dwChannel );
00237
00238 extern eXdmadRC XDMAD_ConfigureTransfer( sXdmad *pXdmad,
00239 uint32_t dwChannel,
00240 sXdmadCfg *pXdmaParam,
00241 uint32_t dwXdmaDescCfg,
00242 uint32_t dwXdmaDescAddr,
00243 uint32_t dwXdmaIntEn);
00244
00245 extern eXdmadRC XDMAD_PrepareChannel( sXdmad *pXdmad, uint32_t dwChannel);
00246
00247 extern eXdmadRC XDMAD_IsTransferDone( sXdmad *pXdmad, uint32_t dwChannel );
00248
00249 extern eXdmadRC XDMAD_StartTransfer( sXdmad *pXdmad, uint32_t dwChannel );
00250
00251 extern eXdmadRC XDMAD_SetCallback( sXdmad *pXdmad,
00252 uint32_t dwChannel,
00253 XdmadTransferCallback fCallback,
00254 void* pArg );
00255
00256 extern eXdmadRC XDMAD_StopTransfer( sXdmad *pXdmad, uint32_t dwChannel );
00257
00258
00259 #endif //#ifndef _XDMAD_H
00260