1.USB简介

    USB,即Universal Serial Bus(通用串行总线)的缩写,是一个外部总线标准,用于规范电脑与外部设备的连接和通讯。USB接口支持设备的即插即用和热插拔功能。USB是在1994年底由英特尔、康柏、IBM等多家公司联合提出的。USB版本经历了多年的发展,现已经发展为3.1版本,成为当今PC中的标准扩展接口。当前主要采用USB2.0和USB3.0接口,USB各版本间能很好的兼容。

    USB采用四线电缆,其中两根是用来传送数据的串行通道,另两根为设备提供电源,对于任何已经成功连接且相互识别的外设,将以双方设备均能够支持的最高速率传输数据。USB总线会根据外设情况在所兼容的传输模式中自动地由高速向低速动态转换且匹配锁定在合适的速率。USB是基于令牌的总线。类似于令牌环网络或FDDI基于令牌的总线。USB主控制器广播令牌,总线上设备检测令牌中的地址是否与自身相符,通过接收或发送数据给主机来响应。USB通过支持挂起/恢复操作来管理USB总线电源。USB系统采用级联星型拓扑,该拓扑由三个基本部分组成:主机(Host),集线器(Hub)和功能设备。

2.驱动架构

2.1 驱动架构

    USB是一种主从结构的系统。主机叫做Host,从机叫做Device;一般情况下,PC作为USB host端,手机等数码设备作为USB device,OTG(On the Go)则使设备即可以是USB device也可以是USB host;通常,作为USB device的设备被称为Gadget。

    所有支持USB通讯的设备端都有USB device程序,通常称它们为USB固件。在一些功能简单的设备里,用一些专用的可编程USB控制器就可以完成USB device功能。而在一些运行了操作系统的复杂的嵌入式系统中,要完成USB device程序,就会要求你不仅熟悉USB device控制器的操作,还要熟悉操作系统的驱动架构。

    USB驱动架构如图 2-1所示。

USB 驱动架构浅析_USB

图 2-1 USB主机端和设备端驱动架构

2.1.1 主机端

    在主机端,有USB HCD和USBD两个接口层。

    USB HCD的全称为主机控制器驱动(Host Controller Driver),它是对主机控制器硬件的一个抽象,提供与USB系统软件之间的软件接口。

    从客户软件的角度看,USBD控制所有的USB设备,因此客户软件对设备的控制和所要发送的数据只要交给USBD就可以了。USBD为客户软件提供命令机制和管道机制。客户软件通过命令机制可以访问所有设备的0号端点且与默认管道通信,从而实现对设备的配置和其他一些基本的控制工作。管道机制允许客户和设备实现特定的通信功能。该默认管道描述了一条USBD和USB设备间通信的逻辑通道。

主机端各层有以下功能:

1)检测连接和移去的USB设备。

2)管理主机和USB设备间的数据流。

3)连接USB状态和活动统计。

4)控制主控制器和USB设备间的电气接口,包括能量供应。

2.1.2 设备端

    在设备端,Gadget API定义了一个通用的Gadget Driver的接口,Gadget Driver通过Gadget API与底层USB Device Controller Driver通信。其中Gadget API层屏蔽了底层硬件的不同,使Gadget Driver注重功能的实现,尽量与硬件无关。

2.2 USB主机端驱动架构

    USB主机端驱动架构如图 2-2所示。

USB 驱动架构浅析_USB_02

图 2-2 USB主机端驱动架构

    USB核心(USBD)是整个USB驱动的核心部分,从图 22可知,一方面USBD对从USB主机控制器接收到的数据进行处理,并传递给上层的设备端驱动软件;同时也接收来自上层的非USB格式数据流,进行相应的数据处理后传递给USB主机控制器驱动。

2.3 设备控制器驱动架构

    设备端控制器基本架构如图 2-3所示。

USB 驱动架构浅析_USB_03

图 2-3 设备端控制器基本架构

    USB设备控制器驱动主要实现Gadget API定义的函数和中断服务函数,可按功能划分为:API函数实现模块和中断处理模块。

    API函数主要实现Gadget API定义的函数功能,如结构体usb_ep_ops和usb_gadget_ops中的函数、usb_gadget_register_driver函数。这些函数提供给Gadget Driver调用。

    中断处理模块主要处理设备控制器产生的各种中断,包括端点中断、复位、挂起等中断。

3.参考资料