Chinaunix

标题: ISA DMA驱动如何设置源地址寄存器 [打印本页]

作者: NKLoveRene    时间: 2009-12-21 15:36
标题: ISA DMA驱动如何设置源地址寄存器
我要从某个硬件地址A开始的64k大小的区域循环读数
include/asm/dma.h 这个里面提供了一个函数 set_dma_addr() 
这个函数的第二个参数,我感觉应该是自己申请的dma缓冲区的地址,也就是做DMA的目的地址, 

那源地址在哪里设置呢?也就是说地址A是哪里设置的呢?
谢谢~
作者: emmoblin    时间: 2009-12-21 16:56
函数set_dma_addr()用来为特定DMA通道设置DMA缓冲区的基地址,传输dmanr指定DMA通道号,传输a指定位于系统RAM中的DMA缓冲区起始位置的物理地址
作者: NKLoveRene    时间: 2009-12-22 15:23
标题: 回复 #2 emmoblin 的帖子
我感觉DMA的操作是这样的:
硬件地址A-->DMA缓冲区地址B-->用户空间buffer地址C
set_dma_addr()设置的应该是B吧
那A是如何指定的呢
作者: accessory    时间: 2009-12-23 01:59
DMA不会用到3个地址. LZ的理解有问题.
我认为DMA就是在外设和内存之间直接传递数据(不经过CPU). 所以只需要2方,一个是外设,一个是内存. 由于外设访问内存时不经过MMU,所以外设只认识总线地址,而不认识虚拟地址. 在X86体系下,总线地址和物理地址是一样的. 所以外设只需要知道要存取的内存(计算机主存)的物理地址即可.
知道了这个地址后,外设会自动把这个地址后面的一段数据放到外设上的缓冲里. 在设置DMA的时候,一般不需要知道外设上的缓冲是如何访问的, 因为外设帮你做好了. 只要指定内存里的物理地址即可.
然后看2楼的解释. DMA通道号是ISA总线特有的.
作者: readkernel    时间: 2009-12-23 09:06
内核初始化是已经在物理内存的最低端保留了部分物理空间给DMA

其它4L已解释了




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2