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驅動終於調通了,明白了時序其實是最終要的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章