PURPOSE
Maps the physical memory ranges to be accessed by kernel-mode
processes and user-mode applications.
Checks whether an I/O or Memory resource was previously
exclusively registered.
Saves data regarding interrupt request (IRQ) number and interrupt
type (edge triggered or level sensitive) in internal data structures to be
used by InterruptEnable() [2.18] or
WD_IntEnable() [3.2].
PROTOTYPE
DWORD WD_CardRegister(
HANDLE hWD,
WD_CARD_REGISTER *pCardReg);
PARAMETERS
| Name | Type | Input/Output |
|---|---|---|
| HANDLE | Input | |
| WD_CARD_REGISTER* | ||
| WD_CARD | ||
| DWORD | Input | |
| WD_ITEMS[WD_CARD_ITEMS] | ||
|
|
DWORD | Input |
|
|
DWORD | Input |
|
|
DWORD | N/A |
|
|
DWORD | Input |
|
|
union | |
| struct | ||
| DWORD | Input | |
| DWORD | Input | |
| DWORD | Output | |
| DWORD | Output | |
| DWORD | Output | |
| DWORD | Input | |
| struct | ||
| KPTR | Input | |
| DWORD | Input | |
| DWORD | Input | |
| struct | ||
| DWORD | Input | |
| DWORD | Input | |
| DWORD | Output | |
| WD_BUS | ||
| WD_BUS_TYPE | Input | |
| DWORD | Input | |
| DWORD | Input | |
| struct | N/A | |
| DWORD | Input | |
| DWORD | Output | |
| DWORD | Input | |
| CHAR[32] | Input | |
| CHAR[100] | Input |
DESCRIPTION
| Name | Description |
|---|---|
| hWD | Handle to WinDriver's kernel-mode driver as received from WD_Open() [5.2] |
| pCardReg | Pointer to a card registration information structure: |
| Card information structure. For PCI and PCMCIA devices it is recommended to pass the card structure received from a previous call to WD_PciGetCardInfo() [2.3] / WD_PcmciaGetCardInfo() [2.6], respectively (see first Remark below [2.8]). | |
| Number of items detected on the card | |
| Card items information structure: | |
| Type of item. Can be ITEM_MEMORY, ITEM_IO, ITEM_INTERRUPT or ITEM_BUS. | |
| If TRUE, only one application at a time can access the mapped memory range, or monitor this card's interrupts | |
| Can be set to a combination of any of the following
WD_ITEM_OPTIONS flags: NOTE: This flag is applicable only to memory items. NOTE: This flag is applicable only to memory items that pertain to the host's RAM, as opposed to local memory on the card. |
|
| Specific data according to the item type: | |
|
|
Describes a memory item (item = ITEM_MEMORY): |
| First address of the physical memory range | |
| Length (in bytes) of the memory range | |
| Kernel-mode mapping of the memory range's physical
base address (dwPhysicalAddr). This address should be used when setting the memory address in calls to WD_Transfer() [2.11] or WD_MultiTransfer() [2.12] or when accessing memory directly from a Kernel PlugIn driver. |
|
| User-mode mapping of the memory range's physical base
address (dwPhysicalAddr). This address should be used for accessing a memory address directly from a user-mode process. |
|
| Translation of the card's physical memory base address (dwPhysicalAddr) from bus-specific values to CPU values | |
| Base Address Register number of PCI card | |
|
|
Describes an I/O item (item = ITEM_IO): |
| First address of the I/O range | |
| Length of the I/O range, in bytes | |
| Base Address Register (BAR) number for the I/O range | |
|
|
Describes an interrupt item (item = ITEM_INTERRUPT): |
| Physical interrupt request (IRQ) number | |
| Interrupt options bit-mask, which can consist of a
combination of any of the following flags: Interrupt type flags: NOTE: In the call to WD_CardRegister() the interrupt type flags are appliable only to ISA devices. For Plug-and-Play hardware (PCI/PCMCIA) the function retrieves the supported interrupt types independently. The value of this flag is zero, therefore it is applicable only when no other interrupt flag is set. Miscellaneous interrupt flags: (unlike other operating systems), there is an abstraction of the physical interrupt number to a logical one. Setting this bit will instruct WinDriver to refer to the dwInterrupt value as a logical interrupt number and convert it to a physical interrupt number. |
|
| An interrupt handle to be used in calls to InterruptEnable() [2.18] or WD_IntEnable() [3.2]. | |
|
|
Describes a bus item (item = ITEM_BUS): |
| The card's bus type. Can be any of the following
WD_BUS_TYPE enumeration values: |
|
| Bus number | |
| A combination of the card's bus slot/socket and function numbers: the lower three bits represent the function number and the remaining bits represent the slot/socket number. For example: a value of 0x80 (<=> 10000000 binary) corresponds to a function number of 0 (lower 3 bits: 000) and a slot/socket number of 0x10 (remaining bits: 10000). | |
| Set to TRUE to check if the defined card resources can be locked (in which case hCard will be set to 1), or whether they are already locked for exclusive use. When this flag is set to TRUE the function doesn't actually locking the specified resources. | |
| Handle to the card resources defined in the
Card field. This handle should later be
passed to WD_CardUnregister() [2.10] in order to free the
resources. If the card registration fails, this field
is set to 0.
When fCheckLockOnly is set to TRUE, hCard is set to 1 if the card's resources can be be locked successfully (i.e. the resources aren't currently locked for exclusive use), or 0 otherwise. |
|
| Should always be set to zero | |
| Card name (optional) | |
| Card description (optional) |
RETURN VALUE
Returns WD_STATUS_SUCCESS (0) on success, or an appropriate error code otherwise [A].
REMARKS
NOTE that if you select to set this flag, WD_CardRegister() will not update the item's dwTransAddr field with a kernel-mapping of the memory and you will therefore not be able to call WD_Transfer() [2.11] or WD_MultiTransfer() [2.12] in order to access the memory from the kernel, nor will you be able to access the memory directly from a Kernel PlugIn driver using the memory item's dwTransAddr field.
WinDriver's ThreadStart() function performs the required call to SetProcPermissions(), therefore when using ThreadStart() to create new threads you do not need to call SetProcPermissions() yourself.
EXAMPLE
WD_CARD_REGISTER cardReg;
BZERO(cardReg);
cardReg.Card.dwItems = 1;
cardReg.Card.Item[0].item = ITEM_IO;
cardReg.Card.Item[0].fNotSharable = TRUE;
cardReg.Card.Item[0].I.IO.dwAddr = 0x378;
cardReg.Card.Item[0].I.IO.dwBytes = 8;
WD_CardRegister(hWD, &cardReg);
if (cardReg.hCard == 0)
{
printf("Failed locking device\n");
return FALSE;
}