开局一张图
(以下是个人理解,如有不足之处,非常欢迎讨论及指正)
Linux系统USB驱动主要包括主、从两大类驱动。
由上图可看出,左边部分是作为USB主驱动的框架,右边部分是作为USB从设备的驱动框架,中间可由OTG驱动互相转换。
USB主驱动的框架
先看左边部分,USB主驱动框架包括:USB设备驱动、USB核心层驱动、USB主控制器驱动。
一、USB主控制器驱动
这里主控制器其实是广义的,主要包括:主控制器(OHC、EHC等控制器)、根集线器(Root Hub)、PHY芯片。这是由于目前大部分厂商已经把根集线器和PHY集成在控制器中。
1.先说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目录下。
2.再说根集线器:
根集线器是USB的第一个设备,通过它再拓扑连接各种集线器和USB设备。目前主控器普遍集成根集线器,方便接入多种设备。
如果没有根集线器,则是一对一点对点连接。
内核Menuconfig中参考以下几个选项:
--- USB support
相关驱动文件位于/drivers/usb/host目录下。
3.最后PHY芯片:
引入: 相关复杂协议(eg. USB)需要分层实现,如用户层、数据链路层、物理层等。
主要作用:用来实现协议物理层相关技术,如底层的信号转换。
形式:控制器内部、控制器外部
主要工作内容:(1)数据的分包,如包头包尾。(2)时序的定义。(3)电平的转换。
内核Menuconfig中为以下几个选项:
--- USB support
USB Physical Layer drivers --->
<*> Freescale MXS USB PHY support
相关驱动文件位于/drivers/usb/phy目录下。
二、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总线只有一个USB Host,对应一个RootHub。
三、USB设备驱动:
设备分为两类,一类是Hub驱动,一类是功能驱动。Hub通过端口Port连接更多USB设备,功能设备即USB外接从设备。
从设备主要包括:U 盘(MassStorage), usb 鼠标、键盘(USB-HID),网卡(RNDIS),U转串(CDC-ACM),视频设备(V4L2),打印机,usb 蓝牙模块,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
再看中间部分,OTG驱动架构(该部分具体逻辑框架,与左右部分的关系还未理清,后续有待更新)。
OTG(On The Go):该协议是在USB2.0时引入的一种mode,提出了一个新的概念叫主机协商协议(Host Negotiation Protocol),允许两个设备间商量谁去当Host。为了让设备可以充当主从两个角色,主设备即HCD,从设备即UDC,也就是Gadget。
主要应用场景:OTG技术就是实现在没有Host的情况下,实现从设备间的数据传输。
特色: 更具节能性的电源管理 和 允许设备以主机、从设备两种方式工作。
OTG设备类型:两用OTG设备(Dual role device) 、 外设式OTG设备(Peripheralonly OTG device)
传输协议:ADP,SRP,HNP
ADP(Attach Detection Protocol): 当USB总线上没有供电时,ADP允许OTG设备或USB设备决定连接状态。
SRP(Session Request Protocol) :允许从设备也可以控制主设备。
HNP(Host Negotiation Protocol) :允许两个设备互换主从角色
协议角色:OTG A-device:电源提供者,主设备。 OTG B-device:电源消费者,从设备。 两角色可通过HNP协议互换。
OTG转换控制器:由SOC厂商或者控制器厂商提供,源码位于/drivers/usb/otg或者其他实例化IP方案目录下。OTG转换控制器通过USB ID 电平高低来决定是启用Host控制器还是Gadget控制器。
主要思路:当OTG线缆上有otg设备插入时,XX产生中断,中断处理函数通过读取OTG控制器寄存器的值来判断设备属于Host设备还是Gadget设备,然后通过相应函数重启Host控制器或Gadget控制器。
OTG转换驱动:主要包括:主驱动、设备驱动、otg转换驱动 (有待更正)
OTG硬件电路实现:
欢迎转载,欢迎指正,更欢迎点赞。转载请附原文链接。