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

关于DS的系统DMA模式,答好了,可多给分

楼主#
更多 发布于:2003-05-13 10:08
还是老问题,用DS学ISA的系统DMA驱动,DMA控制器是主板上的8237,那么我在程序中是否对8237的地址和记数寄存器进行设置?还是 不用设置,都由系统来完成?请指教
我是一只小小鸟,永远也飞也飞不高,但我永远在飞!
libin2309
驱动大牛
驱动大牛
  • 注册日期2002-11-20
  • 最后登录2005-12-29
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-05-14 16:52
没人会吗?怎么没人回答?
我是一只小小鸟,永远也飞也飞不高,但我永远在飞!
zhouzhou_li
驱动牛犊
驱动牛犊
  • 注册日期2003-03-07
  • 最后登录2010-11-04
  • 粉丝0
  • 关注0
  • 积分16分
  • 威望51点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-05-14 20:51
好象要知道缓冲区的物理地址,我也有这样的问题,已经看了一段时间了,ISA卡的DMAC是在主机上的,只要知道基地址,就可以给控制寄存器等赋值了,可ISA卡不是我做的,不知道做硬件的知道吗?
你用DS,可是ISA不是PNP的,我看它的类是从KPnpDevice继承的,这可行吗?
libin2309
驱动大牛
驱动大牛
  • 注册日期2002-11-20
  • 最后登录2005-12-29
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-05-14 21:45
DMAC就是主板上的8237,它的那些寄存器的地址是固定的,查一些资料就能知道的,我想问的是,是不是要直接操作这些口地址,向里面写入控制字什么的,还是不需要!
我是一只小小鸟,永远也飞也飞不高,但我永远在飞!
libin2309
驱动大牛
驱动大牛
  • 注册日期2002-11-20
  • 最后登录2005-12-29
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-05-19 10:10
对于总线主的DMA,用DS来写的话,比用DDK省很多的事,最多用那三个类就完成了。设置相应DMA控制器的控制寄存器来启动DMA传输:直接用KIORANGE的 函数OUT 或IN函数来写或读寄存器。可是,对于系统DMA,它的控制器是主板上的8237,DMA的启动是通过外设发DMA请求信号DREQ来的,也需要用KIORANGE的函数来往8237内部写入或读寄存器吗?

我是一只小小鸟,永远也飞也飞不高,但我永远在飞!
libin2309
驱动大牛
驱动大牛
  • 注册日期2002-11-20
  • 最后登录2005-12-29
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-05-19 15:08
好好研究了DDK文档,DS把DDK给封装了,其实道理是一样的,前面还能看懂,到了后面,启动 DMA这个地方,书上说给设备发送合适的命令来进行数据传输,我的设备是简单的ISA的DMA,没有什么接口芯片,不知道这个控制命令发到什么地方。
硬件设计是这样的:双口RAM半满时发DREQ,请求DMA传输,返回DACK给双口RAM作为选中信号,进行数据传输,我不知道控制命令写到什么地方,另外我注意到,与这个控制命令有关的程序只是在驱动的APATER CONTROL中和ISR 中涉及。其中DMA传输完的中断处理过程中读取状态寄存器的值,这个,我也不知道到那里去读,我的设备上没这样的口地址啊!
郁闷,谁来帮帮我啊!
救命了,我卡在这里了!
我是一只小小鸟,永远也飞也飞不高,但我永远在飞!
libin2309
驱动大牛
驱动大牛
  • 注册日期2002-11-20
  • 最后登录2005-12-29
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-05-20 10:49
难道真的没人知道这个吗?
我是一只小小鸟,永远也飞也飞不高,但我永远在飞!
dnykang
驱动牛犊
驱动牛犊
  • 注册日期2002-01-08
  • 最后登录2006-11-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-05-20 11:52
当然发到系统DMA控制器。但你的卡上要有相应的信号仲裁
libin2309
驱动大牛
驱动大牛
  • 注册日期2002-11-20
  • 最后登录2005-12-29
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-05-20 14:22
当然发到系统DMA控制器。但你的卡上要有相应的信号仲裁


这么说要直接操作8237了,我的硬件设计中,设备发DREQ,8237响应DMA请求,发DACK和一些读,或写的控制信号,地址线等一起做为片选信号,选种请求DMA传送的设备,开始DMA传输,不知道你说的信号仲裁是什么?

另外,我要直接操作8237的那些寄存器?

请大虾指点!!!
我是一只小小鸟,永远也飞也飞不高,但我永远在飞!
libin2309
驱动大牛
驱动大牛
  • 注册日期2002-11-20
  • 最后登录2005-12-29
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2003-05-20 17:53
真的很郁闷,难道没有人做过系统DMA的驱动吗?用DDK的也可以啊,请大侠指点迷津,主要是8237怎么用!
我是一只小小鸟,永远也飞也飞不高,但我永远在飞!
Linking.xmu
驱动牛犊
驱动牛犊
  • 注册日期2003-05-19
  • 最后登录2003-05-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2003-05-21 00:14
呵呵,跟我一样的遭遇,同情。
我用的卡是把板上的内存映射到系统内存空间里的。查了资料,好像8237有一种工作模式可以支持这种传输。方法是把通道0设为读模式,指向源地址;把通道1设为写模式,指向目的地址。再向通道1 的计数器里写入传输字节数。最后把8237设为块传输,允许存储器-存储器传送方式(将模式寄存器的最低位置1)。最后向请求寄存器写入传输请求就可以了。
不过我碰到的情况是:传输是启动了,可是传进来的全是FF。郁闷!

Who can tell me why???
libin2309
驱动大牛
驱动大牛
  • 注册日期2002-11-20
  • 最后登录2005-12-29
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2003-05-21 08:14
呵呵,跟我一样的遭遇,同情。
我用的卡是把板上的内存映射到系统内存空间里的。查了资料,好像8237有一种工作模式可以支持这种传输。方法是把通道0设为读模式,指向源地址;把通道1设为写模式,指向目的地址。再向通道1 的计数器里写入传输字节数。最后把8237设为块传输,允许存储器-存储器传送方式(将模式寄存器的最低位置1)。最后向请求寄存器写入传输请求就可以了。
不过我碰到的情况是:传输是启动了,可是传进来的全是FF。郁闷!

Who can tell me why???


难道非要用两个通道吗?用一个通道,比如通道5不也可以传输数据吗?就把它当作一个外设到内存的数据传输就可以了,我觉得硬件设计这样也可以啊!大虾你说呢!
我是一只小小鸟,永远也飞也飞不高,但我永远在飞!
libin2309
驱动大牛
驱动大牛
  • 注册日期2002-11-20
  • 最后登录2005-12-29
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2003-05-21 08:25
LINUX的系统DMA驱动和NT内核下的系统DMA驱动有什么区别,就是在对8237的设置上有什么区别吗?
我是一只小小鸟,永远也飞也飞不高,但我永远在飞!
surbiandrv
驱动牛犊
驱动牛犊
  • 注册日期2003-05-07
  • 最后登录2003-08-11
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2003-05-21 09:44
系统完成
libin2309
驱动大牛
驱动大牛
  • 注册日期2002-11-20
  • 最后登录2005-12-29
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2003-05-21 09:53
系统完成


楼上大哥能说的详细点吗?你是说,WINDOWS的系统DMA驱动,是由系统来完成是吗?也就是我不需要去设置8237的模式寄存器,命令寄存器什么的 ??真的不知道怎么办,救命啊!
谢谢了!!!!
我是一只小小鸟,永远也飞也飞不高,但我永远在飞!
Linking.xmu
驱动牛犊
驱动牛犊
  • 注册日期2003-05-19
  • 最后登录2003-05-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2003-05-21 23:35
难道非要用两个通道吗?用一个通道,比如通道5不也可以传输数据吗?就把它当作一个外设到内存的数据传输就可以了,我觉得硬件设计这样也可以啊!大虾你说呢!
____________________________________________________________
呵呵,不要捧我,咱们是同病相怜。好像是可以用一个通道实现的,我查了8237的手册,大概是先要8237指定传输设备,然后设备通过DREQ线作出响应,再然后就可以传输了。
手册上说的就只有这些,可是问题是如何指定传输设备,是吧。所有资料提到这点都说了这么一句话:请查阅相关硬件手册。
*_*
.....
Linking.xmu
驱动牛犊
驱动牛犊
  • 注册日期2003-05-19
  • 最后登录2003-05-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2003-05-21 23:37
你可以去看下DDK的代码,好像它对DMA的操作其实也就是封装了几个对8237的端口操作而已,没有什么可借鉴的。
Linking.xmu
驱动牛犊
驱动牛犊
  • 注册日期2003-05-19
  • 最后登录2003-05-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2003-05-21 23:41
还有这里的高手好像都不做ISA下的DMA的,兄弟不妨试试往别的方面努力,期待你的结果。
libin2309
驱动大牛
驱动大牛
  • 注册日期2002-11-20
  • 最后登录2005-12-29
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2003-05-22 08:07
这是我的任务,一定要完成的。我看了DDK关于ISA的系统DMA的实现,其他地方还能理解,就是在启动DMA这里我实在是不知道怎么做,我看书上有这个函数:XxWriteControl(pDE,XX_CTL_INTENB|XX_CTL_DMA_GO);
能详细讲讲怎么用这个函数吗?

我是一只小小鸟,永远也飞也飞不高,但我永远在飞!
游客

返回顶部