本文旨在简单介绍一下 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.从上可以看出只有最底层驱动(控制器驱动)会去直接操作硬件(寄存器);

EDK II之USB协议栈的实现简介的更多相关文章

  1. Linux中USB协议栈的框架简介

    文本旨在简单介绍一下Linux中USB协议栈的代码框架: 下图是USB协议栈相关数据结构的关系图: 下面结合上图看一下系统初始化的流程: 1.USB子系统初始化:\drivers\usb\core\u ...

  2. EDK II之USB设备驱动程序的加载与运行

    本文简单介绍一下USB设备的驱动程序是如何匹配设备以及被加载的: 上文(UDK中USB总线驱动的实现框架)提到USB总线枚举设备的最后一步是调用gBS->ConnectController()去 ...

  3. EDK II之USB总线驱动的实现框架

    本文简单介绍一下UEFI中USB驱动的实现框架: 下图是USBD向上层驱动提供的接口: 1.从图中我们可以看出,USBDI的实现主要通过调用HCDI实现 和 访问USB_INTERFACE结构体(该结 ...

  4. EDK II之USB主控制器(EHCI)驱动的实现框架

    本文简要介绍一下UEFI中EHCI驱动的代码实现框架: 下图是HCDI: 上图是Host驱动程序向上层驱动提供的接口图: 1.大部分接口的最后动作都是去操作主控制器寄存器,ECHI的spec:< ...

  5. EDK II之Secure Boot简述

    密钥对:公钥分发,私钥自留.常见的公钥格式:cer/der,常见的私钥格式:pfx. BIOS中Secure Boot的原理:把公钥包在code里面,当使用gBS->LoadImage()去加载 ...

  6. USB协议规范文档简介

    USB协议规范文档简介       USB驱动开发必须对USB相关的协议规范有一定程度的了解,理解得越深,遇到的问题就会越少,解决问题的速度也就越快. 工欲善其行,必先利其器.USB协议规范就是USB ...

  7. Setting up a EDK II build environment on Windows and Linux:搭建Windows和Linux开发环境[2.2]

    Setting up a EDK II build environment on Windows and Linux:搭建Windows和Linux开发环境[2.2] 2015-07   北京海淀区  ...

  8. Tools:downloading and Building EDK II工具篇:安装/使用EDKII源代码获取/编译工具[2.3]

    Tools:Installing and using the Required Tools for downloading and Building EDK II工具篇:安装/使用EDKII源代码获取 ...

  9. EDK II之驱动程序与硬件平台的初始化简介

    本文旨在简单介绍一下UEFI中驱动程序的加载方式(这里涉及的模块指的是符合UEFI Driver Model的模块): 在UEFI中,当一个驱动模块被加载时,在模块入口点只会安装EFI_DRIVER_ ...

随机推荐

  1. java.lang.SecurityException: Permission Denial: writing android.support.v4.content.FileProvider uri

    在使用红米手机拍摄照片时,出现闪退的情况. 调用系统相机拍摄照片,使用FileProvider.getUriForFile传入Uri时,报异常 java.lang.SecurityException: ...

  2. FreeMaker常用表达式

    1,日期转换 ${data.startDate?string("yyyy-MM-dd HH:mm")} 2,非空检查 当数据为null时,1中日期转换在界面上不会显示异常,但在日志 ...

  3. pycharm tips

    批量更改变量名,就在该变量名上shift+f6 ../data 两个点,就是上一级目录,一个点就是当前目录 unhashable type: 'list' 使用set进行去重 a = [1,2,2,3 ...

  4. 产品设计教程:利用“系列位置效应”优化UI

    任何博得人们喜欢的产品都在一定程度上契合了用户的心理需求.设计和心理学息息相关,掌握一些基本心理学知识,设计师的作品更能在潜意识中抓住用户的心. 系列位置效应 “系列位置效应”(The Serial ...

  5. git安装和使用(二)

    一.git安装 1.目的 通过git管理github托管项目代码 2.下载安装 Git - Downloading Package​www.git-scm.com 点击桌面,右击鼠标,出现两个git单 ...

  6. url传输编码

    首先:协议规范,RFC 1738,定义url地址中不能包含除:0-9,a-zA-Z,- 之外的字符,即,如URL中包含特殊字符,如$-_.+!*’(), 都要编码. 关于为什么如此定义,有如下几个原因 ...

  7. leetcode473 Matchsticks to Square

    一开始想求所有结果为target的组合来着,但是所选元素不能重叠.用这个递归思想很简单,分成四个桶,每次把元素放在任意一个桶里面,最后如果四个桶相等就可以放进去,有一个地方可以剪枝,假如任意一个桶的元 ...

  8. Cocos Creator 对象池cc.NodePool的使用

    对象池cc.NodePool把层级管理器中的节点拖进资源管理器中就创建了预制体:let和var 一样,是声明变量的关键词, 同一个变量名时,var 即使在{}内也作用全局,let有范围:(1)将需要数 ...

  9. MVC5 您不能调用控制器“xx”上的操作方法“xx”,因为该方法是一种泛型方法

    在 MVC5 中当使用   routes.MapMvcAttributeRoutes() 添加路由属性是导致在控制器创建的泛型方法调用错误: Cannot call action method 'Sy ...

  10. Selenium基础知识(九)验证码

    关于Selenium处理验证码总结下: 1.去掉验证码(这个为了测试,去掉可能性不大) 2.万能验证码(让开发给做一个万能验证码,可能性也不大) 3.OCR光学识别,python包Python-tes ...