6

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

 3 years ago
source link: http://yiiyee.cn/blog/2021/05/01/uefi%e5%bc%80%e5%8f%91%e6%8e%a2%e7%b4%a281-yie002usb%e5%bc%80%e5%8f%91%e6%9d%bf%ef%bc%8804-%e5%88%b6%e4%bd%9chid%e8%ae%be%e5%a4%87%ef%bc%89/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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编程中需要注意的重点。

19 total views, 1 views today


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK