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 ...
随机推荐
- Spark学习:ShutdownHookManager虚拟机关闭钩子管理器
Java程序经常也会遇到进程挂掉的情况,一些状态没有正确的保存下来,这时候就需要在JVM关掉的时候执行一些清理现场的代码. JAVA中的ShutdownHook提供了比较好的方案. JDK提供了Jav ...
- FreeMaker常用表达式
1,日期转换 ${data.startDate?string("yyyy-MM-dd HH:mm")} 2,非空检查 当数据为null时,1中日期转换在界面上不会显示异常,但在日志 ...
- word2vec 评测 size_diff
This is a test for word2vecWed Nov 07 16:47:19 2018dir of model1: ./model/window3_ min_count2_worker ...
- 关于RTSP-Over-HTTP
--------------------更新2018.07.10------------------- myRtspClient-1.3.0开始支持RTSP-Over-HTTP ----------- ...
- JS控制文本框只能输入数字 \保留小数点后两位
<input type="text" placeholder="保留到小数点后两位" maxlength="200" onkeyup= ...
- python Rpyc简单使用
客户端可以直接调用服务端代码. rpycserver #!/usr/bin/env python #coding:utf-8 from rpyc.core.service import SlaveSe ...
- 回车和刷新以及Ctr+F5的区别
回车(url跳转)主要是判断本地缓存文件的Expires的有效时间,如果有效则直接使用客户端缓存 不在提交到HTTP服务器 F5 Expires设置不再起效果,只有Last-Modified/ETag ...
- 41.SEO----前端SEO技巧
一.搜索引擎工作原理 当我们在输入框中输入关键词,点击搜索或查询时,然后得到结果.深究其背后的故事,搜索引擎做了很多事情. 在搜索引擎网站,比如百度,在其后台有一个非常庞大的数据库,里面存储了海量的关 ...
- LeetCode11.盛最多水的容器
给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) .在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0).找出其中的两条线, ...
- 关于nginx的安装
今天倒腾nginx,当运用命令service nginx start 出现了这个:Job for nginx.service failed because the control process ex ...