您的位置:首页 > 其它

DMA开发日志

2005-06-24 11:09 363 查看


在完成DMA数据传输的时候,产生硬件中断,这个中断,你们的硬件是怎么设计的?我的总线是ISA,我是这样设计的,对吗?
把总线上的记数结束信号T/C连接到总线上的一个中断输入信号,比如IRQ5,那么当发生中断的时候我怎么判断是不是我的中断,换句话说,我找不到我硬件里的中断控制寄存器!



应该是一个异步过程调用,就是说用户线程先初始化一个内核同步对象(event、mutex...),把这个对象传递给驱动程序,然后阻塞该线程,驱动在数据传输完成后设置这个event,用户线程就知道驱动已经完成处理了。3

看到linux设备驱动程序上面这样描述的:dma被异步的使用
1、硬件发出中断,表明新的数据到达了;
2、中断处理程序分配一个缓冲区,告诉硬件将数据传往何处;
3、外围设备将数据写入缓冲区,当写完时,再次发出中断;
4、处理程序派发新数据,唤醒所有相关进程,处理一些杂务。



设备有数据-〉中断通知驱动程序-〉驱动程序启动DMA完成一次数据传输-〉写往公共缓冲区<-用户进程读取



用VtoosD3.0开发VXD驱动程序。

包含IO端口操作、DMA和中断。

DMA 通道号为5,16bits传输。
int 号为4。

采集程序需要连续采集。方法:
采用VSharedHardwareInt 和 VDMAChannel。
DMA设为auto init模式。DMA设为8192字节。传送完后自动重新开始。而接口卡上每1024个DMA请求产生一个中断。
一般情况下能够正常采集。

现在的麻烦问题在于:老是要蓝屏。而且有一个特点,每当打开资源管理器操作硬盘或插入(拔除)USB接口上的优盘后,在主程序执行DeviceIoControl,vxd程序必然会出错:
(softice窗口提示)
Break due to page fault(0Eh), Fault = 0004
或者
Break due to General Protection Fault (0Dh). fault = 0000

用softice装入代码后,有时出错的代码在
OnW32DeviceIoControl的入口。
DWORD CSonicDrvDevice::OnW32DeviceIoControl(PIOCTLPARAMS pDIOCParams)
{
if(m_pSonicInt==NULL) return DEVIOCTL_ERROR;
if(m_pSonicDMA==NULL) return DEVIOCTL_ERROR;
switch (pDIOCParams->dioc_IOCtlCode)
{
case DIOC_OPEN:
dprintf("DIOC_OPEN!/n ");
break;
case DIOC_CLOSEHANDLE:
dprintf("DIOC_CLOSEHANDLE/n! ");
break;

而且 即使DMA和中断处于mask状态,也要出错


最近调ISA的DMA驱动,也是老蓝屏,不知怎么回事,错误老是fault(0Eh),而且一出错就vxd就卸载不掉,怀疑是缓冲区容量申明的问题,因为我屏蔽掉初始化代码里的VDMABuffer::reserve(MAX_TRANSFER_PAGES,(PVOID)MAX_PHYS_ADDR);后就不会蓝屏了。我的DWORD MAX_TRANSFER_PAGES = 4096;DWORD MAX_PHYS_ADDR = 0x18000000;真不知道这样申明缓冲区有什么问题?7DMA驱动终于调通了,明白了时序其实是最终要的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: