UEFI开发探索81- YIE002USB开发板(04 制作HID设备)

请保留-> 【原文:  https://blog.csdn.net/luobing4365 和 http://yiiyee.cn/blog/author/luobing/】

YIE002开发板上的开发,停滞了有一段时间了,这几天重新开始编写。

在最早编写的《UEFI编程实践》的书稿中,我是使用正点原子的探索者F4来制作HID设备的。感觉在自己的书中,使用其他家的开发板和代码,总是觉得有点不对。另外,在其代码上进行改造开发,存在版权的问题。

当然,最主要的,我也希望能有一个容易携带的开发板,方便我回家、或者出差的时候使用。于是才构建了这么一个机会,取名为YIE002。YIE中文含义为“易也”,来自于好友张佩的博客网站YIIEE,同音于中文“耶”和英文“yeah”。该是来自于程序员解决BUG、完成任务时,不由自主发出的欢呼声。

YIE002开发板的开篇中,描述了USB HID通信架构,包含USB HID的设备和上位机程序编写。上位机包括Windows系统、Linux系统和UEFI系统。之前用来两篇,介绍了如何在Windows系统下进行上位机编写,并开发了一个方便使用的调试工具。从本篇开始,介绍如何使用开发板制作USB HID设备,并使之支持三种通信方式。

从我的博客编写规划来说,YIE002的开发,到现在为止,都还没有进入实质的UEFI开发。主要原因在于,USB协议比较复杂。目前的开发,主要关注的是HID类协议,所需要了解的背景知识也非常庞杂。

在没有掌握USB协议相关的知识前,去读UEFI中关于USB的Protocol,会满头雾水,无法理解的。

因此,我觉得还是有必要通过学习制作USB HID设备,用几篇博客的篇幅,大致了解了USB协议的框架和编程方法,才能深入理解UEFI下USB设备的访问方法。

1 USB规范简介

通用串行总线(Universal Serial Bus,简称USB)由Intel、IBM、微软等计算机和通信公司,于1995年联合制定,解决旧有接口的问题,以适应当时计算机的飞速发展。作为一种高速串行总线,其极高的传输速度可以满足高速数据传输的应用环境要求。并且由于它供电简单、支持热插拔、扩展端口简单以及传输方式多样化等特点,目前广泛应用于各种计算机、手机等电子设备中。

相比于RS-232、PS/2等传统接口,USB最突出的特点是,其扩展性极强。RS-232等传统接口,一个预留接口只能用来连接一个相关设备,当需要扩展时,必须占用大量的计算机内部资源(如系统I/O口、中断向量和总线地址等)。而一个USB口,可以通过USB集线器,连接127个USB设备。USB简便的外设连接方式,以及优良的数据传输功能,为计算机外设接口带来了革命性的变化。

USB标准规范包括USB1.0、USB1.1、USB2.0、USB3.0,以及2019年9月发布的USB4TM规范。如表1所示,从推出时间、传输速率等方面,对USB规范的各版本进行了描述。

表1 USB规范各版本信息

USB版本最大传输速率名称推出时间
USB1.01.5Mbps低速(Low-Speed)1996年1月
USB2.0480Mbps高速(High-Speed)2000年4月
USB3.0(USB3.2 Gen 1)5Gbps超高速(Super-Speed)2008年11月
USB3.1(USB3.2 Gen 2)10Gbps超高速(Super-Speed 10Gbps)2013年12月
USB3.2(USB3.2 Gen 2×2)20Gbps超高速(Super-Speed 20Gbps)2017年9月
USB4TM (USB4 Gen 2×2)20GbpsUSB4TM 20Gbps2019年9月
USB4TM(USB4 Gen 3×2)40GbpsUSB4TM 40Gbps2019年9月

USB规范标准包括三个部分:USB基本规范、USB设备类规范和USB主控制器规范。其中,USB基本规范描述了USB1.0、USB1.1、USB2.0等各代USB的协议规范,以及USB OTG协议规范。USB主控制器规范描述了USB主控制器的协议内容,USB设备类规范则描述了USB设备的协议内容。

USB系统一般由USB主机(USB Host)、一个或多个USB集线器(USB Hub)和一个或多个USB设备节点(Node)组成。如图1所示的USB总线拓扑结构,给出了USB各类设备的物理连接示意图。

图1 USB总线拓扑结构

USB的物理连接是层次性的星型结构,在系统中,有且仅有一个USB主机,而与主机直接连接的Hub一般称为根集线器(即RootHub)。USB系统中,USB集线器实际上就是一个具有特殊功能的USB设备。所有的USB设备都连接在USB集线器上,同时集线器有责任为每个连接其上的USB设备提供+5V/500mA的电源。

USB总线采用的是树形结构、主从工作模式。USB主机根据各个设备的属性,周期性访问各个设备。而USB设备则是被动响应USB主机的访问请求,这样避免了USB设备主动发送数据时可能导致的总线冲突。当然,这样就导致没有USB主机的情况下,USB设备之间是无法通讯的。为解决此问题,在制定USB2.0的规范时,USB-IF提出了USB OTG(USB On-The-Go)技术,拓展了USB在嵌入式设备,如手机、PDA等方面的应用。

2 软件工程师眼中的USB系统

在软件层面,从系统设计和逻辑连接关系上考虑,USB总线系统具有明确的分层结构。USB设备与主机的驱动/应用程序通信,是通过特定的USB端点来实现的。

整个USB系统可以分为USB总线接口层、USB设备层和功能层,如图2所示。

图2 USB系统的软件结构

整个USB系统可以分为USB总线接口层、USB设备层和功能层,如图2所示。

这几层的各自完成的功能如下。

2.1 USB总线接口层

USB总线接口层主要用于实现USB主机和USB设备之间的数据传输,实际的数据流是在此层运行的。USB规范中 ,USB总线接口NRZI编码(反向归零编码)来传输数据。编码的过程是自动进行的,由USB系统硬件完成。

2.2 USB设备层

USB设备层主要用于管理USB设备,包括分配USB地址、读取设备描述符等。在这一层中,USB主机可以获取USB设备的各种属性或能力。这部分的功能,USB主机通过驱动软件来完成,而USB设备的固件层也需要编写对应的代码进行支持。

2.3 功能层

功能层主要负责数据传输,由USB设备的功能单元和对应的USB主机程序实现。按照双方通信的类型,可分为如下四种:

控制传输(Control Transfers)。主要用于传输少了的对时间和速率没有要求的数据,一般用于USB主机读取或设置USB设备的配置信息,或者其他的简单操作。

中断传输(Interrupt Transfers)。主要用于传输少了对传输时间具有周期性要求的数据,在鼠标、键盘等HID设备中经常使用。

批量传输(Bulk Transfers)。用于传输大量的、对传输时间和速率没有严格要求的数据。

实时传输(Isochronous Transfers)。用于传输大量的、且传输时间具有周期性、速率恒定的数据。

在我们设计的USB HID设备的传输中,主要使用的是控制传输。

本篇对于USB的介绍,就到此为止。下一篇将详细介绍USB描述符,USB主机通过对这些描述符的访问,实现对USB设备的类型识别、配置并为其提供相应的客户端驱动程序,是USB编程中需要注意的重点。

931 total views, 3 views today

发表评论

电子邮件地址不会被公开。