Linking.xmu
驱动牛犊
驱动牛犊
  • 注册日期2003-05-19
  • 最后登录2003-05-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1178回复:5

请问8237DMA控制器是不是支持mem-to-mem的传送模式

楼主#
更多 发布于:2003-05-19 13:50
我写了一段代码功能是实现pc内存中一个数据块的搬移,使用8237的DMA传送来实现。
查了8237的手册知道8237中有一种mem-to-mem的传送模式,要用通道0和通道1来联合实现。我照手册完成了程序的编写,可是调试的时候发现程序并没有完成数据块的传送,而是向目标内存区写入了额定数目的“FF”。

后来在狂找资料的过程中在某篇资料上看到说pc上的8237不具备mem-to-mem的传送模式。
这是真的吗?如果是这样的话DMA岂不是没什么作用,那么怎么实现pc内存数据区间的DMA传送呢?
Linking.xmu
驱动牛犊
驱动牛犊
  • 注册日期2003-05-19
  • 最后登录2003-05-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-05-19 13:55
我不明白为什么读进来的数据全是FF,是不是我的工作方式设置有错而使8237从某个端口而不是源存储器读进了数据呢?
libin2309
驱动大牛
驱动大牛
  • 注册日期2002-11-20
  • 最后登录2005-12-29
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-05-20 09:43
现代微机很少使用DMA的内存到内存的数据传输了,因为CPU的直接内存到内存的数据传输比用DMA还要快,所以基本上不使用了,但内存到外设,用DMA还是很快的!
不知道楼上大哥用的是什么系统,用什么工具写的驱动?
我是一只小小鸟,永远也飞也飞不高,但我永远在飞!
Linking.xmu
驱动牛犊
驱动牛犊
  • 注册日期2003-05-19
  • 最后登录2003-05-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-05-20 23:56
其实这是我做的毕设的一部分。
硬件系统是pc104,操作系统是Linux。
目标是开发一个LED显示屏(也就是常常在户外显示广告的那种大显示屏)的驱动,显示卡是基于ISA的(因为pc104上只有ISA),有8k显存。我现在就是要把在系统内存中的数据搬移到显存上。可是boss说这样的数据复制不能用CPU控制传输,因为存在什么总线冲突问题(究竟怎么回事我不太懂,我不是学硬件的)。所以必须用DMA来实现。
.....
再来就是我文章中写的了。
Linking.xmu
驱动牛犊
驱动牛犊
  • 注册日期2003-05-19
  • 最后登录2003-05-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-05-21 00:51
这是相关部分的代码,我看不出有什么错。
if(request_dma(0,\"source\"))
{
printk(\"DMA err\\n\");
return 0;
}
        if(request_dma(1,\"target\"))
{
printk(\"DMA err\\n\");
return 0;
}
flags=claim_dma_lock();
disable_dma(0);
disable_dma(1);
clear_dma_ff(0);
set_dma_addr(0,virt_to_bus(p1)); //p1包含了要传送的数据
set_dma_count(0,SIZE);
set_dma_addr(1,virt_to_bus(p2)); //p2指向目的地址
set_dma_count(1,SIZE);
dma_outb(0x88,DMA1_MODE_REG); //设置通道0为读方式
dma_outb(0x85,DMA1_MODE_REG); //设置通道1为写方式
dma_outb(0x01,DMA1_CMD_REG); //设置8237为mem-to-mem工作方式
dma_outb(0x04,DMA1_REQ_REG); //请求通道0传输
dma_outb(0x05,DMA1_REQ_REG); //请求通道0传输
enable_dma(0);
enable_dma(1);
release_dma_lock(flags);
Linking.xmu
驱动牛犊
驱动牛犊
  • 注册日期2003-05-19
  • 最后登录2003-05-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-05-21 23:21
知道为什么的请不吝赐教
游客

返回顶部