📄 pdc4000.h
字号:
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 + -