本文旨在简单介绍一下 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. Android 7.0下,拍摄照片报错

    对于面向 Android 7.0 的应用,Android 框架执行的 StrictMode API 政策禁止在您的应用外部公开 file:// URI.如果一项包含文件 URI 的 intent 离开 ...

  2. 异常的Error与Exception

    一般不可处理:Error:是jvm抛出的严重性问题.已经严重影响程序执行  例如:内存溢出等情况这种问题发生一般不针对处理,直接修改程序. 可处理:Exception: 该体系的特点:子类的后缀名都是 ...

  3. SQL IN查询优化

    实际项目中有如下SQL, 发现效率很低,用时超过1分钟 select TaskID, StartDate = min(UpdateTime), EndDate = max(UpdateTime) fr ...

  4. bat脚本简单命令

    1.if 判断 (1.1)判断字符串是否为空: if "%var1%" == " " ( echo null) else(echo not null ) (1. ...

  5. c# 判断文件是否发生了变化

    你这个是想文件发生改变时,自动调用一个函数,做出一些操作呢. 还是有一个按钮(或者别的什么),你去点击一下,然后检测下一个文件,是否发生了变化? 下面的代码,监控d盘下的所有.txt文件的修改 1 2 ...

  6. js--script和link中的 integrity 属性

    <link crossorigin="anonymous" integrity="sha256-+hDz/gVbhp24mhOmoIT4Du4F3K5fs9fjjo ...

  7. ida pro 使用

    交互式反汇编器专业版(Interactive Disassembler Professional),人们常称其为IDA Pro,或简称为IDA.是目前最棒的一个静态反编译软件,为众多0day世界的成员 ...

  8. Redis:C#使用Redis(1)

    一.安装 1.下载安装包: 官方网站:redis.io 官方推荐windows版本:https://github.com/MSOpenTech/redis 2:下载压缩包,解压后如下 redis-se ...

  9. webpack 解决跨域问题

    一.webpack 内置了 http-proxy-middleware 可以解决 请求的 URL 代理的问题 安装:npm install --save http-proxy-middleware 二 ...

  10. beego 初体验 - orm - 增删改查

    本文记录一下 beego orm 简单的增删改查,大牛请绕道. 首先,注册4个增删改查的路由: 其次,在 views 文件夹下增加对应的模板(页面): controller 类里写上增删改查的方法: ...