本文旨在簡單介紹一下 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.從上可以看出只有最底層驅動(控制器驅動)會去直接操作硬件(寄存器);
