usb

一、usb作用和设计初衷

  • 背景:旧接口的“战国时代”:在 USB 出现前,连接外设很麻烦,接口种类繁多(如串口、并口、PS/2、SCSI 等),每种接口都需要不同的安装和配置方法-,使用门槛高、扩展性差-

  • USB 的设计目标:USB 旨在创建一个统一的“通用”接口标准-,主要解决三大问题-

    1. 真正的即插即用 (Plug and Play):支持热插拔-,设备插入后由系统自动识别和配置驱动-,极大简化了用户操作-

    2. 强大的扩展能力 (Expandability):采用树形拓扑结构,一个主机控制器理论上最多可连接 127 个设备-,满足外设日益增长的需求。

    3. 标准化的接口 (Standardization):统一接口类型和通信协议,让不同厂商生产的设备能在同一个开放体系下广泛使用-

二、usb的设计思想和方法

  核心设计思想一:分层架构 (Layered Architecture)

  目的:为了处理复杂性,将 USB 系统划分为不同层次,每层各司其职,让开发者能专注于自己关心的层次-。

逻辑分层:可以介绍 USB 规范中经典的三层逻辑结构-:

功能层 (Function Layer):最顶层,负责实现设备的具体功能,由客户端软件和设备端的功能逻辑进行“意义”上的沟通。
USB 设备层 (USB Device Layer):中间层,由 USB 系统软件管理,负责设备枚举、配置管理等通用操作。
总线接口层 (Bus Interface Layer):最底层,负责所有物理层面的通信,包括电气信号、数据打包等-。
  核心设计思想二:主从架构 (Host-Device Architecture)

  主机为中心 (Host-Centric):整个 USB 系统中,主机 (Host) 是绝对的核心与“主控者 (Master)”-。

设备为从属 (Device as Slave):所有设备 (Device) 都只能被动响应主机的请求,不能主动发起通信-(远程唤醒功能除外-)。

职责划分:

主机:负责检测设备的连接/移除(即枚举 (Enumeration)-)、管理总线上的数据传输、提供并管理电源、执行错误检查等-。

设备:响应主机的命令,并在被主机“点名”时才进行数据传输。

三、usb拓扑结构

  主机端提供USB根集线器,USB根集线器可外接USB外设,也可的外接USB的集线器HUB,用于拓展USB端点接口,拓展的USB集线器上的端口也可以外接USB设备。使用这种方式可实现USB设备的层层拓扑连接。不过这种拓扑关系最大的深度为7。

image

 

image

 四、usb主机

  usb主机有usb硬件+驱动软件组成。在嵌入式soc中,usb硬件主要指的是usb控制器,软件指的是linux usb驱动和设备驱动程序。

  1

  2

五、usb设备

  参考:https://www.usbzh.com/article/detail-177.html

1、usb描述符

image

 

  • 其实所有的描述符都是USB设备用来描述自己属性及用途的,所以必须在设备端实现对应的描述符,主机会在枚举此设备的时候根据设备实现的描述符去确定设备到底是一个什么样的设备、设备需要的总线资源、和设备的通讯方式等等。
  • 每一个USB设备只有一个设备描述符,主要向主机说明设备类型、端点0最大包长、设备版本、配置数量等等。
  • 每一个USB设备至少有一个或者多个配置描述符,但是主机同一时间只能选择某一种配置,标准配置描述符主要向主机描述当前配置下的设备属性、所需电流、支持的接口数、配置描述符集合长度等等。
  • 主机在获取配置描述符集合的时候会先获取一次标准配置描述符,然后根据里面的配置描述符集合长度属性值获取配置描述符集合的所有描述符信息,配置描述符集合有标准配置描述符、接口描述符端点描述符HID描述符
  • 每一个USB配置下至少有一个或者多个接口描述符接口描述符主要说明设备类型、此接口下使用的端点数(不包括0号号端点),一个接口就是实现一种功能,实现这种功能可能需要端点0就够了,可能还需要其它的端点配合。
  • 每一个USB接口下至少有0个或者多个端点描述符端点描述符用来描述端点的各种属性。
  • 端点是实现USB设备功能的物理缓冲区实体,USB主机和设备是通过端点进行数据交互的。
  • 一个USB设备有一个或多个配置描述符。每个配置有一个或多个接口,每个接口有零个或多个端点。
  • 字符串描述符就是用字符串描述一个设备的一些属性,描述的属性包括设备厂商名字、产品名字、产品序列号、各个配置名字、各个接口名字。
  • HID描述符只有HID设备才会存在。
  • HID设备至少有一个报告描述符
  • 报告描述符主要作用就是描述主机和HID设备交互的数据,向主机说明这些数据中哪些位是用来做什么用的

六、linux usb识别流程

  Linux对USB设备的识别流程就是一个“先问名字(VID/PID),再看能力(接口描述符),最后分配工作(加载驱动)”的标准作业程序。

  第一步:硬件检测与物理枚举 (Physical Enumeration)
  当你把USB设备插入接口时,一系列硬件层面的交互会首先发生-:

电压变化与复位:主机检测到D+或D-数据线上的电平变化,从而知道有新设备插入。随后,主机向设备发送复位信号,将其置于一个已知的初始状态-6。

分配地址:主机通过“控制传输”向设备发送请求,为其分配一个唯一的设备地址(1-127)。从此,主机就能通过这个地址来“点名”该设备-13。

读取描述符:这是关键一步。主机向设备请求一系列标准化的描述符 (Descriptors),这些描述符就是设备的“身份证”和“说明书”。主机主要读取以下内容:

设备描述符 (Device Descriptor):包含最重要的 VID (Vendor ID,供应商ID)--2 和 PID (Product ID,产品ID)--2。

配置描述符 (Configuration Descriptor):描述设备的电源需求和可能的配置。

接口描述符 (Interface Descriptor):描述设备提供的功能接口,包含 bInterfaceClass (接口类)、bInterfaceSubClass (接口子类) 等信息-。

端点描述符 (Endpoint Descriptor):描述用于数据输入/输出的端点。

完成这一步,Linux内核就获得了该设备最基本的“身份信息”和“能力清单”。

   第二步:软件匹配与驱动加载 (Software Matching)
  在获得设备的描述符信息后,Linux内核的USB核心(usbcore)便开始根据这些信息,寻找最合适的驱动程序-18。匹配过程通常按照以下优先级进行:

匹配方式一:VID + PID 精确匹配 (最高优先级)
这是最精确的匹配方式。驱动程序在代码中会定义一个 usb_device_id 结构体数组,里面列出了它能支持的所有设备的VID和PID-2。

// 驱动代码中的ID表示例
static struct usb_device_id my_usb_ids[] = {
{ USB_DEVICE(0x1234, 0x5678) }, // VID=0x1234, PID=0x5678
{ } // 终止项
};
MODULE_DEVICE_TABLE(usb, my_usb_ids);
当内核匹配时,会调用 usb_device_match 函数-2,逐一比对每个驱动的ID表和设备的VID、PID-。一旦找到匹配项,就会加载对应的驱动。

  匹配方式二:接口类 (Interface Class) 匹配
如果多个设备功能相同,就可以使用这种更通用的匹配方式。例如,所有的USB鼠标都遵循“HID (人机交互设备)”类规范。Linux内核中的 usbhid 驱动会声明自己支持 bInterfaceClass 为 USB_CLASS_HID 的设备-。这样,只要设备声明自己是HID类,无论其VID、PID是什么,都能被这个通用驱动支持。

  匹配方式三:内核的默认兜底驱动
如果以上两种方式都匹配失败,内核还会尝试使用 usb_generic_driver 作为最后的“兜底”驱动-18。这个驱动只是将设备配置好,使其处于可用状态,但不会提供具体的功能,只用于基本的设备管理-18。

 

五、usb调试

1、lsusb

  识别完成后用lsusb命令就能看到插入的usb设备,

image

 这里的2c72:0900就是插入的5g usb网卡,那1d6b那个是什么呢?那个是usb控制器。这个芯片有一个usb2.0控制器,两个usb3.0控制器。linux驱动识别出来5条bus ,这个是逻辑总线,为了方便管理,不是对应实际物理接口。一个usb3.0接口能识别出一条2.0和一条3.0逻辑总线

image

 2、查看usb设备信息

  cat /sys/kernel/debug/usb/devices

3、详细设备信息

  以usb 5g网卡为例,在/sys/bus/usb/devices/5-1中,有改usb 网卡的信息。

image

idVendor:厂商 ID

idProduct:产品 ID

manufacturer / product / serial:可读的制造商名、设备名和序列号

bDeviceClass(设备类):定义这整个设备属于什么“大类别”。

bDeviceSubClass(设备子类):在大类别下进行细分。

bDeviceProtocol(设备协议):定义该设备使用的具体传输协议。

这里bDeviceClass是0x00,它的含义是:bDeviceClass 不使用设备级别的定义,请到每一个独立的“接口(Interface)”里去查看具体的类别。需要到5-1:1:x中去查看bDeviceClass

5-1:1:0~5-1:1:7七个接口的功能:

image

 

 

 

六、学习资料

1、https://www.usbzh.com/article/detail-344.html

 

posted @ 2026-07-23 10:23  YYFaGe  阅读(12)  评论(0)    收藏  举报