USB - 设备架构及设备描述符

news2024/11/17 19:48:54

一、USB的设备架构

USB从上到下分为设备(device)、配置(config)、接口(interface)和端点(endpoint)四个层次。

Linux的USB设备驱动是绑定到接口上的, 每个接口在主机看来都是一个独立的功能设备。譬如录音接口, 播放接口, 数据接口等等。

对于这四个层次的简单描述如下:

(1) 设备通常具有一个或多个的配置

(2) 配置经常具有一个或多个的接口

(3) 接口没有或具有一个以上的端点

  • 设备

设备代表USB设备,它由一个或多个配置组成。设备描述符用于说明设备的总体信息,并指出其所包含配置的个数。

  • 配置

在使用USB设备前,必须为其选择一个合适的配置。如USB设备的低功耗模式和高功耗模式分别对应一个配置。配置描述符用于说明USB设备中各个配置的特性。

  • 接口

一个配置可以包含一个或多个接口。接口是一个端点的集合。接口描述符用于说明USB设备中各个接口的特性。

  • 端点

端点是USB设备中的实际物理单元,USB数据传输就是在主机和USB设备各个端点之间进行的。

二、USB描述符

* 设备描述符

* 配置描述符

* 接口描述符

* 端点描述符

描述符在使用时以 bDescriptorType字段来区分。描述符类型与对应的bDescriptorType字段值对应关系为:

定义位置:include/uapi/linux/usb/ch9.h

2.1、设备描述符

设备描述符描述的是设备的整体信息,与设备本身一一对应,一个设备只能有一个设备描述符。在主机对USB 设备枚举的过程中,首先要做的就是获取设备描述符,以对设备有一个整体的了解。设备描述符由 14 个字段组成,总长度 18 字节。

/* USB_DT_DEVICE: Device descriptor */

struct usb_device_descriptor {

__u8 bLength;

__u8 bDescriptorType;

__le16 bcdUSB;

__u8 bDeviceClass;

__u8 bDeviceSubClass;

__u8 bDeviceProtocol;

__u8 bMaxPacketSize0;

__le16 idVendor;

__le16 idProduct;

__le16 bcdDevice;

__u8 iManufacturer;

__u8 iProduct;

__u8 iSerialNumber;

__u8 bNumConfigurations;

} __attribute__ ((packed));

#define USB_DT_DEVICE_SIZE 18

其中比较重要的是bDeviceClass描述设备的类别:

/*

* Device and/or Interface Class codes

* as found in bDeviceClass or bInterfaceClass

* and defined by www.usb.org documents

*/

#define USB_CLASS_PER_INTERFACE 0 /* for DeviceClass */

#define USB_CLASS_AUDIO 1

#define USB_CLASS_COMM 2

#define USB_CLASS_HID 3

#define USB_CLASS_PHYSICAL 5

#define USB_CLASS_STILL_IMAGE 6

#define USB_CLASS_PRINTER 7

#define USB_CLASS_MASS_STORAGE 8

#define USB_CLASS_HUB 9

#define USB_CLASS_CDC_DATA 0x0a

#define USB_CLASS_CSCID 0x0b /* chip+ smart card */

#define USB_CLASS_CONTENT_SEC 0x0d /* content security */

#define USB_CLASS_VIDEO 0x0e

#define USB_CLASS_WIRELESS_CONTROLLER 0xe0

#define USB_CLASS_MISC 0xef

#define USB_CLASS_APP_SPEC 0xfe

#define USB_CLASS_VENDOR_SPEC 0xff

#define USB_SUBCLASS_VENDOR_SPEC 0xff

2.2、配置描述符

一个 USB 设备可以有多种配置,不同的配置使设备工作在不同的状态下,每个配置必须有一个配置描述符。其格式包括 8 个字段,共 9 字节,其格式如下:

/* USB_DT_CONFIG: Configuration descriptor information.

*

* USB_DT_OTHER_SPEED_CONFIG is the same descriptor, except that the

* descriptor type is different. Highspeed-capable devices can look

* different depending on what speed they're currently running. Only

* devices with a USB_DT_DEVICE_QUALIFIER have any OTHER_SPEED_CONFIG

* descriptors.

*/

struct usb_config_descriptor {

__u8 bLength;

__u8 bDescriptorType;

__le16 wTotalLength;

__u8 bNumInterfaces;

__u8 bConfigurationValue;

__u8 iConfiguration;

__u8 bmAttributes;

__u8 bMaxPower;

} __attribute__ ((packed));

#define USB_DT_CONFIG_SIZE 9

2.3、接口描述符

接口是端点的集合,负责完成 USB 的特定功能,例如数据的输入输出。接口描述符用于描述一个接口,包含了接口的特性,如端点个数,所属设备类和子类等。它有 9 个字段,共 9 字节。其格式如下:

/* USB_DT_INTERFACE: Interface descriptor */

struct usb_interface_descriptor {

__u8 bLength;

__u8 bDescriptorType;

__u8 bInterfaceNumber;

__u8 bAlternateSetting;

__u8 bNumEndpoints;

__u8 bInterfaceClass;

__u8 bInterfaceSubClass;

__u8 bInterfaceProtocol;

__u8 iInterface;

} __attribute__ ((packed));

#define USB_DT_INTERFACE_SIZE 9

2.4、端点描述符

端点描述符用于指出 USB 端点的特性,包括其所支持的传输类型、传输方向等信息。 USB 中规定,端点 0没有端点描述符,其余端点必须包含端点描述符。每个设备至少支持控制端点0。USB设备应该支持三类端点:控制端点、输入端点和输出端点。

/* USB_DT_ENDPOINT: Endpoint descriptor */

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));

#define USB_DT_ENDPOINT_SIZE 7

参考:

1,内核笔记

https://xuesong.blog.csdn.net/article/details/122609437

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1479309.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于springboot+vue的共享汽车管理系统(前后端分离)

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 ​主要内容:毕业设计(Javaweb项目|小程序|Pyt…

互动多媒体内容的魔法:如何让你的网页活起来

互动多媒体内容的魔法:如何让你的网页活起来 前言 在之前的文章中,我们探讨了网页结构中的基础介绍,本文将介绍如何通过简单的交互增强用户体验,包括图像大小的动态切换,以及音视频内容的播放控制来介绍网页多媒体的具…

Swiper实现轮播效果

swiper官网&#xff1a;https://3.swiper.com.cn/ <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title&…

Redis 之三:发布订阅(pub/sub)

概念介绍 Redis 发布订阅 (pub/sub) 是一种消息通信模式&#xff0c;它允许客户端之间进行异步的消息传递 Redis 客户端可以订阅任意数量的频道。 模型中的角色 在该模型中&#xff0c;有三种角色&#xff1a; 发布者&#xff08;Publisher&#xff09;&#xff1a;负责发送信…

【DIY】TA7376组成的耳机放大电路

用头戴式耳机&#xff0c;尤其是小型耳机听音乐&#xff0c;总感到音乐味不够足&#xff0c;在低频段的效果更差。因此用本机增强耳机的低频特性&#xff0c;并采用立体声反相合成的办法&#xff0c;加上内藏简易矩阵环绕声电路&#xff0c;能获得强劲的低音和在较宽的范围内展…

使用Node.js构建一个简单的聊天机器人

当谈到人工智能&#xff0c;我们往往会想到什么&#xff1f;是智能语音助手、自动回复机器人等。在前端开发领域中&#xff0c;我们也可以利用Node.js来构建一个简单而有趣的聊天机器人。本文将带你一步步实现一个基于Node.js的聊天机器人&#xff0c;并了解其工作原理。 首先…

http模块学习

http模块 客户端&#xff1a;负责消费资源的电脑 服务器&#xff1a;负责对外提供网络资源的电脑&#xff0c;与普通电脑的区别就在于服务器上 安装了web服务器软件。 http模块是Node.js官方提供用来 创建web服务器的模块&#xff0c;通过http模块提供的http.createServer()方…

WPS/Office 好用的Word插件-查找替换

例如&#xff1a;一片文档&#xff1a;…………泰山…………泰&#xff08;少打了山字&#xff09;………… 要是把“泰”查找替换为“泰山”&#xff0c;就会把前面的“泰山”变成“泰山山”&#xff0c;这种问题除了再把“泰山山”查找替换为“泰山”&#xff0c;有没有更简单…

1978-2022年各省农业总产值数据(无缺失)

1978-2022年各省农业总产值数据(无缺失) 1、时间&#xff1a;1978-2022年 2、范围&#xff1a;包括全国31省 3、来源&#xff1a;国家统计J、统计NJ、各省NJ 4、指标解释&#xff1a;农业总产值是一定时期&#xff08;通常为一年&#xff09;内以货币形式表现的农、林、牧、…

RK3568平台开发系列讲解(基础篇)文件私有数据

🚀返回专栏总目录 文章目录 一、文件私有数据二、文件私有数据实验沉淀、分享、成长,让自己和他人都能有所收获!😄 一、文件私有数据 Linux 中并没有明确规定要使用文件私有数据,但是在 linux 驱动源码中,广泛使用了文件私有数据,这是 Linux 驱动遵循的“潜规则”,实…

【三、接口协议与抓包】使用TcpDump + WireShark抓包分析三次握手与四次挥手

你好啊&#xff01;我是山茶&#xff0c;一个持续探索 AI 测试之路的程序员。 对于三次握手与四次挥手的理解与基本讲解如下。 那么具体的请求是什么样的呢&#xff1f;使用 TCPDump WireShark 对 TCP 三次握手与四次挥手展示 协议分析工具 网络监听&#xff1a;TcpDump Wi…

Centos中安装Docker及Docker的使用

在centos7系统中安装指定版本的docker,并通过docker使用安装mysql为例,阐述docker的使用。 2.1、Docker卸载及安装yum依赖 【卸载Docker,如果安装的Docker的版本不合适】 yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-…

探索口袋中的远程控制神器

在这个科技日新月异的时代&#xff0c;我们的生活被各种手机软件所包围。几乎每个人都有一个甚至多个手机&#xff0c;你是否也有遇到过需要远程操作自己某一台手机的场景呢&#xff1f;今天&#xff0c;我要向大家推荐一款神奇的手机远程操作神器&#xff0c;让你可以随时随地…

旧版android模拟器,37岁程序员被裁

前言 从18年毕业至今&#xff0c;就职过两家公司&#xff0c;大大小小项目做了几个&#xff0c;非常感谢我的两位老大&#xff0c;在我的android成长路上给予我很多指导&#xff0c;亦师亦友的关系。 从年前至今参加面试了很多公司&#xff0c;也收到了几家巨头的offer&#…

对齐了之后才舒服,matplotlib文字和字体设置

文章目录 text方法字体局部字体 matplotlib教程&#xff1a; 初步&#x1f4c8; 子图绘制&#x1f4c8; 坐标投影&#x1f4c8; 刻度设置&#x1f4c8; 共享坐标轴&#x1f4c8; 内容填充 text方法 【plt】提供了文字显示函数text&#xff0c;包含三个必不可少的参数&am…

【VSCODE修改代码行间距】解决方案

在我们编码的过程中&#xff0c;由于显示字体和显示器的不同&#xff0c;会需要调整行间距&#xff0c;在vscode默认的选项中没有看到设定行间距的选项&#xff0c;不过&#xff0c;可以手动修改配置档达到目的。 1.打开设置 2.打开配置档&#xff0c;手动进行设定 3.在选项中添…

Vue3自定义文件列表页面(含上传、搜索、复制链接)

文章目录 一、代码展示二、代码解读三、结果展示 一、代码展示 <template><div class"container"><h1>文件列表</h1><div class"header-actions"><a-input placeholder"输入关键词搜索" v-model:value"…

Zynq—AD9238数据采集DDR3缓存千兆以太网发送实验(一)

ACM9238 高速双通道ADC模块自助服务手册AD9238 一、实验目的 本次实验通过电脑上的网络调试助手&#xff0c;将命令帧进行发送&#xff0c;然后通过ACZ7015开发板上的以太网芯片接收&#xff0c;随后将接收到的数据转换成命令&#xff0c;从而实现对ACM9238模块采样频率、数据…

Java配置48-nginx 按照日期生成日志

1. 背景 默认情况下&#xff0c;nginx 的日志会一直输入到 access.log&#xff0c;长时间运行后会导致这个日志文件过大。 2. 方法 修改 nginx.conf map $time_iso8601 $logdate {~^(?<ymd>\d{4}-\d{2}-\d{2}) $ymd;default date-not-found;}access_log logs/acce…

用vivado创建一个赛灵思AXI的IP核

一、新建一个管理IP的任务 二、设置板子&#xff0c;verilog语言和文件位置 三、创建新的IP核 添加一个axi-full的master接口和axi-full的slave接口 四、查看赛灵思AXI代码 第一个是axi的master接口代码&#xff0c;下面的是axi的slave接口代码 五、打包IP核以供后续使用 六、…