4)DMA通道数据结构
/* DMA channel structure */
typedef struct {
dmach_t channel;//通道号:可为0,1,2,3
unsigned int in_use;    /* Device is allocated 设备是否已*/
const char *device_id;    /* Device name 设备名*/
dma_buf_t *head;    /* where to insert buffers 该DMA通道缓冲区链表头*/
dma_buf_t *tail;    /* where to remove buffers该DMA通道缓冲区链表尾*/
dma_buf_t *curr;    /* buffer currently DMA'ed该DMA通道缓冲区链表中的当前缓冲区*/
unsigned long queue_count;    /* number of buffers in the queue 链表中缓冲区个数*/
int active;    /* 1 if DMA is actually processing data 该通道是否已经在使用*/
dma_regs_t *regs;    /* points to appropriate DMA registers 该通道使用的DMA控制寄存器*/
int irq;    /* IRQ used by the channel //通道申请的中断号*/
dma_device_t write;    /* to write //执行读操作的DMA设备*/
dma_device_t read;    /* to read 执行写操作的DMA设备*/
} s3c2410_dma_t;
  DMA驱动主要函数功能分析:
  写一个DMA驱动的主要工作包括:DMA通道申请、DMA中断申请、控制寄存器设置、挂入DMA等待队列、清除DMA中断、释放DMA通道.
  int s3c2410_request_dma(const char *device_id, dmach_t channel,
  dma_callback_t write_cb, dma_callback_t read_cb) (s3c2410_dma_queue_buffer);
  函数描述:申请某通道的DMA资源,填充s3c2410_dma_t 数据结构的内容,申请DMA中断。
  输入参数:device_id DMA 设备名;channel 通道号;
  write_cb DMA写操作完成的回调函数;read_cb DMA读操作完成的回调函数
  输出参数:若channel通道已使用,出错返回;否则,返回0
  int s3c2410_dma_queue_buffer(dmach_t channel, void *buf_id,
  dma_addr_t data, int size, int write) (s3c2410_dma_stop);
  函数描述:这是DMA操作关键的函数,它完成了一系列动作:分配并初始化一个DMA内核缓冲区控制结构,并将它插入DMA等待队列,设置DMA控制寄存器内容,等待DMA操作触发
  输入参数: channel 通道号;buf_id,缓冲区标识
  dma_addr_t data DMA数据缓冲区起始物理地址;size DMA数据缓冲区大小;write 是写还是读操作
  int s3c2410_dma_stop(dmach_t channel)
  函数描述:停止DMA操作。
  int s3c2410_dma_flush_all(dmach_t channel)
  函数描述:释放DMA通道所申请的所有内存资源
  void s3c2410_free_dma(dmach_t channel)
  函数描述:释放DMA通道
  因为各函数功能强大,一个完整的DMA驱动程序中一般只需调用以上3个函数即可。可在驱动初始化中调用s3c2410_request_dma,开始DMA传输前调用s3c2410_dma_queue_buffer,释放驱动模块时调用s3c2410_free_dma。