EFI Driver Model(中)-PCI 驱动设计
PCI 驅(qū)動(dòng)設(shè)計(jì)
??參考、翻譯、總結(jié) Driver Writer Guide for UEFI 2.3.1
??有幾個(gè)類別的PCI驅(qū)動(dòng)程序合作為平臺(tái)中的PCI控制器提供支持,下表列出這些PCI驅(qū)動(dòng)
| PCI root bridge driver | 產(chǎn)生一個(gè)或多個(gè) PCI Root Bridge I/O 的實(shí)例 |
| PCI bus driver | 使用PCI Root Bridge I/O協(xié)議,為每個(gè)PCI控制器生成一個(gè)子句柄,并將設(shè)備路徑協(xié)議和PCII/O協(xié)議安裝到每個(gè)子句柄上。 |
| PCI driver | 使用PCII/O協(xié)議,并生成I/O抽象,為啟動(dòng)符合EFI的操作系統(tǒng)所需的控制臺(tái)和引導(dǎo)設(shè)備提供服務(wù)。 |
??本章主要介紹PCI驅(qū)動(dòng)程序的設(shè)計(jì)和實(shí)現(xiàn)
??PCI總線驅(qū)動(dòng)程序使用PCI_ROOT_BRIDGE_IO_PROTOCOL的服務(wù),該服務(wù)枚舉系統(tǒng)中存在的PCI控制器,可檢測到磁盤控制器、圖形控制器和USB主機(jī)控制器,每個(gè)控制器生成一個(gè)句柄。因此,PCI總線驅(qū)動(dòng)程序產(chǎn)生了EFI_DEVICE_PATH_PROTOCOL和 EFI_PCI_IO_PROTOCOL的三個(gè)子句柄。
- PCI磁盤控制器的驅(qū)動(dòng)程序使用EFI_PCI_IO_PROTOCOL服務(wù),產(chǎn)生兩個(gè)包含EFI_DEVICE_PATH_PROTOCOL和EFI_BLOCK_IO_PROTOCOL.的子句柄。
- 圖形控制器的PCI驅(qū)動(dòng)程序使用EFI_PCI_IO_PROTOCOL的服務(wù),產(chǎn)生一個(gè)EFI_GRAPHICS_OUTPUT_PROTOCOL.子句柄。
- USB主機(jī)控制器的PCI驅(qū)動(dòng)程序使用EFI_PCI_IO_PROTOCOL的服務(wù)來生成EFI_USB_HOST_CONTROLLER_PROTOCOL。USB總線驅(qū)動(dòng)程序?qū)⑹褂肊FI_USB_HOST_CONTROLLER_PROTOCOL,為每個(gè)USB設(shè)備生成子句柄。USB驅(qū)動(dòng)程序?qū)⒐芾磉@些子句柄。
1、PCI Root Bridge I/O Protocol Drivers
??針對平臺(tái)的UEFI固件通常實(shí)現(xiàn)一個(gè)根橋驅(qū)動(dòng)程序,從而生成PCI根橋I/O協(xié)議。此代碼是特定于芯片組的,并直接訪問產(chǎn)生PCI根橋I/O協(xié)議服務(wù)的芯片組資源。EDKII中包含了一個(gè)帶有pc-at兼容芯片組的系統(tǒng)的示例驅(qū)動(dòng)程序。
??這個(gè)驅(qū)動(dòng)程序的源代碼可以從EDK II的PcAtChipsetPkg/PciHostBridgeDxe找到。
2、PCI Bus Drivers
??EDKII包含一個(gè)通用的PCI總線驅(qū)動(dòng)程序。它使用EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL的服務(wù)枚舉PCI設(shè)備并且生成包含 EFI_DEVICE_PATH_PROTOCOL和 EFI_PCI_IO_PROTOCOL的子句柄。源代碼可以在
MdeModulePkg/Bus/Pci/PciBusDxe中找到。
??此總線類型可以在 Supported()和Start()服務(wù)中解析RemainingDevicePath來支持生成一個(gè)子句柄。然而,一次為PCI總線生成一個(gè)子句柄通常沒有意義。這是因?yàn)镻CI總線驅(qū)動(dòng)程序需要枚舉并分配資源給所有的PCI設(shè)備,然后才能生成單個(gè)子句柄。
??為所有枚舉的PCI設(shè)備生成子句柄并不需要太多額外的時(shí)間。因此,建議PCI總線驅(qū)動(dòng)程序在第一次調(diào)用Start()時(shí)產(chǎn)生所有的PCI設(shè)備。
??如果將基于UEFI的系統(tǒng)固件移植到一個(gè)新平臺(tái),那么大多數(shù)與pci相關(guān)的更改都發(fā)生在根橋驅(qū)動(dòng)產(chǎn)生EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL實(shí)例的實(shí)施中。
3、PCI drivers
??PCI驅(qū)動(dòng)程序使用EFI_PCI_IO_PROTOCOL的服務(wù)來生成一個(gè)或多個(gè)協(xié)議,為一個(gè)PCI控制器提供I/O抽象。PCI驅(qū)動(dòng)程序遵循UEFI驅(qū)動(dòng)程序模型,所以它們可能是以下任何一種:
;? Device drivers
? Bus drivers
? Hybrid drivers
??圖形控制器的PCI驅(qū)動(dòng)程序通常是使用EFI_PCI_IO_PROTOCOL并產(chǎn)生EFI_GRAPHICS_OUTPUT_PROTOCOL的設(shè)備驅(qū)動(dòng)程序。USB主機(jī)控制器的PCI驅(qū)動(dòng)程序通常是使用EFI_PCI_IO_PROTOCOL并產(chǎn)生EFI_USB_HOST_CONTROLLER_PROTOCOL的設(shè)備驅(qū)動(dòng)程序。
磁盤控制器的PCI驅(qū)動(dòng)程序通常是總線驅(qū)動(dòng)程序或混合驅(qū)動(dòng)程序,它們使用EFI_PCI_IO_PROTOCOL和EFI_DEVICE_PATH_PROTOCOL,并使用EFI_DEVICE_PATH_PROTOCOL和EFI_BLOCK_IO_PROTOCOL產(chǎn)生子句柄。
??使用SCSI命令集的磁盤控制器的PCI驅(qū)動(dòng)程序通常會(huì)為磁盤控制器生成的每個(gè)SCSI通道生成EFI_EXT_SCSI_PASS_THRU_PROTOCOL。
3.1 Supported()
??PCI驅(qū)動(dòng)程序必須實(shí)現(xiàn)包含Supported()、Start()和Stop()服務(wù)的EFI_DRIVER_BINDING_PROTOCOL。 Supported()服務(wù)評估傳入的ControllerHandle,以查看控ControllerHandle是否代表PCI驅(qū)動(dòng)程序可以管理的PCI設(shè)備。
??實(shí)現(xiàn)測試的最常見方法是讓PCI驅(qū)動(dòng)程序從PCI控制器檢索PCI配置頭,并評估設(shè)備ID、供應(yīng)商ID,以及可能的PCI配置頭的類代碼字段。如果這些字段與PCI驅(qū)動(dòng)程序管理的值相匹配,則Supported()將返回EFI_SUCCESS。否則,Supported()服務(wù)將返回EFI_UNSUPPORTED。PCI驅(qū)動(dòng)程序必須仔細(xì),不干擾PCI控制器的狀態(tài),因?yàn)榭赡苡胁煌腜CI驅(qū)動(dòng)程序正在管理PCI控制器。
3.2 Start() and Stop()
??針對PCI驅(qū)動(dòng)程序的驅(qū)動(dòng)程序綁定協(xié)議的Start()服務(wù)也會(huì)打開具有EFI_OPEN_PROTOCOL_BY_DRIVER屬性的PCII/O協(xié)議。Start()連接Driver與Handle,Stop()斷開Driver跟Handle之間的連結(jié).
3.3 PCI Cards with Multiple PCI Controllers
??一些PCI設(shè)備在單個(gè)設(shè)備上有一系列相同的設(shè)備,通常在PCI橋后面。如果這些設(shè)備需要由UEFI驅(qū)動(dòng)程序的單個(gè)實(shí)例來控制,那么它們可能需要額外的工作。以下圖作為設(shè)備的示例。
可能要求選項(xiàng)ROM中的驅(qū)動(dòng)程序控制PCI設(shè)備上的所有3個(gè)控制器。為此,請使用以下操作:
- .在“ Supported()”函數(shù)中,確保UEFI驅(qū)動(dòng)程序支持傳遞到“ Supported()”函數(shù)中的控制器。傳入的第一個(gè)控制器可以是PCI卡上的任何一個(gè)控制器。
- 在“Supported()”函數(shù)中,確保該函數(shù)沒有觸摸或更改HW狀態(tài)。這很重要。如果PCII/O實(shí)例已經(jīng)打開(如果一些其他的應(yīng)用程序或驅(qū)動(dòng)程序已經(jīng)在管理控制器),則返回一個(gè)錯(cuò)誤。
- 在PCI卡上的第一個(gè)控制器的Start()函數(shù)中,使用EFI_OPEN_PROTOCOL_BY_DRIVER屬性打開同一PCI卡上的其他句柄上的PCII/O協(xié)議實(shí)例。這將通知該平臺(tái)上的所有其他UEFI驅(qū)動(dòng)程序,即PCI卡上的所有控制器都已被管理。
- 在Stop()函數(shù)中,撤銷在Start()中完成的所有操作。在這些更復(fù)雜的用例中,使用私有上下文數(shù)據(jù)結(jié)構(gòu)來跟蹤完成Stop()操作所需的信息。
4、PCI Option ROM Images
??EDKII提供了一些工具來幫助開發(fā)針對PCI適配器的UEFI驅(qū)動(dòng)程序。一旦UEFI驅(qū)動(dòng)器的PCI適配器建立,他們需要打包成PCI選項(xiàng)ROM兼容的圖像格式。存儲(chǔ)在PCI選項(xiàng)rom中的UEFI驅(qū)動(dòng)程序會(huì)在PCI枚舉期間由PCI總線驅(qū)動(dòng)程序自動(dòng)加載和執(zhí)行。
總結(jié)
以上是生活随笔為你收集整理的EFI Driver Model(中)-PCI 驱动设计的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 聊天系统服务器端类图,使用Java多线程
- 下一篇: PUN补充