Linux USB Subsystem
Linux 包括了一个 USB Core 的子系统。其包含了一组特定的API函数来支持USB设备和主机控制器。
USB Core 中包含了通用于所有 USB 设备和主机控制器驱动程序的函数。这些函数可以划分成上层和底层API。
从下图可以看出,一类API是为USB设备驱动程序服务,另一类为主机控制器驱动程序服务。
|
USB Device Driver Framework
USB设备驱动通过USB子系统框架进行注册/注销。每个USB设备驱动应该注册两个入口点和入口名字,并且注册一组文件操作指针和一个minor number。
所有USB设备的 major number 都是 180。
Framework Data Structures
所有USB相关函数或数据结构都遵从相同的命名规则,且以usb_ 为前缀。
下图列出了注册usb驱动到USB子系统的数据结构。
- name: 模块名
- probe: 侦测函数入口
- disconnect: 断开函数入口
- driver_list: 子系统内部使用
- fops: 驱动程序通用文件操作列表
- minor: 被分配给该驱动的 minor number 基值(该值应该是16的倍数)。
- serialize: 串行化
- ioctl: I/O接口控制
- id_table:
Framewor Entry Point
USB驱动框架针对常规设备驱动增加了两个入口函数。
- void *probe(struct usb_device *dev, unsigned int interface, const struct usb_device_id *id_table);
当新设备被连接上总线时,该入口函数被调用。驱动将为新设备创建其内部数据结构的实例。
dev 参数指定了设备上下文, 包含了所有 USB 描述符的指针。
interface 参数指定了接口值。 如果usb驱动希望去绑定一个特定的设备和接口,它将返回一个指针;该指针指向了驱动程序的上下文数据结构。
probe 函数通常检查 usb 供应商和产品信息,或者usb class 和 subclass 定义。如果和驱动支持的接口数值进行比较后其相等,将继续解析更多的 USB 描述符。
一个简单的 probe 函数示例如下:
- void disconnect(struct usb_device *dev, void *drv_context);
当USB驱动服务的设备被拔出时, disconnect() 函数被调用。
dev 参数指定了设备上下文。
drv_context 参数返回一个指向先前由 probe() 函数注册的 drv_context 指针。
一旦 disconnect() 函数返回, USB 框架将释放所有关联该设备的数据结构。 usb_driver 数据结构不能再被驱动使用。
一个简单的 disconnect() 函数示例如下: