天天看点

Linux USB总线架构

USB 总线介绍

USB发展史:

USB(Universal Serial Bus ),通用串行总线,是一种外部总线标准,用于规范电脑与外部设备的连接和通讯。USB是在1994年底由英特尔、康柏、IBM、Microsoft等多家公司联合提出的,自1996年推出后,已成功替代串口和并口,成为当今个人电脑和大量智能设备的必配接口之一。

  • USB 1.0出现在1996年的,速度只有1.5Mb/s。
  • 1998年升级为USB 1.1,速度也提升到12Mb/s,称之为 “full speed”。
  • USB2.0规范是由USB1.1规范演变而来的。它的传输速率达到了 480Mbps ,称之为“high speed”。
  • USB3.0提供了十倍于USB 2.0的传输速度和更高的节能效率,被称为“super speed”。

各种型号USB接口的图片:(来源互联网)

Linux USB总线架构

USB信号线:

USB接口有4根线,两根电源线,两根信号线。USB接口的输出电压和电流是:+5V 500mA

Linux USB总线架构

USB电源: 标有VCC、Power、5V、5VSB字样

USB数据线:(正)DATA+、USBD+、PD+、USBDT+

USB数据线:(负)DATA-、USBD-、PD-、USBDT-

地线: GND、Ground

系统拓扑结构:

对于每个USB系统来说,都有一个称为主机控制器的设备,该控制器和一个 根 Hub 作为一个整体。这个根Hub下可以接多级的Hub,每个子Hub又可以接子Hub。每个USB设备作为一个节点接在不同级别的Hub上。 每条USB总线上最多可以接127个设备。

Linux USB总线架构
Linux USB总线架构

常见的USB主控制器规格:

OHCI:主要是非PC系统上的USB芯片

UHCI:大多是 Intel 和 Via 主板上的 USB 控制器芯片。他们都是由USB1.1规格的。

EHCI:由 Intel 等几个厂商研发,兼容 OHCI 和 UHCI ,遵循USB2.0规范。

USB 协议分析

USB设备逻辑结构:

在USB设备的逻辑组织中,包含 设备、配置、接口 和 端点 4个层次。设备通常有一个或多个配置,配置通常有一个或多个接口,接口有零或多个端点。

Linux USB总线架构

每个USB设备都可以包含一个或多个配置,不同的配置使设备表现出不同的功能组合,配置由多个接口组成。在USB协议中,接口代表一个基本的功能,一个功能复杂的USB设备可以具有多个接口,而接口是端点的汇集。

举例说明:

一个USB播放器带有音频,视频功能,还有旋钮和按钮。

配置1:音频(接口)+旋钮(接口)

配置2:视频(接口)+旋钮(接口)

配置3:音频(接口)+视频(接口)+按钮(接口)

音频接口,视频接口,按钮接口,旋钮接口均需要一个驱动程序。

USB设备中的唯一可寻址的部分是设备端点,端点的作用类似于寄存器。每个端点在设备内部有唯一的端点号,这个端点号是在设备设计时给定的。主机和设备的通信最终都作用于设备上的各个端点。每个端点所支持的操作都是单向的,要么只读,要么只写。

USB描述符:

在每一个USB设备内部,包含了固定格式的数据,通过这些数据,USB主机就可以获取USB设备的类型、生产厂商等信息。这些固定格式的数据,我们就称之为USB描述符。

标准的USB设备有 5种 USB描述符: 设备描述符,配置描述符,接口描述符,端点描述符,字符串描述符。

1、设备描述符:

一个USB设备只有一个设备描述符,设备描述符长度为18个字节,参考《USB specification : Table-9.8》。

Linux USB总线架构

2、配置描述符:

USB配置描述符长度为8个字节,格式参考《USB specification :Table-9.10》。

Linux USB总线架构

3、接口描述符:

USB接口描述符长度为8个字节,参考《USB specification Table-9.12》。

Linux USB总线架构

4、端点描述符:

USB端点描述符长度为7个字节,参考《USB specification :Table-9.13》。

Linux USB总线架构

USB数据通讯

1、USB的数据通讯首先是基于传输(Transfer)的,传输的类型有:中断传输、批量传输、同步传输、控制传输。

Linux USB总线架构

2、一次传输由一个或多个事务(transaction)构成,事务可分为:In事务,Out事务,Setup事务。

Linux USB总线架构

3、一个事务由一个或多个包(packet)构成,包可分为:令牌包(setup)、数据包(data)、握手包(ACK)和 特殊包 。

Linux USB总线架构

4、一个包由多个域构成,域可分为:同步域(SYNC),标识域(PID),地址域(ADDR),端点域(ENDP),帧号域(FRAM),数据域(DATA),校验域(CRC)。

Linux USB总线架构

USB设备枚举

USB设备在正常工作以前,第一件要做的事就是枚举。枚举是让主机认得这个USB设备,并且为该设备准备资源,建立好主机和设备之间的数据传递通道。

枚举的过程:

Linux USB总线架构

Linux USB 系统架构

开发板既可以作为USB主机使用,也可以作为USB设备来使用。

开发板作为USB主机使用:

Linux USB总线架构

在启动了开发板的Linux系统之后,可以将U盘插入开发板上的USB口上,这样开发板就可以作为主机使用。可以使用MassStorage驱动。

MassStorage驱动

内核驱动设置:

1、主控制器驱动设置

Linux USB总线架构

2、设备驱动

Linux USB总线架构

3、其他配置

Linux USB总线架构
Linux USB总线架构
Linux USB总线架构
Linux USB总线架构

在开发板上挂载使用U盘

在U盘插入开发板之后,执行命令:

mount /dev/uba /mnt/

挂载U盘,然后通过 ls /mnt/ 命令就可以查看U盘的文件

开发板作为USB设备使用:

在开发板连接到电脑时,就可以作为USB设备来使用,可以使用 Gadget驱动,该驱动可以把开发板作为网口、串口等设备来使用。

Linux USB总线架构

RNDIS驱动(Gadget驱动的一种)

1、控制器驱动

Linux USB总线架构

2、Gadget驱动

Linux USB总线架构

在上图的例子中,将USB设备作为一个网口来使用。将编译之后的内核模块 .ko 文件拷贝到开发板中,加载模块。

执行 如下命令:

Linux USB总线架构

在计算机的设备管理器中会发现多了一个设备:

Linux USB总线架构

右击选择更新驱动设备,选择从计算机的设备驱动程序列表中安装,设备类型选择网络适配器,厂商做如下选择:

Linux USB总线架构

在安装了驱动之后,就可以在计算机的网络中发现开发板的连接,多了一个网卡。RNDIS驱动在计算机上将USB口模拟成网口,同时RNDIS驱动在开发板上也将USB口模拟成网口,这样就实现了计算机与开发板通过USB的网口连接。

设置计算机的IP地址,在开发板上执行ping命令,就可以ping通计算机。

继续阅读