EDK II之USB主控制器(EHCI)驱动的实现框架
本文简要介绍一下UEFI中EHCI驱动的代码实现框架:
下图是HCDI:

上图是Host驱动程序向上层驱动提供的接口图:
1.大部分接口的最后动作都是去操作主控制器寄存器,ECHI的spec:《ehci-specification-for-usb.pdf》;
2.寄存器PORTSC用来获取/设置端口的状态(这里表示root hub的端口),root hub有几个port,这里就会有几个对应的寄存器(根据硬件厂商自己的实现);
3.图中出现的2个链表是由硬件自己维护的,链表位于内存的地址由相关寄存器指定,驱动程序把要发送的数据写到这里,硬件会自动执行发送;
4.Asynchronous Schedule list用来发送controller和bulk(发完就删除,比如获取一下设备状态);
5.Periodic schedule frame list用来发送异步中断(周期发送,比如定期查询hub,kb的状态)。
下图是EHCI驱动初始化的流程:

初始化流程图:
1.定义了一个定时器事件,这样在驱动程序初始化完成后,会有一个函数EhcMonitorAsyncRequests()周期执行,用来查询异步中断传输队列:&Ehc->AsyncIntTransfers;
(参考UEFI spec中的这句话:An Asynchronous Interrupt Transfer is typically used to query a device’s status at a fixed rate. For example, keyboard,mouse, and hub devices use this type of transfer to query their interrupt endpoints at a fixed rate.)后面我们会发现,在初始化HUB、KB这些device的时候会调用到AsyncInterruptTransfer()来把数据添加到periodic schedule frame list。
下面从数据结构的角度看一下EHCI的驱动结构:
下图是EHCI驱动中涉及的主要数据结构的关系图:

1.Struct USB2_HC_DEV是Host controller的核心数据结构,在初始化过程中创建;QTD、QH的数据结构的定义位于 EHCI spec 3.5/3.6;
2.管理controller和bulk传输:插入Asynchronous Schedule list
//把组装好的Qh插入EHCI主控制器的Asynchronous Schedule List,以便硬件执行传输命令
EhcLinkQhToAsync (Ehc, Urb->Qh);
//阻塞式的执行此次controller传输
Status = EhcExecTransfer (Ehc, Urb, TimeOut);
//从Asynchronous Schedule List中将其移除
EhcUnlinkQhFromAsync (Ehc, Urb->Qh);
3.管理isochronous和interrupt传输:插入Periodic schedule frame list
//把组装好的Qh插入EHCI主控制器的Periodic schedule frame list,以便硬件执行传输命令
EhcLinkQhToPeriod (Ehc, Urb->Qh);
//并把URB插入异步中断传输链表 &Ehc->AsyncIntTransfers
InsertHeadList (&Ehc->AsyncIntTransfers, &Urb->UrbList);
4.插入硬件链表的URB,硬件会自动执行发送;
5.链表&Ehc->AsyncIntTransfers是由驱动程序创建并管理的,由EhcMonitorAsyncRequests()管理;
(1)他会循环&Ehc->AsyncIntTransfers上的每个urb;
(2)通过判断QTD.status来判断执行结果(一个urb中包含一个QH和一串QTD);
(3)更新QH,为下一轮异步传输准备;
(4)如果有回调函数,执行回调函数。
6.总结:EHCI驱动初始化完成后,硬件负责维护两个链表(自动发送上面的数据),软件负责维护一个链表(用来周期查询Periodic list中的URB的执行结果,并调用回调函数)。
EDK II之USB主控制器(EHCI)驱动的实现框架的更多相关文章
- EDK II之USB协议栈的实现简介
本文旨在简单介绍一下 UEFI中USB协议栈的代码框架: 主要包括: USB主控制器驱动(HCDI:EFI_USB2_HC_PROTOCOL) USB总线驱动(USBDI:EFI_USB_IO_PRO ...
- EDK II之USB总线驱动的实现框架
本文简单介绍一下UEFI中USB驱动的实现框架: 下图是USBD向上层驱动提供的接口: 1.从图中我们可以看出,USBDI的实现主要通过调用HCDI实现 和 访问USB_INTERFACE结构体(该结 ...
- EDK II之USB设备驱动程序的加载与运行
本文简单介绍一下USB设备的驱动程序是如何匹配设备以及被加载的: 上文(UDK中USB总线驱动的实现框架)提到USB总线枚举设备的最后一步是调用gBS->ConnectController()去 ...
- 【转】USB协议架构及驱动架构
1. USB协议 1.1 USB主机系统 在USB主机系统中,通过根集线器与外部USB从机设备相连的处理芯片,称为USB主机控制器.USB主机控制器包含硬件.软件和固件一部分. 1.2 USB设备系统 ...
- 乾坤合一~Linux设备驱动之USB主机和设备驱动
如果不能陪你到最后 是否后悔当初我们牵手 如果当初没能遇见你 现在的我 在哪里逗留 所有的爱都是冒险 那就心甘情愿 等待我们一生中 所有悬念 我一往情深的恋人 她是我的爱人 她给我的爱就像是 带着露水 ...
- 《网蜂A8实战演练》——8.Linux USB 主机控制器和设备驱动
USB 的全称是 Universal Serial Bus,顾名思义:通用串行总线. 提到总线,联想一下,在你心目中总线总是用来干嘛的?还记得 I2C 总线? I2C 总线上挂有二条信号线,一条是 S ...
- 基于Linux的USB 主/从设备之间通讯的三种方式
转载:http://archive.eet-china.com/www.eet-china.com/ART_8800323770_617693_TA_eda530e7.HTM 随着简单易用的USB接口 ...
- linux USB HOST之EHCI和OHCI【转】
转自:http://blog.csdn.net/ljzcom/article/details/8186914 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] 2 关键数据结 ...
- EDK II之驱动程序与硬件平台的初始化简介
本文旨在简单介绍一下UEFI中驱动程序的加载方式(这里涉及的模块指的是符合UEFI Driver Model的模块): 在UEFI中,当一个驱动模块被加载时,在模块入口点只会安装EFI_DRIVER_ ...
随机推荐
- AOP 入门
1,源码 Application.java package com.bf; import org.springframework.context.ApplicationContext; import ...
- huawei
线程堆栈(Thread Stack)和托管堆(Managed Heap) 每个正在运行的程序都对应着一个进程 (process),在一个进程内部,可以有一个或多个线程(thread),每个线程都拥有一 ...
- 天气服务API文档 第1版
HTTP接口设计文档 此文档为开发HTTP接口的设计文档,目前用于提供天气查询的相关接口. 测试的时候使用 URL=http://www.dennisthink.com/test/api/weathe ...
- win10 修改root文件
1.进入Win10系统的hosts文件所在位置,我们直接输入C:\Windows\System32\Drivers\etc后回车就可以打开了,右键hosts文件,选择属性 2.点击hosts属性对话框 ...
- c3p0:Connections could not be acquired from the underlying database!解决方案
在利用ssh框架做网站的时候遇到了一个比较棘手的问题,一直连接不上数据库,问题描述如下: 各种百度然后说的最多的解决方案是: 1,驱动配置有误:2,数据库连接地址有误:3,密码或帐号有误: 4,数据库 ...
- scrapy yield
生成器 一个带有 yield 的函数就是一个 generator,它和普通函数不同,生成一个 generator 看起来像函数调用,但不会执行任何函数代码,直到对其调用 next()(在 for 循环 ...
- centos安装java的jdk
1.下载 jdk-8u101-linux-x64.rpm http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads- ...
- 学习笔记<2>Android基本四大组件
<1>Activity(活动) ------与用户交互的界面 (1)Activity启动基本流程 <2>service(服务) <3>ContentProvider ...
- hdu4746莫比乌斯反演+分块
http://blog.csdn.net/mowayao/article/details/38875021 题意: 5000组样例. 问你[1,n] 和 [1,m]中有多少对数的GCD的素因子个数小于 ...
- 如何在Sitecore CMS中打开内容编辑器
在Sitecore中开发网站时,大多数项目管理都来自内容编辑器.创建,删除,修改,移动,发布,排序和查看项目只是可以在Content Editor界面中处理的众多任务中的一小部分. 由于内容编辑器对于 ...