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

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.dtcms.com/a/349280.html

相关文章:

  • More Effective C++ 条款06: 区分自增自减操作符的前缀和后缀形式
  • 04-ArkTS编程语言入门
  • 分享些 Function 和 枚举的经典使用案例
  • 【RAGFlow代码详解-1】概述
  • 青少年软件编程(python六级)等级考试试卷-客观题(2023年3月)
  • 同步阻塞和异步非阻塞是什么?
  • Web开发中的CGI:通用网关接口详解
  • 软件测试用例指南:覆盖 6 大设计方法
  • 二、GP/GS流程图
  • Spring面试题及详细答案 125道(16-25) -- 核心概念与基础2
  • 工程师的自我修养
  • Linux --网络基础概念
  • 08-系统能力调用与权限管理
  • Python爬虫-解决在抓包的过程中,找不到接口地址的问题
  • ViLU: Learning Vision-Language Uncertainties for Failure Prediction
  • C++ 容器——vector
  • PyTorch入门实战:MNIST数据集加载与可视化详解
  • 一、基因组选择(GS)与基因组预测(GP)
  • 【K8s】整体认识K8s之namespace
  • OpenIM应用机器人自动应答
  • 基于陌讯视觉算法的扶梯大件行李识别技术实战:误检率↓79%的工业级解决方案
  • 大模型中的意图识别
  • DMA-API(alloc和free)调用流程分析(十)
  • 胸部X光片数据集:健康及肺炎2类,14k+图像
  • 【网络运维】Shell脚本编程:函数
  • 大件垃圾识别精准度↑90%!陌讯多尺度融合模型在智慧环卫的落地实践
  • 鸿蒙ArkTS 基础篇-03-对象
  • 【黑色星期五输出当年有几个】2022-10-23
  • 单词搜索+回溯法
  • Windows客户端部署和管理