9.2 Driver Binding Protocol Template
The implementation of the Driver Binding Protocol for a specific driver is
typically found in the file <<DriverName>>
.c. This file contains the instance
of the EFI_DRIVER_BINDING_PROTOCOL
along with the implementation of the
Supported()
, Start()
, and Stop()
services. Appendix A contains the
template for a UEFI Driver and includes the declaration of the Driver Binding
Protocol instance, the Driver Binding Protocol services and the driver entry
point that uses the EDK II library UefiLib
functions to install the Driver
Binding Protocol into the handle database and complete the initialization of
the Driver Binding Protocol data fields.
The Supported()
, Start()
, and Stop()
services are covered in detail in
the EFI Driver Binding Protocol section of the UEFI Specification. Also included are code
examples and the detailed algorithms to implement these services for device
drivers and bus drivers If a UEFI Driver produces multiple instances of the
Driver Binding Protocol, they are all installed in the driver entry point.
Each instance of the Driver Binding Protocol is implemented using the same guidelines.
The different instances may share worker functions to reduce the size of the driver.
The Supported()
service performs a quick check to see if a driver supports a
controller. The Supported()
service must
not
modify the state of the
controller because the controller may already be managed by a different driver.
If the Supported()
service passes, the Start()
service is called to ask the
driver to bind to a specific controller. The Stop()
service does the opposite
of Start()
. It disconnects a driver from a controller and frees any resources
allocated in the Start()
services.
TIP: Although the thought of initializing something as soon as it is supported in the Supported()
service of the driver seems to make sense, the Supported()
service is intended only to be a quick check to find out if a driver can make a connection to the specified controller, find out if it has already been called (started and in use), or if it is in use exclusively by another component. The Supported()
service must return an error if the controller is already in use or is in use exclusively by another component.
Initializing or modifying tasks should only be done in the Start()
service of the driver, not in the Supported()
service.
Tip: This guide provides additional recommendations for implementing the Driver Binding Protocol for devices on industry standard busses such as PCI, USB, SCSI, and SATA. Please see the chapter on the specific bus type for additional details. -----
None of the Driver Binding Protocol services are allowed to use the console I/O
protocols. A UEFI Driver may use the DEBUG()
and ASSERT()
macros from the
EDK II library DebugLib
to send messages to the standard error console if it
is active. These macros are usually enabled during UEFI Driver development and
are disabled when a UEFI Driver is released.