Linux下usb设备驱动涉及的结构体
一. 简介
本文简单学习一下,Linux下usb设备驱动的框架,以及涉及的结构体。
在 Linux 内核中,USB 设备驱动的设计遵循分层架构,基于内核提供的 USB 子系统框架实现。其核心目标是屏蔽硬件细节,通过统一的接口实现设备枚举、数据传输和资源管理。
二. Linux下usb设备驱动涉及的结构体
Linux USB 驱动的核心结构体之间存在明确的层次关系(设备→配置→接口→端点),以下是最关键的结构体及其作用:
1. struct usb_driver
(USB 设备驱动核心)
该结构体是 USB 设备驱动的 “总入口”,定义了驱动的行为和支持的设备类型,负责找到设备,管理usb设备连接和断开的作用。核心成员如下:
struct usb_device {struct usb_device *parent; // 父设备(如 USB 集线器)struct usb_bus *bus; // 设备所属的 USB 总线unsigned int devnum; // 设备在总线上的地址(1~127)enum usb_device_speed speed; // 设备速度(低速/全速/高速/超高速)struct usb_device_descriptor descriptor; // 设备描述符(厂商 ID、产品 ID 等)struct usb_config_descriptor *config; // 当前激活的配置描述符struct usb_interface **interfaces; // 设备的接口数组(一个配置包含多个接口)struct usb_host_endpoint *ep0; // 端点 0(默认控制端点)// 其他成员(如设备状态、电源管理信息、私有数据等)...
};
2. struct usb_device
(代表一个 USB 设备)
该结构体描述一个完整的 USB 设备(物理设备),包含设备的全局信息(如厂商信息、速度、配置等),核心成员如下:
struct usb_device {struct usb_device *parent; // 父设备(如 USB 集线器)struct usb_bus *bus; // 设备所属的 USB 总线unsigned int devnum; // 设备在总线上的地址(1~127)enum usb_device_speed speed; // 设备速度(低速/全速/高速/超高速)struct usb_device_descriptor descriptor; // 设备描述符(厂商 ID、产品 ID 等)struct usb_config_descriptor *config; // 当前激活的配置描述符struct usb_interface **interfaces; // 设备的接口数组(一个配置包含多个接口)struct usb_host_endpoint *ep0; // 端点 0(默认控制端点)// 其他成员(如设备状态、电源管理信息、私有数据等)...
};
3. struct usb_interface
(代表设备的一个接口)
USB 设备采用 “配置→接口→端点” 的分层结构,一个设备可包含多个配置,一个配置可包含多个接口(逻辑功能单元)。struct usb_interface
描述一个接口,核心成员如下:
struct usb_interface {struct usb_host_interface *altsetting; // 接口的可选设置(同一接口的不同配置)struct usb_host_interface *cur_altsetting; // 当前激活的设置unsigned num_altsetting; // 可选设置的数量struct usb_device *dev; // 指向所属的 USB 设备struct device interface_dev; // 接口对应的设备模型节点const struct usb_device_id *id; // 匹配的设备 ID 信息void *private_data; // 驱动私有数据(通常用于存储设备上下文)// 其他成员(如接口状态、所属总线等)...
};
4. struct usb_host_endpoint
与 struct usb_endpoint_descriptor
(端点相关)
- 端点是 USB 设备与主机通信的物理通道(单向),每个接口包含多个端点(控制传输的端点 0 除外)。
struct usb_host_endpoint
是内核中端点的表示,包含端点描述符和传输相关信息:
struct usb_host_endpoint {struct usb_endpoint_descriptor desc; // 端点描述符(核心属性)struct usb_host_buffer *hcpriv; // 主机控制器私有数据unsigned char *extra; // 端点额外描述符int extralen; // 额外描述符长度// 其他成员(如端点状态、传输类型等)...
};
struct usb_endpoint_descriptor
是端点的核心属性描述(来自 USB 协议规范):
struct usb_endpoint_descriptor {__u8 bLength; // 描述符长度(7 字节)__u8 bDescriptorType; // 描述符类型(端点描述符为 0x05)__u8 bEndpointAddress; // 端点地址(低 4 位为端点号,最高位为方向:1=IN,0=OUT)__u8 bmAttributes; // 端点属性(传输类型:控制/批量/中断/同步)__le16 wMaxPacketSize; // 最大包大小(小端序)__u8 bInterval; // 轮询间隔(中断/同步传输用,单位:帧或微帧)
} __attribute__((packed));
5. struct usb_device_id
(设备匹配 ID)
用于定义驱动支持的设备列表,内核通过该结构体匹配设备与驱动,核心成员如下:
struct usb_device_id {__u16 match_flags; // 匹配标志(如匹配厂商 ID、产品 ID 等)__u16 idVendor; // 厂商 ID(USB-IF 分配)__u16 idProduct; // 产品 ID(厂商自定义)__u16 bcdDevice_lo; // 设备版本号下限__u16 bcdDevice_hi; // 设备版本号上限__u8 bDeviceClass; // 设备类__u8 bDeviceSubClass; // 设备子类__u8 bDeviceProtocol; // 设备协议__u8 bInterfaceClass; // 接口类__u8 bInterfaceSubClass; // 接口子类__u8 bInterfaceProtocol; // 接口协议kernel_ulong_t driver_info; // 驱动私有数据(传递给 probe 函数)
};
6. struct urb
(USB 请求块,异步传输核心)
urb
(USB Request Block)请求块,是usb设备驱动中用于描述与 usb设备通信所用的基本载体和核心数据结构。驱动通过提交 URB 来进行数据收发。
urb
请求块是 Linux USB 子系统中异步传输的核心结构体,用于描述一次异步数据传输请求,核心成员如下:
struct urb {struct list_head urb_list; // 链表节点(用于内核管理)struct usb_device *dev; // 目标 USB 设备unsigned int pipe; // 传输管道(包含端点地址和方向)void *transfer_buffer; // 传输缓冲区(用户数据)dma_addr_t transfer_dma; // DMA 地址(用于 DMA 传输)unsigned int transfer_buffer_length; // 缓冲区长度unsigned int actual_length; // 实际传输长度unsigned int status; // 传输状态(如成功、错误码)void (*complete)(struct urb *urb); // 传输完成回调函数void *context; // 回调函数的上下文数据unsigned int interval; // 传输间隔(中断/同步传输用)// 其他成员(如传输标志、端点号等)...
};
7. 其他结构体
struct usb_ctrlrequest
:控制传输的请求结构,包含请求类型、命令、值等(用于usb_control_msg()
)。
struct usb_bus
:描述 USB 总线(如主机控制器对应的总线),包含总线上的设备列表。
三. 总结
1. 结构体之间的层次关系
从物理设备到驱动的层次关系如下:
USB 设备(usb_device)
→ 包含多个 配置(usb_config_descriptor)
→ 每个配置包含多个 接口(usb_interface)
→ 每个接口包含多个 端点(usb_host_endpoint)
→ 驱动(usb_driver)通过 probe
绑定到接口,并使用端点进行数据传输。
Linux USB 设备驱动的结构围绕 “驱动注册→设备匹配→数据传输→资源释放” 的生命周期展开,核心结构体 usb_driver
、usb_device
、usb_interface
、usb_host_endpoint
和 urb
分别对应驱动行为、设备全局信息、接口逻辑单元、通信端点和异步传输请求。理解这些结构体的作用及关系,是编写 USB 设备驱动的基础。