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 uint32_t mbr_nda;
00161
00162 uint32_t mbr_ubc;
00163
00164 uint32_t mbr_ta;
00165 } LinkedListDescriporView0;
00166
00167
00168
00169 typedef struct _LinkedListDescriporView1 {
00170
00171 uint32_t mbr_nda;
00172
00173 uint32_t mbr_ubc;
00174
00175 uint32_t mbr_sa;
00176
00177 uint32_t mbr_da;
00178 } LinkedListDescriporView1;
00179
00180
00181
00182 typedef struct _LinkedListDescriporView2 {
00183
00184 uint32_t mbr_nda;
00185
00186 uint32_t mbr_ubc;
00187
00188 uint32_t mbr_sa;
00189
00190 uint32_t mbr_da;
00191
00192 uint32_t mbr_cfg;
00193 } LinkedListDescriporView2;
00194
00195
00196
00197 typedef struct _LinkedListDescriporView3 {
00198
00199 uint32_t mbr_nda;
00200
00201 uint32_t mbr_ubc;
00202
00203 uint32_t mbr_sa;
00204
00205 uint32_t mbr_da;
00206
00207 uint32_t mbr_cfg;
00208
00209 uint32_t mbr_bc;
00210
00211 uint32_t mbr_ds;
00212
00213 uint32_t mbr_sus;
00214
00215 uint32_t mbr_dus;
00216 } LinkedListDescriporView3;
00217
00218
00219
00220
00221
00222
00223
00224
00225 extern void XDMAD_Initialize(sXdmad *pXdmad,
00226 uint8_t bPollingMode);
00227
00228 extern void XDMAD_Handler(sXdmad *pDmad);
00229
00230 extern uint32_t XDMAD_AllocateChannel(sXdmad *pXdmad,
00231 uint8_t bSrcID, uint8_t bDstID);
00232 extern eXdmadRC XDMAD_FreeChannel(sXdmad *pXdmad, uint32_t dwChannel);
00233
00234 extern eXdmadRC XDMAD_ConfigureTransfer(sXdmad *pXdmad,
00235 uint32_t dwChannel,
00236 sXdmadCfg *pXdmaParam,
00237 uint32_t dwXdmaDescCfg,
00238 uint32_t dwXdmaDescAddr,
00239 uint32_t dwXdmaIntEn);
00240
00241 extern eXdmadRC XDMAD_PrepareChannel(sXdmad *pXdmad, uint32_t dwChannel);
00242
00243 extern eXdmadRC XDMAD_IsTransferDone(sXdmad *pXdmad, uint32_t dwChannel);
00244
00245 extern eXdmadRC XDMAD_StartTransfer(sXdmad *pXdmad, uint32_t dwChannel);
00246
00247 extern eXdmadRC XDMAD_SetCallback(sXdmad *pXdmad,
00248 uint32_t dwChannel,
00249 XdmadTransferCallback fCallback,
00250 void *pArg);
00251
00252 extern eXdmadRC XDMAD_StopTransfer(sXdmad *pXdmad, uint32_t dwChannel);
00253
00254
00255 #endif //#ifndef _XDMAD_H
00256