USB基础---Linux USB驱动层次
在Linux系统中,提供主机侧和设备侧视角的USB驱动框架,从主机侧看到的USB主机控制器和设备驱动,以及从设备侧看到的设备控制器和Gadget驱动。
- Linux系统中USB驱动的整体视图
图1
(1) Mass storage
USB Mass Storage Device ,USB大容量设备,比如我们的移动硬盘,或者是我们手机连接PC时作为一个大容量设备。
(2) CDC
CDC(Communication Device Class)类是USB2.0标准下的一个子类,定义了通信相关设备的抽象集合。它与USB2.0标准以及其下的子类的相互关系如下图所示:
图2
(3) HID
人机接口设备Human Interface Device的缩写,由其名称可以了解HID设备是直接与人交互的设备,例如键盘、鼠标与游戏杆等。不过HID设备并不一定要有人机接口,只要符合HID类别规范的设备都是HID设备。
(4) UDC(USB device controller)
图3
- 主机侧与设备侧USB驱动
2.1 主机侧
从主机侧的角度看,需要编写的USB驱动包括USB主机控制器驱动和USB设备驱动两类,USB主机控制器驱动程序控制插入其中的USB设备,而USB设备驱动程序控制该设备如何作为从设备与主机通信,比如图3右边,Android设备作为主机,USB主机控制器驱动程序控制插入其中的USB键盘,而USB设备驱动此时对应HID(包括USB键盘)的驱动。
每条总线上只有一个主机控制器,负责协调主机和设备间的通信,而设备不能主动向主机发生任何消息。
USB核心负责USB驱动管理和协议处理的主要工作。其功能包括:通过定义一些数据结构、宏、功能函数,向上为设备驱动提供编程接口,向下为USB主机控制器驱动提供编程接口;维护整个系统的USB设备信息;完成设备热拔插控制、总线数据传输控制等。
2.2 设备侧
Linux内核的USB设备侧驱动程序分为3个层次:UDC驱动程序、Gadget(小配件) Function API和Gadget Function驱动 。
UDC驱动程序直接访问硬件,控制USB设备和主机间的底层通信,向上层提供与硬件相关操作的回调函数。Gadget Function API是UDC驱动程序回调函数的简单封装。Gadget Function驱动具体控制USB设备功能的实现,使设备表现为“网络链接”、“打印机”或“USB Mass Storage”等特性,它使用Gadget Function API控制UDC实现这些功能。Gadget Function API把下层的UDC驱动和上层到Gadget Function驱动隔离开,是的在linux系统中编写USB设备侧驱动时能够把功能的实现和底层通信分离。