www.pudn.com > zbtsram.rar > csl_dma.h
/******************************************************************************\ * Copyright (C) 1999-2000 Texas Instruments Incorporated. * All Rights Reserved *------------------------------------------------------------------------------ * FILENAME...... csl_dma.h * DATE CREATED.. 06/11/1999 * LAST MODIFIED. 09/20/2000 * \******************************************************************************/ #ifndef _CSL_DMA_H_ #define _CSL_DMA_H_ #include#include #include #if (DMA_SUPPORT) /******************************************************************************\ * scope and inline control macros \******************************************************************************/ #ifdef __cplusplus #define CSLAPI extern "C" far #else #define CSLAPI extern far #endif #undef USEDEFS #undef IDECL #undef IDEF #ifdef _DMA_MOD_ #define IDECL CSLAPI #define USEDEFS #define IDEF #else #ifdef _INLINE #define IDECL static inline #define USEDEFS #define IDEF static inline #else #define IDECL CSLAPI #endif #endif /******************************************************************************\ * global macro declarations \******************************************************************************/ #define DMA_CHA_CNT 4 /* DMA_open() flags */ #define DMA_OPEN_RESET 0x00000001u /* channel identifiers for DMA_open() */ #define DMA_CHAANY (-1) #define DMA_CHA0 (0) #define DMA_CHA1 (1) #define DMA_CHA2 (2) #define DMA_CHA3 (3) /* DMA status state */ #define DMA_STATUS_STOPPED DMA_PRICTL_STATUS_STOPPED #define DMA_STATUS_RUNNING DMA_PRICTL_STATUS_RUNNING #define DMA_STATUS_PAUSED DMA_PRICTL_STATUS_PAUSED #define DMA_STATUS_AUTORUNNING DMA_PRICTL_STATUS_AUTORUNNING /* predefined global register IDs */ #define DMA_GBL_ADDRRLDB 0x00000001u #define DMA_GBL_ADDRRLDC 0x00000002u #define DMA_GBL_ADDRRLDD 0x00000003u #define DMA_GBL_INDEXA 0x00000004u #define DMA_GBL_INDEXB 0x00000005u #define DMA_GBL_CNTRLDA 0x00000008u #define DMA_GBL_CNTRLDB 0x00000009u #define DMA_GBL_SPLITA 0x0000000Du #define DMA_GBL_SPLITB 0x0000000Eu #define DMA_GBL_SPLITC 0x0000000Fu #define DMA_GBLADDRA 0x00000001u #define DMA_GBLADDRB 0x00000002u #define DMA_GBLADDRC 0x00000004u #define DMA_GBLADDRD 0x00000008u #define DMA_GBLIDXA 0x00000010u #define DMA_GBLIDXB 0x00000020u #define DMA_GBLCNTA 0x00000040u #define DMA_GBLCNTB 0x00000080u #define _DMA_GBLREG_CNT 16 #define _DMA_GBLREG_MASK (_DMA_GBLREG_CNT-1) /****************************************************************/ /* The two following macros are used to get/clear the condition */ /* flags of the DMA SECCTL register in a safe manner. */ /* */ /* The X argument MUST be one of the following: */ /* DMA_SECCTL_SXCOND */ /* DMA_SECCTL_FRAMECOND */ /* DMA_SECCTL_LASTCOND */ /* DMA_SECCTL_BLOCKCOND */ /* DMA_SECCTL_RDROPCOND */ /* DMA_SECCTL_WDROPCOND */ /****************************************************************/ #define DMA_GET_CONDITION(hDma,X) \ ((DMA_RGETH(hDma,SECCTL)&_##X##_MASK)>>_##X##_SHIFT) #define DMA_CLEAR_CONDITION(hDma,X) \ _PER_RAOI(DMA_ADDRH(hDma,SECCTL),DMA,SECCTL,\ (0xFFFF0AAA&~_##X##_MASK),\ (0x00000555&~_##X##_MASK),\ 0x00000000\ ) /******************************************************************************\ * global typedef declarations \******************************************************************************/ /* private object, not to be used by application code */ typedef struct { Uint32 allocated; Uint32 eventId; Uint32 volatile *baseAddr; } DMA_Obj,*DMA_Handle; /* channel configuration structure */ typedef struct { Uint32 prictl; Uint32 secctl; Uint32 src; Uint32 dst; Uint32 xfrcnt; } DMA_Config; typedef enum { DMA_GBL_ADDRRLD = 0x00, DMA_GBL_INDEX = 0x04, DMA_GBL_CNTRLD = 0x08, DMA_GBL_SPLIT = 0x0C } DMA_Gbl; typedef struct { Uint32 addrA; Uint32 addrB; Uint32 addrC; Uint32 addrD; Uint32 idxA; Uint32 idxB; Uint32 cntA; Uint32 cntB; } DMA_GlobalConfig; /******************************************************************************\ * global variable declarations \******************************************************************************/ extern far Uint32 _DMA_gblRegTbl[_DMA_GBLREG_CNT]; /* Predefined channel handles, these are only here for legacy */ /* purposes and should not be used. */ extern far DMA_Handle _DMA_hCha0; extern far DMA_Handle _DMA_hCha1; extern far DMA_Handle _DMA_hCha2; extern far DMA_Handle _DMA_hCha3; /******************************************************************************\ * global function declarations \******************************************************************************/ CSLAPI void DMA_reset(DMA_Handle hDma); CSLAPI DMA_Handle DMA_open(int chaNum, Uint32 flags); CSLAPI void DMA_close(DMA_Handle hDma); CSLAPI Uint32 DMA_allocGlobalReg(DMA_Gbl regType, Uint32 initVal); CSLAPI void DMA_freeGlobalReg(Uint32 regId); CSLAPI Uint32 DMA_globalAlloc(Uint32 regs); CSLAPI void DMA_globalFree(Uint32 regs); /******************************************************************************\ * inline function declarations \******************************************************************************/ IDECL Uint32 DMA_getEventId(DMA_Handle hDma); IDECL Uint32 DMA_getStatus(DMA_Handle hDma); IDECL void DMA_restoreStatus(DMA_Handle hDma,Uint32 status); IDECL void DMA_start(DMA_Handle hDma); IDECL void DMA_stop(DMA_Handle hDma); IDECL void DMA_pause(DMA_Handle hDma); IDECL void DMA_autoStart(DMA_Handle hDma); IDECL void DMA_wait(DMA_Handle hDma); IDECL void DMA_setAuxCtl(Uint32 auxCtl); IDECL Uint32 DMA_getGlobalRegAddr(Uint32 regId); IDECL Uint32 DMA_getGlobalReg(Uint32 regId); IDECL void DMA_setGlobalReg(Uint32 regId, Uint32 val); IDECL void DMA_config(DMA_Handle hDma, DMA_Config *config); IDECL void DMA_configArgs(DMA_Handle hDma, Uint32 prictl, Uint32 secctl, Uint32 src, Uint32 dst, Uint32 xfrcnt); IDECL void DMA_getConfig(DMA_Handle hDma, DMA_Config *config); IDECL void DMA_globalConfig(Uint32 regs, DMA_GlobalConfig *cfg); IDECL void DMA_globalConfigArgs(Uint32 regs, Uint32 addrA, Uint32 addrB, Uint32 addrC,Uint32 addrD,Uint32 idxA,Uint32 idxB,Uint32 cntA,Uint32 cntB); IDECL void DMA_globalGetConfig(Uint32 regs, DMA_GlobalConfig *cfg); /******************************************************************************\ * inline function definitions \******************************************************************************/ #ifdef USEDEFS /*----------------------------------------------------------------------------*/ IDEF Uint32 DMA_getEventId(DMA_Handle hDma) { return (Uint32)(hDma->eventId); } /*----------------------------------------------------------------------------*/ IDEF Uint32 DMA_getStatus(DMA_Handle hDma) { return (Uint32)DMA_FGETH(hDma,PRICTL,STATUS); } /*----------------------------------------------------------------------------*/ IDEF void DMA_restoreStatus(DMA_Handle hDma,Uint32 status) { DMA_FSETH(hDma,PRICTL,START,status); } /*----------------------------------------------------------------------------*/ IDEF void DMA_start(DMA_Handle hDma) { DMA_FSETSH(hDma,PRICTL,START,NORMAL); } /*----------------------------------------------------------------------------*/ IDEF void DMA_stop(DMA_Handle hDma) { DMA_FSETSH(hDma,PRICTL,START,STOP); } /*----------------------------------------------------------------------------*/ IDEF void DMA_pause(DMA_Handle hDma) { DMA_FSETSH(hDma,PRICTL,START,PAUSE); } /*----------------------------------------------------------------------------*/ IDEF void DMA_autoStart(DMA_Handle hDma) { DMA_FSETSH(hDma,PRICTL,START,AUTOINIT); } /*----------------------------------------------------------------------------*/ IDEF void DMA_wait(DMA_Handle hDma) { while (DMA_getStatus(hDma) & DMA_STATUS_RUNNING); } /*----------------------------------------------------------------------------*/ IDEF void DMA_setAuxCtl(Uint32 auxCtl) { DMA_RSET(AUXCTL,auxCtl); } /*----------------------------------------------------------------------------*/ IDEF Uint32 DMA_getGlobalRegAddr(Uint32 regId) { return _DMA_gblRegTbl[regId&_DMA_GBLREG_MASK]; } /*----------------------------------------------------------------------------*/ IDEF Uint32 DMA_getGlobalReg(Uint32 regId) { return DMA_RGETA(_DMA_gblRegTbl[regId&_DMA_GBLREG_MASK],REG); } /*----------------------------------------------------------------------------*/ IDEF void DMA_setGlobalReg(Uint32 regId, Uint32 val) { DMA_RSETA(_DMA_gblRegTbl[regId&_DMA_GBLREG_MASK],REG,val); } /*----------------------------------------------------------------------------*/ IDEF void DMA_config(DMA_Handle hDma, DMA_Config *config) { Uint32 gie; volatile Uint32 *base = (volatile Uint32 *)(hDma->baseAddr); register int prictl,secctl,src,dst,xfrcnt; gie = IRQ_globalDisable(); /* the compiler generates more efficient code if the loads */ /* and stores are grouped together rather than intermixed */ prictl = config->prictl; secctl = config->secctl; src = config->src; dst = config->dst; xfrcnt = config->xfrcnt; base[_DMA_PRICTL_OFFSET] = 0x00000000; base[_DMA_SECCTL_OFFSET] = secctl; base[_DMA_SRC_OFFSET] = src; base[_DMA_DST_OFFSET] = dst; base[_DMA_XFRCNT_OFFSET] = xfrcnt; base[_DMA_PRICTL_OFFSET] = prictl; IRQ_globalRestore(gie); } /*----------------------------------------------------------------------------*/ IDEF void DMA_configArgs(DMA_Handle hDma, Uint32 prictl, Uint32 secctl, Uint32 src, Uint32 dst, Uint32 xfrcnt) { Uint32 gie; volatile Uint32 *base = (volatile Uint32 *)(hDma->baseAddr); gie = IRQ_globalDisable(); base[_DMA_PRICTL_OFFSET] = 0x00000000; base[_DMA_SECCTL_OFFSET] = secctl; base[_DMA_SRC_OFFSET] = src; base[_DMA_DST_OFFSET] = dst; base[_DMA_XFRCNT_OFFSET] = xfrcnt; base[_DMA_PRICTL_OFFSET] = prictl; IRQ_globalRestore(gie); } /*----------------------------------------------------------------------------*/ IDEF void DMA_getConfig(DMA_Handle hDma, DMA_Config *config) { Uint32 gie; volatile Uint32 *base = (volatile Uint32 *)(hDma->baseAddr); volatile DMA_Config*cfg = (volatile DMA_Config*)config; register int prictl,secctl,src,dst,xfrcnt; gie = IRQ_globalDisable(); /* the compiler generates more efficient code if the loads */ /* and stores are grouped together rather than intermixed */ prictl = base[_DMA_PRICTL_OFFSET]; secctl = base[_DMA_SECCTL_OFFSET]; src = base[_DMA_SRC_OFFSET]; dst = base[_DMA_DST_OFFSET]; xfrcnt = base[_DMA_XFRCNT_OFFSET]; cfg->prictl = prictl; cfg->secctl = secctl; cfg->src = src; cfg->dst = dst; cfg->xfrcnt = xfrcnt; IRQ_globalRestore(gie); } /*----------------------------------------------------------------------------*/ IDEF void DMA_globalConfig(Uint32 regs, DMA_GlobalConfig *cfg) { Uint32 gie; gie = IRQ_globalDisable(); if (regs & DMA_GBLADDRA) DMA_RSET(GBLADDRA,cfg->addrA); if (regs & DMA_GBLADDRB) DMA_RSET(GBLADDRB,cfg->addrB); if (regs & DMA_GBLADDRC) DMA_RSET(GBLADDRC,cfg->addrC); if (regs & DMA_GBLADDRD) DMA_RSET(GBLADDRD,cfg->addrD); if (regs & DMA_GBLIDXA) DMA_RSET(GBLIDXA,cfg->idxA); if (regs & DMA_GBLIDXB) DMA_RSET(GBLIDXB,cfg->idxB); if (regs & DMA_GBLCNTA) DMA_RSET(GBLCNTA,cfg->cntA); if (regs & DMA_GBLCNTB) DMA_RSET(GBLCNTB,cfg->cntB); IRQ_globalRestore(gie); } /*----------------------------------------------------------------------------*/ IDEF void DMA_globalConfigArgs(Uint32 regs, Uint32 addrA, Uint32 addrB, Uint32 addrC,Uint32 addrD,Uint32 idxA,Uint32 idxB,Uint32 cntA,Uint32 cntB) { Uint32 gie; gie = IRQ_globalDisable(); if (regs & DMA_GBLADDRA) DMA_RSET(GBLADDRA,addrA); if (regs & DMA_GBLADDRB) DMA_RSET(GBLADDRB,addrB); if (regs & DMA_GBLADDRC) DMA_RSET(GBLADDRC,addrC); if (regs & DMA_GBLADDRD) DMA_RSET(GBLADDRD,addrD); if (regs & DMA_GBLIDXA) DMA_RSET(GBLIDXA,idxA); if (regs & DMA_GBLIDXB) DMA_RSET(GBLIDXB,idxB); if (regs & DMA_GBLCNTA) DMA_RSET(GBLCNTA,cntA); if (regs & DMA_GBLCNTB) DMA_RSET(GBLCNTB,cntB); IRQ_globalRestore(gie); } /*----------------------------------------------------------------------------*/ IDEF void DMA_globalGetConfig(Uint32 regs, DMA_GlobalConfig *config) { Uint32 gie; volatile DMA_GlobalConfig* cfg = (volatile DMA_GlobalConfig*)config; gie = IRQ_globalDisable(); if (regs & DMA_GBLADDRA) cfg->addrA = DMA_RGET(GBLADDRA); if (regs & DMA_GBLADDRB) cfg->addrB = DMA_RGET(GBLADDRB); if (regs & DMA_GBLADDRC) cfg->addrC = DMA_RGET(GBLADDRC); if (regs & DMA_GBLADDRD) cfg->addrD = DMA_RGET(GBLADDRD); if (regs & DMA_GBLIDXA) cfg->idxA = DMA_RGET(GBLIDXA); if (regs & DMA_GBLIDXB) cfg->idxB = DMA_RGET(GBLIDXB); if (regs & DMA_GBLCNTA) cfg->cntA = DMA_RGET(GBLCNTA); if (regs & DMA_GBLCNTB) cfg->cntB = DMA_RGET(GBLCNTB); IRQ_globalRestore(gie); } /*----------------------------------------------------------------------------*/ #endif /* USEDEFS */ #endif /* DMA_SUPPORT */ #endif /* _CSL_DMA_H_ */ /******************************************************************************\ * End of csl_dma.h \******************************************************************************/