EDK II之USB总线驱动的实现框架
本文简单介绍一下UEFI中USB驱动的实现框架:
下图是USBD向上层驱动提供的接口:

1.从图中我们可以看出,USBDI的实现主要通过调用HCDI实现 和 访问USB_INTERFACE结构体(该结构体在总线枚举过程中存放了device的相关信息):
(这里为什么是从interface获取呢?一个device可以包含多个configuration,一个configuration可以包含多个interface,我们可以把device看成一个物理设备,而把interface看成逻辑设备,就是说interface是与driver对应的。比如说我们有一个usb设备,含有两种逻辑功能,就表示它支持两个interface,我们也就需要安装两个device驱动来分别驱动这两个功能。所以如果上层的device驱动通过USBDI获取相关的描述符,也就需要从对应的interface结构体中读取就行了)
下图是USBD中操作hub的相关接口实现:


1.这里分为root hub和一般hub,root hub位于Host controller中,从上面的接口实现也可以看出来,root hub的相关操作都是直接通过调用HCDI实现的(即直接操作HC中的PORTSC寄存器);
下图是USBD初始化的简单流程图:

我们设想这样一个链接结构:root hub下挂了一个hub,该hub下有挂了一个device,来分析一下初始化流程:
1.首先初始化root hub,去循环枚举每个port,检测到有hub存在,会去调用UsbEnumerateNewDev()(参考USB2.0 spec 9.1.2),同时注意UsbRootHubEnumeration是一个周期调用的函数,用来查询root hub的各个端口的状态;
2.UsbCreateInterface()会创建interface,并安装USBDI:EFI_USB_IO_PROTOCOL,从这里也可以看出为什么USBDI会从interface获取descriptor;USB总线驱动为每个Interface安装EFI_USB_IO_PROTOCOL
3.判断port口上的device的类型,发现是hub,调用hub的初始化函数,来初始化hub;
4.hub会去注册一个异步中断传输(回调函数为UsbOnHubInterrupt())(参考前两篇的文章,我们知道UsbOnHubInterrupt()会被周期调用,他又会导致UsbHubEnumeration()被周期调用);
5.hub发下他下面的port口上有一个device,调用UsbEnumerateNewDev(),最后调用gBS->ConnectController()去查找device的驱动并加载他。
USBD初始化完成后,会存在两个被周期调用的函数(类似于Linux中的内核线程):
1.UsbRootHubEnumeration() - 用来查询root hub上的端口的状态;
2.UsbHubEnumeration() - 用来查询hub上的端口的状态(基于 异步中断传输 实现)。
EDK II之USB总线驱动的实现框架的更多相关文章
- EDK II之USB设备驱动程序的加载与运行
本文简单介绍一下USB设备的驱动程序是如何匹配设备以及被加载的: 上文(UDK中USB总线驱动的实现框架)提到USB总线枚举设备的最后一步是调用gBS->ConnectController()去 ...
- linux usb总线驱动(一)
目录 linux usb总线驱动框架 USB 介绍 传输类型 控制器接口 2440接口 基本流程 alloc_dev choose_address hub_port_init usb_get_devi ...
- EDK II之USB协议栈的实现简介
本文旨在简单介绍一下 UEFI中USB协议栈的代码框架: 主要包括: USB主控制器驱动(HCDI:EFI_USB2_HC_PROTOCOL) USB总线驱动(USBDI:EFI_USB_IO_PRO ...
- Linux下的USB总线驱动(一)
版权所有,转载请说明转自 http://my.csdn.net/weiqing1981127 一.USB理论 1. USB概念概述 USB1.0版本速度1.5Mbps(低速USB) USB1 ...
- EDK II之USB主控制器(EHCI)驱动的实现框架
本文简要介绍一下UEFI中EHCI驱动的代码实现框架: 下图是HCDI: 上图是Host驱动程序向上层驱动提供的接口图: 1.大部分接口的最后动作都是去操作主控制器寄存器,ECHI的spec:< ...
- 嵌入式Linux驱动学习之路(二十)USB设备驱动
USB在接入系统的时候,以0的设备ID和主机通信,然后由主机为其分配新的ID. 在主机端,D+和D-都是下拉接地的.而设备端的D-接上拉时,表明此设备为高速设备:12M/s. D+接上拉时则是全速设备 ...
- 19.Linux-USB总线驱动分析
如下图所示,以windows为例,我们插上一个没有USB设备驱动的USB,就会提示你安装驱动程序 为什么一插上就有会提示信息? 是因为windows自带了USB总线驱动程序, USB总线驱动程序负责: ...
- USB设备驱动概述
USB设备驱动 · )USB Hub:每个USBHost控制器都会自带一个USB Hub,被称为根(Root)Hub.这个根Hub可以接子(Sub)Hub,每个Hub上挂载USB设备.一般PC有8个 ...
- Linux下 USB设备驱动分析(原创)
之前做过STM32的usb HID复合设备,闲来看看linux下USB设备驱动是怎么一回事, 参考资料基于韦东山JZ2440开发板,以下,有错误欢迎指出. 1.准备知识 1.1USB相关概念: USB ...
随机推荐
- 第一天 Linux基础篇
课程介绍 1.认识Linux的不同版本 2.以及应用领域 3.文件和目录 4.Linux命令概述 5.Linux命令-文件 6.Linux命令-系统管理-磁盘管理 认识Linux 什么是操作系统 生 ...
- vue弹窗组件
文件结构 component.vue <template> <div class="_vuedals" v-show="show"> & ...
- [xdoj]1299&1300朱神的烦恼 朱神的序列
http://acm.xidian.edu.cn/problem.php?id=1299 1.第一道题简单的很,数据范围最多只有1e4,对于数组中的每一个元素进行两个for循环,i=0;i<n; ...
- IdentityServer4:IdentityServer4+API+Client+User实践OAuth2.0密码模式(2)
一.密码模式实操 仍然使用第一节的代码:做如下改动: 1.授权服务端 前面我们使用项目:Practice.IdentityServer作为授权服务器 修改项目的Config.cs类: 添加测试用户,并 ...
- iOS 测试企业应用的分发
开发者能够方便地来做iOS应用的测试分发,目前可以选用“浦公英”和“Fir.im”来做. 生成IPA文件 生成应用的 IPA 文件可以使用命令行 xcodebuild exportArchive -e ...
- vue打包后404,webpack配置问题
首先声明这是基于vue2.x的 1. 将其中build的配置项assetsPublicPath进行修改,改为上图-->目的是将资源文件的引入路径,改为相对地址(相对index.html) 2.h ...
- Adobe Flash Builder 调试器无法连接,无法进行调试,构建停止在57%
参考:https://blog.csdn.net/wuboyaogun1/article/details/9105373 谷歌浏览器下载Flash debugger :Download the Win ...
- sqli-labs(十五)(堆叠注入)
第三十八关: 后面好几关都是堆叠注入.简单介绍下: Stacked injections:堆叠注入.从名词的含义就可以看到应该是一堆sql语句(多条)一起执行.而在真实的运用中也是这样的,我们知道在m ...
- laravel中使用event
https://www.cnblogs.com/ziyouchutuwenwu/p/4274539.html
- spark2.2.1 sql001
package sql import org.apache.spark.sql.SparkSession import org.apache.spark.SparkContext object Par ...