●Linux的device和driver注册模型
USB的框架遵循“平台总线、设备、驱动”的结构,也分为总线、设备、驱动三大块。其中总线驱动是已经由内核完成的,一旦接入usb设备,总线驱动程序就会找到能处理该设备的驱动进行处理。
● USB的4个层次: 设备 配置 接口 端点
以树/树干/树枝/树叶为例:
一棵树(设备),一般只有一个树干(配置)(当然可以有多个树干,比如榕树),一个树干上有多个树枝(接口 ),每个树枝有多个树叶(端点)。
USB设备是由一些配置(configuration)、接口 (interface)和端点(endpoint)组成,,即一个USB设备可以含有一个或多个配置,在每个配置中可含有一个或多个接口,在每个接口中可含有若干个端点。一个USB设备驱动可能包含多个子驱动。一个USB设备子驱动程序对应一个USB接口,而非整个USB设备,见上图。
●USB驱动核心
在Linux内核中,使用 struct usb_driver结构体来描述一个USB(接口)驱动,通过usb_register在USB驱动中注册进内核。
接口 device的注册函数是usb_register_dev
接口 driver的注册函数是usb_register → usb_register_driver。
宏定义usb_register如下:
/* use a define to avoid include chaining to get THIS_MODULE & friends */
#define usb_register(driver) \
usb_register_driver(driver, THIS_MODULE, KBUILD_MODNAME)
比如鼠标,键盘,u盘,usb转串口,音频,视频等各种各种的物理设备,都会调用usb_register函数来注册。这里一种功能就是一个接口。以HID设备为例,驱动代码如下:
static struct usb_driver hid_driver = {
.name = "usbhid",