本文简单介绍一下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;USB总线驱动为每个Interface安装EFI_USB_IO_PROTOCOL

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

EDK II之USB总线驱动的实现框架的更多相关文章

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

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

  2. linux usb总线驱动(一)

    目录 linux usb总线驱动框架 USB 介绍 传输类型 控制器接口 2440接口 基本流程 alloc_dev choose_address hub_port_init usb_get_devi ...

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

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

  4. Linux下的USB总线驱动(一)

    版权所有,转载请说明转自 http://my.csdn.net/weiqing1981127 一.USB理论 1.      USB概念概述 USB1.0版本速度1.5Mbps(低速USB) USB1 ...

  5. EDK II之USB主控制器(EHCI)驱动的实现框架

    本文简要介绍一下UEFI中EHCI驱动的代码实现框架: 下图是HCDI: 上图是Host驱动程序向上层驱动提供的接口图: 1.大部分接口的最后动作都是去操作主控制器寄存器,ECHI的spec:< ...

  6. 嵌入式Linux驱动学习之路(二十)USB设备驱动

    USB在接入系统的时候,以0的设备ID和主机通信,然后由主机为其分配新的ID. 在主机端,D+和D-都是下拉接地的.而设备端的D-接上拉时,表明此设备为高速设备:12M/s. D+接上拉时则是全速设备 ...

  7. 19.Linux-USB总线驱动分析

    如下图所示,以windows为例,我们插上一个没有USB设备驱动的USB,就会提示你安装驱动程序 为什么一插上就有会提示信息? 是因为windows自带了USB总线驱动程序, USB总线驱动程序负责: ...

  8. USB设备驱动概述

    USB设备驱动 ·  )USB Hub:每个USBHost控制器都会自带一个USB Hub,被称为根(Root)Hub.这个根Hub可以接子(Sub)Hub,每个Hub上挂载USB设备.一般PC有8个 ...

  9. Linux下 USB设备驱动分析(原创)

    之前做过STM32的usb HID复合设备,闲来看看linux下USB设备驱动是怎么一回事, 参考资料基于韦东山JZ2440开发板,以下,有错误欢迎指出. 1.准备知识 1.1USB相关概念: USB ...

随机推荐

  1. 定义结构体和table type

    1: 在se11 中创建结构体 2: 定义一个内表, row type 使用structure类型,将会具有structure的字段. 3:在代码中 使用 结构体和table  type *& ...

  2. sap 查看自己代码的结构

    1:进入系统X3C:然后输入T-CODE   bsp_wd_cmpwb

  3. git add 所有文件

    git add 多个文件的格式介绍 git提交修改之前要add然后commit,假如我用git clone远程服务器文件到本地,然后我如果修改了其中几个文件要提交,我必须一个个的如: $git add ...

  4. PHP策略模式2

    <?php /** PHP 策略模式 * 策略模式是对象的行为模式,用意是对一组算法的封装.动态的选择需要的算法并使用. * 策略模式指的是程序中涉及决策控制的一种模式.策略模式功能非常强大,因 ...

  5. PHP实现装饰器

    参考:https://www.cnblogs.com/onephp/p/6108940.html ●装饰器模式(Decorator),可以动态地添加修改类的功能 ●一个类提供了一项功能,如果要在修改并 ...

  6. 【设计模式】用追MM来解释23种设计模式,转

    创建型模式 1.FACTORY—追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,虽然口味有所不同,但不管你带MM去麦当劳或肯德基,只管向服务员说“来四个鸡翅”就行了.麦当劳和肯德基 ...

  7. linux iscsi挂载与卸载

    iscsiadm -m discovery -t sendtargets -p 192.168.4.245:3260 #扫描ISCSI Target 列出所有LUN iscsiadm -m node ...

  8. 【LeetCode每天一题】Valid Parentheses(有效的括弧)

    Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determine if the inpu ...

  9. 家庭记账本之Github账号注册与安装(二)

    好多程序猿都在使用github用来存放自己的代码:但是如果仅仅用github的web版本的话:有一些功能还是需要使用git客户端工具才能操作的: 那么今天将指导大家如何安装GitHub for win ...

  10. Hibernate框架第二天

    ### Hibernate的持久化类 ### ---------- **什么是持久化类** 1. 持久化类:就是一个Java类(咱们编写的JavaBean),这个Java类与表建立了映射关系就可以成为 ...