usb设备驱动描述,王明学learn
usb设备驱动
本章主要内容包含以下:USB总线介绍,USB协议分析,USB系统架构
一、USB总线介绍
1.1USB发展史
USB(Universal Serial Bus)通用串行总线,是一种外部总线标准用于规范电脑与外部设备的连接和通讯。USB是在1994年底由英特尔、康柏、IBM、Microsoft等多家公司联合提出的,自1996年推出后已成功替代串口和并口,成为当今个人电脑和大量智能设备的必配接口之一。
- USB 1.0出现在1996年的,速度只有1.5Mb/s1998年升级为USB 1.1,速度也提升到12Mb/s,称之为”full speed”
- USB2.0规范是由USB1.1规范演变而来的。它的传输速率480Mbps ”high speed”达到了480Mbps称之为”high speed”
- USB3.0提供了十倍于USB 2.0的传输速度和更高的节能效率,被称为”super speed”
二、USB硬件接口
2.1USB硬件接口主要包括:标准A口,标准B口,mini-usb口,micro-usb口
2.2USB信号线
USB接口有4根线,两根电源线,两根信号线。USB接口的输出电压和电流是:+5V 500mA
USB电源:标有VCC,power,5v,5vSB字样。
USB数据线:(正)DATA+,USBD+,PD-,USBDT+等字样。
USB数据线:(负)DATA-,USB-,PD-,USBDT-等字样。
地线:GND,ground
2.3USB拓扑结构
2.3.1系统拓扑结构
对于每个USB系统来说,都有一个称为主机控制器的设备,该控制器和一个根Hub作为一个整体。这个根Hub下可以接多级的Hub,每个子Hub又可以接子Hub。每个USB设备作为一个节点接在不同级别的Hub上。 每条USB总线上最多可以接127个设备。
2.3.2USB主控制器规格
OHCI:主要是非PC系统上的USB芯片
UHCI:大多是Intel和Via主板上的USB控制器芯片。他们都是由USB1.1规格的。
器芯片。他们都是由USB1.1规格的。
EHCI是有Intel等几个厂商研发,兼容OHCI UHCI ,遵循USB2.0规范。
三、USB协议分析
在USB设备的逻辑组织中,包含设备、配置、接口和端点4个层次。设备通常有一个或多个配置,配置通常有一个或多个接口,接口有零或多个端点。
3.1设备逻辑结构
每个USB设备都可以包含一个或多个配置,不同的配置使设备表现出不同的功能组合,配置由多个接口组成。在USB议中,接口代表一个基本的功能,一个功能复杂的USB设备可以具有多个接口,而接口是端点的汇集
一个USB播放器带有音频,视频功能,还有旋钮和按钮。
配置1: 音频(接口)+旋钮(接口)
配置2: 视频(接口)+旋钮(接口)
频接口,视频接口,按钮接口,旋钮接口均需要一个驱动程序。
USB设备中的唯一可寻址的部分是设备端点,端点的作用类似于寄存器。每个端点在设备内部有唯一的端点号,这个端点是在设备设计时给定的。主机和设备的通信最终都作用于设备上的各个端点。每个端点所支持的操作都是单向的,要么只读,要么只写。
3.1.1USB设备描述符
当我们把USB设备如:USB鼠标)插到我们的PC时,主机能够自动识别出我们的USB设备类型。
在每一个USB设备内部,包含了固定格式的数据,通过这些数据,USB主机就可以获取USB设备的类型、生产厂商等信息。这些固定格式的数据,我们就称之为USB描述符。标准的USB设备有5种USB描述符:设备描述符,配置描述符,接口描述符,端点描述符,字符串描述符。
一个USB设备只有一个设备描述符,设备描述符长度为18个字节,这也是由USB协议所决定的。
linux内核使用struct usb_device_descriptor来对应usb描述符中的设备描述符
struct usb_device_descriptor {
__u8 bLength;描述符长度,固定为0x12
__u8 bDescriptorType;设备描述符类型,固定为0x01
__le16 bcdUSB;规范发布号。表示本设备能适用哪种协议,如2.0=0200
__u8 bDeviceClass;类型代码
__u8 bDeviceSubClass;子类型代码
__u8 bDeviceProtocol;协议代码
__u8 bMaxPacketSize0;端点0最大分组大小
__le16 idVendor;供应商ID
__le16 idProduct;产品ID,由厂家自行设置
__le16 bcdDevice;设备出厂编码,由厂家自行设置
__u8 iManufacturer;厂商描述符字符串索引,索引到对应的字符串描述符。为0表示没有。
__u8 iProduct;产品描述符字符串索引
__u8 iSerialNumber;设备序列号字符串索引
__u8 bNumConfigurations;可能的配置数。
} __attribute__ ((packed)); 按字节对齐
3.1.2配置描述符
bLength : 描述符长度,固定为0x09。
bDescriptorType : 配置描述符类型,固定为0x02。
wTotalLength : 返回整个数据的长度,指此配置返回的配置描述符,接口描述符以及端点描述符的全部大小。
bConfigurationValue : 作为SetConfiguration的一个参数选择配置值。
bNumInterfaces : 配置所支持的接口数,指该配置配备的接口数量,也表示该配置下接口描述符数量。
iConfiguration : 用于描述该配置字符串描述符的索引。
bmAttributes : 供电模式选择。Bit4-0保留,D7:总线供电,D6:自供电,D5:远程唤醒.
MaxPower : 总线供电的USB设备的最大消耗电流,以2mA为单位。
linux内核使用struct usb_config_descriptor来对应usb描述符中的配置描述符---->当然这也是有USB协议决定的。
struct usb_config_descriptor {
__u8 bLength;
__u8 bDescriptorType;
__le16 wTotalLength;
__u8 bNumInterfaces;
__u8 bConfigurationValue;
__u8 iConfiguration;
__u8 bmAttributes;
__u8 bMaxPower;
} __attribute__ ((packed));
3.1.3接口描述符
USB接口描述符长度为8个字节
bLength : 描述符长度,固定为0x09。
bDescriptorType : 接口描述符类型,固定为0x04。
bInterfaceNumber: 该接口的编号。
bAlternateSetting: 用于为上一个字段选择可供替换的设置。
bNumEndpoint : 使用的端点数目,端点0除外。
bInterfaceClass : 类型代码(由USB组织分配)。
bInterfaceSunClass : 子类型代码(由USB组织分配)。
bInterfaceProtocol : 议代码(由USB组织分配)。
iInterface : 字符串描述符的索引。
struct usb_interface_descriptor {
__u8 bLength;
__u8 bDescriptorType;
__u8 bInterfaceNumber;
__u8 bAlternateSetting;
__u8 bNumEndpoints;接口包含的端点个数,不包含0号端点,它是控制端点。
__u8 bInterfaceClass;
__u8 bInterfaceSubClass;
__u8 bInterfaceProtocol;
__u8 iInterface;
} __attribute__ ((packed));
3.1.4端点描述符
USB端点描述符长度为7个字节。
bLength : 描述符大小,固定为0x07。
bDescriptorType : 接口描述符类型,固定为0x05。
bEndpointType : USB设备的端点地址。Bit7,方向,对于控制端点可以忽略,1/0:IN/OUT。Bit6-4,保留。BIt3-0:端点号
bmAttributes : 端点属性,Bit7-2,保留。BIt1-0:00控制,01同步,02批量,03中断。
wMaxPacketSize : 本端点接收或发送的最大信息包大小。
bInterval : 轮训数据传送端点的时间间隔.对于批量传送和控制传送的端点忽略.对于同步传送的端点,必须为1,对于中断传送的端点,范围为1-255。
struct usb_endpoint_descriptor
{
__u8 bLength;
__u8 bDescriptorType;
__u8 bEndpointAddress;
__u8 bmAttributes;
__le16 wMaxPacketSize;
__u8 bInterval;
/* NOTE: these two are _only_ in audio endpoints. */
/* use USB_DT_ENDPOINT*_SIZE in bLength, not sizeof. */
__u8 bRefresh;
__u8 bSynchAddress;
} __attribute__ ((packed));
3.2USB数据通讯
这里主要包含:通讯模型,传输,事物,包,域的内容。
USB的数据通讯首先是基于传输(Transfer)的,传输的类型有:中传输、批量传输、同步传输、控制传输
3.2.1数据通讯-传输
3.2.2数据通讯-事务
一次传输由一个或多个事务(transaction)构成,事务可分为:In事务,Out事务,Setup事务
3.2.3数据通讯-包
一个事务由一个或多个包(packet)构成,包可分为:令牌包(setup)、数据包(data)、握手包(ACK)和特殊包
3.2.4数据通讯-域
一个包由多个域构成,域可分为:同步域(SYNC),标识域(PID),地址域(ADDR),端点域(ENDP),帧号域(FRAM),数据域(DATA),校验域(CRC)。
3.3USB设备枚举
USB设备在正常工作以前, 第一件要做的事就是枚举。枚举是让主机认得这个USB设备, 并且为该设备准备资源,建立好主机和设备之间的数据传递通道。
1. 获取设备描述符
2. 复位
3. 设置地址
4. 再次获取设备描述符
5. 获取配置描述符
6. 获取接口、端点描述符
7. 获取字符串描述符
8. 选择设备配置
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· ASP.NET Core 模型验证消息的本地化新姿势
· 对象命名为何需要避免'-er'和'-or'后缀
· “你见过凌晨四点的洛杉矶吗?”--《我们为什么要睡觉》
· 编程神器Trae:当我用上后,才知道自己的创造力被低估了多少
· C# 从零开始使用Layui.Wpf库开发WPF客户端
· C#/.NET/.NET Core技术前沿周刊 | 第 31 期(2025年3.17-3.23)
· 接口重试的7种常用方案!