UEFI中USB协议栈的实现简介

Posted 学习笔记

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UEFI中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.从上可以看出只有最底层驱动(控制器驱动)会去直接操作硬件(寄存器);

 

以上是关于UEFI中USB协议栈的实现简介的主要内容,如果未能解决你的问题,请参考以下文章

栈的实现(c语言)--- 数据结构

栈的实现(c语言)--- 数据结构

栈的实现(c语言)--- 数据结构

栈的实现(c语言)--- 数据结构

Linux Kernel TCP/IP Stack — Overview

Linux Kernel TCP/IP Stack — Overview