Hi all,
In \FmpDevicePkg\Library\FmpDeviceLibNull\FmpDeviceLib.c
There are comments for RegisterFmpInstaller:
/**
Used to pass the FMP install function to this lib. This allows the library to
have control of the handle that the FMP instance is installed on. This allows
the library to use DriverBinding protocol model to locate its device(s) in the
system.
@param[in] Func Function pointer to FMP install function.
@retval EFI_SUCCESS Library has saved function pointer and will call
function pointer on each DriverBinding Start.
@retval EFI_UNSUPPORTED Library doesn't use driver binding and only supports
a single instance.
@retval other error Error occurred. Don't install FMP
**/
EFI_STATUS
EFIAPI
RegisterFmpInstaller (
IN FMP_DEVICE_LIB_REGISTER_FMP_INSTALLER Func
)
{
//
// This is a system firmware update that does not use Driver Binding Protocol
//
return EFI_UNSUPPORTED;
}
However, since the ‘RegisterFmpInstaller’ of the example directly returns EFI_UNSUPPORTED
, it does not demonstrate how to handle the DriverBinding protocol.
In addition, I refer to
the example of \MdeModulePkg\Bus\Usb\UsbMouseAbsolutePointerDxe
adding the driverbinding protocol to locate the USBMouse device to the 'RegisterFmpInstaller' function. And set the return value of RegisterFmpInstaller to EFI_SUCCESS
.
where RegisterFmpInstaller is in the following file:edk2-platforms\Platform\Intel\Vlv2TbltDevicePkg\Feature\Capsule\Library\FmpDeviceLibSample
Then tested on Minnowboard.
Test command: CapsuleApp.efi Red.cap
The test results are as follows:
FmpDeviceSetImageWithStatus
is executed, USBMouseAbsolutePointerDriverBindingSupported
has not been executed, that is, USB Device IO cannot be operated yet.USBMouseAbsolutePointerDriverBindingSupporte
d is executed, USBIO can be operated, but at this time FmpDeviceSetImageWithStatus
has been executed, that is, capsule update is too late to process.My questions are as follows:
FMP_DEVICE_LIB_REGISTER_FMP_INSTALLER Func
', and how should the parameter Handle
in Func
(ie InstallFmpInstance
, see below) be passed from FmpDxe
to FmpDeviceLib
?EFI_STATUS
EFIAPI
FmpDxeEntryPoint (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
{
….
Status = RegisterFmpInstaller(InstallFmpInstance);
…
}
EFI_STATUS
EFIAPI
InstallFmpInstance (
IN EFI_HANDLE Handle
)
{….
}
EFI_STATUS
EFIAPI
RegisterFmpInstaller(
IN FMP_DEVICE_LIB_REGISTER_FMP_INSTALLER Func
)
{
// Because this is a sample lib with very simple fake device we don't use
// the driverbinding protocol to locate our device.
//
return EFI_UNSUPPORTED;
}