Loading Device Drivers (Windows CE 5.0)
When OEMInit executes, you should start Ethernet debugging, serial debugging, or any other debugging methods. The following locations store resource information for these debugging methods:
Boot arguments in the boot loader. Boot arguments provide resource information to set up the hardware in a specific way.
For example, the interrupt request (IRQ) for the Ethernet debugging adapter may be passed as a boot argument.
Hard-coded resource information in the OAL.
Resources may be discoverable by the OAL.
Additionally, the registry might contain copies of this resource information. Store copies of this resource information in the registry, if the debugging resources are fixed and known in advance. This allows the Device Manager to load, execute, and then start the I/O Resource Manager, which reads these available resources from the registry.
The OAL might need to configure and enumerate a bus, such as the PCI bus, to operate a device used for debugging services. For example, an Ethernet adapter on the PCI bus that is for Ethernet debugging services needs its resources and intermediary bridges to be configured to be functional. You can ignore other devices because the PCI bus driver performs the configuration and enumeration.
The resource information configures the debugging devices and initializes their associated services. The OAL is responsible for putting this resource information in a registry key and making it accessible to the driver. The OAL uses the Registry Helper Functions to fill out the device's information in a PCI_REG_INFO structure, defined in PCIReg.h. Then, the OS calls KernelIoControl with IOCTL_HAL_INITREGISTRY to enable the helper function PCIReg to be called to populate the registry. This method is preferred, if the debugging resources are selectable at boot time, if they are discovered through bus enumeration, or both.
The Device Manager loads the bus enumerator from HKEY_LOCAL_MACHINE\RootKey where RootKey is a value defined under the HKEY_LOCAL_MACHINE\Drivers key. If the RootKey value is not defined, it defaults to Drivers. Currently, Common.reg sets RootKey equal to Drivers\BuiltIn. This means that the Device Manager looks for the Dll value to load the bus enumerator under HKEY_LOCAL_MACHINE\Drivers\BuiltIn. The bus enumerator, BusEnum.dll, initializes the process of scanning the registry for additional buses and devices to be loaded for subkeys of the RootKey.
Some of the RootKey subkeys describe built-in or possibly fixed ISA buses. The DLL loaded might be BusEnum.dll, or any other bus driver that you choose.
One of the RootKey subkeys might be PCI. Typically, the DLL listed under the PCI key is the PCI bus driver, which is loaded by BusEnum.dll. Registry entries for the PCI bus driver include resources available to the PCI bus. Typically, the HKEY_LOCAL_MACHINE\RootKey\PCI\Order value is set so that the PCI bus driver is loaded last, which allows all of the fixed resources to be allocated before the flexible resources of the PCI devices are configured. Driver registry entries are listed under the PCI key, which represents devices that reside on the PCI bus.
The following table shows the values that PCI bus drivers, with associated physical devices, use or generate.
Subkey | Type | Description |
---|---|---|
MemBase | DWORD or MULTI_SZ | Base addresses of memory-mapped I/O. |
MemLen | DWORD or MULTI_SZ | Length of memory-mapped ranges corresponding to Membase. |
IoBase | DWORD or MULTI_SZ | Base address of port-mapped I/O. |
IoLen | DWORD or MULTI_SZ | Length of port-mapped ranges corresponding to IoBase. |
InterfaceType | DWORD or MULTI_SZ | Hardware interface type. For more information see INTERFACE_TYPE. |
Irq | DWORD or MULTI_SZ | Optional. Logical IRQ numbers. |
SysIntr | DWORD or MULTI_SZ | System interrupt numbers corresponding to the IRQs. |
The SysIntr value is a mapping of the Irq as specified by the OAL. Some bus drivers, such as the PCI bus driver, generate both the Irq and SysIntr values and write them to the registry. If BusEnum.dll enumerates the registry key, you are required to set the SysIntr value in the appropriate registry file.
Some bus drivers, such as the PCI bus driver, might require additional values. For example, the PCI bus driver has to distinguish between instances of the same device.
The following table shows these additional identification values.
Subkey | Type | Description |
---|---|---|
BusNumber | DWORD | PCI bus number of the device. |
DeviceNumber | DWORD | Number of the device on the bus. |
FunctionNumber | DWORD | Identifies one of the eight possible functions implemented on the device. |
After enumerating the registry, the bus enumerator loads drivers for all built-in devices and all bus drivers it recognizes on the system. Bus drivers are subsequently responsible for loading drivers for the devices on their buses. For example, the PCMCIA host controller driver loads drivers for all PC Card client devices.
Device-specific registry keys reside in the appropriate bus driver registry key, not in Device Manager. Bus drivers should load their client drivers and you should update the bus driver registry entries accordingly.
See Also
ActivateDeviceEx | Bus Enumerator | PCI Bus Driver
Send Feedback on this topic to the authors