嵌入式系统与单片机|技术阅读
登录|注册

您现在的位置是:嵌入式系统与单片机 > 技术阅读 > 大胆盘一盘linux-usb

大胆盘一盘linux-usb

一、导读

本文主要描述linux的usb子系统,此子系统较为庞大,且usb本身也比较复杂,本文姑且跳过这些复杂的话题,首先对usb做一个简单描述,接着会基于linux从硬件和软件视角描述usb结构和框图。

(1-1)USB简介

USB( Universal Serial Bus)是通用串行总线,用于计算机与外部设备的连接和通信。现如今USB接口可以说是随处可见,得到了大范围的应用。

从USB发展史来看,出现了几个版本:USAB1.0、USB2.0、USB3.0、USB4.0

  • USB1.0:USB 规范于 1995 年第一次发布,由 Intel、IBM、Microsoft 等公司组成的 USB-IF(USB Implement Forum)组织提出。USB-IF 与 1996 年正式发布 USB1.0,理论速度为 1.5Mbps。1998 年 USBIF 在 USB1.0 的基础上提出了 USB1.1 规范。

  • USB2.0:USB2.0 依然由 Intel、IBM、Microsoft 等公司提出并发布,USB2.0 分为两个版 本:Full-Speed 和 High-Speed,也就是全速(FS)和高速(HS)。USB2.0 FS 的速度为 12Mbps,USB2.0 HS 速度为 480Mbps。目前大多数单片机以及低端 Cortex-A 芯片配置的都是 USB2.0 接口。

  • USB3.0:最大理论传输速度为 5.0Gbps,USB3.0引入了全双工数据传输,USB2.0 的 480Mbps 为半双工。USB3.0 中有两根线用于发送数据,另外两根用于接收数据。除此之外,在USB3.0的基础上又提出了USB3.1、USB3.2等规范。

  • USB4.0:USB4 1.0规范于2019年8月发布,速度提升到了 40Gbps。

二、USB硬件视角

(2-1)各式各样的USB接口

USB接口经过近20年的演化过程,产生了非常多的分支,常见接口总结如下:

  • USB A
  • USB B

  • Micro USB / Mini USB

  • USB TypeC
  • USB规范
  • 接头类型

(2-2)USB硬件方案

小生对比了目前常见的一些处理器,发现对USB硬件部分IP大多遵循以下结构:

  • 直接连接
  • 使用Hub扩展多个USB物理接口,例如GL850G USB2.0 Hub芯片,结构框图总结如下:

例如瑞芯微rk3568处理器的USB部分:


UTMI是USB的PHY协议,英文全称USB 2.0 Transceiver Macrocell Interace。UTMI+则是由UTMI发展而来,为USB系统增加了主机和OTG功能。协议升级到UTMI+之后UTMI就被定义为UTMI LEVEL0,如下图所示:

三、Linux-USB软件视角

从软件视角看linux-usb子系统,可总结出下图所示结构:
  • USB Core核心

USB核心由一系列基础代码组成,这些基础代码包括了用于描述USB子系统的结构体和相关函数实现,这些函数供主机控制器驱动(HCD)和USB客户驱动程序使用,还用于导出相关的接口到用户空间,例如usbfs文件系统。

  • HOST控制器驱动

对于常见、主流的USB HOST控制器驱动,在linux内核中都提供有对应的驱动程序,例如:UHCIOHCIEHCIxHCI。如果处理器的USB HOST控制器符合标准的控制器规范,则可以直接使用内核提供的标准HOST控制器驱动。

  • HUB驱动

在USB主机控制器中一般内嵌了一个叫根集线器的硬件,HUB驱动则用于驱动这个硬件。

linux内核USB子系统下提供了基础设施或者辅助线程用于监测USB端口状态变化和配置热插拔设备,通常情况下该线程处于睡眠状态,当Hub驱动程序检测到USB端口状态变化后,该内核线程被立马唤醒执行对应的操作。

  • 客户端驱动程序

客户端驱动程序是用于操作具体USB设备的驱动程序。

对于USB端到端的操作,往往需要USB子系统配合其他的内核层来共同完成。例如:一个USB-蓝牙键盘,则需要USB子系统、蓝牙层、input子系统和tty层来共同完成。

linux-usb子系统框图