EDK II之USB協議棧的實現簡介


本文旨在簡單介紹一下 UEFI中USB協議棧的代碼框架:

主要包括:

USB主控制器驅動(HCDI:EFI_USB2_HC_PROTOCOL

USB總線驅動(USBDI:EFI_USB_IO_PROTOCOL

USB Mass Storage驅動(EFI_BLOCK_IO_PROTOCOL

下圖是USB協議棧的代碼框架:

上圖出自:《UEFI與EDKII源代碼分析》

 

下圖是USB Host Controller(EHCI)驅動初始化的流程(代碼位於:\MdeModulePkg\Bus\Pci\EhciDxe\):

 

 

下圖是USB BUS驅動初始化的流程(代碼位於:MdeModulePkg\Bus\Usb\UsbBusDxe\): 

 

 

下圖是USB Device(Mass Storage)驅動初始化的流程(代碼位於:MdeModulePkg\Bus\Usb\UsbMassStorageDxe\): 

 

 

下面我們通過一個例子來看一下各層驅動程序之間的接口是如何被調用的:

比如我們需要重啟USB設備:

 

總結:

1.UEFI中底層驅動程序是通過Protocol來向上層驅動提供接口的(Linux中的方式是內核符號表);

2.只有最底層的驅動會去操作硬件(寄存器),EHCI HC寄存器的定義:《ehci-specification-for-usb.pdf》;

3.EhcLinkQhToAsync()把我們要發送的URB放到ASYNCLISTADDR寄存器指定的地方,然后硬件會自動把這個地方的數據發送出去;

4.USB總線驅動執行完成后,UsbRootHubEnumeration()會被定期執行,用來檢查root hub上的端口狀態;

5.如果有hub,hub被初始化完成后,UsbHubEnumeration()會被定期執行,用來檢查hub上的端口狀態(類似於Linux中的內核線程);

6.UEFI中,是通過輪詢的方式來發現新接入的設備的;

7.從上可以看出只有最底層驅動(控制器驅動)會去直接操作硬件(寄存器);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM