Linux上的USB简介
Universal Serial Bus (USB) 通用串行总线用于将主机(例如PC或工作站)连接到许多外围设备。
USB使用树形结构,主机作为根(系统的主节点),集线器作为内部节点,外围设备作为叶子(和从节点)。现代PC支持几种此类的USB设备,通常是一些USB 3.0(5 GBit / s)或USB 3.1(10 GBit / s)以及一些旧版USB 2.0(480 MBit / s)总线。
出于多种原因USB设计者设计了主/从不对称性,其中一个是易于使用。从物理角度上不可能在上端和下端出错,对于TypeC类型插头也没关系(或者它们内置在外围设备中)。同样,主机软件不需要处理分布式自动配置,因为预先指定的主节点可以管理所有这些。
内核开发人员在Linux2.2内核的早期就向Linux添加了对USB支持,并且自那时起一直不断迭代开发。除了支持每个新一代USB外,还支持各种主机控制器,同时添加了用于外设的新驱动程序,并引入了用于延迟测量和改进电源管理的高级功能。
Linux可以在USB设备内部运行,也可以在控制设备的主机上运行。但是,在这些外围设备中运行的USB设备驱动程序与在主机中运行的USB设备驱动程序的功能不同,因此为它们指定了不同的名称:gadget drivers。
USB主机端API模型
主机端的USB设备驱动程序与“ usbcore” API进行数据交换。里面有两组API,一个用于通用驱动程序(通过驱动程序框架公开),另一个用于核心驱动程序。这样的核心驱动程序包括集线器驱动程序(管理USB设备的树)和几种不同类型的主机控制器驱动程序,它们控制单个总线。
USB驱动程序中看到的设备模型相对复杂。
-
USB支持四种数据传输(控制,批量,中断和同步)。其中两个(控制和批量)使用可用的带宽,而其他两个(中断和同步)则计划提供有保证的带宽。
-
设备描述模型中包括每个设备的一个或多个“配置”,一次仅激活其中一个。设备应能以低于其最高速度的速度运行,并且可以提供BOS描述符,以显示其保持完全运行的最低速度。
-
从USB 3.0开始,USB集成了一个或多个“功能”,这些功能提供了一种通用功能,并且为了电源管理的目的将它们组合在一起。
-
配置或功能具有一个或多个“接口”,每个接口可能具有“备用设置”。接口可以通过USB“ Class”规范进行标准化,或者可以特定于供应商或设备。
USB设备驱动程序实际上绑定到接口,而不是设备。将它们视为“接口驱动程序”,尽管您可能看不到区别很重要的许多设备。大多数USB设备都很简单,只有一种功能,一种配置,一种接口和一种替代设置。
-
接口具有一个或多个“端点”,每个端点都支持一种类型和方向的数据传输,例如“批量输出”或“中断输入”。整个配置在每个方向上最多可以有16个端点,并根据需要在所有接口之间分配。
-
USB上的数据传输已打包;每个端点都有一个最大的数据包大小。驾驶员必须经常意识到一些惯例,例如使用“短”(包括零长度)数据包标记批量传输的结束。
-
Linux USB API支持对控制消息和批量消息的同步调用。它还使用称为“ URB”(USB请求块)的请求结构支持用于各种数据传输的异步调用。
因此,暴露给设备驱动程序的USB Core API覆盖了很多领域。您可能需要免费查阅USB 3.0规范以及类或设备规范,该规范可从www.usb.org在线获得。
HCD是唯一真正接触硬件(读取/写入寄存器,处理IRQ等)的主机端驱动程序。从理论上讲,所有HCD通过相同的API提供相同的功能。这个处理方法非常正确,但是在不同的HCD上仍然存在一些差异,尤其是在不太常见的控制器上进行故障处理时。不同的控制器报告的故障点不一定相同,并且从故障中恢复(包括由软件引起的故障,例如断开URB的链接)尚不完全一致。设备驱动程序作者应重点针对每个不同的主机控制器驱动程序进行断开连接测试(在设备处于活动状态时),以确保驱动程序不存在自身的错误,并确保它们不依赖某些错误。( HCD特定行为)