免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4166 | 回复: 4
打印 上一主题 下一主题

ISA DMA驱动如何设置源地址寄存器 [复制链接]

论坛徽章:
1
巨蟹座
日期:2013-12-03 18:38:13
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-12-21 15:36 |只看该作者 |倒序浏览
我要从某个硬件地址A开始的64k大小的区域循环读数
include/asm/dma.h 这个里面提供了一个函数 set_dma_addr() 
这个函数的第二个参数,我感觉应该是自己申请的dma缓冲区的地址,也就是做DMA的目的地址, 

那源地址在哪里设置呢?也就是说地址A是哪里设置的呢?
谢谢~

论坛徽章:
0
2 [报告]
发表于 2009-12-21 16:56 |只看该作者
函数set_dma_addr()用来为特定DMA通道设置DMA缓冲区的基地址,传输dmanr指定DMA通道号,传输a指定位于系统RAM中的DMA缓冲区起始位置的物理地址

论坛徽章:
1
巨蟹座
日期:2013-12-03 18:38:13
3 [报告]
发表于 2009-12-22 15:23 |只看该作者

回复 #2 emmoblin 的帖子

我感觉DMA的操作是这样的:
硬件地址A-->DMA缓冲区地址B-->用户空间buffer地址C
set_dma_addr()设置的应该是B吧
那A是如何指定的呢

论坛徽章:
0
4 [报告]
发表于 2009-12-23 01:59 |只看该作者
DMA不会用到3个地址. LZ的理解有问题.
我认为DMA就是在外设和内存之间直接传递数据(不经过CPU). 所以只需要2方,一个是外设,一个是内存. 由于外设访问内存时不经过MMU,所以外设只认识总线地址,而不认识虚拟地址. 在X86体系下,总线地址和物理地址是一样的. 所以外设只需要知道要存取的内存(计算机主存)的物理地址即可.
知道了这个地址后,外设会自动把这个地址后面的一段数据放到外设上的缓冲里. 在设置DMA的时候,一般不需要知道外设上的缓冲是如何访问的, 因为外设帮你做好了. 只要指定内存里的物理地址即可.
然后看2楼的解释. DMA通道号是ISA总线特有的.

论坛徽章:
0
5 [报告]
发表于 2009-12-23 09:06 |只看该作者
内核初始化是已经在物理内存的最低端保留了部分物理空间给DMA

其它4L已解释了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP