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接口的图片:(来源互联网)
USB信号线:
USB接口有4根线,两根电源线,两根信号线。USB接口的输出电压和电流是:+5V 500mA
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个设备。
常见的USB主控制器规格:
OHCI:主要是非PC系统上的USB芯片
UHCI:大多是 Intel 和 Via 主板上的 USB 控制器芯片。他们都是由USB1.1规格的。
EHCI:由 Intel 等几个厂商研发,兼容 OHCI 和 UHCI ,遵循USB2.0规范。
USB 协议分析
USB设备逻辑结构:
在USB设备的逻辑组织中,包含 设备、配置、接口 和 端点 4个层次。设备通常有一个或多个配置,配置通常有一个或多个接口,接口有零或多个端点。
每个USB设备都可以包含一个或多个配置,不同的配置使设备表现出不同的功能组合,配置由多个接口组成。在USB协议中,接口代表一个基本的功能,一个功能复杂的USB设备可以具有多个接口,而接口是端点的汇集。
举例说明:
一个USB播放器带有音频,视频功能,还有旋钮和按钮。
配置1:音频(接口)+旋钮(接口)
配置2:视频(接口)+旋钮(接口)
配置3:音频(接口)+视频(接口)+按钮(接口)
音频接口,视频接口,按钮接口,旋钮接口均需要一个驱动程序。
USB设备中的唯一可寻址的部分是设备端点,端点的作用类似于寄存器。每个端点在设备内部有唯一的端点号,这个端点号是在设备设计时给定的。主机和设备的通信最终都作用于设备上的各个端点。每个端点所支持的操作都是单向的,要么只读,要么只写。
USB描述符:
在每一个USB设备内部,包含了固定格式的数据,通过这些数据,USB主机就可以获取USB设备的类型、生产厂商等信息。这些固定格式的数据,我们就称之为USB描述符。
标准的USB设备有 5种 USB描述符: 设备描述符,配置描述符,接口描述符,端点描述符,字符串描述符。
1、设备描述符:
一个USB设备只有一个设备描述符,设备描述符长度为18个字节,参考《USB specification : Table-9.8》。
2、配置描述符:
USB配置描述符长度为8个字节,格式参考《USB specification :Table-9.10》。
3、接口描述符:
USB接口描述符长度为8个字节,参考《USB specification Table-9.12》。
4、端点描述符:
USB端点描述符长度为7个字节,参考《USB specification :Table-9.13》。
USB数据通讯
1、USB的数据通讯首先是基于传输(Transfer)的,传输的类型有:中断传输、批量传输、同步传输、控制传输。
2、一次传输由一个或多个事务(transaction)构成,事务可分为:In事务,Out事务,Setup事务。
3、一个事务由一个或多个包(packet)构成,包可分为:令牌包(setup)、数据包(data)、握手包(ACK)和 特殊包 。
4、一个包由多个域构成,域可分为:同步域(SYNC),标识域(PID),地址域(ADDR),端点域(ENDP),帧号域(FRAM),数据域(DATA),校验域(CRC)。
USB设备枚举
USB设备在正常工作以前,第一件要做的事就是枚举。枚举是让主机认得这个USB设备,并且为该设备准备资源,建立好主机和设备之间的数据传递通道。
枚举的过程:
Linux USB 系统架构
开发板既可以作为USB主机使用,也可以作为USB设备来使用。
开发板作为USB主机使用:
在启动了开发板的Linux系统之后,可以将U盘插入开发板上的USB口上,这样开发板就可以作为主机使用。可以使用MassStorage驱动。
MassStorage驱动
内核驱动设置:
1、主控制器驱动设置
2、设备驱动
3、其他配置
在开发板上挂载使用U盘
在U盘插入开发板之后,执行命令:
mount /dev/uba /mnt/
挂载U盘,然后通过 ls /mnt/ 命令就可以查看U盘的文件
开发板作为USB设备使用:
在开发板连接到电脑时,就可以作为USB设备来使用,可以使用 Gadget驱动,该驱动可以把开发板作为网口、串口等设备来使用。
RNDIS驱动(Gadget驱动的一种)
1、控制器驱动
2、Gadget驱动
在上图的例子中,将USB设备作为一个网口来使用。将编译之后的内核模块 .ko 文件拷贝到开发板中,加载模块。
执行 如下命令:
在计算机的设备管理器中会发现多了一个设备:
右击选择更新驱动设备,选择从计算机的设备驱动程序列表中安装,设备类型选择网络适配器,厂商做如下选择:
在安装了驱动之后,就可以在计算机的网络中发现开发板的连接,多了一个网卡。RNDIS驱动在计算机上将USB口模拟成网口,同时RNDIS驱动在开发板上也将USB口模拟成网口,这样就实现了计算机与开发板通过USB的网口连接。
设置计算机的IP地址,在开发板上执行ping命令,就可以ping通计算机。