libin2309
驱动大牛
驱动大牛
  • 注册日期2002-11-20
  • 最后登录2005-12-29
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2241回复:26

救命啊108分,这次只能给这么多,若能解决问题我把1000多分全给大家

楼主#
更多 发布于:2003-05-22 11:15
真的,真的很失望,更加郁闷,看了很长时间的ISA的系统DMA的驱动了,在启动DMA上,我卡住了,DDK的帮助,DS的帮助,我都看了,因为我是用DS做的,先看的DS的DMA模型,前面能看懂,到了回调函数那里,帮助上说,回调函数先检查是否还有剩余字节需要传输,如果没有,则结束DMA传输,如果有则调用操作硬件的函数来进行DMA的启动工作以后进入ISR,DPC。。。。很死板的机制。不知道回调函数怎么写,我就去看了,DS的SOURCE文件夹里的两个进行DMA传输的函数,然后又看了DDK关于DMA的信息,发现,DS的那两个函数把DDK给封装了,做的很出色,包括了所有的四种情况。还是不知道怎么操作硬件,但我明白了点,我的DMAC:主板上的8237,我不用去管它了,也就是我不用亲自来操作它的那些寄存器,因为DDK做好了这些工作,DS又封装DDK,但要启动DMA的传输,我要做的只能是来控制我的外设卡上的东东了。可惜我的板卡设计的很简单,双口RAM半满发DMA请求信号:DREQ给8237,驱动程序(DS的那两个源函数)设置好了8237的基本设置,然后8237发DACK给外设,再配合一定的控制信号,就可以进行数据的传输了,外设没有可用的口地址来让驱动启动DMA?
哪位大师做过系统DMA的驱动,尤其是做过8237驱动的能人,请您,指点迷津!
真的,很无助,很急,这个问题捆饶我了很长时间了,如果谁能帮我把问题解决,当然是给些思路,我将把分全部给他!
真诚的求救

最新喜欢:

zheng2002zheng2...
我是一只小小鸟,永远也飞也飞不高,但我永远在飞!
libin2309
驱动大牛
驱动大牛
  • 注册日期2002-11-20
  • 最后登录2005-12-29
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-06-03 16:17
DS上关于系统DMA的驱动是这么描述的:the callback is responsible for telling the device to start requesting DMA service.
DDK中对这句话的解释是:给设备发送合适的命令来启动DMA的传输。

但我还是不理解,怎么控制的外部设备?DMA的启动是外部发DREQ 程序怎么来控制一跟信号线???
我是一只小小鸟,永远也飞也飞不高,但我永远在飞!
libin2309
驱动大牛
驱动大牛
  • 注册日期2002-11-20
  • 最后登录2005-12-29
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-05-30 19:28
问题是要操作的只是设备上的一段内存,不是什么磁盘之类的能发命令的东西,如何start?


是啊, 真的是这么回事!


我还有疑问,就是:编程8237是在什么时候,是在初始化适配器对象的时候还是在初始化传输对象的时候?我理解是在初始化适配器对象的时候,ADAPTER DESTRIPE 里的各项就分别对应编程8237的各寄存器。是不是这样,而真正启动传输是靠外设。当外设发DREQ的时候,比如说是通道5,所以是DREQ5,8237早已准备好了,它给外设发DACK5的同时进行数据的传输,由于微软封装了对8237的底层操作,所以驱动里面是不能直接对8237的寄存器进行直接读写的,我们要控制的只能是设备,所以又回到了我前面的问题,我的板子上的映射内存的DMA数据传输是的条件是当该内存(实际是个双口RAM)半满的时候,发DREQ5信号,我所能控制(判断)的也就是这跟信号线,至于半满的条件,完全由外部设备控制,我没有办法控制,但我没有办法控制它!!!!
我是一只小小鸟,永远也飞也飞不高,但我永远在飞!
libin2309
驱动大牛
驱动大牛
  • 注册日期2002-11-20
  • 最后登录2005-12-29
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-05-29 18:47
我不控制外部设备发请求,可不可以呢?
我是一只小小鸟,永远也飞也飞不高,但我永远在飞!
libin2309
驱动大牛
驱动大牛
  • 注册日期2002-11-20
  • 最后登录2005-12-29
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-05-28 08:33
你这么热心的回答我,我很感激你!关键是,硬件电路设计上,没有我所要的口地址来让我写控制字,我和它们的联系只是DREQ和DACK,所以,我感觉,我没有办法来判断!真的很郁闷
我是一只小小鸟,永远也飞也飞不高,但我永远在飞!
libin2309
驱动大牛
驱动大牛
  • 注册日期2002-11-20
  • 最后登录2005-12-29
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-05-27 15:41
比如不是enable/disable DMA DREQ,而是enable/disable AD转换

这样不也可以控制吗?没有数据,就不会半满,也就不会DREQ是否有效 :D


你这么热心的回答我,我很感激你!关键是,硬件电路设计上,没有我所要的口地址来让我写控制字,我和它们的联系只是DREQ和DACK,所以,我感觉,我没有办法来判断!真的很郁闷
我是一只小小鸟,永远也飞也飞不高,但我永远在飞!
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
6楼#
发布于:2003-05-27 15:03
比如不是enable/disable DMA DREQ,而是enable/disable AD转换

这样不也可以控制吗?没有数据,就不会半满,也就不会DREQ是否有效 :D
libin2309
驱动大牛
驱动大牛
  • 注册日期2002-11-20
  • 最后登录2005-12-29
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-05-27 14:58
8237我不能碰,设备只是通过DREQ请求DMA传送,DREQ是否有效,设备自己都做好了,我没办法控制它,那我的驱动我感觉真的是走投无路了!
我是一只小小鸟,永远也飞也飞不高,但我永远在飞!
libin2309
驱动大牛
驱动大牛
  • 注册日期2002-11-20
  • 最后登录2005-12-29
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-05-27 08:35
这个问题,没有答案了!
我是一只小小鸟,永远也飞也飞不高,但我永远在飞!
libin2309
驱动大牛
驱动大牛
  • 注册日期2002-11-20
  • 最后登录2005-12-29
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2003-05-26 14:24
WDM就想抽象DMA controller,你还去写8237的reg,呵呵。
硬件设计是不是有问题,我就无法回答了,不懂。

比如不是enable/disable DMA DREQ,而是enable/disable AD转换。


那我真的没折了!
我是一只小小鸟,永远也飞也飞不高,但我永远在飞!
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
10楼#
发布于:2003-05-26 12:07
WDM就想抽象DMA controller,你还去写8237的reg,呵呵。
硬件设计是不是有问题,我就无法回答了,不懂。

比如不是enable/disable DMA DREQ,而是enable/disable AD转换。
libin2309
驱动大牛
驱动大牛
  • 注册日期2002-11-20
  • 最后登录2005-12-29
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2003-05-26 11:04
我是不是可以这样来使DREQ有效呢!设置8237的屏蔽寄存器,清除我要使用的通道的屏蔽位!我很疑惑,8237的内部寄存器是否需要我来亲自控制?
我是一只小小鸟,永远也飞也飞不高,但我永远在飞!
libin2309
驱动大牛
驱动大牛
  • 注册日期2002-11-20
  • 最后登录2005-12-29
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2003-05-26 08:25
那大概可以这样:
设置好DMA,然后允许设备发DREQ。
在DMA中断,判断是不是传输完了。完了就禁止设备发DREQ。

您说的很对,我也是这么想的,就是不知道怎么去实现,我觉得能达到这种目的的唯一办法就是往控制寄存器(板子上的,不是8237的)写数据来使能DMA(DREQ),但是硬件设计上确没有这样的寄存器,只是简单的有一条DREQ信号线。是不是我的硬件设计有错误?还是说有别的办法,来控制设备发DREQ。

真的很感激你的回答!
我是一只小小鸟,永远也飞也飞不高,但我永远在飞!
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
13楼#
发布于:2003-05-25 21:32
那大概可以这样:
设置好DMA,然后允许设备发DREQ。
在DMA中断,判断是不是传输完了。完了就禁止设备发DREQ。
libin2309
驱动大牛
驱动大牛
  • 注册日期2002-11-20
  • 最后登录2005-12-29
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2003-05-25 19:58
我写错了,是trigger。
外部触发信号吧


那pacer 是什么意思?
我的外部触发信号就是DREQ,由CPLD发出,CPLD计数到双口RAM半满时,发DREQ给总线,可见,我的驱动没有办法控制设备发请求,你说呢?大虾!
我是一只小小鸟,永远也飞也飞不高,但我永远在飞!
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
15楼#
发布于:2003-05-25 19:43
我写错了,是trigger。
外部触发信号吧
libin2309
驱动大牛
驱动大牛
  • 注册日期2002-11-20
  • 最后登录2005-12-29
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2003-05-25 19:10
你怎么控制设备发DREQ呀?总得有个东西吧?
pacer?register?external triger?



谢谢这位大哥的回答,register是寄存器,pacer,external triger,分别指什么?能告诉我吗?谢谢
我是一只小小鸟,永远也飞也飞不高,但我永远在飞!
mailme
驱动老牛
驱动老牛
  • 注册日期2001-05-21
  • 最后登录2010-02-25
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2003-05-23 19:08
问题是要操作的只是设备上的一段内存,不是什么磁盘之类的能发命令的东西,如何start?


???
早起早睡 精神百倍
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
18楼#
发布于:2003-05-23 19:06
你怎么控制设备发DREQ呀?总得有个东西吧?
pacer?register?external triger?
libin2309
驱动大牛
驱动大牛
  • 注册日期2002-11-20
  • 最后登录2005-12-29
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2003-05-23 16:44
设备是你的,你都不知道怎么start?
应该是你给你的设备一个命令如写某个reg,或设置触发条件等。

我的板子上的双口RAM半满时发DREQ信号给8237,这是触发的唯一条件,可是,我的板子上没有对应的寄存器可写,那是不是我硬件设计有问题?
我是一只小小鸟,永远也飞也飞不高,但我永远在飞!
上一页
游客

返回顶部