40楼#
发布于:2003-06-06 15:15
你回答的很好!确实是这么回事,不知道你做过总线主方式的DMA没有?
这种形式的DMA,驱动编写的时候,要用软件来启动DMA的传输!驱动资料上说,基于包传输(非通用缓冲区)的系统DMA传输和基于包的总线主DMA传输的差别在于:驱动调用IoMapTransfer后,对于系统的DMA,函数调用后系统自动编程好了DMA控制器(例如8237,往里写地址和记数值)驱动只需给设备发送合适的命令来启动DMA的传输,或者说成是驱动发标志位给硬件来告诉硬件可以开始请求DMA了。而总线主的DMA,驱动调用IoMapTransfer后,系统并没有编程DMA控制器(自己板子上自带的),因为系统不知道怎么来编程,得需要驱动编写者自己来做这些事:把IoMapTransfer返回的地址和记数值写到相应的地址和记数寄存器,然后和系统DMA的差不多,发送合适的命令来启动DMA的传输。也就是系统DMA的传输,编程DMA硬件是要系统来做的,而总线主的DMA是要驱动编写者自己来做的。这个我能理解,也是很好理解的。 其实,问你到现在,我的问题还是关于启动传输,是否要软件支持的问题,是必要的,还是不一定需要? 我想,是必要的,理由如下,你分析一下,看有没有道理:假如不用我的软件来使能DMA的传输,那么一旦外设的DREQ来的时候,就表明DMA请求是有效的,我就得响应,来传输数据吧,如果这时候,我还没调用IoMapTransfer编程好我的8237,那么我就不可能响应传输,也就是不可能进行数据的传输了,那么外设也就得不到DACK这个信号了。你说是不是? |
|
|
41楼#
发布于:2003-06-06 16:51
有DMA允许信号是最保险的做法,你能加就加吧。
但我还是不认为它必要: 操作系统对不使用的DMA通道应该均是屏蔽的,如果驱动又不使用8237的自动重载功能的话,在每次DMA计数完成时,8237均会自行屏蔽该通道。 |
|
|
42楼#
发布于:2003-06-06 18:11
是你说的这个道理,但是,如果外设的DMA请求到来了,我的DMA控制器还没有编程好的话,怎么进行传输,也就是我编程DMA控制器在前,使能DREQ在后,不加使能控制难以做到这点,所以必须加使能!你说呢?
|
|
|
43楼#
发布于:2003-06-06 22:11
你最好加上DMA允许位,我只是说:
如果你家的门没有,但是整幢楼的门确被管理员管得很好,一样也没有危险――你家的门是DMA允许位,整幢楼的门是8237的屏蔽位。 我要撞豆腐啦。 |
|
|
44楼#
发布于:2003-06-07 10:49
你回答的真够形象的。好的,硬件上,我是没什么问题了,关于软件的问题,我再开帖子问!真的很感激你的回答!请问你在哪个城市?交个朋友!
|
|
|
45楼#
发布于:2003-06-07 16:53
我常看的邮箱是zhyzya@163.net,在江苏省连云港市,有空就给我来个email吧。
|
|
|
上一页
下一页