Step 2: Enumerating Devices on the PCI Bus (Windows Embedded CE 6.0)
1/6/2010
After configuring the PCI bus, the PCI bus driver scans the PCI bus again to enumerate devices and match them with registry entries. When the driver enumerates a device, it searches the registry using the device's identifiers.
The following table shows the device identifiers.
Subkey | Description |
---|---|
Class |
Basic function of a device, for example, a mass storage controller. |
SubClass |
Specific subclass of a basic function, for example, an IDE controller. |
ProgIF |
Register-specific programming interface, for example, USB OHCI or UHCI. |
VendorID |
Manufacturer of the device. |
DeviceID |
Type of device. |
SubsystemVendorID |
Vendor of a card or subsystem that uses a device. |
SubsystemID |
Type of card or subsystem that uses a device. |
RevisionID |
Revision number of a device. |
The identifiers are listed in order of increasing specificity. When matching a found device with a registry entry, all of the values that are listed in the registry must match the found device. For example, the following table shows the registry entries for a driver that works with all 16550-compatible serial controllers.
Subkey | Value | Description |
---|---|---|
Class |
7 |
Simple communications controllers |
SubClass |
0 |
Serial |
ProgIF |
2 |
16550-compatible serial controller |
Note
These values are part of the PCI Revision 2.2 Specification.
If a particular serial driver were tailored to a particular vendor's device, then the VendorID and DeviceID values would be listed as well. The registry entry for this driver would only match a device that contains exactly same Class, SubClass, ProgIF, VendorID and DeviceID. The VendorID, DeviceID, SubsystemVendorID, SubsystemID and RevisionID can have a list of values associated so the driver can be matched with a subset of cards.
Registry Keys Before Enumeration
The following registry example shows the state of the registry before the drivers are enumerated.
[HKEY_LOCAL_MACHINE\Drivers]
"RootKey"="Drivers"
"Dll"="BusEnum.dll"
[HKEY_LOCAL_MACHINE\Drivers\Debug]
"Dll"="BusEnum.dll"
"Order"=dword:0
"Flags"=dword:1
[HKEY_LOCAL_MACHINE\Drivers\Debug\KITL]
"Flags"=dword:4
"Irq"=dword:1
"MemBase"=dword:FFBFA000
"MemLen"=dword:1000
"SysIntr"=dword:11
[HKEY_LOCAL_MACHINE\Drivers\Virtual]
"Dll"="BusEnum.dll"
"Order"=dword:1
"Flags"=dword:1
[HKEY_LOCAL_MACHINE\Drivers\Virtual\NDIS]
"Dll"="NDIS.dll"
"Order"=dword:1
"Prefix"="NDS"
"Index"=dword:0
[HKEY_LOCAL_MACHINE\Drivers\CSP]
"Dll"="BusEnum.dll"
"Order"=dword:2
"Flags"=dword:1
[HKEY_LOCAL_MACHINE\Drivers\CSP\Serial]
"Dll"="Com16550.Dll"
"Order"=dword:0
"Irq"=dword:3
"MemBase"=dword:FFBFC000
"MemLen"=dword:8
"SysIntr"=dword:13
"Prefix"="COM"
"DeviceArrayIndex"=dword:0
"Priority"=dword:0
[HKEY_LOCAL_MACHINE\Drivers\CSP\Serial\Unimodem]
"Tsp"="Unimodem.dll"
"DeviceType"=dword:0
"FriendlyName"="Serial Cable on COM1:"
"DevConfig"=hex: 10,00, 00,00, 05,00,00,00, 10,01,00,00, 00,4B,00,00
[HKEY_LOCAL_MACHINE\Drivers\ISA]
"Dll"="BusEnum.dll"
"Order"=dword:3
"Flags"=dword:1
[HKEY_LOCAL_MACHINE\Drivers\ISA\Serial]
"Dll"="Com16550.Dll"
"Order"=dword:0
"Irq"=dword:4
"IoBase"=dword:02F8
"IoLen"=dword:8
"SysIntr"=dword:14
"Prefix"="COM"
"DeviceArrayIndex"=dword:1
[HKEY_LOCAL_MACHINE\Drivers\ISA\Serial\Unimodem]
"Tsp"="Unimodem.dll"
"DeviceType"=dword:0
"FriendlyName"="Serial Cable on COM2:"
"DevConfig"=hex: 10,00, 00,00, 05,00,00,00, 10,01,00,00, 00,4B,00,00
[HKEY_LOCAL_MACHINE\Drivers\ISA\PCMCIA]
"Dll"="PCMCIA.dll"
"Order"=dword:1
"Irq"=dword:B
"SysIntr"=dword:1B
"IoBase"=dword:03e0
"IoLen"=dword:2
[HKEY_LOCAL_MACHINE\Drivers\PCI]
"Dll"="PCIbus.dll"
"Order"=dword:4
"Flags"=dword:1
"MemBase"=dword:FFC00000
"MemLen"=dword:100000
"IoBase"=dword:D000
"IoLen"=dword:3000
[HKEY_LOCAL_MACHINE\Drivers\PCI\Template\Serial]
"Dll"="Com16550.Dll"
"Class"=dword:07
"SubClass"=dword:00
"ProgIF"=dword:02
"VendorID"=multi_sz:"0AF0","B320","B320"
"DeviceID"=multi_sz:"0020","0300","0302"
"Prefix"="COM"
[HKEY_LOCAL_MACHINE\Drivers\PCI\Template\Serial\Unimodem]
"Tsp"="Unimodem.dll"
"DeviceType"=dword:0
"FriendlyName"="Serial Cable on PCI"
"DevConfig"=hex: 10,00, 00,00, 05,00,00,00, 10,01,00,00, 00,4B,00,00
[HKEY_LOCAL_MACHINE\Drivers\PCI\Instance\Serial1\Unimodem]
"FriendlyName"="Serial Cable on COM1:"
[HKEY_LOCAL_MACHINE\Drivers\PCI\Template\NE2000]
"Dll"="NDIS.dll"
"ConfigDll"="NE2000cfg.dll"
"ConfigEntry"="DeviceConfig"
"Class"=dword:02
"SubClass"=dword:00
"ProgIF"=dword:00
"MiniPort"="NE2000"
; NE2000 common and instance specific information
[HKEY_LOCAL_MACHINE\Comm\NE2000]
"DisplayName"="NE2000 Compatible Ethernet Driver"
"Group"="NDIS"
"ImagePath"="NE2000.dll"
[HKEY_LOCAL_MACHINE\Comm\NE20001]
"DisplayName"="NE2000 Compatible Ethernet Driver 1"
[HKEY_LOCAL_MACHINE\Comm\NE20001\Parms]
"Transceiver"=dword:3
[HKEY_LOCAL_MACHINE\Comm\NE20001\Parms\TcpIp]
"EnableDHCP"=dword:1
"DefaultGateway"=""
"UseZeroBroadcast"=dword:0
"IpAddress"="0.0.0.0"
"Subnetmask"="0.0.0.0"
[HKEY_LOCAL_MACHINE\Comm\NE20002]
"DisplayName"="NE2000 Compatible Ethernet Driver 2"
[HKEY_LOCAL_MACHINE\Comm\NE20002\Parms]
"Transceiver"=dword:2
[HKEY_LOCAL_MACHINE\Comm\NE20002\Parms\TcpIp]
"EnableDHCP"=dword:0
"DefaultGateway"=""
"UseZeroBroadcast"=dword:0
"IpAddress"="157.56.148.128"
"Subnetmask"="255.255.252.0"
See Also
Concepts
Example: Loading Drivers on the PCI Bus
Step 3: Enumerating a PCI Serial Driver