本文简要介绍一下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)驱动的实现框架的更多相关文章

  1. EDK II之USB协议栈的实现简介

    本文旨在简单介绍一下 UEFI中USB协议栈的代码框架: 主要包括: USB主控制器驱动(HCDI:EFI_USB2_HC_PROTOCOL) USB总线驱动(USBDI:EFI_USB_IO_PRO ...

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

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

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

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

  4. 【转】USB协议架构及驱动架构

    1. USB协议 1.1 USB主机系统 在USB主机系统中,通过根集线器与外部USB从机设备相连的处理芯片,称为USB主机控制器.USB主机控制器包含硬件.软件和固件一部分. 1.2 USB设备系统 ...

  5. 乾坤合一~Linux设备驱动之USB主机和设备驱动

    如果不能陪你到最后 是否后悔当初我们牵手 如果当初没能遇见你 现在的我 在哪里逗留 所有的爱都是冒险 那就心甘情愿 等待我们一生中 所有悬念 我一往情深的恋人 她是我的爱人 她给我的爱就像是 带着露水 ...

  6. 《网蜂A8实战演练》——8.Linux USB 主机控制器和设备驱动

    USB 的全称是 Universal Serial Bus,顾名思义:通用串行总线. 提到总线,联想一下,在你心目中总线总是用来干嘛的?还记得 I2C 总线? I2C 总线上挂有二条信号线,一条是 S ...

  7. 基于Linux的USB 主/从设备之间通讯的三种方式

    转载:http://archive.eet-china.com/www.eet-china.com/ART_8800323770_617693_TA_eda530e7.HTM 随着简单易用的USB接口 ...

  8. linux USB HOST之EHCI和OHCI【转】

    转自:http://blog.csdn.net/ljzcom/article/details/8186914 版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[-] 2 关键数据结 ...

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

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

随机推荐

  1. sap 查看类的修饰属性

  2. Python 全栈开发十 socket网络编程

    一.客户端(client)服务端(sever)架构 在计算机中有很多常见的C/S架构,例如我们的浏览器是客户端.而百度网站和其他的网站就是服务端:视频软件是客户端,提供视频的腾讯.优酷.爱奇艺就是服务 ...

  3. 用iframe嵌入了一个微信公众号平台文章的URL

    JS: $.ajaxPrefilter( function (options) { if (options.crossDomain && jQuery.support.cors) { ...

  4. vim自动安装插件Vundle

    https://github.com/VundleVim/Vundle.vim Set up Vundle: git clone https://github.com/VundleVim/Vundle ...

  5. pyCharm编辑器激活使用

    1.打开激活窗口 2.选择 Activate new license with License server (用license server 激活) 3.在 License sever addres ...

  6. 听说,你也一直钟爱着equals。。。

    脑补一下final final 用于声明变量/参数/属性.方法和类. 修饰变量:如果变量是基本类型,其值不变:如果是对象,则引用不可再变(内容可变). 修饰方法:方法不可重写(是否可继承取决于方法的访 ...

  7. Oracle如何查询当前的crs/has自启动状态

    我们知道在某些停机测试场景,是需要人为禁用crs/has的自启动的,防止过程中主机反复重启对数据库集群造成影响. 使用crsctl disable/enable crs命令可以禁用/启用crs的自启动 ...

  8. Window.sessionStorage - Web API 接口参考 | MDN

    参考:https://developer.mozilla.org/zh-CN/docs/Web/API/Window/sessionStorage sessionStorage 属性允许你访问一个 s ...

  9. RCNN系列算法的发展

    一. RCNN系列的发展 1.1  R-CNN 根据以往进行目标检测的方法,在深度学习应用于目标检测时,同样首先尝试使用滑动窗口的想法,先对图片进行选取2000个候选区域,分别对这些区域进行提取特征以 ...

  10. MyBatis基础入门《十 一》修改数据

    MyBatis基础入门<十 一>修改数据 实体类: 接口类: xml文件: 测试类: 测试结果: 数据库: 如有问题,欢迎纠正!!! 如有转载,请标明源处:https://www.cnbl ...