当前位置: 首页 > web >正文

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_driverusb_deviceusb_interfaceusb_host_endpoint 和 urb 分别对应驱动行为、设备全局信息、接口逻辑单元、通信端点和异步传输请求。理解这些结构体的作用及关系,是编写 USB 设备驱动的基础。

http://www.xdnf.cn/news/18815.html

相关文章:

  • 记一次生产环境Hbase填坑之路、Hbase客户端登陆、kerberos认证、端口列表、Pod上手撕代码【Hbase最佳实践】
  • 酶 EC number 预测工具CLEAN的安装和使用
  • Java 线程池详解:原理、使用与源码深度解析
  • 从全栈开发到微服务架构:一次真实的Java面试实录
  • 【图像处理基石】如何把非笑脸转为笑脸?
  • Git连接Github远程仓库的代理设置
  • Java:HashSet的使用
  • Linux shell脚本条件循环
  • 基础篇(下):神经网络与反向传播(程序员视角)
  • 【论文阅读 | arXiv 2025 | WaveMamba:面向RGB-红外目标检测的小波驱动Mamba融合方法】
  • Multitouch for mac 触控板手势增强软件
  • Zynq开发实践(Verilog、仿真、FPGA和芯片设计)
  • RAG智能问答为什么需要进行Rerank?
  • 【K8s】整体认识K8s之namespace
  • 低功耗模式DMA数据搬运问题解析
  • 模块测试与低功耗模式全攻略
  • 【Java】springboot的自动配置
  • 谷德红外温度传感器在 3D 打印领域应用探究
  • Rust 登堂 生命周期(一)
  • 纯血鸿蒙下的webdav库
  • 最近遇到的几个JVM问题
  • JVM OOM问题排查与解决思路
  • Flask蓝图:模块化开发的利器
  • HarmonyOS NEXT系列之元服务框架ASCF
  • 第04章 SPSS简介与数据库构建
  • 【机器学习】9 Generalized linear models and the exponential family
  • BQTLOCK 勒索软件即服务出现,拥有复杂的规避策略
  • 大白话解析:多证明验证(Merkle Multi-Proof)​
  • 可视化-模块1-HTML-03
  • 基于SpringBoot的美食分享平台【2026最新】