EFI Driver Model(下)-USB 驱动设计

news/2024/4/19 4:08:48/文章来源:https://blog.csdn.net/weixin_41172506/article/details/130202245

1、USB简介

  通用串行总线(英语:Universal Serial Bus,缩写:USB)是一种串口总线标准,也是一种输入输出接口的技术规范,被广泛地应用于个人电脑和移动设备等信息通讯产品,并扩展至摄影器材、数字电视(机顶盒)、游戏机等其它相关领域。最新一代是USB4,传输速度为40Gbit/s,三段式电压5V/12V/20V,最大供电100W ,新型Type C接口允许正反盲插。
  USB是一个外部总线标准,规范电脑与外部设备的连接和通讯。USB接口具有热插拔功能。USB接口可连接多种外设,如鼠标和键盘等。USB是在1994年底由英特尔等多家公司联合在1996年推出后,已成功替代串口和并口,已成为当今电脑与大量智能设备的必配接口。USB版本经历了多年的发展,到如今已经发展为USB4版本。对于大多数工程师来说,开发USB2.0接口产品主要障碍在于:要面对复杂的USB2.0协议、自己编写USB设备的驱动程序、熟悉单片机的编程。这不仅要求有相当的VC编程经验、还能够编写USB接口的硬件(固件)程序。所以大多数人放弃了自己开发USB产品。

2、USB枚举

USB Host

  一个USB系统只有一个USB Host。主计算机中的USB接口称为主控制器(Host Controller)。这个接口不是指USB端口,而是指USB系统和主计算机之间的连接接口,可能是由硬件、固件、软件组成。

USB bus

  被实现为Host Controller,且集成有Root Hub
  USB 接入后,进行USB枚举过程

  • 1、 hub 通过status change 管道(寄存器)反馈给host有设备接入或移除,device处于powered状态,port处于disabled状态。
  • 2、host检查change状态来查询是有设备接入还是移除。
  • 3、host确定有新设备接入之后,等待至少100ms来等待接入状态稳定和供电稳定;然后host发送 reset 端口命令。
  • 4、hub执行reset 端口命令,reset完成后端口被enable。此时device处于default状态并能从端口获取电流。
  • 5、host给device分配一个唯一的address,device进入Address状态。
  • 6、host读取device的设备描述符信息来去确定设备所支持的最大数据包大小。
  • 7、host读取device的配置信息,从配置0开始读到配置n-1。
  • 8、host根据配置信息以及如何使用usb device来设置device使用哪种配置。此时device处于configured状态,也即处于可用状态了。

3、USB驱动设计

  有几个类别的USB驱动程序合作在一个平台上提供USB驱动程序堆栈。下表列出了这些USB驱动程序

驱动类别描述
USB主控制器驱动使用USB主机控制器句柄上的PCI I/O协议,并生成USB2主机控制器协议。
USB bus driver使用USB2主机控制器协议,并为USB总线上的每个USB控制器生成一个子句柄。在每个子句柄上安装设备路径协议和USB I/O协议。
USB 设备驱动使用USB I/O协议,并生成一个I/O抽象,该抽象为启动符合EFI的操作系统所需的控制台设备和引导设备提供服务。

  下图显示了一个USB驱动程序堆栈以及USB驱动程序使用和生成的协议的示例。因为USB集线器是一种特殊的设备,它只是作为一个信号中继器,所以它不包括在图21中。

  在此示例中,平台硬件在PCI总线上提供了单个USB主机控制器。PCI总线驱动程序为这个USB主机控制器安装了EFI_DEVICE_PATH_PROTOCOL和EFI_PCI_IO_PROTOCOL的句柄。然后,USB主机控制器驱动程序在该USB主机控制器设备句柄上使用EFI_PCI_IO_PROTOCOL,并将EFI_USB2_HC_PROTOCOL安装到同一句柄上。
  USB总线驱动程序使用EFI_USB2_HC_PROTOCOL的服务。它使用此服务来枚举USB总线。在此示例中,USB总线驱动程序检测USB键盘、USB鼠标和USB大容量存储设备。因此,USB总线驱动程序创建三个子句柄,并将EFI_DEVICE_PATH_PROTOCOL和EFI_USB_IO_PROTOCOL安装到每个句柄上。

  USB鼠标驱动程序消耗EFI_USB_IO_PROTOCOL并生成EFI_SIMPLE_POINTER_PROTOCOL。USB键盘驱动程序使用EFI_USB_IO_PROTOCOL来生成EFI_SIMPLE_TEXT_INPUT_PROTOCOL。

  USB大量存储驱动程序使用EFI_USB_IO_PROTOCOL来生成EFI_BLOCK_IO_PROTOCOL。
在这里插入图片描述
在这里插入图片描述

3.1、USB Host Controller Driver

USB主机控制器驱动程序取决于主机控制器所基于的哪个USB主机控制器规范。目前,USB主机控制器的主要类型如下:

  • Open Host Controller Interface (OHCI) (USB 1.0 and USB 1.1)
  • Universal Host Controller Interface (UHCI) (USB 1.0 and USB 1.1)
  • Enhanced Host Controller Interface (EHCI) (USB 2.0)
  • Extended Host Controller Interface (XHCI) (USB 3.0)

USB主机控制器驱动程序是一个设备驱动程序,并遵循UEFI驱动程序模型。它通常使用EFI_PCI_IO_PROTOCOL的服务并生成EFI_USB2_HC_PROTOCOL。以下部分提供了为USB主机控制器驱动程序实现EFI_DRIVER_BINDING_PROTOCOL服务和EFI_USB2_HC_PROTOCOL服务的指南。EDK II提供了UEFI驱动程序,在MdeModulePkg中实现UHCI、ECHI和XHCI的EFI_USB_HC2_PROTOCOL:

  • UHCI - MdeModulePkg/Bus/Pci/UhciDxe
  • EHCI - MdeModulePkg/Bus/Pci/EhciDxe
  • XHCI - MdeModulePkg/Bus/Pci/XhciDxe

3.1.1、EFI_USB2_HC_PROTOCOL

  EFI_USB2_HC_PROTOCOL提供USB主机控制器管理,基本通过USB总线的数据事务以及USB根集线器访问。设备驱动程序希望在系统中管理USB总线的检索EFI_USB2_HC_PROTOCOL与要管理的USB总线相关联的实例。设备句柄对于USB主机控制器,将至少包含一个EFI_DEVICE_PATH_PROTOCOL实例和EFI_USB2_HC_PROTOCOL实例。

struct _EFI_USB2_HC_PROTOCOL {EFI_USB2_HC_PROTOCOL_GET_CAPABILITY              GetCapability;EFI_USB2_HC_PROTOCOL_RESET                       Reset;EFI_USB2_HC_PROTOCOL_GET_STATE                   GetState;EFI_USB2_HC_PROTOCOL_SET_STATE                   SetState;EFI_USB2_HC_PROTOCOL_CONTROL_TRANSFER            ControlTransfer;EFI_USB2_HC_PROTOCOL_BULK_TRANSFER               BulkTransfer;EFI_USB2_HC_PROTOCOL_ASYNC_INTERRUPT_TRANSFER    AsyncInterruptTransfer;EFI_USB2_HC_PROTOCOL_SYNC_INTERRUPT_TRANSFER     SyncInterruptTransfer;EFI_USB2_HC_PROTOCOL_ISOCHRONOUS_TRANSFER        IsochronousTransfer;EFI_USB2_HC_PROTOCOL_ASYNC_ISOCHRONOUS_TRANSFER  AsyncIsochronousTransfer;EFI_USB2_HC_PROTOCOL_GET_ROOTHUB_PORT_STATUS     GetRootHubPortStatus;EFI_USB2_HC_PROTOCOL_SET_ROOTHUB_PORT_FEATURE    SetRootHubPortFeature;EFI_USB2_HC_PROTOCOL_CLEAR_ROOTHUB_PORT_FEATURE  ClearRootHubPortFeature;////// The major revision number of the USB host controller. The revision information/// indicates the release of the Universal Serial Bus Specification with which the/// host controller is compliant.///UINT16                                           MajorRevision;////// The minor revision number of the USB host controller. The revision information/// indicates the release of the Universal Serial Bus Specification with which the/// host controller is compliant.///UINT16                                           MinorRevision;
};

GetCapability: 获取控制器的能力支持,如最大传输速度,root hub的端口数目,是否支持64位mem寻址等。
Rest: 复位host controller
GetState: 获取host controller的状态,如halt,suspend还是operational
SetState: 设置host controller的状态
ControlTransfer: 控制传输函数
**BulkTransfer:**块传输函数
**AsyncInterruptTransfer:**异步中断传输函数,以固定的速率获取设备的状态,即提交一次传输请求之后会周期性执行。
**SyncInterruptTransfer:**同步中断传输函数,提交一次中断传输请求,只执行一次。
IsochronousTransfer: 同步传输函数。用于host和device之间周期性的,连续的通信。一个frame之内完成,未完成返回timeout。
AsyncIsochronousTransfer: 异步类型的同步传输。提交一次传输请求后立刻返回,传输真正完成时触发回调函数,查看传输结果和数据。
**GetRootHubPortStatus:**获取root hub port状态,包括connect, enable, suspend, oc, reset ,power, speed以及change状态。
SetRootHubPortFeature: 设置root hub port 特性。包括enable, suspend, power等。
**ClearRootHubPortFeature:**清除root hub port特性。包括enable, suspend, reset, power, owner, connectchange, enable change…

3.2、USB Bus Driver

  EDK II包含一个通用的USB总线驱动程序。该驱动程序使用EFI_USB2_HC_PROTOCOL的服务来枚举USB设备,并使用EFI_DEVICE_PATH_PROTOCOL和EFI_USB_IO_PROTOCOL产生子句柄。USB总线驱动程序的实现可以在MdeModulePkg的目录下的MdeModulePkg/总线/Usb/UsbBusDxe中找到。
  USB集线器,包括USB根集线器和公共集线器,是一种USB设备。USB总线驱动程序负责管理所有的USB集线器设备。USB集线器设备不需要USB设备驱动程序。
  如果基于UEFI的系统固件移植到一个新平台,大多数与USB相关的更改都发生在USB主机控制器驱动程序的实现中。如果引入了提供控制台或UEFI引导功能的新型USB设备,则还需要实现新的USB设备驱动程序。
USB总线驱动程序被设计为一个通用的、与平台无关的驱动程序。因此,我们强烈反对自定义USB总线驱动程序。

3.2.1 EFI_USB_IO_PROTOCOL

  EFI_USB_IO_PROTOCOL提供了描述的四种基本传输类型在USB 1.1规范中。其中包括控制传输、中断转移、批量转移和同步转移。EFI_USB_IO_PROTOCOL还提供了一些基本的USB设备/控制器管理和配置接口。USB设备驱动程序使用此协议的服务来管理USB设备。

struct _EFI_USB_IO_PROTOCOL {//// IO transfer//EFI_USB_IO_CONTROL_TRANSFER           UsbControlTransfer;EFI_USB_IO_BULK_TRANSFER              UsbBulkTransfer;EFI_USB_IO_ASYNC_INTERRUPT_TRANSFER   UsbAsyncInterruptTransfer;EFI_USB_IO_SYNC_INTERRUPT_TRANSFER    UsbSyncInterruptTransfer;EFI_USB_IO_ISOCHRONOUS_TRANSFER       UsbIsochronousTransfer;EFI_USB_IO_ASYNC_ISOCHRONOUS_TRANSFER UsbAsyncIsochronousTransfer;//// Common device request//EFI_USB_IO_GET_DEVICE_DESCRIPTOR      UsbGetDeviceDescriptor;EFI_USB_IO_GET_CONFIG_DESCRIPTOR      UsbGetConfigDescriptor;EFI_USB_IO_GET_INTERFACE_DESCRIPTOR   UsbGetInterfaceDescriptor;EFI_USB_IO_GET_ENDPOINT_DESCRIPTOR    UsbGetEndpointDescriptor;EFI_USB_IO_GET_STRING_DESCRIPTOR      UsbGetStringDescriptor;EFI_USB_IO_GET_SUPPORTED_LANGUAGE     UsbGetSupportedLanguages;//// Reset controller's parent port//EFI_USB_IO_PORT_RESET                 UsbPortReset;
};

UsbGetDeviceDescriptor:获取设备描述符。
UsbGetConfigDescriptor:获取配置描述符。
UsbGetInterfaceDescriptor:获取接口描述符。
UsbGetEndpointDescriptor:获取断点描述符。
UsbGetStringDescriptor:获取字符串描述符。
UsbGetSupportedLanguages:获取设备支持的语言。

3.3、USB Device Driver

  USB设备驱动程序使用EFI_USB_IO_PROTOCOL提供的服务来产生一个或多个协议,以提供USB设备的I/O抽象。USB设备驱动程序必须遵循UEFI驱动程序模型。如上所述,USB设备驱动程序不管理集线器设备,因为这些集线器设备是由USB总线驱动程序管理。EDK II在MdeModulePkg中提供了许多USB设备驱动程序,设备通常用于提供UEFI控制台和UEFI启动设备。EDK II MdePkg还提供了一个名为UefiUbLib的库,它提供了使用USB I/O协议简化USB设备驱动程序的实现的功能。在EDK II中提供的一些USB设备驱动程序实现如下:

  • USB Keyboard: MdeModulePkg/Bus/Usb/UsbKbDxe
  • USB Mouse: MdeModulePkg/Bus/Usb/UsbMouseDxe
  • USB Mouse: MdeModulePkg/Bus/Usb/UsbMouseAbsolutePointerDxe
  • USB Mass Storage: MdeModulePkg/Bus/Usb/UsbMassStorageDxe

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_102257.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

我看谁没看过

vue在新窗口打开页面方法 const { href } this.$router.resolve({path: "/officePlatform/addPrompt"});window.open(href, "_blank"); 添加圆形标志 h3::before {content: "";display: inline-block;width: 13px;height: 13px;background: va…

NFT介绍及监管规则

什么是NFT NFT是Non-Fungible Token(非同质化代币)的缩写。 NFT是“Non-Fungible Token”的缩写,即非同质化代币。不同于FT(Fungible Token,同质化代币),每一个NFT都是独一无二且不可相互替代的…

第二章 Maven 核心程序解压和配置

第一节 Maven核心程序解压与配置 1、Maven 官网地址 首页: Maven – Welcome to Apache Maven(opens new window) 下载页面: Maven – Download Apache Maven(opens new window) 下载链接: 具体下载地址:https://dlcdn.apac…

【云原生】Java 应用程序在 Kubernetes 上棘手的内存管理

文章目录 引言JVM 内存模型简介非 Heap 内存Heap 堆内存Kubernetes 内存管理JVM 和 Kubernetes场景 1 — Java Out Of Memory 错误场景 2 — Pod 超出内存 limit 限制场景 3 — Pod 超出节点的可用内存场景 4 — 参数配置良好,应用程序运行良好 结语 引言 如何结合…

三月、四月总计面试碰壁15次,作为一个27岁的测试工程师.....

3年测试经验原来什么都不是,只是给你的简历上画了一笔,一直觉得经验多,无论在哪都能找到满意的工作,但是现实却是给我打了一个大巴掌!事后也不会给糖的那种... 先说一下自己的个人情况,普通二本计算机专业…

JVM调优最佳参数

项目背景 C端的项目,用户量比较多,请求比较多。 启动参数表 Xmx指定应用程序可用的最大堆大小。 Xms指定应用程序可用的最小堆大小。 (一般情况下,需要设置Xmx和Xms为相等的值,且为一个固定的值) 如果该值…

图像处理:均值滤波算法

目录 前言 概念介绍 基本原理 Opencv实现中值滤波 Python手写实现均值滤波 参考文章 前言 在此之前,我曾在此篇中推导过图像处理:推导五种滤波算法(均值、中值、高斯、双边、引导)。这在此基础上,我想更深入地研…

使用状态机实现幂等性

文章目录 背景幂等概念适用场景示例代码上述代码状态流转 背景 在某些场景下,可以使用状态机来实现幂等性。将业务流程抽象为一个状态机,定义各个状态之间的转换规则。当收到一个请求时,根据当前状态和请求类型来判断是否允许执行操作&#x…

数学知识四

容斥原理 S表示面积,下面公式可求出不相交的面积 2个圆的公式是这样 4个圆的面积是 总面积-所有俩俩相交的面积所有三三相交的面积-四四相交的面积,公式里加和减互相出现。 从n个集合里面挑一个一直到从n个集合里面挑n个 1-10中,能被2&#x…

【 SpringBoot单元测试 和 Mybatis 增,删,改 操作 】

文章目录 一、Spring-Boot单元测试(了解)1.1 概念1.2 单元测试引用1.3 单元测试的实现1.4 简单的断言说明1.5 单元测试优点 二、Mybatis 增,删,改 操作2.1 增加⽤户操作2.2 修改⽤户操作2.3 删除⽤户操作 一、Spring-Boot单元测试(了解) 1.1 概念 单元测…

645. 错误的集合|||697. 数组的度|||448. 找到所有数组中消失的数字

645. 错误的集合 题目 集合 s 包含从 1 到 n 的整数。不幸的是,因为数据错误,导致集合里面某一个数字复制了成了集合里面的另外一个数字的值,导致集合 丢失了一个数字 并且 有一个数字重复 。 给定一个数组 nums 代表了集合 S 发生错误后的…

教你轻松申请Azure OpenAI

Azure OpenAI 和 OpenAI 官方提供的服务基本是一致的,但是目前前者还是处于预览版的状态,一些功能还没有完全开放。 优点: 不受地域限制,国内可以直接调用。可以自己上传训练数据进行训练(据说很贵)。Azu…

Cloud Kernel SIG月度动态:发布 Anolis 8.8 镜像、kABI 社区共建流程

Cloud Kernel SIG(Special Interest Group):支撑龙蜥内核版本的研发、发布和服务,提供生产可用的高性价比内核产品。 01 SIG 整体进展 Anolis 8.8 镜像发布,默认搭载 ANCK 5.10-013 版本。 Anolis 23 滚动内核更新至…

Windows下版本控制器(SVN)-验证是否安装成功+配置版本库+启动服务器端程序

文章目录 基础知识-Windows下版本控制器(SVN)3、Subversion 安装与配置3.1 验证是否安装成功。3.2 配置版本库3.3 启动服务器端程序 基础知识-Windows下版本控制器(SVN) 3、Subversion 安装与配置 TortoiseSVN安装与配置网上资料太多了,这里就不阐述了。 3.1 验证是…

【Java代码】MP3、flac歌曲批量生成同名的“xxx.lrc”歌词文件导入索尼黑砖二代

目录 1、准备条件2、实现方式3、代码环境和maven依赖4、Java代码5、示例1结果6、示例2结果7、一个小问题8、“音乐标签”下载地址 1、准备条件 网易云下载的MP3、flac后缀的歌曲若干首(ncm后缀的歌曲需要还原格式,不然会随着VIP过期而无法听&#xff09…

【原理图专题】案例:从集成的电平转换芯片换成三极管分立电平转换怎么就报异常

本案例是一个已经小批量量产的设备,不是我测试出来的,但是也算是我之前一手造成的,因为原理图这部分是我修改的。 异常发现最近生产的整机有部分非接读卡时无法控制到蜂鸣器发声音。我们的设计是这样的,有两个MCU互相通信,一个MCU是控制蜂鸣器的,另一个MCU通过SPI与非接芯…

银行数字化转型导师坚鹏:银行业务数字化创新工作坊

银行业务数字化创新工作坊 课程背景: 很多银行存在以下问题: 不清楚如何进行业务数字化创新? 不知道如何开展银行数字化营销工作? 不知道零售业务数字化创新成功案例? 学员收获: 学习原创银行BLM…

docker容器内的应用利用k8s configmap做配置中心

ConfigMap 能带来什么好处? 传统的应用服务都有自己的配置文件,各自配置文件存储在服务所在节点。如果配置出现变更,就需要对应节点的配置文件。Kubernetes 利用了 Volume 功能,完整设计了一套配置中心,其核心对象就是…

阳光万里,祝你上岸——免统考在职研究生

什么是在职研究生 在职研究生,是国家计划内,以在职人员身份,部分时间在职工作,部分时间在校学习的研究生教育的一种类型。在职攻读硕士方式有三种: 1.双证非全日制研究生:为普通高等教育研究生学历&#x…

Android OpenGL 渲染相机预览画面显示体系

OpenGL能进行高效得渲染图形图像,并支持各种复杂的特效和动画。 而在 Android 当中,运用的是OpenGL ES,它是OpenGL的一个轻量级版本,专门用于在移动设备、游戏控制台、嵌入式系统等嵌入式环境中使用。 它可以做相机滤镜或者图片…