日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

EFI Driver Model(中)-PCI 驱动设计

發布時間:2023/12/18 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 EFI Driver Model(中)-PCI 驱动设计 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

PCI 驅動設計

??參考、翻譯、總結 Driver Writer Guide for UEFI 2.3.1
??有幾個類別的PCI驅動程序合作為平臺中的PCI控制器提供支持,下表列出這些PCI驅動

驅動類別描述
PCI root bridge driver產生一個或多個 PCI Root Bridge I/O 的實例
PCI bus driver使用PCI Root Bridge I/O協議,為每個PCI控制器生成一個子句柄,并將設備路徑協議和PCII/O協議安裝到每個子句柄上。
PCI driver使用PCII/O協議,并生成I/O抽象,為啟動符合EFI的操作系統所需的控制臺和引導設備提供服務。

??本章主要介紹PCI驅動程序的設計和實現
??PCI總線驅動程序使用PCI_ROOT_BRIDGE_IO_PROTOCOL的服務,該服務枚舉系統中存在的PCI控制器,可檢測到磁盤控制器、圖形控制器和USB主機控制器,每個控制器生成一個句柄。因此,PCI總線驅動程序產生了EFI_DEVICE_PATH_PROTOCOL和 EFI_PCI_IO_PROTOCOL的三個子句柄。

  • PCI磁盤控制器的驅動程序使用EFI_PCI_IO_PROTOCOL服務,產生兩個包含EFI_DEVICE_PATH_PROTOCOL和EFI_BLOCK_IO_PROTOCOL.的子句柄。
  • 圖形控制器的PCI驅動程序使用EFI_PCI_IO_PROTOCOL的服務,產生一個EFI_GRAPHICS_OUTPUT_PROTOCOL.子句柄。
  • USB主機控制器的PCI驅動程序使用EFI_PCI_IO_PROTOCOL的服務來生成EFI_USB_HOST_CONTROLLER_PROTOCOL。USB總線驅動程序將使用EFI_USB_HOST_CONTROLLER_PROTOCOL,為每個USB設備生成子句柄。USB驅動程序將管理這些子句柄。

1、PCI Root Bridge I/O Protocol Drivers

??針對平臺的UEFI固件通常實現一個根橋驅動程序,從而生成PCI根橋I/O協議。此代碼是特定于芯片組的,并直接訪問產生PCI根橋I/O協議服務的芯片組資源。EDKII中包含了一個帶有pc-at兼容芯片組的系統的示例驅動程序。
??這個驅動程序的源代碼可以從EDK II的PcAtChipsetPkg/PciHostBridgeDxe找到。

2、PCI Bus Drivers

??EDKII包含一個通用的PCI總線驅動程序。它使用EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL的服務枚舉PCI設備并且生成包含 EFI_DEVICE_PATH_PROTOCOL和 EFI_PCI_IO_PROTOCOL的子句柄。源代碼可以在
MdeModulePkg/Bus/Pci/PciBusDxe中找到。
??此總線類型可以在 Supported()和Start()服務中解析RemainingDevicePath來支持生成一個子句柄。然而,一次為PCI總線生成一個子句柄通常沒有意義。這是因為PCI總線驅動程序需要枚舉并分配資源給所有的PCI設備,然后才能生成單個子句柄。
??為所有枚舉的PCI設備生成子句柄并不需要太多額外的時間。因此,建議PCI總線驅動程序在第一次調用Start()時產生所有的PCI設備。
??如果將基于UEFI的系統固件移植到一個新平臺,那么大多數與pci相關的更改都發生在根橋驅動產生EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL實例的實施中。

3、PCI drivers

??PCI驅動程序使用EFI_PCI_IO_PROTOCOL的服務來生成一個或多個協議,為一個PCI控制器提供I/O抽象。PCI驅動程序遵循UEFI驅動程序模型,所以它們可能是以下任何一種:
;? Device drivers
? Bus drivers
? Hybrid drivers
??圖形控制器的PCI驅動程序通常是使用EFI_PCI_IO_PROTOCOL并產生EFI_GRAPHICS_OUTPUT_PROTOCOL的設備驅動程序。USB主機控制器的PCI驅動程序通常是使用EFI_PCI_IO_PROTOCOL并產生EFI_USB_HOST_CONTROLLER_PROTOCOL的設備驅動程序。
磁盤控制器的PCI驅動程序通常是總線驅動程序或混合驅動程序,它們使用EFI_PCI_IO_PROTOCOL和EFI_DEVICE_PATH_PROTOCOL,并使用EFI_DEVICE_PATH_PROTOCOL和EFI_BLOCK_IO_PROTOCOL產生子句柄。
??使用SCSI命令集的磁盤控制器的PCI驅動程序通常會為磁盤控制器生成的每個SCSI通道生成EFI_EXT_SCSI_PASS_THRU_PROTOCOL。

3.1 Supported()

??PCI驅動程序必須實現包含Supported()、Start()和Stop()服務的EFI_DRIVER_BINDING_PROTOCOL。 Supported()服務評估傳入的ControllerHandle,以查看控ControllerHandle是否代表PCI驅動程序可以管理的PCI設備。
??實現測試的最常見方法是讓PCI驅動程序從PCI控制器檢索PCI配置頭,并評估設備ID、供應商ID,以及可能的PCI配置頭的類代碼字段。如果這些字段與PCI驅動程序管理的值相匹配,則Supported()將返回EFI_SUCCESS。否則,Supported()服務將返回EFI_UNSUPPORTED。PCI驅動程序必須仔細,不干擾PCI控制器的狀態,因為可能有不同的PCI驅動程序正在管理PCI控制器。

3.2 Start() and Stop()

??針對PCI驅動程序的驅動程序綁定協議的Start()服務也會打開具有EFI_OPEN_PROTOCOL_BY_DRIVER屬性的PCII/O協議。Start()連接Driver與Handle,Stop()斷開Driver跟Handle之間的連結.

3.3 PCI Cards with Multiple PCI Controllers

??一些PCI設備在單個設備上有一系列相同的設備,通常在PCI橋后面。如果這些設備需要由UEFI驅動程序的單個實例來控制,那么它們可能需要額外的工作。以下圖作為設備的示例。

可能要求選項ROM中的驅動程序控制PCI設備上的所有3個控制器。為此,請使用以下操作:

  • .在“ Supported()”函數中,確保UEFI驅動程序支持傳遞到“ Supported()”函數中的控制器。傳入的第一個控制器可以是PCI卡上的任何一個控制器。
  • 在“Supported()”函數中,確保該函數沒有觸摸或更改HW狀態。這很重要。如果PCII/O實例已經打開(如果一些其他的應用程序或驅動程序已經在管理控制器),則返回一個錯誤。
  • 在PCI卡上的第一個控制器的Start()函數中,使用EFI_OPEN_PROTOCOL_BY_DRIVER屬性打開同一PCI卡上的其他句柄上的PCII/O協議實例。這將通知該平臺上的所有其他UEFI驅動程序,即PCI卡上的所有控制器都已被管理。
  • 在Stop()函數中,撤銷在Start()中完成的所有操作。在這些更復雜的用例中,使用私有上下文數據結構來跟蹤完成Stop()操作所需的信息。

4、PCI Option ROM Images

??EDKII提供了一些工具來幫助開發針對PCI適配器的UEFI驅動程序。一旦UEFI驅動器的PCI適配器建立,他們需要打包成PCI選項ROM兼容的圖像格式。存儲在PCI選項rom中的UEFI驅動程序會在PCI枚舉期間由PCI總線驅動程序自動加載和執行。

總結

以上是生活随笔為你收集整理的EFI Driver Model(中)-PCI 驱动设计的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。