⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pdc4000.h

📁 PCI9054驱动源代码,是学习PCI驱动的好教材,大家可以参考参考
💻 H
📖 第 1 页 / 共 2 页
字号:
typedef struct _DMA_CHANNEL_DESCRIPTION
{
	ULONG LocalBusWidth					:2;	//DMA Mode Register: 0:1
	ULONG InternalWaitStates			:4;	//DMA Mode Register: 2:5
    ULONG ReadyInputEnable				:1;	//DMA Mode Register: 6
    ULONG BTERMInputEnable				:1;	//DMA Mode Register: 7
    ULONG LocalBurstEnable				:1;	//DMA Mode Register: 8
	ULONG ScatterGatherMODE				:1; //DMA Mode Register: 9
	ULONG DoneInterrputEnable			:1;	//DMA Mode Register: 10
	ULONG LocalAddressingMode			:1;	//DMA Mode Register: 11
	ULONG DemandMode					:1;	//DMA Mode Register: 12
    ULONG MemoryWriteAndInvalidateMode	:1;	//DMA Mode Register: 13
    ULONG DmaEOTPinEnable				:1;	//DMA Mode Register: 14
    ULONG FastSlowTerminateModeSelect   :1;	//DMA Mode Register: 15
    ULONG EnableTransferCountClear		:1;	//DMA Mode Register: 16
    ULONG InterrputSelect				:1;	//DMA Mode Register: 17
    ULONG DACChainLoad					:1;	//DMA Mode Register: 18
    ULONG Reserved1						:9;
    ULONG PciToLocalAlmostFull			:4;	//DMA Threshold Register
    ULONG LocalToPciAlmostEmpty			:4;	//DMA Threshold Register
    ULONG LocalToPciAlmostFull			:4;	//DMA Threshold Register
    ULONG PciToLocalAlmostEmpty			:4;	//DMA Threshold Register
	//ULONG EnableDoneInt					:1;
    ULONG Reserved2						:13;
    DMA_CHANNEL_PRIORITY DmaChannelPriority;
} DMA_CHANNEL_DESCRIPTION, *PDMA_CHANNEL_DESCRIPTION;

// DMA channel information 
typedef struct _DMA_CHANNEL_INFO
{
    DMA_STATE    State;						// DMA Channel open state

    BOOLEAN      HoldLocalAddressConstant;	// Flag to keep track if local address remains constant

	PDMA_ADAPTER	pDmaAdapterObject;		//Pointer to the DMA_ADAPTER structure returned by IoGetDmaAdapter that represents the bus master adapter or DMA controller.
	ULONG			lNumberOfMapRegisters;

	BOOLEAN			bWriteToLocal;	
	
	//For Scatter/Gather List
	PVOID				pSgl;				// Address of the current SGL descriptor list
    PMDL				pMdl;				// MDL of the user buffer for locking and unlocking
	
	ULONG				lTransferedBytes;	//
	ULONG				lNeedTransferBytes;	//
	ULONG				lRemainBytes;		//
	PVOID				pVirtualAddress;	// Virtual Address for current stage
	//For Common Buffer
	PVOID				vaCommonBuffer;
	PHYSICAL_ADDRESS	paCommonBuffer;
	ULONG				lCommonBufferSize;

	//For Scatter/Gather DMA
//	PPCI9054_SCATTER_GATHER_LIST	pSGL;
	PPCI9054_SCATTER_GATHER_ELEMENT pSGE;	//The address of Scatter/Gather elements
	ULONG							lpaSGL;
	PVOID							vaSglTransfer;
	ULONG							lSglTransferSize;
	ULONG							lSglBytesRemaining;
	ULONG							lMapRegisterCount;
	PVOID							pMapRegisterBase;

}DMA_CHANNEL_INFO, *PDMA_CHANNEL_INFO;



///////////////////////////////////////////////////////////////////////////////
// Device Extension Structure
typedef struct _DEVICE_EXTENSION 
{
	PDEVICE_OBJECT		pDeviceObject;			// device object this extension belongs to
	PDEVICE_OBJECT		pLowerDeviceObject;		// next lower driver in same stack
	PDEVICE_OBJECT		pPhysicalDeviceObject;	// the PDO

	IO_REMOVE_LOCK		RemoveLock;				// removal control locking structure

	UNICODE_STRING		InterfaceName;	    	// interface name

	DEVICE_POWER_STATE	DevicePower;			// current device power state
	SYSTEM_POWER_STATE	SystemPower;			// current system power state

	PULONG IdleCount;							// address of idle counter from idle detection registration
	DEVICE_CAPABILITIES DeviceCaps;				// copy of most recent device capabilities

	LONG Handles;								// # open handles

	// Interrupt handling variables
	ULONG				InterruptSource;
    PKINTERRUPT			pInterruptObject;		// address of interrupt object
	
	LIST_ENTRY          InterruptEventList;
    KSPIN_LOCK          InterruptEventListLock;

	PUCHAR				PortBase;				// I/O port base address 
	ULONG				PortCount;				
	// TODO add additional per-device declarations
	BOOLEAN				bMappedPort;			// true if we mapped port addr in StartDevice
	BOOLEAN				bBusy;					// true if device busy with a request
	BOOLEAN				bStalledForPower;		// power management has stalled IRP queue

	//事件对象指针
	PKEVENT				pWaitEvent;
	BOOLEAN				bSetWaitEvent;

	//PCI9054内部寄存器映射的内存资源
	ULONG				*LocalRegisterMemBase;				
	PHYSICAL_ADDRESS	LocalRegisterPhysicalMemBase;
	ULONG				LocalRegisterMemCount;
	//自定义内存资源
	ULONG				*PdcMemBase0;
	PHYSICAL_ADDRESS	PdcPhysicalMemBase0;
	ULONG				PdcMemCount0;

	KSPIN_LOCK          HardwareAccessLock;

	signed long			UsageCount;				//The pending I/O Count
	BOOLEAN				bStopping;				//
	KEVENT				StoppingEvent;			// Set when all pending I/O complete

	BOOLEAN				GotResource;			//

	NTSTATUS			TransmitIrpStatus;

	//Power Defines
	DEVICE_POWER_STATE  PowerState;

	//DMA 
	 // DMA access information
    DMA_CHANNEL_INFO    DmaInfo[NUMBER_OF_DMA_CHANNELS];
    KSPIN_LOCK          DmaChannelLock;

    // Doorbell storage
    ULONG				IntraDoorbellValue;

} DEVICE_EXTENSION, *PDEVICE_EXTENSION;
//				Define Device Extention
////////////////////////////////////////////////////////////////////////////////////


#define COMMON_BUFFER_SIZE 0x2000

/**********************************************
*               Init Functions
**********************************************/

VOID DriverUnload(IN PDRIVER_OBJECT pDriverObject);

/**********************************************
*               Pnp Functions
**********************************************/
NTSTATUS DispatchPnp(IN PDEVICE_OBJECT fdo,
					 IN PIRP pIrp);
NTSTATUS DefaultPnpHandler(IN PDEVICE_OBJECT fdo,
						   IN PIRP pIrp);
NTSTATUS PnpRemoveDevice(IN PDEVICE_OBJECT fdo,
						 IN PIRP pIrp);
NTSTATUS PnpStartDevice(IN PDEVICE_OBJECT fdo,
						IN PIRP pIrp);
NTSTATUS PnpStopDevice(IN PDEVICE_OBJECT fdo,
					   IN PIRP pIrp);
NTSTATUS ForwardAndWait(IN PDEVICE_OBJECT fdo,
						IN PIRP pIrp);
NTSTATUS AddDevice(IN PDRIVER_OBJECT pDriverObject,
				   IN PDEVICE_OBJECT pdo);
VOID RemoveDevice(IN PDEVICE_OBJECT fdo);
NTSTATUS StartDevice(IN PDEVICE_OBJECT fdo,
					 IN PCM_PARTIAL_RESOURCE_LIST ResourceListRaw,
					 IN PCM_PARTIAL_RESOURCE_LIST ResourceList);
VOID StopDevice(IN PDEVICE_OBJECT fdo);
BOOLEAN LockDevice(IN DEVICE_EXTENSION *pdx);
VOID UnlockDevice(IN DEVICE_EXTENSION *pdx);
NTSTATUS OnRequestComplete(IN PDEVICE_OBJECT fdo,
						   IN PIRP pIrp,
						   IN PKEVENT pKEvent);
unsigned char GetBarIndex(IN PHYSICAL_ADDRESS address,
						  IN PCI_COMMON_CONFIG *pciRegs);

NTSTATUS CompleteRequest(IN PIRP Irp,
						 IN NTSTATUS status);
NTSTATUS CompleteRequestInfo(IN PIRP Irp, 
							 IN NTSTATUS status, 
							 IN ULONG_PTR info);
/**********************************************
*               Dispath Functions
**********************************************/
NTSTATUS DispatchCreate(IN PDEVICE_OBJECT fdo,
						IN PIRP pIrp);
NTSTATUS DispatchCleanup(IN PDEVICE_OBJECT fdo,
						 IN PIRP pIrp);
NTSTATUS DispatchClose(IN PDEVICE_OBJECT fdo,
					   IN PIRP pIrp);
NTSTATUS DispatchRead(IN PDEVICE_OBJECT fdo,
					  IN PIRP pIrp);
NTSTATUS DispatchWrite(IN PDEVICE_OBJECT fdo,
					   IN PIRP pIrp);
NTSTATUS DispatchSystemControl(IN PDEVICE_OBJECT fdo,
							   IN PIRP pIrp);
NTSTATUS DispatchIoControl(IN PDEVICE_OBJECT fdo,
						   IN PIRP pIrp);
VOID StartIo(IN PDEVICE_OBJECT fdo,
				  IN PIRP pIrp);
VOID CancelIrp(IN PDEVICE_OBJECT fdo,
			   IN PIRP pIrp);

/**********************************************
*               Interupt Functions
**********************************************/
BOOLEAN OnInterrupt(IN PKINTERRUPT pInterrupt,
					IN PDEVICE_EXTENSION pdx);//PVOID pdx);	//
VOID DpcForIsr(IN PKDPC pDpc,
			   IN PDEVICE_OBJECT fdo,
			   IN PIRP Irp, 
			   IN PDEVICE_EXTENSION pdx);

BOOLEAN EnablePciInterrupt(IN PDEVICE_EXTENSION pdx);
BOOLEAN DisablePciInterrupt(IN PDEVICE_EXTENSION pdx);
/**********************************************
*               Power Functions
**********************************************/
NTSTATUS DispatchPower(IN PDEVICE_OBJECT fdo,
					   IN PIRP Irp);
NTSTATUS DefaultPowerHandler(IN PDEVICE_OBJECT fdo,
							 IN PIRP Irp);
NTSTATUS PowerSetPower(IN PDEVICE_OBJECT fdo,
						IN PIRP Irp);
NTSTATUS PowerQueryPower(IN PDEVICE_OBJECT fdo,
						  IN PIRP Irp);
NTSTATUS OnFinishPowerUp(IN PDEVICE_OBJECT fdo,
						 IN PIRP Irp,
						 IN PVOID junk);
VOID OnPowerRequestComplete(IN PDEVICE_OBJECT   DeviceObject,
							IN unsigned char    MinorFunction,
							IN POWER_STATE      PowerState, 
							IN PVOID            context,
							IN PIO_STATUS_BLOCK ioStatus);

NTSTATUS SendDeviceSetPower(IN PDEVICE_OBJECT fdo,
							IN DEVICE_POWER_STATE state,
							IN ULONG context);
VOID SetPowerState(IN PDEVICE_OBJECT fdo,
				   IN DEVICE_POWER_STATE state);
BOOLEAN EmpowerDevice(IN DEVICE_EXTENSION  *pdx,
					  IN DEVICE_POWER_STATE state);
NTSTATUS SendSelfSetPowerRequest(IN PDEVICE_OBJECT fdo,
								 IN DEVICE_POWER_STATE state);

/****************************************************************
*		DMA fuctions
*****************************************************************/
BOOLEAN SynchronizedModifyRegister(PREG_DATA RegData);

RETURN_CODE DmaOpenBlockChannel(DEVICE_EXTENSION *pdx,
							long lDmaChannel,
							DMA_CHANNEL_DESCRIPTION *pDmaChannelDescription);
RETURN_CODE DmaBlockTransfer(DEVICE_EXTENSION     *pdx,
						 ULONG		           lDmaChannel,
						 DMA_TRANSFER_ELEMENT *pDmaData);
RETURN_CODE DmaRestartBlockTransfer(DEVICE_EXTENSION *pdx,
									ULONG lDmaChannel,
									ULONG lTransferSize,
									PIRP  pIrp);
RETURN_CODE DmaCloseBlockChannel(DEVICE_EXTENSION *pdx,
								ULONG       lDmaChannel,
								BOOLEAN     bCheckInProgress);
RETURN_CODE DmaControl(DEVICE_EXTENSION *pdx,
					   ULONG			lDmaChannel,
					   DMA_COMMAND		DmaCommand);
RETURN_CODE DmaGetStatus(DEVICE_EXTENSION *pdx,
						 ULONG lDmaChannel);
VOID DmaShuttleTransferComplete(DEVICE_EXTENSION *pdx,
								ULONG lDmaChannel);
RETURN_CODE CloseDmaShuttleChannel(DEVICE_EXTENSION *pdx,
								   ULONG			lDmaChannel);
RETURN_CODE DmaShuttleTransfer(DEVICE_EXTENSION     *pdx,
							   ULONG				lDmaChannel,
							   DMA_TRANSFER_ELEMENT *pDmaData);
RETURN_CODE DmaOpenShuttleChannel(DEVICE_EXTENSION			*pdx,
								  ULONG						lDmaChannel,
								  DMA_CHANNEL_DESCRIPTION	*pDmaChannelDescription,
								  PFILE_OBJECT				pFileObject);
RETURN_CODE DmaCloseSglChannel(DEVICE_EXTENSION *pdx,
							   ULONG			lDmaChannel,
							   BOOLEAN			bCheckInProgress);
RETURN_CODE DmaSglTransfer(DEVICE_EXTENSION     *pdx,
						   ULONG				lDmaChannel,
						   ULONG				lMdbAddress);
RETURN_CODE DmaOpenSglChannel(DEVICE_EXTENSION			*pdx,
							  ULONG						lDmaChannel,
							  DMA_CHANNEL_DESCRIPTION	*pDmaChannelDescription);

IO_ALLOCATION_ACTION AdapterControl(IN PDEVICE_OBJECT fdo, 
									IN PIRP pIrp, 
									PVOID pMapRegisterBase, 
									PDEVICE_EXTENSION pdx);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -