3.14 UEFI Driver Model Connection Process
All UEFI Drivers that adhere to the UEFI Driver Model follow the same basic
procedure. When the driver is loaded, it installs a Driver Binding Protocol on
the image handle from which it was loaded. It may also update a pointer to the
Unload()
service of the Loaded Image Protocol and install the Component Name
2 Protocol and the Component Name Protocol, if needed, so its name is visible
to any operator. The UEFI Driver then exits from the entry point with a return
status of EFI_SUCCESS
, leaving the UEFI Driver resident in system memory.
The Driver Binding Protocol provides a version number and the following three services:
Supported()
Start()
Stop()
The Driver Binding Protocol is available on the driver's image handle after the
entry point is exited. Later on when the system is "connecting" drivers to
devices, the driver's Driver Binding Protocol Supported()
service is called.
The Supported()
service is passed a controller handle. The Supported()
function quickly examines the controller handle to see if it represents a
device that the driver knows how to manage. If so, it returns EFI_SUCCESS
.
The system then starts the driver by calling the driver's Start()
service,
passing in the supported controller handle. The driver can later be
disconnected from a controller handle by calling the Stop()
service.
A platform connects the devices in a platform with the drivers available in the platform. This connection process appears complex at first, but as the process continues, it becomes evident that the same basic procedure is used over and over again to accomplish the complex task. This description does not go into all the details of the connection process but explains enough that the role of various drivers in the connection process can be understood. This knowledge is fundamental to designing new UEFI Drivers.
The UEFI boot service ConnectController()
demonstrates the flexibility of the
UEFI Driver Model. The UEFI Shell command connect
directly exposes much of
the functionality of this boot service and provides a convenient way to explore
the flexibility and control offered by ConnectController()
.