Linux系统USB之协议驱动框架


开局一张图

(以下是个人理解,如有不足之处,非常欢迎讨论及指正

 

 

 

 

 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 APIUDC驱动

驱动文件位于/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硬件电路实现

 

 

 


 欢迎转载,欢迎指正,更欢迎点赞。转载请附原文链接。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM