您的位置:首页 > 移动开发 > Objective-C

windows wdf 驱动开发总结(5)--PCI 驱动

2010-10-07 10:50 190 查看
PCI驱动相关(CY7C09449)(AMCC5933)
   
PCI总线标准是一种将系统外部设备连接起来的总线标准,它是PC中最重要的总线。其它总线ISA总线,USB总线都挂在PCI总线上。
(2.1)WDF_INTERRUPT_CONFIG_INIT
函数功能:initializes a
WDF_INTERRUPT_CONFIG structure.
VOID
  WDF_INTERRUPT_CONFIG_INIT(
    OUT PWDF_INTERRUPT_CONFIG Configuration,

    IN PFN_WDF_INTERRUPT_ISR  
EvtInterruptIsr,

    IN PFN_WDF_INTERRUPT_DPC  
EvtInterruptDpc
    );
参数:
Configuration

A pointer to a
WDF_INTERRUPT_CONFIG structure.
EvtInterruptIsr

A pointer to the driver's
EvtInterruptIsr callback function.
EvtInterruptDpc

A pointer to the driver's
EvtInterruptDpc callback function, or NULL.

Comments

The WDF_INTERRUPT_CONFIG_INIT function zeros the specified WDF_INTERRUPT_CONFIG structure and sets its
Size member to the structure's size. It also sets the structure's
ShareVector member to WdfUseDefault and stores the specified callback function pointers.

 
结构:
typedef struct _WDF_INTERRUPT_CONFIG {

  ULONG  Size;

  WDFSPINLOCK  SpinLock;

  WDF_TRI_STATE  ShareVector;

  BOOLEAN  FloatingSave;

  BOOLEAN  AutomaticSerialization;

  PFN_WDF_INTERRUPT_ISR  EvtInterruptIsr;

  PFN_WDF_INTERRUPT_DPC  EvtInterruptDpc;

  PFN_WDF_INTERRUPT_ENABLE  EvtInterruptEnable;

  PFN_WDF_INTERRUPT_DISABLE  EvtInterruptDisable;

} WDF_INTERRUPT_CONFIG, *PWDF_INTERRUPT_CONFIG;

Members

Size

The size, in bytes, of this structure.

SpinLock

The handle to a framework spin-lock object, obtained by a previous call to
WdfSpinLockCreate, or NULL. If this parameter is NULL, the framework uses an internal spin-lock object. The framework acquires the spin lock before it calls the driver's
EvtInterruptSynchronize event callback function and when the driver calls
WdfInterruptAcquireLock.
ShareVector

A
WDF_TRI_STATE-typed value. If this value is WdfTrue, the interrupt vector can be shared. If the value is
WdfFalse, the interrupt vector cannot be shared. If the value is
WdfDefault, the PnP manager uses the bus driver's value.

FloatingSave

A Boolean value that, if TRUE, indicates that the system will save the processor's floating point and MMX state when the device
interrupts. If FALSE, the system does not save the floating point and MMX state. A driver should set this value to TRUE only if its
EvtInterruptIsr callback function must use floating point or MMX registers. For more information about saving floating point and MMX state, see
Using Floating Point or MMX in a WDM Driver.

AutomaticSerialization

A Boolean value that, if TRUE, indicates that the framework will synchronize execution of the interrupt object's
EvtInterruptDpc callback function with callback functions from other objects that are underneath the interrupt's parent device object. For more information, see the following Comments section.

EvtInterruptIsr

A pointer to the driver's
EvtInterruptIsr callback function. This pointer cannot be NULL.

EvtInterruptDpc

A pointer to the driver's
EvtInterruptDpc callback function, or NULL.
EvtInterruptEnable

A pointer to the driver's
EvtInterruptEnable callback function, or NULL.
EvtInterruptDisable

A pointer to the driver's
EvtInterruptDisable callback function, or NULL.
 
(2.2)
WdfInterruptCreate
函数功能:creates a framework interrupt object.
NTSTATUS
  WdfInterruptCreate(

    IN WDFDEVICE  
Device,

    IN PWDF_INTERRUPT_CONFIG  
Configuration,

    IN OPTIONAL PWDF_OBJECT_ATTRIBUTES  
Attributes,

    OUT WDFINTERRUPT*  
Interrupt
    );
参数:
Device

A handle to a framework device object.

Configuration

A pointer to a
WDF_INTERRUPT_CONFIG structure that was initialized by a call to
WDF_INTERRUPT_CONFIG_INIT.
Attributes

A pointer to a
WDF_OBJECT_ATTRIBUTES structure that specifies object attributes for the framework interrupt object. (The structure's
ParentObject member must be NULL.) This parameter is optional and can be WDF_NO_OBJECT_ATTRIBUTES.

Interrupt

A pointer to a location that receives a handle to the new interrupt object.

 
评论:
Drivers typically call the
WdfInterruptCreate method from an EvtDriverDeviceAdd callback function. Your driver must call
WdfInterruptCreate once for each interrupt vector that its device requires. If the device supports message-signaled interrupts (MSI), the driver must create an interrupt object for each message that the device can support.
 
(2.3)
WDF_DMA_ENABLER_CONFIG_INIT
函数功能:initializes a driver's
WDF_DMA_ENABLER_CONFIG structure.
VOID FORCEINLINE
  WDF_DMA_ENABLER_CONFIG_INIT(
    OUT PWDF_DMA_ENABLER_CONFIG  Config,

    IN WDF_DMA_PROFILE  
Profile,

    IN size_t  
MaximumLength
    );

Parameters

Config

A pointer to a driver-allocated
WDF_DMA_ENABLER_CONFIG structure.
Profile

A value for the
Profile member of the WDF_DMA_ENABLER_CONFIG structure.

MaximumLength

A value for the
MaximumLength member of the WDF_DMA_ENABLER_CONFIG structure.

评论:
Drivers must call the
WDF_DMA_ENABLER_CONFIG_INIT function before calling
WdfDmaEnablerCreate.
 
typedef struct _WDF_DMA_ENABLER_CONFIG {

  ULONG  Size;

  WDF_DMA_PROFILE  Profile;

  size_t  MaximumLength;

  PFN_WDF_DMA_ENABLER_FILL  EvtDmaEnablerFill;

  PFN_WDF_DMA_ENABLER_FLUSH  EvtDmaEnablerFlush;

  PFN_WDF_DMA_ENABLER_DISABLE  EvtDmaEnablerDisable;

  PFN_WDF_DMA_ENABLER_ENABLE  EvtDmaEnablerEnable;

  PFN_WDF_DMA_ENABLER_SELFMANAGED_IO_START  EvtDmaEnablerSelfManagedIoStart;

  PFN_WDF_DMA_ENABLER_SELFMANAGED_IO_STOP  EvtDmaEnablerSelfManagedIoStop;

} WDF_DMA_ENABLER_CONFIG, *PWDF_DMA_ENABLER_CONFIG;
 

Members

Size

The size, in bytes, of this structure.

Profile

A
WDF_DMA_PROFILE-typed value, which identifies the type of bus-master DMA operation that will be associated with the DMA enabler object.

MaximumLength

The default maximum size, in bytes, that the device can handle in a single DMA transfer. (Drivers can override this default value
for individual DMA transactions by calling WdfDmaTransactionSetMaximumLength.) If your driver must run on versions of Microsoft Windows operating systems that support a maximum of 16 map registers,
MaximumLength must be less than 65,536.
EvtDmaEnablerFill

A pointer to the driver's
EvtDmaEnablerFill event callback function, or NULL.

EvtDmaEnablerFlush

A pointer to the driver's
EvtDmaEnablerFlushevent callback function, or NULL.

EvtDmaEnablerDisable

A pointer to the driver's
EvtDmaEnablerDisable event callback function, or NULL.

EvtDmaEnablerEnable

A pointer to the driver's
EvtDmaEnablerEnable event callback function, or NULL.

EvtDmaEnablerSelfManagedIoStart

A pointer to the driver's
EvtDmaEnablerSelfManagedIoStart event callback function, or NULL.

EvtDmaEnablerSelfManagedIoStop

A pointer to the driver's
EvtDmaEnablerSelfManagedIoStop event callback function, or NULL.

Comments

The WDF_DMA_ENABLER_CONFIG structure is used as an input parameter to the
WdfDmaEnablerCreate method.Drivers must call
WDF_DMA_ENABLER_CONFIG_INIT to initialize the WDF_DMA_ENABLER_CONFIG structure.
 
typedef enum _WDF_DMA_PROFILE {

  WdfDmaProfileInvalid = 0,

  WdfDmaProfilePacket,

  WdfDmaProfileScatterGather,

  WdfDmaProfilePacket64,

  WdfDmaProfileScatterGather64,

  WdfDmaProfileScatterGatherDuplex,

  WdfDmaProfileScatterGather64Duplex
} WDF_DMA_PROFILE;

Values

WdfDmaProfileInvalid

For internal use only.

WdfDmaProfilePacket

The device supports single-packet DMA operations, using 32-bit addressing.

WdfDmaProfileScatterGather

The device supports packet-based, scatter/gather DMA operations, using 32-bit addressing.

WdfDmaProfilePacket64

The device supports single-packet DMA operations, using 64-bit addressing.

WdfDmaProfileScatterGather64

The device supports packet-based, scatter/gather DMA operations, using 64-bit addressing.

WdfDmaProfileScatterGatherDuplex

The device supports packet-based, scatter/gather DMA operations, using 32-bit addressing. The device also supports duplex operation.

WdfDmaProfileScatterGather64Duplex

The device supports packet-based, scatter/gather DMA operations, using 64-bit addressing. The device also supports duplex operation.

Comments

WDF_DMA_PROFILE-typed values are used within the driver's
WDF_DMA_ENABLER_CONFIG structure.
 
 
(2.4)
WdfDeviceSetAlignmentRequirement
函数功能:The
WdfDeviceSetAlignmentRequirement method sets a device's address alignment requirement for the data buffers that the device uses during memory transfer operations.
VOID
  WdfDeviceSetAlignmentRequirement(
    IN WDFDEVICE  Device,

    IN ULONG  
AlignmentRequirement
    );

Parameters

Device

A handle to a framework device object.

AlignmentRequirement

The alignment requirement for a data buffer. This value must be one less than the alignment boundary. For example, you can specify
15 for a 16-byte alignment boundary and 31 for a 32-byte alignment boundary. You can also use one of the FILE_Xxxx_ALIGNMENT constants that are defined in
Wdm.h.
 
(2.5)
WdfDmaEnablerCreate
函数功能:creates a DMA enabler object.
NTSTATUS
  WdfDmaEnablerCreate(
    IN WDFDEVICE  Device,

    IN PWDF_DMA_ENABLER_CONFIG  
Config,

    IN OPTIONAL PWDF_OBJECT_ATTRIBUTES  
Attributes,

    OUT WDFDMAENABLER*  
DmaEnablerHandle
    );

Parameters

Device

A handle to a framework device object.

Config

A pointer to a
WDF_DMA_ENABLER_CONFIG structure. Drivers must initialize this structure by calling
WDF_DMA_ENABLER_CONFIG_INIT.
Attributes

A pointer to a
WDF_OBJECT_ATTRIBUTES structure that specifies object attributes for the new DMA enabler object. This parameter is optional and can be WDF_NO_OBJECT_ATTRIBUTES.

DmaEnablerHandle

A handle to a new DMA enabler object.

 
评论:
Framework-based drivers must call
WdfDmaEnablerCreate before creating DMA transactions
for a device.Before a driver calls WdfDmaEnablerCreate,
it must call WdfDeviceSetAlignmentRequirement.
By default, the framework device object that the
Device parameter of WdfDmaEnablerCreate specifies
becomes the parent object for the new DMA enabler object. You can use the
ParentObject
member of the WDF_OBJECT_ATTRIBUTES structure to specify a different parent. The framework deletes the DMA enabler object when it deletes the parent object.
For more information about DMA enabler objects and
WdfDmaEnablerCreate, see Enabling DMA Transactions.
 
(2.6)
WdfDmaTransactionCreate
函数功能:creates a DMA transaction
NTSTATUS
  WdfDmaTransactionCreate(
    IN WDFDMAENABLER  DmaEnabler,

    IN OPTIONAL WDF_OBJECT_ATTRIBUTES  *
Attributes,

    OUT WDFDMATRANSACTION  *
DmaTransaction
    );
参数:

Parameters

DmaEnabler

A handle to a DMA enabler object that the driver obtained from a previous call to
WdfDmaEnablerCreate.
Attributes

A pointer to a
WDF_OBJECT_ATTRIBUTES structure that specifies object attributes for the new DMA transaction object. (The structure's
ParentObject member must be NULL.) This parameter is optional and can be WDF_NO_OBJECT_ATTRIBUTES.

DmaTransaction

A handle to a DMA transaction object.

 

Comments

After your driver calls
WdfDmaTransactionCreate, it must call
WdfDmaTransactionInitialize or WdfDmaTransactionInitializeUsingRequest before calling
WdfDmaTransactionExecute.
The specified DMA enabler object becomes the parent of the new DMA transaction object. The driver cannot change this parent, and the
ParentObject member or the WDF_OBJECT_ATTRIBUTES structure must be NULL.
 
(2.7)
WdfCmResourceListGetCount (获取配置资源的个数)
函数功能:returns the number of resource descriptors that are contained
in a specified resource list.
ULONG
  WdfCmResourceListGetCount(
    IN WDFCMRESLIST  List
    );

Parameters

List

A handle to a framework resource-list object that represents a list of hardware resources for a device.

Return Value

WdfCmResourceListGetCount
returns the number of resource descriptors that are contained in the resource list that the
List parameter specifies.
A bug check occurs if the driver supplies an invalid object handle.
 
for (i = 0; i < WdfCmResourceListGetCount(ResourcesTranslated); i++) {

        desc = WdfCmResourceListGetDescriptor(

                                              ResourcesTranslated,

                                              i

                                              );

        switch (desc->Type) {

            case CmResourceTypeMemory:

                //

                // Handle memory resources here.

                //

                break;

            case CmResourceTypePort:

                //

                // Handle port resources here.

                //

                break;

            case CmResourceTypeInterrupt:

                //

                // Handle interrupt resources here.

                //

                break;

            default:

                //

                // Ignore all other descriptors.

                //

                break;

        }

(2.8)
WdfCmResourceListGetDescriptor (获取该资源的描述符)
函数功能:returns a pointer to a resource descriptor that
is contained in a specified resource list.
PCM_PARTIAL_RESOURCE_DESCRIPTOR
  WdfCmResourceListGetDescriptor(
    IN WDFCMRESLIST  List,

    IN ULONG  
Index
    );

Parameters

List

A handle to a framework resource-list object that represents a list of hardware resources for a device.

Index

A zero-based value that is used as an index into the logical configuration that
List specifies.

Return Value

WdfCmResourceListGetDescriptor
returns a pointer to the CM_PARTIAL_RESOURCE_DESCRIPTOR structure that describes the hardware resource that the
Index parameter identifies, if the operation succeeds. Otherwise, the method returns NULL.
A bug check occurs if the driver supplies an invalid object handle.

Comments

Your driver cannot modify the resource descriptor that
WdfCmResourceListGetDescriptor retrieves.

 
 
(2.9)
MmMapIoSpace
函数功能:将物理地址转换成系统内核模式的地址(maps
the given physical address range to nonpaged system space.)
PVOID 

  MmMapIoSpace(
    IN PHYSICAL_ADDRESS  PhysicalAddress,

    IN SIZE_T
  NumberOfBytes,

    IN MEMORY_CACHING_TYPE 
 CacheType
    );

Parameters

PhysicalAddress

Specifies the starting physical address of the I/O range to be mapped.

NumberOfBytes

Specifies a value greater than zero, indicating the number of bytes to be mapped.

CacheType

Specifies a
MEMORY_CACHING_TYPE value, which indicates the cache attribute to use to map the physical address range.

 
评论:
A driver must call this routine during device start-up if it receives translated resources of type
CmResourceTypeMemory in a CM_PARTIAL_RESOURCE_DESCRIPTOR structure.
MmMapIoSpace maps the physical address returned in the
resource list to a logical address through which the driver can access device registers.
For example, drivers of PIO devices that allocate long-term I/O buffers can call this routine to make such buffers accessible or to make device memory
accessible.
For more information about using this routine, see Mapping Bus-Relative Addresses to Virtual Addresses.

 
(2.10) MmUnmapIoSpace
函数功能:MmUnmapIoSpace解除物理地址与系统内核模式地址的关联unmaps
a specified range of physical addresses previously mapped by MmMapIoSpace.
VOID 

  MmUnmapIoSpace(
    IN PVOID  BaseAddress,

    IN SIZE_T
  NumberOfBytes
    );

Parameters

BaseAddress

Pointer to the base virtual address to which the physical pages were mapped.

NumberOfBytes

Specifies the number of bytes that were mapped.

 
评论:
If a driver calls
MmMapIoSpace during device start-up, it must call MmUnmapIoSpace
when it receives a PnP stop-device or remove-device IRP for the same device object.
 
(2.11)WdfMemoryCopyToBuffer
函数功能:
copies the contents of a specified memory object's buffer into a specified destination buffer.

NTSTATUS
  WdfMemoryCopyToBuffer(
    IN WDFMEMORY  SourceMemory,

    IN size_t  
SourceOffset,

    IN PVOID  
Buffer,

    IN size_t  
NumBytesToCopyTo
    );

Parameters

SourceMemory

A handle to a framework memory object that represents the source buffer.

SourceOffset

An offset, in bytes, from the beginning of the source buffer. The copy operation begins at the specified offset in the source buffer.

Buffer

A pointer to a destination buffer.

NumBytesToCopyTo

The number of bytes to copy from the source buffer to the destination buffer. This value must not be greater than the size of the
source buffer
 
 //将应用程序的数据拷贝到CY7C09449的RAM中
 status = WdfMemoryCopyToBuffer(memory, 0, pRAM, length);
 
(2.12)
WdfDmaTransactionInitializeUsingRequest
函数功能:
initializes a specified DMA transaction by using the parameters of a specified I/O request.
NTSTATUS
  WdfDmaTransactionInitializeUsingRequest(
    IN WDFDMATRANSACTION  DmaTransaction,

    IN WDFREQUEST  
Request,

    IN PFN_WDF_PROGRAM_DMA  
EvtProgramDmaFunction,

    IN WDF_DMA_DIRECTION  
DmaDirection
    );

Parameters

DmaTransaction

A handle to a DMA transaction object that the driver obtained from a previous call to
WdfDmaTransactionCreate.
Request

A handle to a framework request object.

EvtProgramDmaFunction

A pointer to the driver's
EvtProgramDma event callback function.
DmaDirection

A
WDF_DMA_DIRECTION-typed value that specifies the direction of the DMA transfer.
The
WdfDmaTransactionInitializeUsingRequest method prepares
a DMA operation for execution, by performing initialization operations such as setting up a transfer's scatter/gather list. After your driver calls
WdfDmaTransactionInitializeUsingRequest, the driver
must call WdfDmaTransactionExecute.
 
(2.13)
WdfDmaTransactionExecute
函数功能:
begins the execution of a specified DMA transaction.
NTSTATUS
  WdfDmaTransactionExecute(
    IN WDFDMATRANSACTION  DmaTransaction,

    IN OPTIONAL PVOID  
Context
    );

Parameters

DmaTransaction

A handle to a DMA transaction object that the driver obtained from a previous call to
WdfDmaTransactionCreate.
Context

Driver-defined context information. The framework passes the value specified for
Context, which can be a pointer, to the driver's EvtProgramDma event callback function. This parameter is optional and can be NULL.

 
评论:
The
WdfDmaTransactionExecute method initializes a transaction's
scatter/gather list for the first DMA transfer that is associated with the specified DMA transaction. (For single-packet transfers, the scatter/gather list contains a single element.) Then, the method calls the driver's
EvtProgramDma event callback function, and the callback function can program the device to begin the transfer.
 
(2.14)
HalGetBusData
函数功能:This function retrieves configuration information about a specified slot
or address on a I/O bus.
函数原型:
ULONG HalGetBusData(

  BUS_DATA_TYPE BusDataType,

  ULONG BusNumber,

  ULONG SlotNumber,

  PVOID Buffer,

  ULONG Length

);

参数:
BusDataType:该参数指定总线类型。HalGetBusData函数可以查询各个总线的情况,对于PCI总线,这里设置为PCIConfiguration;
BusNumber:该参数指定Bus总线号;
SlotNumber:该参数由Device号和功能号共同组成;
Buffer:该参数是得到的PCI配置空间的首地址;
Length:该参数是PCI配置空间的大小。
HalSetBusData设置的参数和HalGetBusData一样,它是在NT式的驱动中使用。
 
(2.15)WDM微软不推荐采用HalGetBusData,推荐使用PDO处理IRP_MN_START_DEVICE的结果。在处理完IRP_MN_START_DEVICE后,驱动程序会将处理结果存储在IRP的设备堆栈中,从IO堆栈可以取出CM_FULL_RESOURCE_DESCRIPTOR数据结构,从CM_FULL_RESOURCE_DESCRIPTOR中可以取出CM_PARTIAL_RESOURCE_LIST数据结构,CM_PARTIAL_RESOURCE_LIST中又可以取出CM_PARTIAL_RESOURCE_DESCRIPTOR数据结构,而CM_PARTIAL_RESOURCE_DESCRIPTOR数据结构就是PDO帮助程序员从256字节的PCI配置空间中获取的有用信息。这其中包括中断号、设备物理内存、IO端口等信息。
 
(2.16)
IoGetAttachedDeviceReference
函数功能:The
IoGetAttachedDeviceReference routine returns a pointer to
the highest level device object in a driver stack and increments the reference count on that object.(驱动栈中最上层的设备对象,并增加该对象的引用计数)

PDEVICE_OBJECT IoGetAttachedDeviceReference(

 
__in  PDEVICE_OBJECT DeviceObject

);
参数:
DeviceObject
[in]

Pointer to the device object for which the topmost attached device object is retrieved.

Return Value:
returns a pointer to the highest level device object in a stack of attached device objects after incrementing
the reference count on the object.
 
Remarks
If the device object at
DeviceObject has no device objects attached to it,
DeviceObject and the returned pointer are equal.
 
(2.17)IoConnectInterrupt(中断操作)
函数功能:IoConnectInterrupt
routine registers a device driver's
InterruptService routine (ISR), so that it will be called when a device interrupts on any of a specified set of processors.

NTSTATUS IoConnectInterrupt(

  __out    
PKINTERRUPT *InterruptObject,

  __in     
PKSERVICE_ROUTINE ServiceRoutine,

  __in_opt 
PVOID ServiceContext,

  __in_opt 
PKSPIN_LOCK SpinLock,

  __in     
ULONG Vector,

  __in     
KIRQL Irql,

  __in  
   KIRQL SynchronizeIrql,

  __in     
KINTERRUPT_MODE InterruptMode,

  __in     
BOOLEAN ShareVector,

  __in     
KAFFINITY ProcessorEnableMask,

  __in     
BOOLEAN FloatingSave

);
Parameters
InterruptObject
[out]

Pointer to the address of driver-supplied storage for a pointer to a set of interrupt objects. This pointer must be passed in subsequent calls to
KeSynchronizeExecution.

得到一个Interrupt结构的中断内核对象。当设备停止或者退出时,需要将中断与中断号分离,这时需要调用IoDisconnectInterrupt.
ServiceRoutine
[in]

Pointer to the entry point for the driver-supplied
InterruptService routine.

驱动程序提供的中断例程,此服务例程运行在DIRQL上,所有分页的内存操作都不能再这个函数上使用。
ServiceContext
[in, optional]

Pointer to the driver-determined context that will be supplied to the
InterruptService routine when it is called. The
ServiceContext area must be in resident memory: in the device extension of a driver-created
device object, in the controller extension of a driver-created controller object, or in nonpaged pool allocated by the device driver. See
Providing ISR Context Information for details.

中断服务例程的上下文参数。
SpinLock
[in, optional]

Pointer to an initialized spin lock, for which the driver supplies the storage, that will be used to synchronize access to driver-determined data shared by other driver routines. This
parameter is required if the ISR handles more than one vector or if the driver has more than one ISR. Otherwise, the driver need not allocate storage for an interrupt spin lock and the input pointer is NULL.

用于同步的自旋锁,可选参数,一般为NULL
Vector [in]

Specifies the interrupt vector passed in the interrupt resource at the
u.Interrupt.Vector member of
CM_PARTIAL_RESOURCE_DESCRIPTOR.

中断向量号,这个是PDO返回时可以得到的。
Irql [in]

Specifies the DIRQL passed in the interrupt resource at the
u.Interrupt.Level member of CM_PARTIAL_RESOURCE_DESCRIPTOR.

IRQL,同样在PDO返回时可以得到。
SynchronizeIrql
[in]

Specifies the DIRQL at which the ISR will run. If the ISR handles more than one interrupt vector or the driver has more than one ISR, this value must be the highest of the
Irql values passed at
u.Interrupt.Level in each interrupt resource. Otherwise, the
Irql and
SynchronizeIrql values are identical.

同IRQL
InterruptMode
[in]

Specifies whether the device interrupt is
LevelSensitive or
Latched.

中断的模式,主要是电平触发(Latched)和边缘触发(LevelSensitive),对于PCI设备,一般为电平触发。
ShareVector
[in]

Specifies whether the interrupt vector is sharable.

指定是否容许与其它PCI设备共享中断。
ProcessorEnableMask
[in]

Specifies a
KAFFINITY value representing the set of processors on which device interrupts can occur in this platform. This value is passed in the interrupt
resource at u.Interrupt.Affinity.

CPU屏蔽位。
FloatingSave
[in]

Specifies whether to save the floating-point stack when the driver's device interrupts. For x86-based and IA64-based platforms, this value must be set to FALSE. For more information
about saving floating point and MMX state, see
Using Floating Point or MMX in a WDM Driver
 

Remarks

New drivers should use the
IoConnectInterruptEx routine, which is easier to use. Drivers for devices that support message-signaled interrupts (MSI) must
use IoConnectInterruptEx.
 
(2.18)操作设备物理内存
   
对于物理内存,一般程序是无法读取的,一般程序所看到的内存都是虚拟内存,如果想操作物理内存,必须使用DDK提供的内核WRITE_REGISTER_XX系列函数和READ_REGISTER_XX系列函数。这些都是存储器访问。存储器地址空间现在达到了4GB,而Io地址空间为64kb,Io地址访问通过WRITE_PORT_XX系列函数和READ_PORT_XX系列函数。
 
另外DDK提供了内核函数MmAllocateContiguousMemory,他可以分配连续的物理内存,并映射成连续的虚拟内存。MmAllocateContiguousMemory返回的是虚拟内存地址,可以用MmGetPhysicalAddress得到连续的物理内存地址,然后用前面介绍的WRITE_REGISTER_XX系列函数和READ_REGISTER_XX系列函数进行读写。
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息