DMA开发日志

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

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

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

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

VtoosD3.0开发VXD驱动程序。

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

DMA
通道号为516bits传输。
int
号为4

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

现在的麻烦问题在于:老是要蓝屏。而且有一个特点,每当打开资源管理器操作硬盘或插入(拔除)USB接口上的优盘后,在主程序执行DeviceIoControlvxd程序必然会出错:
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状态,也要出错

 

最近调ISADMA驱动,也是老蓝屏,不知怎么回事,错误老是fault(0Eh),而且一出错就vxd就卸载不掉,怀疑是缓冲区容量申明的问题,因为我屏蔽掉初始化代码里的VDMABuffer::reserve(MAX_TRANSFER_PAGES,(PVOID)MAX_PHYS_ADDR);后就不会蓝屏了。我的DWORD MAX_TRANSFER_PAGES = 4096;DWORD MAX_PHYS_ADDR = 0x18000000;真不知道这样申明缓冲区有什么问题?

DMA驱动终于调通了,明白了时序其实是最终要的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值