当前位置: 代码迷 >> 综合 >> EDKII SataController
  详细解决方案

EDKII SataController

热度:44   发布时间:2023-12-14 22:24:16.0

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 接口实例: