阅读:1519回复:18
关于DS的系统DMA模式,答好了,可多给分
还是老问题,用DS学ISA的系统DMA驱动,DMA控制器是主板上的8237,那么我在程序中是否对8237的地址和记数寄存器进行设置?还是 不用设置,都由系统来完成?请指教
|
|
|
沙发#
发布于:2003-05-14 16:52
没人会吗?怎么没人回答?
|
|
|
板凳#
发布于:2003-05-14 20:51
好象要知道缓冲区的物理地址,我也有这样的问题,已经看了一段时间了,ISA卡的DMAC是在主机上的,只要知道基地址,就可以给控制寄存器等赋值了,可ISA卡不是我做的,不知道做硬件的知道吗?
你用DS,可是ISA不是PNP的,我看它的类是从KPnpDevice继承的,这可行吗? |
|
地板#
发布于:2003-05-14 21:45
DMAC就是主板上的8237,它的那些寄存器的地址是固定的,查一些资料就能知道的,我想问的是,是不是要直接操作这些口地址,向里面写入控制字什么的,还是不需要!
|
|
|
地下室#
发布于:2003-05-19 10:10
对于总线主的DMA,用DS来写的话,比用DDK省很多的事,最多用那三个类就完成了。设置相应DMA控制器的控制寄存器来启动DMA传输:直接用KIORANGE的 函数OUT 或IN函数来写或读寄存器。可是,对于系统DMA,它的控制器是主板上的8237,DMA的启动是通过外设发DMA请求信号DREQ来的,也需要用KIORANGE的函数来往8237内部写入或读寄存器吗?
|
|
|
5楼#
发布于:2003-05-19 15:08
好好研究了DDK文档,DS把DDK给封装了,其实道理是一样的,前面还能看懂,到了后面,启动 DMA这个地方,书上说给设备发送合适的命令来进行数据传输,我的设备是简单的ISA的DMA,没有什么接口芯片,不知道这个控制命令发到什么地方。
硬件设计是这样的:双口RAM半满时发DREQ,请求DMA传输,返回DACK给双口RAM作为选中信号,进行数据传输,我不知道控制命令写到什么地方,另外我注意到,与这个控制命令有关的程序只是在驱动的APATER CONTROL中和ISR 中涉及。其中DMA传输完的中断处理过程中读取状态寄存器的值,这个,我也不知道到那里去读,我的设备上没这样的口地址啊! 郁闷,谁来帮帮我啊! 救命了,我卡在这里了! |
|
|
6楼#
发布于:2003-05-20 10:49
难道真的没人知道这个吗?
|
|
|
7楼#
发布于:2003-05-20 11:52
当然发到系统DMA控制器。但你的卡上要有相应的信号仲裁
|
|
8楼#
发布于:2003-05-20 14:22
当然发到系统DMA控制器。但你的卡上要有相应的信号仲裁 这么说要直接操作8237了,我的硬件设计中,设备发DREQ,8237响应DMA请求,发DACK和一些读,或写的控制信号,地址线等一起做为片选信号,选种请求DMA传送的设备,开始DMA传输,不知道你说的信号仲裁是什么? 另外,我要直接操作8237的那些寄存器? 请大虾指点!!! |
|
|
9楼#
发布于:2003-05-20 17:53
真的很郁闷,难道没有人做过系统DMA的驱动吗?用DDK的也可以啊,请大侠指点迷津,主要是8237怎么用!
|
|
|
10楼#
发布于:2003-05-21 00:14
呵呵,跟我一样的遭遇,同情。
我用的卡是把板上的内存映射到系统内存空间里的。查了资料,好像8237有一种工作模式可以支持这种传输。方法是把通道0设为读模式,指向源地址;把通道1设为写模式,指向目的地址。再向通道1 的计数器里写入传输字节数。最后把8237设为块传输,允许存储器-存储器传送方式(将模式寄存器的最低位置1)。最后向请求寄存器写入传输请求就可以了。 不过我碰到的情况是:传输是启动了,可是传进来的全是FF。郁闷! Who can tell me why??? |
|
11楼#
发布于:2003-05-21 08:14
呵呵,跟我一样的遭遇,同情。 难道非要用两个通道吗?用一个通道,比如通道5不也可以传输数据吗?就把它当作一个外设到内存的数据传输就可以了,我觉得硬件设计这样也可以啊!大虾你说呢! |
|
|
12楼#
发布于:2003-05-21 08:25
LINUX的系统DMA驱动和NT内核下的系统DMA驱动有什么区别,就是在对8237的设置上有什么区别吗?
|
|
|
13楼#
发布于:2003-05-21 09:44
系统完成
|
|
14楼#
发布于:2003-05-21 09:53
系统完成 楼上大哥能说的详细点吗?你是说,WINDOWS的系统DMA驱动,是由系统来完成是吗?也就是我不需要去设置8237的模式寄存器,命令寄存器什么的 ??真的不知道怎么办,救命啊! 谢谢了!!!! |
|
|
15楼#
发布于:2003-05-21 23:35
难道非要用两个通道吗?用一个通道,比如通道5不也可以传输数据吗?就把它当作一个外设到内存的数据传输就可以了,我觉得硬件设计这样也可以啊!大虾你说呢!
____________________________________________________________ 呵呵,不要捧我,咱们是同病相怜。好像是可以用一个通道实现的,我查了8237的手册,大概是先要8237指定传输设备,然后设备通过DREQ线作出响应,再然后就可以传输了。 手册上说的就只有这些,可是问题是如何指定传输设备,是吧。所有资料提到这点都说了这么一句话:请查阅相关硬件手册。 *_* ..... |
|
16楼#
发布于:2003-05-21 23:37
你可以去看下DDK的代码,好像它对DMA的操作其实也就是封装了几个对8237的端口操作而已,没有什么可借鉴的。
|
|
17楼#
发布于:2003-05-21 23:41
还有这里的高手好像都不做ISA下的DMA的,兄弟不妨试试往别的方面努力,期待你的结果。
|
|
18楼#
发布于:2003-05-22 08:07
这是我的任务,一定要完成的。我看了DDK关于ISA的系统DMA的实现,其他地方还能理解,就是在启动DMA这里我实在是不知道怎么做,我看书上有这个函数:XxWriteControl(pDE,XX_CTL_INTENB|XX_CTL_DMA_GO);
能详细讲讲怎么用这个函数吗? |
|
|