标题:
对DMA 通道的操作分析之一
[打印本页]
作者:
yuyang911220
时间:
2014-10-30 10:24
标题:
对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来进行转换。
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/)
Powered by Discuz! 7.0.0