DDMA(Device Direct Memory Access)是E2000提供的一个通用DMA控制模块,支持典型的DMA操作,提供多个DMA通道,多个通道可以同时工作,独立配置给不同外设使用
FDDMA 驱动程序主要完成 DDMA 模块的初始化,DDMA通道的分配与释放, 相关源文件为:
fddma
.
├── fddma.c
├── fddma.h
├── fddma_g.c
├── fddma_hw.c
├── fddma_hw.h
├── fddma_intr.c
├── fddma_selftest.c
└── fddma_sinit.c
以下部分将指导您完成 FDDMA 驱动的软件配置:
DDMA 实例配置
typedef struct
{
u32 id; /* DDMA ctrl id */
uintptr base_addr; /* DDMA ctrl base address */
u32 irq_num; /* DDMA ctrl interrupt id */
u32 irq_prority; /* DDMA ctrl interrupt priority */
} FDdmaConfig; /* DDMA instance configuration */
DDMA 通道配置
typedef struct
{
FDdmaChanIndex id; /* DMA channel index */
u32 slave_id; /* Perpherial slave id for DDMA */
FDdmaChanRequst req_mode; /* DMA transfer direction */
uintptr ddr_addr; /* DMA channel DDR address, could be source or destination */
u32 dev_addr; /* DMA channel Perpherial, could be source or destination */
u32 trans_len; /* DMA channel transfer length */
#define FDDMA_MAX_TRANSFER_LEN 64 /* max bytes in transfer */
#define FDDMA_MIN_TRANSFER_LEN 4 /* min bytes in transfer */
u32 timeout; /* timeout = 0 means no use DMA timeout */
} FDdmaChanConfig; /* DDMA channel instance */
DDMA 通道实例
typedef struct FDdmaChan_
{
FDdmaChanConfig config; /* DDMA channel configuration */
boolean is_used; /* TRUE means channel is in use */
FDdma *dma; /* DMA instance of this channel */
FDdmaChanEvtHandler evt_handler[FDDMA_NUM_OF_CHAN_EVT]; /* interrupt evt */
void *evt_handler_args[FDDMA_NUM_OF_CHAN_EVT]; /* interrupt evt args */
} FDdmaChan; /* DDMA channel instance */
DDMA 控制器实例
typedef struct FDdma_
{
FDdmaConfig config; /* DDMA instance configuration */
FDdmaChan *chan[FDDMA_NUM_OF_CHAN]; /* DDMA channel instance, NULL means channel not yet allocate */
u32 is_ready; /* TRUE means DDMA init ok */
u32 bind_status; /* channel bind status, BIT(n) = 1 means channel n is allocated */
} FDdma; /* DDMA instance */
const FDdmaConfig *FDdmaLookupConfig(u32 instance_id);
Note:
Input:
Return:
FError FDdmaCfgInitialization(FDdma *const instance, const FDdmaConfig *input_config);
Note:
Input:
Return:
void FDdmaDeInitialization(FDdma *const instance);
Note:
Input:
Return:
FError FDdmaAllocateChan(FDdma *const instance, FDdmaChan *const dma_chan, const FDdmaChanConfig *dma_chan_config);
Note:
Input:
Return:
FError FDdmaDellocateChan(FDdmaChan *const dma_chan);
Note:
Input:
Return:
FError FDdmaStart(FDdma *const instance);
Note:
Input:
Return:
FError FDdmaStop(FDdma *const instance);
Note:
Input:
Return:
void FDdmaIrqHandler(s32 vector, void *args)
Note:
Input:
Return:
void FDdmaRegisterChanEvtHandler(FDdmaChan *const dma_chan,
FDdmaChanEvt evt,
FDdmaChanEvtHandler handler,
void *handler_arg);
Note:
Input:
Return: