Chinaunix首页 | 论坛 | 博客
  • 博客访问: 47952
  • 博文数量: 18
  • 博客积分: 1415
  • 博客等级: 上尉
  • 技术积分: 209
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-11 19:33
文章分类

全部博文(18)

文章存档

2011年(1)

2009年(17)

我的朋友

分类: LINUX

2009-09-18 07:28:43

今天的内容有点多,大家要注意看!

好了下面我们就开始吧!
在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来进行转换。

请继续阅读:对DMA 通道的操作分析 之二 
感谢你对小孟的支持! 或

阅读(459) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~