十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Linux USB 驱动内核架构

Linux USB 驱动内核架构 USB 技术与 Linux 内核架构概述通用串行总线Universal Serial Bus简称 USB自 20 世纪 90 年代问世以来已成为现代计算机与嵌入式系统中应用最为广泛的外部总线接口标准。USB 规范的核心优势在于其出色的即插即用Plug and Play特性、支持热插拔Hot-plugging、统一的接口标准以及强大的总线供电能力。在 Linux 操作系统中USB 驱动框架USB Subsystem设计高度模块化能够完备地支持从底层主机控制器Host Controller到上层纷繁复杂的各种外设如 U盘、USB 摄像头、网卡及 HID 设备等。深入理解 Linux USB 驱动体系必须首先厘清 USB 的物理拓扑结构与逻辑拓扑映射主从式拓扑USB 总线采用严格的星型拓扑结构所有的数据传输均由 Host主机端 主动发起Device/Target设备端 仅能被动响应主机的请求。分层抽象模型从物理硬件接入、通信拓扑路由到逻辑抽象及内核数据结构USB 系统的分层模型自顶向下包含了 8 个核心概念。一、 硬件拓扑层物理连接与路由总线Bus概念主控制器Host Controller引出的物理传输介质与通信总线通道。作用USB 主控芯片如 xHCI/EHCI对应一条独立的总线负责统一调度总线上的所有数据传输。Sysfs 与内核结构对应 usb1、usb2内核中对应 struct usb_bus。端口Port概念硬件上的物理插口如主板 USB 口、Hub 扩展口。作用提供物理供电与差分信号引脚负责检测设备的插入与拔出。端口间通过级联Hub 嵌套构成树状拓扑路经。硬件设备Physical Device概念用户手里的硬件产品如 USB 复合摄像头、U盘、外接 Hub。作用包含主控芯片、PCB 板及物理接口。它是所有逻辑实体与硬件缓冲区的物理载体。二、 协议与通信抽象层设备识别与模式逻辑设备Logical Device概念主机在枚举Enumeration过程中分配了唯一总线地址USB Address的软件/通信实体。作用代表接入系统的一个独立节点。无论是单功能 U盘 还是带有麦克风的复合摄像头物理接入后在主机视角下首先都是一个逻辑设备。内核结构内核中对应 struct usb_device。配置Configuration概念逻辑设备的工作模式或功耗策略。作用定义设备在特定环境下的资源分配如高性能模式 vs 省电模式。一个逻辑设备可以包含多种配置但同一时刻只能激活Select一种配置。内核结构内核中对应 struct usb_host_config。三、 功能与传输实现层驱动绑定与数据收发逻辑功能Logical Function概念设备对外提供的业务功能抽象如“视频采集功能”、“音频播放功能”或“串口通信功能”。作用一个硬件设备可以集成多个逻辑功能复合设备。逻辑功能是应用层业务需求的直观体现。接口Interface概念逻辑功能在 USB 协议规范中的标准呈现形态。作用接口是 Linux USB 设备驱动struct usb_driver匹配与绑定的最小单位。一个逻辑功能对应一个接口例如 UVC 视频控制接口或 UAC 音频流接口。系统通过为不同接口挂载不同驱动来实现多功能复合设备的支持。内核结构内核中对应 struct usb_interface。端点Endpoint概念USB 芯片内部的硬件数据缓冲区Buffer/FIFO是数据传输的绝对终点。作用接口本身仅作为逻辑抽象无法直接收发数据一个接口所代表的逻辑功能是由多个不同传输类型控制、中断、批量、等时的端点协作来实现数据实际收发的。寻址由“设备地址 端点号 方向”决定。内核结构对应 struct usb_host_endpoint。以复合摄像头作为示例通过/sys/bus/usb/devices/目录下的拓扑命名路径将这 8 个概念从底层硬件到逻辑接口进行映射说明[总线 Bus 2] --- 系统中的根总线 (usb2) │ [端口 Port 1] --- 主板上的第一个物理 USB 口 │ [硬件设备/逻辑设备 2-1] --- 插在端口 1 上的第一个硬件外接 USB Hub │ [端口 Port 1] --- 外接 Hub 上的第一个扩展物理接口 │ [硬件设备/逻辑设备 2-1.1] --- 插在 Hub 端口 1 上的“带麦克风的 USB 复合摄像头” ┌──────────┴──────────┐ [配置 :1] [配置 :1] --- 选择高性能工作模式包含图像和音频功能 │ │ [逻辑功能 1] [逻辑功能 2] --- 业务分工视频采集 vs 音频录制 │ │ [接口 2-1.1:1.0] [接口 2-1.1:1.1] --- 驱动绑定uvcvideo vs snd-usb-audio ┌────┴────┐ │ [EP0] [EP1 IN] [EP2 IN] --- 硬件缓冲区控制指令、视频帧、音频数据对应拓扑路径的具体解析总线Bus→ \rightarrow→usb2主板上的 xHCI 控制器提供Bus 2总线 2对应内核中的usb2目录管理该总线上所有的数据调度。端口Port与硬件设备Hub→ \rightarrow→2-1主板物理端口 1检测到了设备插入。插在这里的硬件实体是一个外接 USB Hub。主机对其进行枚举后将其识别为总线 2 上的一个逻辑设备赋予节点名称2-1对应struct usb_device。级联端口与复合硬件设备→ \rightarrow→2-1.1用户将“带麦克风的复合摄像头”插在了外接 Hub 的第 1 个扩展端口上。主机识别到二级级联设备分配节点名称2-1.1。这是摄像头的物理电路板与主机通信的逻辑设备载体对应struct usb_device。激活配置Configuration→ \rightarrow→2-1.1:1主机读取描述符后选中并激活了该摄像头的配置 1高性能模式。此时冒号后面的:1即代表当前激活的配置编号对应struct usb_host_config。逻辑功能Logical Function与接口Interface→ \rightarrow→2-1.1:1.0与2-1.1:1.1在配置 1 下设备包含两个逻辑功能视频采集与音频录制。接口 0 (2-1.1:1.0)代表视频采集接口Linux 内核将其与uvcvideo驱动绑定对应struct usb_interface。接口 1 (2-1.1:1.1)代表音频录制接口Linux 内核将其与snd-usb-audio驱动绑定对应struct usb_interface。端点Endpoint→ \rightarrow→驱动内部操作的数据管道虽然 Sysfs 的目录名只展示到接口层如2-1.1:1.0但在接口目录下驱动会调用底层端点对应struct usb_host_endpoint2-1.1:1.0接口利用EP0接收曝光调节命令利用EP1 IN传输视频帧。2-1.1:1.1接口利用EP2 IN传输音频流。在 Linux 内核的设计哲学中USB 驱动框架被划分为主机端驱动架构包括主机控制器驱动 HCD 与内核 USB Core 核心层以及设备端驱动架构如基于 Gadget / UDC 的控制器驱动。对 Linux USB 驱动的研究将围绕这种层次化的设备模型、URBUSB Request Block请求机制以及特定接口协议如 UVC 视频类、Mass Storage 存储类等展开。具体的驱动框架参考文章【Linux驱动开发】Linux USB驱动架构详解本人针对文章中涉及的关键概念修正与补充说明整理如下HCD 全称修正原文/常见混淆USB主机控制器Host Controller Device, HCD准确定义Host Controller Driver主机控制器驱动。在 Linux 内核框架中HCD 特指运行在软件层的控制器驱动程序如xhci-hcd、ehci-hcd负责屏蔽底层芯片差异并向上层 USB Core 提供统一的 API 接口。USB Gadget 命名与概念厘清概念区分在设备模式/从机模式Device/Slave Mode下Linux 没有将驱动命名为usb_device驱动而是统一称为Gadget 驱动。命名缘由在 Linux USB 主机侧框架中struct usb_device结构体已经被定义为“插入到 Linux 主机上的外部 USB 从机设备”。为了避免在开发板充当 USB 外设时出现结构体命名冲突与概念混淆Linux 内核引入了Gadget小工具/小装置这一术语专门代指 Linux 端侧/设备端的 USB 子系统架构。HDC 与 UCD从系统角色与驱动架构的角度来看你的理解非常准确——这两个概念在 Linux 内核中所处的“控制实体”和“硬件/逻辑节点”维度完全不同HCD指的是“驱动程序” (Driver)概念属性HCDHost Controller Driver本质上是软件代码/驱动模块。角色定位它是 Linux 内核中的主机侧底层驱动负责管理主机端的物理控制器硬件如 xHCI、EHCI 芯片。核心职责向 Linux 的 USB CoreUSB 核心层注册统一的操作接口。驱动 CPU 去操纵 Host Controller 芯片向 USB 总线上发送数据包、分配总线带宽、发起轮询与枚举。总结HCD 是驱动负责去“控制”总线上的硬件。UDC指的是“硬件设备/控制器实体” (Device Controller)概念属性UDCUSB Device Controller本质上指的是物理硬件外设/控制器节点即芯片内部负责实现 Device 模式的硬件 IP 核。角色定位它是运行 Linux 系统的主板如嵌入式开发板自身作为从机设备时的硬件基础。核心职责提供物理端点Endpoints, EP和 FIFO 缓冲区。在硬件层面响应外部 Host 发送的 Setup 包、拉高 D/D- 数据线的上拉电阻以宣告设备存在。在 Linux 内核中针对 UDC 硬件编写的驱动通常被称为UDC Driver负责向内核 Gadget 框架注册并提供对这个 UDC 硬件的操作集如struct usb_gadget_ops。总结UDC 是从机端的硬件控制器节点设备被 Gadget 驱动所驱动。两者关系对比总结概念实体属性归属侧对应硬件/驱动关系HCD驱动 (Driver)主机侧 (Host)HCD是驱动程序用来驱动 CPU 侧的HC (Host Controller)硬件。UDC控制器/设备 (Device/Hardware)从机侧 (Device/Gadget)UDC是从机硬件控制器被内核中的UDC Driver驱动并向上层Gadget Function提供硬件服务。在 Host 侧我们在软件层讨论 HCD主机驱动在 Device 侧我们在硬件与底层节点层讨论 UDC从机控制器。
返回列表