//下面几条语句设置DMA寄存器,读数据:FromDeviceToMemory //L地址
WRITE_REGISTER_USHORT((PUSHORT)(pREG+DMALBASE),RAM); //H地址
WRITE_REGISTER_ULONG((PULONG)(pREG+DMAHBASE),address);
//字节长度,0表示传输4字节,4表示传输8字节
WRITE_REGISTER_USHORT((PUSHORT)(pREG+DMASIZE),(USHORT)length-1);
//启动DMA传输 WRITE_REGISTER_USHORT((PUSHORT)(pREG+DMACTL),0x101);
// Release our interrupt spinlock WdfInterruptReleaseLock( pDeviceContext->Interrupt );
return TRUE; }
BOOLEAN
PCISample_EvtInterruptIsr(
IN WDFINTERRUPT Interrupt, IN ULONG MessageID ) {
PDEVICE_CONTEXT pDeviceContext; PUCHAR pREG; USHORT status; pDeviceContext = GetDeviceContext(WdfInterruptGetDevice(Interrupt)); pREG = pDeviceContext->MemBaseAddress;
//读取中断状态寄存器值
status = READ_REGISTER_USHORT((PUSHORT)(pREG+HINT)); if ((status & 0x020) == 0x020)
{ //判断是否为DMA传输结束中断 //若是,清除并禁止中断 WRITE_REGISTER_ULONG((PULONG)(pREG+HINT),0x3FF);
//
// Request the DPC to complete the transfer. //
WdfInterruptQueueDpcForIsr(Interrupt);
return TRUE; } else
return FALSE; // 不是由该设备产生的中断,返回FALSE }
VOID
PCISample_EvtInterruptDpc(
IN WDFINTERRUPT Interrupt, IN WDFOBJECT Device ) {
NTSTATUS status; WDFDEVICE device;
PDEVICE_CONTEXT pDeviceContext; WDFDMATRANSACTION dmaTransaction; BOOLEAN transactionComplete; WDFREQUEST request; size_t bytesTransferred;
pDeviceContext = GetDeviceContext(Device); dmaTransaction = pDeviceContext->DmaTransaction; request = WdfDmaTransactionGetRequest(dmaTransaction); // // Indicate this DMA operation has completed: // This may drive the transfer on the next packet if // there is still data to be transfered in the request. // transactionComplete =
WdfDmaTransactionDmaCompleted(dmaTransaction, &status); if (transactionComplete) {
}
//DMA传输字节数
bytesTransferred = WdfDmaTransactionGetBytesTransferred(dmaTransaction); //终止传输
WdfDmaTransactionRelease(dmaTransaction);
WdfRequestCompleteWithInformation(request, status, bytesTransferred); DbgPrint(\
return; }
/******************************************************************/ Resource.h
//{{NO_DEPENDENCIES}}
// Microsoft Developer Studio generated include file. // Used by WDFSample.rc //
// Next default values for new objects //
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NO_MFC 1 #define _APS_NEXT_RESOURCE_VALUE 101 #define _APS_NEXT_COMMAND_VALUE 40001 #define _APS_NEXT_CONTROL_VALUE 1000 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif
/***************************************************8/ Sources
TARGETNAME=PCISample TARGETTYPE=DRIVER
KMDF_VERSION=1 INF_NAME=PCISample
MISCFILES=$(OBJ_PATH)\\$(O)\\$(INF_NAME).inf NTTARGETFILES=
C_DEFINES= $(C_DEFINES)
INCLUDES=$(INCLUDES);..\\..\\inc
SOURCES=driver.c \\ device.c \\ queue.c \\
WDFSample.rc
/*****************************************************************/ WDFSample.rc
//Microsoft Developer Studio generated resource script. //
#include \
#define APSTUDIO_READONLY_SYMBOLS
///////////////////////////////////////////////////////////////////////////// //
// Generated from the TEXTINCLUDE 2 resource. //
#define APSTUDIO_HIDDEN_SYMBOLS #include \
#undef APSTUDIO_HIDDEN_SYMBOLS #include \
///////////////////////////////////////////////////////////////////////////// #undef APSTUDIO_READONLY_SYMBOLS
///////////////////////////////////////////////////////////////////////////// // Chinese (P.R.C.) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS) #ifdef _WIN32
LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED #pragma code_page(936) #endif //_WIN32
#ifndef _MAC
///////////////////////////////////////////////////////////////////////////// //
// Version //
VS_VERSION_INFO VERSIONINFO FILEVERSION 1,0,0,0
PRODUCTVERSION 1,0,0,0 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L #else
FILEFLAGS 0x0L
#endif
FILEOS 0x40004L FILETYPE 0x3L FILESUBTYPE 0x7L BEGIN
BLOCK \ BEGIN
BLOCK \ BEGIN
VALUE \
VALUE \电子工业出版社\\0\ VALUE \ VALUE \ VALUE \
VALUE \最新WDF设备驱动程序开发(武安河)\\0\ VALUE \ VALUE \ VALUE \ VALUE \ VALUE \ VALUE \ END END
BLOCK \ BEGIN
VALUE \ END END
#endif // !_MAC
#ifdef APSTUDIO_INVOKED
///////////////////////////////////////////////////////////////////////////// //
// TEXTINCLUDE //
1 TEXTINCLUDE DISCARDABLE BEGIN
\END
2 TEXTINCLUDE DISCARDABLE