USB标准
- USB1.0, 1996,低速1.5Mbps和高速12Mbps,USB1.1 iMac G3,Type A和Type B接口
- USB 2.0 2000, 480Mpbs,Type A/B/C接口、Micro A/B
- USB 3.0 5Gbps, 随着USB 3.2命名规定,现在也叫USB 3.2 Gen1
- USB 3.1 10Gpbs,现在称为USB 3.2 Gen2
- USB 3.2 USB 3.2 Gen2*2 10Gpbs
- USB 4,基于雷电3协定,功率提升到240W, 40Gbps
USB接口类型TypeA/B/C
https://zhuanlan.zhihu.com/p/447595295
USB端点
端点可以看作是一个单向的管道,USB通讯的基本方式是通过端点完成的,端点有四种类型:
- CONTROL控制:允许对USB设备的不同部分存取,常用来配置设备、获取关于设备的信息、发送命令到设备、获取设备的状态报告
- INTERRUPT中断:创送少量的数据,固定传输速率,比如USB键盘和鼠标
- BULK块:传送大量的数据,不能有数据丢失,比如打印机、存储器和网络设备上
- ISOCHRONOUS同步:传送大量数据、但是数据不保证完成,比如实时数据采集设备,如音频或者视频
USB接口
USB端点被绑在接口中,USB接口只处理一类USB逻辑连接,每个USB驱动控制一个接口
USB配置
USB接口被捆绑到配置上,一个USB设备可能有多个配置并在它们之间转换
USB设备、端点、接口、配置关系
- 设备通常有一个或者多个配置
- 配置常常有一个或者多个接口
- 接口常常有一个活动多个设置
- 接口有零或者多个端点
URB
USB Request Block,一个URB用来发送或者接受数据
URB声明周期
- 被一个USB设备驱动创建
- 安排一个特定的USB设备的特定端点
- 被USB设备驱动提交给USB核心
- 提交给被USB核心指定的USB主机控制器驱动
- 被USB主机控制器处理,进行一次USB设备的传送
- URB完成时,USB主机控制器驱动通知USB设备驱动
USB驱动总统框架
从主机侧看:
USB主机控制器:负责协调主机和设备的通信
USB主机控制器驱动:控制插入的USB设备
USB核心:USB驱动管理和协议处理的主要工作,定义一些数据结构、宏和功能函数,向上为设备驱动提供编程接口、向下为USB主机控制器驱动提供编程接口,维护整个系统USB设备信息,完成设备热插拔控制,总线数据传输
USB设备驱动:控制USB设备如何与主机通信
从设备侧看:
- UDC驱动程序直接访问硬件、控制USB设备和主机间的底层通信,向上提供与硬件相关操作的回调函数
- Gadget Function API是UDC驱动程序回调函数的简单包装
- Gadget Function驱动程序具体控制USB设备功能的实现,使设备表现出网络连接、打印机或者USB Mass Storage等特性
USB主机控制器驱动
OHCI:非PC系统上以及带有SiS和ALi芯片组的PC主板
UHCI:大多数其他主板上的USB芯片
EHCI:兼容OHCI和UHCI
xHCI:面向USB 3.0
USB的探测和断开函数
探测函数:设备插入时初始化硬件资源
断开函数:设备拔出时释放硬件资源
Gadget Function驱动
- Ethernet over USB:驱动模拟以太网网口,例如CDC Ethernet、CDC Subset以及RNDIS
- File-Backed Storage Gadget: 最常见的U盘功能实现
- Serial Gadget: 串口,例如Generic Serial和CDC ACM规范实现
- Gadget MIDI:暴露ALSA MIDI接口
- USB Video Class Gadget驱动:让Linux系统成为另外一个系统的USB视频采集源
- GadgetFS:Gadget文件系统
DMA
工作原理: DMA是一种数据传输方式,允许外部设备(如硬盘控制器、网络接口等)直接访问系统内存,而不需要CPU的直接干预。DMA控制器获得系统总线的控制权,通过将数据直接从外部设备传输到内存或从内存传输到外部设备,从而避免了CPU的中断和参与,提高了数据传输效率。
应用场景: 适用于需要大量数据传输或实时数据传输的场景,比如高速网络数据包处理、高性能存储设备等。DMA通常用于设备之间的数据传输,而不涉及CPU直接处理数据。
mmap
工作原理: mmap是一种内存映射技术,允许将文件或其他对象映射到进程的地址空间中。这样,进程可以直接通过访问内存来读写文件内容,而不需要通过传统的文件I/O调用。mmap允许文件数据在内存中进行缓存和访问,提高了文件访问速度。
应用场景: 主要用于文件I/O,可以加速对文件的访问。在许多情况下,将文件映射到内存中可以提高读写文件的效率,并允许以更直接的方式处理文件数据。