码迷,mamicode.com
首页 > 其他好文 > 详细

UEFI中USB总线驱动的实现框架

时间:2017-11-12 11:01:08      阅读:226      评论:0      收藏:0      [点我收藏+]

标签:实现   链接   枚举   root   str   tco   connect   传输   .com   

本文简单介绍一下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;

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上的端口的状态(基于 异步中断传输 实现)。

 

UEFI中USB总线驱动的实现框架

标签:实现   链接   枚举   root   str   tco   connect   传输   .com   

原文地址:http://www.cnblogs.com/nju347/p/7821011.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!