开局一张图
(以下是个人理解,如有不足之处,非常欢迎讨论及指正)
Linux系统USB驱动主要包括主、从两大类驱动。
由上图可看出,左边部分是作为USB主驱动的框架,右边部分是作为USB从设备的驱动框架,中间可由OTG驱动互相转换。
先看左边部分,USB主驱动框架包括:USB设备驱动、USB核心层驱动、USB主控制器驱动。
USB主控制器驱动:干嘛用的?顾名思义就是驱动主控制器的。主控制器干嘛用的?就是用来直接与USB设备通信的。
控制器一般是由SOC厂商研制的,各个厂家不一样,市面上主要有以下四类:
OHCI(Open Host Controller Interface): 微软主导的低速USB1.0(1.5Mbps)和全速USB1.1(12Mbps),OHCI接口的软件简单,硬件复杂
UHCI(Universal Host Controller Interface): Intel主导的低速USB1.0(1.5Mbps)和全速USB1.1(12Mbps), 而UHCI接口的软件复杂,硬件简单
EHCI(Enhanced Host Controller Interface):高速USB2.0(480Mbps),
xHCI(eXtensible Host Controller Interface):USB3.0(5.0Gbps),采用了9针脚设计,同时也支持USB2.0、1.1等
(后续还会有USB4.0 5.0 等等)
内核Menuconfig中为以下几个选项:
--- USB support
<*> xHCI HCD (USB 3.0) support
<*> EHCI HCD (USB 2.0) support
相关驱动文件位于/drivers/usb/host目录下。
USB核心层驱动:核心层驱动不由SOC厂商提供,而是由USB联盟或Linux根据USB协议编制的统一通用接口。一方面向使用 USB 总线的设备驱动提供操作 USB 总线的 API ,另一方面则管理上层驱动传下来的的数据流,按 USB 主控制器的要求放在控制器驱动规定的位置, USB 主控制器会调度这些数据。
内核Menuconfig中为以下几个选项:
--- USB support
<*> Support for Host-side USB
参与编译的文件位于/drivers/usb/core/目录下,主要包括如下几个驱动文件:
该核心层驱动也叫USB子系统模块,是usb设备所必须的驱动层。它注册了USB总线、USB文件系统、USB hub、及USB通用设备驱动等。
USB设备驱动:设备分为两类,一类是Hub驱动,一类是功能驱动。Hub通过端口Port连接更多USB设备,功能设备即USB外接从设备。
从设备主要包括:U 盘(MassStorage), usb 鼠标、键盘(USB-HID),网卡(RNDIS),U转串(CDC-ACM),视频设备(V4L2),打印机,usb 蓝牙模块,usb 读卡器,等。
再看右边部分,USB从设备驱动框架主要包括:Gadget驱动、Gadget API、UDC驱动。
驱动文件位于/drivers/usb/gadget目录下。
UDC驱动:udc驱动直接访问硬件usb控制器ohci、ehci、uhci,作为usb设备和主机间的底层通信,同时向上层提供与硬件相关操作的回调函数。该硬件和驱动负责将本设备依附于一个USB主控制器上。
比如,当某个安卓手机作为U盘连接PC机时,手机USB控制器行使USB设备控制器的功能,调用UDC驱动。
Gadget API:是对UDC驱动程序回调函数简单的包装,硬件无关层。usb gaget 驱动框架不像 usb 主机端有 usb core 的概念,usb 主机可能支持成百类型的外设,把通用功能抽象出来很有意义。Usb device 端则通常没有这个需求,一些通用功能抽象在一些 Helper 函数里就可以了。
Gadget驱动:具体控制系统作为usb设备时的相关功能的实现,使设备表现出“网络连接”、“打印机” 或“USB Mass Storage”等特性。重要的驱动有:
Gadget Zero, 类似于 dummy hcd, 该驱动用于测试 udc 驱动。它会帮助您通过 USB-IF 测试。
Ethernet over USB, 该驱动模拟以太网网口,它支持多种运行方式。
File-backed Storage Gadget最常见的 U 盘功能实现。
再看中间部分,OTG驱动架构(该部分具体逻辑框架,与左右部分的关系还未理清,后续有待更新)。
欢迎转载,欢迎指正,更欢迎点赞。转载请附原文链接。