如何理解USB 配置描述符wTotalLength位运算深度

cpp 复制代码
__USB_ALIGN_BEGIN static uint8_t usb_dev_cdc_cfgdesc[USB_CDC_CONFIG_DESC_SIZ]  = {
    0x09,
    USB_CFG_DESCRIPTOR_TYPE,///* wTotalLength 低字节 */
    USB_CDC_CONFIG_DESC_SIZ,//* wTotalLength 高字节 */
    0x00,
    0x02,
    0x01,
    0x00,
    0xC0,
    0x32,

将wTotalLength 16位总长度拆分为USB小端格式(Little-Endian)

一、USB协议层:小端序强制要求

USB协议规定所有多字节字段必须采用小端序(Little-Endian)传输:

低字节在前,高字节在后。

wTotalLength 是配置描述符中最重要的字段之一,它告知主机整个配置描述符集合的总长度,是USB枚举的"导航地图"。

二、核心作用:主机内存分配的"标尺"

场景:主机获取完整描述符

USB枚举过程中,主机分两步获取配置描述符:

第一步:获取配置描述符头部(仅9字节)

主机 → 设备: GET_DESCRIPTOR(CONFIGURATION, 0, 9)

设备 → 主机: [9字节配置头,含wTotalLength]

第二步:根据wTotalLength获取完整数据

主机读取wTotalLength = 273 (0x0111)

主机 → 设备: GET_DESCRIPTOR(CONFIGURATION, 0, 273) // 请求全部字节

设备 → 主机: [273字节完整配置包]

作用:主机动态分配足够内存,一次性读取所有接口、端点、功能描述符,避免多次小数据包传输。

三、完整配置包结构示例

wTotalLength = 273字节的实际内容:

┌────────────────────────────────────┐

│ 配置描述符 (9字节) │

├────────────────────────────────────┤

│ IAD描述符 (8字节) │

├────────────────────────────────────┤

│ 接口0描述符 (9字节) │

├────────────────────────────────────┤

│ 功能描述符 (Header/ACM/Union) │

├────────────────────────────────────┤

│ 端点描述符2 (7字节) │

├────────────────────────────────────┤

│ 接口1描述符 (9字节) │

├────────────────────────────────────┤

│ 端点描述符1 OUT (7字节) │

├────────────────────────────────────┤

│ 端点描述符1 IN (7字节) │

├────────────────────────────────────┤

│ ...CDC#2/3/4重复结构... │

└────────────────────────────────────┘

关键: wTotalLength 包含了所有下级描述符的长度之和。

相关推荐
wj3055853786 小时前
课程 9:模型测试记录与 Prompt 策略
linux·人工智能·python·comfyui
星寂樱易李7 小时前
iperf3 + Python-- 网络带宽、网速、网络稳定性
开发语言·网络·python
abigriver7 小时前
打造 Linux 离线大模型级语音输入法:Whisper.cpp + 3090 显卡加速与 Rime 中英混输终极调优指南
linux·运维·whisper
wangqiaowq7 小时前
windows下nginx的安装
linux·服务器·前端
YYRAN_ZZU8 小时前
Petalinux新建自动脚本启动
linux
charlie1145141918 小时前
嵌入式Linux驱动开发pinctrl篇(1)——从寄存器到子系统:驱动演进之路
linux·运维·驱动开发
于小猿Sup8 小时前
VMware在Ubuntu22.04驱动Livox Mid360s
linux·c++·嵌入式硬件·自动驾驶
cen__y9 小时前
Linux12(Git01)
linux·运维·服务器·c语言·开发语言·git
不仙52010 小时前
VMware Workstation 26.0.0 在 Ubuntu 24.04 (内核 6.17.0) 上的安装与内核模块编译问题
linux·ubuntu·elasticsearch
随身数智备忘录10 小时前
什么是设备管理体系?设备管理体系包含哪些核心模块?
网络·数据库·人工智能