SATA 驱动是一种完全不同于并行ATA 的新型硬盘接口类型,是做为IDE 接口的取代物出
现的。它使用串行方式传输数据,具有结构简单,传输速度高,可支持热插拔等优点。
SerialATA 规范定义了SATA 接口的物理特性,传输层及协议层实现以支持ATA/ATAPI
命令集。AHCI 规范则定义了SATA 主控制器的软硬件接口与实现标准。为保持向后兼容
性,SerialATA 规范还支持对标准ATA的仿真。
SataController 代码解析:
///
/// EFI_DRIVER_BINDING_PROTOCOL instance
///
EFI_DRIVER_BINDING_PROTOCOL gSataControllerDriverBinding = {
SataControllerSupported,
SataControllerStart,
SataControllerStop,
0x10,
NULL,
NULL
};
/**
Entry point function.
@param ImageHandle - While the driver image loaded be the ImageLoader(),
an image handle is assigned to this driver binary,
all activities of the driver is tied to this ImageHandle
@param SystemTable - A pointer to the system table, for all BS(Boo Services) and
RT(Runtime Services)
@retval EFI_SUCCESS - Function completes successfully
**/
EFI_STATUS
EFIAPI
InitializeSataControllerDriver (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
{
//
// Install driver binding.
//
return EfiLibInstallDriverBindingComponentName2 (
ImageHandle,
SystemTable,
&gSataControllerDriverBinding,
ImageHandle,
&gSataControllerName,
&gSataControllerName2
);
}
与IDE 主控制器驱动实现相同,它也通过UefiLib 库函数
EfiLibInstallDriverBindingComponentName2
将EFI_DRIVER_BINDING_PROTOCOL 的实例gSataControllerDringBinding,
EFI_COMPONENT_NAME_PROTOCOL 的实例
gSataControllerName 以及EFI_COMPONENT_NAME2_PROTOCOL 的实例
gSataControllerName2 安装在ImageHandle句柄上。
//
// Get PCI I/O protocol used to access the controller.
//
Status = gBS->OpenProtocol (
Controller,
&gEfiPciIoProtocolGuid,
(VOID **) &PciIo,
This->DriverBindingHandle,
Controller,
EFI_OPEN_PROTOCOL_BY_DRIVER
);
if (EFI_ERROR (Status)) {
return Status;
}
//
// Install protocols for private data and IDE Init protocol.
//
Status = gBS->InstallMultipleProtocolInterfaces (
&Controller,
&gEfiIdeControllerInitProtocolGuid,
&(SataPrivateData->IdeInit),
NULL
);
根据实际可插最大IDE 存储设备数分配内存资源以存储内部数据,并在
Controller 句柄上安装EFI_IDE_CONTROLLER_INIT_PROTOCOL实例。
SataControllerStop()函数
所做的事情刚好和SataControllerStart 相反。
//
// Uninstall the IDE Controller Init Protocol
//
gBS->UninstallMultipleProtocolInterfaces (
Controller,
&gEfiIdeControllerInitProtocolGuid,
&(SataPrivateData->IdeInit),
NULL
);
//
释放所有SataControllerStart 函数中分配及占有的资源。
EFI_IDE_CONTROLLER_INIT_PROTOCOL 接口实例: