标签:实现 链接 枚举 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上的端口的状态(基于 异步中断传输 实现)。
标签:实现 链接 枚举 root str tco connect 传输 .com
原文地址:http://www.cnblogs.com/nju347/p/7821011.html