本文简要介绍一下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. Jsp与Servlet面试题

    一.jsp有哪些内置对象作用分别是什么  答:JSP共有以下9种基本内置组件(可与ASP的6种内部组件相对应): request  用户端请求,此请求会包含来自GET/POST请求的参数  respo ...

  2. 删除 clean tomcat7:run

    1.在eclipse中运行的绿色箭头旁边有个下箭头,点击: 2.选择Run Configurations... 3.在Maven Builder下删除不想要的

  3. Extjs event domain 研究

    Listeners and Event Domains In Ext JS 4.2, the MVC event dispatcher was generalized with the introdu ...

  4. jenkins 常用插件和配置项介绍和使用

    jenkins 上搜索不到的插件可以在如下地址下载: http://updates.jenkins-ci.org/download/plugins/ 1.Notification Plugin 介绍: ...

  5. CentOS6.5 安装Kafka集群

    1.安装zookeeper 参考文档:http://www.cnblogs.com/hunttown/p/5452138.html 2.下载:https://www.apache.org/dyn/cl ...

  6. for in //for of //forEach //map三种对比

    遍历Array可以采用下标循环,遍历Map和Set就无法使用下标.为了统一集合类型,ES6标准引入了新的iterable类型,Array.Map和Set都属于iterable类型. 具有iterabl ...

  7. ElementNotVisibleException: Message: element not visible

    selenium自动化测试中,经常会报异常: 可能会有各种疑问,元素可以定位到啊.为什么报以下异常? ElementNotVisibleException: Message: element not ...

  8. 转git的使用

    git的使用(包括创建远程仓库到上传代码到git的详细步骤以及git的一些常用命令) A创建远程仓库到上传代码到git 1)登陆或这注册git账号 https://github.com 2)创建远程仓 ...

  9. node.js初识10

    post请求 form.html <!DOCTYPE html> <html lang="en"> <head> <meta charse ...

  10. vue中强制刷新的bug处理

    vue是单页面应用,跳转路由也是局部刷新,这里就拿后台管理系统而言,如果你的后台管理系统是左右布局,你不会遇到这样的问题,但是如果你的后台管理系统是上左右布局,你就会遇到这个问题,一级菜单在最上面,二 ...