1. USB基本概念
- 通用串行总线
- 协议版本发展
usb 1.0 | 1.5Mbps | 低速设备 |
usb 1.1 | 12Mbps | 全速设备 |
usb 2.0 | 480Mbps | 高速设备 |
usb 3.0 | 5Gbps | 极速设备 |
usb 3.1 | 10Gbps | 超速设备 |
2. USB拓扑结构
- 主从结构
- 数据交换只能发生在主从设备之间,主机与主机之间或从机与从机之间是不能通信的
- OTG是一种可以实现主从机角色切换的协议
- 所有从机都必须经过集线器(hub)才能与主机相连
- 与主机直接相连的集线器称为根集线器,用户外接的一般都是普通集线器
- 集线器只能扩展出更多的接口而不是带宽
- usb2.0协议中规定最多扩展7层hub,设备总数不超过127个(包括集线器hub本身)
- 每一个usb设备都有一个唯一的7bit的从机地址(不包括0地址)
3. USB系统硬件框架和软件框架
在USB系统中有两个硬件的概念:
- USB Host:他跟处理器相连,处理器通过USB Host跟各类USB设备通讯。USB Host中集成有一个root hub;
- USB Device:USB设备又分为两类:Hub(用来扩展USB接口)和Function(普通的USB设备,例如U盘和声卡等);
- PS:最多6级Hub;
USB主机是如何检测到设备的插入?
USB集线器的每个下游端口的D+和D-上,分别接了一个15KΩ的下拉电阻到地,在端口悬空时,就被这两个下拉电阻拉到了低电平。而在USB设备端,在D+和D-端接了1.5K欧姆的上拉电阻。对于全速和高速设备,上拉电阻接在D+上,对于低速设备,上拉电阻接在D-上。当设备插入到集线器时,由1.5K的上拉电阻和15K的下拉电阻分压,就将差分数据线中的一条拉高了。集线器检测到这个状态后,就报告给USB主控制器(或者通过他上一层的集线器报告给USB主控制器),这样就检测到设备的插入了。USB告诉设备首先被识别为USB全速设备,然后通过HOST和DEVICE两者之间的确认,再切换到高速模式。
当USB设备插入时,USB主机控制器的D+或D-被拉高,在主机控制器端会产生一个中断发现一个新设备并通过端点0给新设备分配一个地址和获取USB设备的设备描述符,解析设备描述符并通过device_add()将其添加到usb_bus_type链表中,并且匹配链表上的driver程序,匹配成功后调用driver的probe函数,这部分过程类似Platform平台总线驱动。
4. USB驱动中的设备、配置、接口、端点是什么
设备是整个USB系统的基本单位。每个USB设备都提供了不同级别的配置信息,这些配置信息决定了设备在不同情境下如何运作。
配置是设备提供的一种或多种功能组合,用户在使用设备时,需要在这些配置中选择一个。一个USB设备可以有一个或多个配置,每个配置都由多个接口组成。配置的主要作用是使设备在不同的使用场景下,能够表现出不同的功能。
接口在USB协议中,代表了一个基本的功能,是USB设备驱动程序控制的对象。一个复杂的USB设备可能包含多个接口,每个接口都由多个端点组成。接口是端点的集合,每个接口可以包含一个或多个可替换设置,这样用户在使用设备时,可以根据需要改变接口的特性和数量。例如,一个USB扬声器可能包含一个音频接口,用于处理音频数据,以及一个控制接口,用于处理旋钮和按钮的输入。
端点是USB通信的最基本形式,每个USB设备接口在主机看来就是一个端点的集合。主机只能通过端点与设备进行通信,以使用设备的功能。每个端点都有特定的属性,如传输方式、方向(输入或输出)、总线访问频率、带宽、端点号和数据包的最大容量等。在USB系统中,每一个端点都有唯一的地址,这是由设备地址和端点号共同决定的。端点可以看作是一个单向的管道,负责在主机和设备之间传输数据。
假设我们有一个USB摄像头设备。这个设备就是我们所说的USB设备。它可以通过USB接口连接到计算机上,并被计算机识别为一个独立的设备。
这个USB摄像头设备具有多种功能,比如视频录制、拍照等。这些功能是通过不同的配置来实现的。例如,当我们将摄像头设置为拍照模式时,它使用的是一种配置;而当我们将其设置为视频录制模式时,它使用的是另一种配置。这些配置信息在设备内部进行了预定义,并由设备驱动程序根据用户的需求进行加载和使用。
在USB摄像头设备的每个配置中,都包含了多个接口。对于视频录制功能,设备可能包含一个视频接口,用于传输视频数据;对于拍照功能,可能还有一个控制接口,用于接收来自计算机的控制命令,如调整焦距、曝光等。每个接口都由设备驱动程序进行控制和管理,以确保数据的正确传输和处理。
最后,每个接口都由多个端点组成。这些端点是数据传输的通道,负责将视频数据从设备传输到计算机,或者将控制命令从计算机传输到设备。例如,视频接口可能有一个或多个输入端点,用于接收视频数据;控制接口可能有一个输出端点,用于发送控制命令。这些端点都有唯一的地址,以便主机能够准确地找到并与它们进行通信。
在实际使用中,当我们连接USB摄像头到计算机上时,操作系统会自动加载相应的设备驱动程序。驱动程序会根据设备的配置信息,加载并初始化相应的接口和端点。然后,我们就可以通过应用程序与摄像头进行通信,使用其提供的各种功能了。
通过这个实例,我们可以看到,设备、配置、接口和端点在USB驱动中扮演着不同的角色,它们共同构成了USB设备的逻辑架构,使得设备能够与主机进行高效、稳定的数据传输和功能实现。
5. 相关的结构体
- 设备——————struct usb_device(\include\linux\usb.h)
- 设备描述符———struct usb_device_descriptor(\include\uapi\linux\usb\ch9.h)
- 配置——————struct usb_host_config(\include\linux\usb.h)
- 配置描述符———struct usb_config_descriptor(\include\uapi\linux\usb\ch9.h)
- 接口——————struct usb_interface(\include\linux\usb.h)
- 接口描述符———struct usb_interface_descriptor(\include\uapi\linux\usb\ch9.h)