首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

对DMA 通道的操作分析之一

对DMA 通道的操作分析之一

今天的内容有点多,大家要注意看!
好了下面我们就开始吧!
在linux系统中DMA通道用dma_chan结构数组表示,该函数位于kernel/dma.c文件中
下面让我们来看一下他的定义。
   
   /* Channel n is busy if dma_chan_busy[n].lock != 0.
    * DMA0 used to be reserved for DRAM refresh, but apparently not any more...
    * DMA4 is reserved for cascading.
    */
   
   struct dma_chan {
    int  lock;
    const char *device_id;
   };
   
   static struct dma_chan dma_chan_busy[MAX_DMA_CHANNELS] = {
    [4] = { 1, "cascade" },
   };

从该结构的定义中我们可以看出,如果dma_chan_busy[n].lock != 0,则说明
通道n现在“忙”,DMA0保留为DRAM更新用,DMA4用作级联。
对于DMA缓冲区有一点需要大家注意,那就是DMA缓冲区如果大于一页时,他就必须
占据物理内存中的连续页。
分配DMA缓冲区的方法是调用kmalloc(GFP_ATOMIC),最终得到由连续页面组成的DMA
缓冲区。
当使用DMA的设备驱动程序与链接到接口总线上的硬件通信时,我们会遇到另一个问题:
一般情况下这些设备大都是使用物理地址,而程序代码使用的是虚拟地址。基于DMA的
硬件使用总线地址而不是物理地址。所以当我们需要利用驱动程序向一个I/O设备发送
地址信息时就必须使用virt_to_bus来进行转换,相反在接收到来自连接到总线上硬件
的地址信息时,同样也必须使用bus_to_virt来进行转换。
继承事业,薪火相传
返回列表