导图社区 USB
USB知识点总结,包括关键过程,描述符,USB系统结构,USB总线数据流,设备状态的内容点总结。
编辑于2022-12-06 11:40:30 浙江省这是一篇关于程序和库信息的思维导图,主要内容包括:(查看基础信息),获取ELF节的长度信息,显示可执行文件或库需要静态加载的动态库完整列表--显示加载时的依赖项,列出二进制文件的节信息,查看动态节,列出并查看段,查看重定位节,反汇编,列出库中未定义的符号,列出动态符号,列出二进制文件或库的符号表,查看节中的数据,符号的类型。
这是一篇关于设备驱动的思维导图,主要内容包括:主要功能,设备驱动模型。阐述了设备驱动的主要功能、信号定义、设备驱动模型等内容。
这是一篇关于算法的思维导图,主要内容包括:云计算,内存管理算法,分布式同步算法,避免死锁算法,进程调度算法,磁盘调度算法。
社区模板帮助中心,点此进入>>
这是一篇关于程序和库信息的思维导图,主要内容包括:(查看基础信息),获取ELF节的长度信息,显示可执行文件或库需要静态加载的动态库完整列表--显示加载时的依赖项,列出二进制文件的节信息,查看动态节,列出并查看段,查看重定位节,反汇编,列出库中未定义的符号,列出动态符号,列出二进制文件或库的符号表,查看节中的数据,符号的类型。
这是一篇关于设备驱动的思维导图,主要内容包括:主要功能,设备驱动模型。阐述了设备驱动的主要功能、信号定义、设备驱动模型等内容。
这是一篇关于算法的思维导图,主要内容包括:云计算,内存管理算法,分布式同步算法,避免死锁算法,进程调度算法,磁盘调度算法。
USB
关键过程
USB枚举过程
1.USB主机检测到USB设备插入后 就会先对设备复位
USB设备在总线复位后其地址为0 这样主机就可以通过0地址和那些刚刚插入的设备通信 USB主机往地址为0的设备端点0发送获取设备描述符的标准请求 设备收到该请求后 会按照主机请求的参数 在数据过程将设备描述符返回给主机 主机在成功获取到一个数据包的设备描述符并且确认没有错误后 就返回一个0长度的确认数据包(状态过程)给设备 从而进入到接下来的设置地址阶段
2.主机对设备又一次复位
进入到了设置地址阶段 USB主机往地址为0的设备端点0发出一个设置地址的请求(控制传输的建立过程) 新的设备地址包含在建立过程的数据包中 具体的地址由USB主机负责管理 主机会分配一个唯一的地址给刚接入的设备 USB设备在收到这个建立过程之后 就直接进入到状态过程(因为这个控制传输没有数据过程) 设备等待主机请求状态返回(一个输入令牌包) 收到令牌包后 设备就返回0长度的状态数据包 如果主机确认该状态包已经正确收到 就会发送应答ACK给设备 设备在收到这个ACK之后 就要启用新的设备地址了
3.主机获取设备描述符
首先时主机使用新的设备地址来访问设备获取全部18字节的设备描述符
4.主机获取配置描述符
配置描述符共为9字节 主机在获取到配置描述符后 根据配置描述符中所描述的配置集合总长度 获取配置集合 获取配置描述符和获取配置描述符集合的请求时差不多的 只是指定的长度不一样 有些主机干脆不单独获取配置描述符 而是直接使用最大长度来获取配置描述符集合(因为设备实际返回的数据可以少于指定的字节数) 配置描述符集合包括配置描述符 接口描述符 类特殊描述符 端点描述符 (接口描述符 类特殊描述符 端点描述符时不能单独获取的 必须跟随配置描述符以一个集合的方式返回)
USB连接过程
1.当USB设备连接到主机或集线器的下行端口后 总线立即为其提供电源
2.当主机检测到D-/D+线上电压 确认其下行端口有USB设备连接
3.USB集线器通过中断IN管道 向USB主机报告下行端口有USB设备连接
4.USB主机等等100ms 确保USB设备连接的稳定性
5.主机发送集线器设备请求SetPortStatus复位连接的USB设备
6.复位结束后 USB设备进入默认状态 使用默认地址对管道0的控制事务响应
7.主机向USB功能设备发送GetDescriptor(Device)请求 获取默认控制管道的最大数据包长度
8.主机发出SetAddress请求 为连接的USB设备分配一个唯一的设备地址
9.主机使用新的地址向USB设备发送GetDescriptor(Device)请求 并读取其设备描述符的全部字段(产品ID 供应商ID)
10.主机循环发送GetDescriptor(Configuration)请求 获取完整的配置信息(配置描述符 接口描述符 端点描述符 各类设备类定义描述符 和供应商自定义描述符)
11.主机根据USB设备的配置信息 为其选择并加载一个合适的主机驱动程序
12.在加载 驱动程序后 便可以进行各种配置操作和数据传输
USB设备断开过程
1.当USB设备从集线器下行端口断开时 集线器禁止该端口 并通过中断IN管道向USB主机报告其端口状态的变化
2.主机发送GetPortStatus请求了解详细信息 并处理该断开操作
3.USB驱动程序释放其所占用的所有系统资源
USB主机向USB设备发送数据流程
1.主机软件将数据保存在发送数据缓冲区中 向USB总线驱动程序发送数据传输请求(IO请求包IRP)
2.USB总线驱动程序对主机软件的IO请求包(IRP)进行响应 将其中的数据转换为USB协议中规定的数据流管理格式 并将其向下传递给USB主控制器驱动程序
3.USB的主控制器驱动程序将每个数据流管理转换为一些列帧/小帧为单位的数据流管理队列
4.在USB主控制器中 读取数据流管理列表 将其中的数据流管理以信息包的形式发送到USB总线上
5.USB功能设备接收信息 USB的SIE引擎自动解码信息包 并将数据保存在指定的端点缓冲区中 供USB进行处理
urb处理流程
描述符
设备描述符
记录信息有: 设备所使用的USB协议版本号,设备类型,端点0的最大包大小,厂商ID(VID)和产品ID(PID), 设备版本号,厂商字符串索引,产品字符串索引,设备序列号索引,可能的配置数
配置描述符
记录信息有: 配置所包含的接口数,配置的编号,供电方式,是否支持远程唤醒,电流需求量
接口描述符
记录信息有: 接口的编号,接口的端点数,接口所使用的类,子类,协议等
端点描述符
记录信息有: 端点号及方向,端点的传输类型,最大包长度m查询时间间隔
字符串描述符
主要记录一些帮助信息
USB系统结构
功能层
主要负责数据传输 由USB设备的功能单元和对应的USB主机程序组成 USB主机程序用于和特定的USB设备功能单元进行通信
控制传输
主要用于传输少量的对时间和速率都没有要求的数据 一般用于USB主机读取或设置USB设备的配置信息
建立阶段
数据阶段
状态阶段
中断传输
主要用于传输少量的对传输时间具有周期性要求的数据
令牌阶段
数据阶段
握手阶段
块传输
主要用于传输大量的 对传输时间和速率没有严格要求的数据
令牌阶段
数据阶段
握手阶段
同步传输
用于传输大量的且传输时间具有周期性 速率恒定的数据
令牌阶段
数据阶段
设备层
主要用于管理USB设备 分配USB地址 读取设备描述符等
总线接口层
主要用于实现USB主机和USB设备之间的数据传输 USB总线接口使用NRZI编码来传输数据 USB主控制器和USB集线器将数据接收或发送 并且自动进行编解码 该部分一般是USB系统硬件自动完成
USB总线数据流
字段
同步字段-SYNC
用于数据通信的同步
包标识字段-PID
指明信息包类型 用于差错控制
令牌包
PID[3:0]=0001B 表示OUT PID此时数据从USB主机发送到USB设备 PID[3:0]=1001B 表示IN PID 此时数据从USB设备发送到USB主机 PID[3:0]=0101B 表示SOF PID 此时作为一个帧或者小帧的开始信息 PID[3:0]=1101B 表示SETUP PID此时作为主机向USB设备发送配置信息
握手包
PID[3:0]=0010B 表示ACK PID 说明接收方已经正确接收到数据 PID[3:0]=1010B 表示NAK PID 说明接收方未能正确接收到数据 PID[3:0]=1110B 表示STALL PID 说明使用的端点被挂起 PID[3:0]=0110B 表示NYET PID 说明接收方没有任何响应
数据包
PID[3:0]=0011B 表示DATA0 PID 数据包为偶数据包 PID[3:0]=1011B 表示DATA1 PID 数据包为奇数据包 PID[3:0]=0111B 表示DATA2 PID 为一个高速同步事务的专用数据包 PID[3:0]=1111B 表示MDATA PID 为一个SPLIT事务的专用数据包
特殊包
PID[3:0]=1100B 表示PRE PID 如果是令牌信息 则为USB主机发送的先导包 用于使能USB低速数据通信 PID[3:0]=1011B 表示ERR PID 如果是握手信息 则用于SPLIT事务中的错误握手信号 PID[3:0]=1000B 表示SPLIT PID 为一个高速SPLIT事务的令牌信息 PID[3:0]=0100B 表示PING PID 用于数据流量检测控制
地址字段-ADDR
指明USB总线上的一个USB设备 地址0作为默认地址不能分配给USB设备 在USB上电时 USB首先通过默认地址0和USB设备进行通信 当USB上电配置完成后 USB主机便重新为该USB设备分配一个USB地址
端点字段-ENDP
指明USB的端点 端点字段长度为4位 对于低速USB设备 USB协议只规定了3个端点 对于高速USB设备 包含全部16分端点 端点0是所有USB设备所必需的 端点0主要用于在USB设备上电初期和USB主机进行通信 从而完成USB设备的配置
帧号字段-NUM
指明当前帧的帧号 表征了当前帧或小帧的帧号 一般 在每个帧或小帧发送时 帧号字段里的内容字段+1
数据字段-DATA
包含传输的数据 首先传输低字节 然后传输高字节 对于每一字节 先传输字节的低位 再传输字节的高位 实际数据字段的长度根据传输类型和程序的需要决定
校验字段-CRC
循环冗余校验CRC一般再发送方的位填充操作之前进行 可以检验信息包的正误 以保证传输的可靠性 令牌包采用5位循环冗余校验CRC 数据包采用16位循环冗余校验CRC
数据流阶段
令牌阶段
定义了本次传输的类型 用于表征数据流的开始
数据阶段
包含了本次传输的数据 数据大小根据端点和传输类型而定 最大量为1024字节
握手阶段
用于数据的接收方 向 发送方报告此次数据传输是否成功
信息包类型
令牌包
IN令牌包
PID字段-定义了数据传输方向为USB设备到USB主机 ADDR字段-指明了USB设备地址 ENDP字段-指明了发送数据的端点号 CRC字段-用于对ADDR字段和ENDP字段进行循环冗余校验 IN数据流管理操作步骤: 1).USB主机向USB设备发送IN令牌包 表示主机可以接收数据 2).USB设备正确接收到IN令牌包 然后向USB主机发送数据包 3).USB主机正确接收到数据包后 向USB设备返回ACK握手包 确认传输成功
OUT令牌包
PID字段-定义了数据传输方向为USB主机到USB设备 ADDR字段-指明了USB设备地址 ENDP字段-指明了接收数据的端点号 CRC字段-用于对ADDR字段和ENDP字段进行循环冗余校验 OUT数据流管理操作步骤: 1).USB主机向USB设备发送OUT令牌包 表示主机将要发送数据 2).USB设备正确接收到OUT令牌包 然后USB主机开始发送数据包 3).USB主机正确接收到数据包后 向USB设备返回ACK握手包 确认传输成功
SETUP令牌包
PID字段-定义了数据传输方向为USB主机到USB设备 ADDR字段-指明了USB设备地址 ENDP字段-指明了接收数据的端点号 CRC字段-用于对ADDR字段和ENDP字段进行循环冗余校验 SETUP数据流管理操作步骤: 1).USB主机向USB设备发送SETUP令牌包 表示主机将要发送DATA0数据 2).USB设备正确接收到SETUP令牌包 然后USB主机开始发送DATA0数据包 3).USB主机正确接收到DATA0数据包后 向USB设备返回ACK握手包 确认传输成功
PING令牌包
PID字段-定义了USB设备到USB主机的握手信号传输 ADDR字段-指明了USB设备地址 ENDP字段-指明了发送握手包的端点号 CRC字段-用于对ADDR字段和ENDP字段进行循环冗余校验 PING数据流管理的操作步骤 1).USB主机向USB设备发送PING令牌包 表示一个PING事务的开始 2).USB正确接收到该令牌包 然后USB设备向USB主机返回各种握手包进行响应
SOF令牌包
PID字段-定义了数据传输方向为USB主机到USB设备 帧号字段-指明了USB传输的帧号 SOF数据流管理的操作步骤 1).由USB主机发送一个SOF令牌包即可 { 对于低速和全速USB传输 每1ms产生一个SOF令牌包 对于高速USB传输 每个125us产生一个小帧 每隔7个小帧 产生一个SOF令牌包 }
SPLIT令牌包
SSPLIT令牌包
PID字段-定义了数据传输方向为USB主机到USB集线器 ADDR字段-指明了USB集线器的设备地址 SC字段-该字段固定为0 用于表示开始SPLIT令牌包 PORT字段-用于指明USB集线器的端口号 S字段-{ 在中断传输和控制传输下{ S=0 表示全速数据传输 S=1 表示低速数据传输 } 在块传输和同步IN传输下{ S必须置为0 } 在同步OUT传输下{ S=0,E=0 表示全速数据负载的中间数据是高速数据 S=0,E=1 表示全速数据负载的尾部数据是高速数据 S=1,E=0 表示全速数据负载的首部数据是高速数据 S=1,E=1 表示全速数据负载的全部数据是高速数据 } } E字段-{ 在块传输 中断传输 同步IN传输和控制传输下{ E必须为0 } 在同步OUT传输下{ S=0,E=0 表示全速数据负载的中间数据是高速数据 S=0,E=1 表示全速数据负载的尾部数据是高速数据 S=1,E=0 表示全速数据负载的首部数据是高速数据 S=1,E=1 表示全速数据负载的全部数据是高速数据 } } ET字段-用于指明在高速数据传输中 使用的低速/全速数据传输的类型{ ET=00 表示采用控制传输 ET=01 表示采用同步传输 ET=10 表示采用块传输 ET=11 表示采用中断传输 } SSPLIT数据流管理操作步骤 1).USB主机发送令牌包(包括SSPLIT令牌包和低速/全速令牌包2个) 2).USB设备正确接收到该令牌包 此时USB主机发送DATAx数据包 3).USB设备正确接收DATAx数据包 在握手阶段返回握手信息
CSPLIT令牌包
PID字段-定义了数据传输方向为USB主机到USB集线器 ADDR字段-指明了USB集线器的设备地址 SC字段-该字段固定为1 用于表示结束SPLIT令牌包 PORT字段-用于指明USB集线器的端口号 S字段-{ 在中断传输和控制传输下{ S=0 表示全速数据传输 S=1 表示低速数据传输 } 在块传输和同步IN传输下{ S必须置为0 } 在同步OUT传输下{ S=0,E=0 表示全速数据负载的中间数据是高速数据 S=0,E=1 表示全速数据负载的尾部数据是高速数据 S=1,E=0 表示全速数据负载的首部数据是高速数据 S=1,E=1 表示全速数据负载的全部数据是高速数据 } } U字段-{ 其值必须为0 } ET字段-用于指明在高速数据传输中 使用的低速/全速数据传输的类型{ ET=00 表示采用控制传输 ET=01 表示采用同步传输 ET=10 表示采用块传输 ET=11 表示采用中断传输 } CSPLIT数据流管理操作步骤 1).USB主机发送令牌包(包括CSPLIT令牌包和低速/全速令牌包2个) 2).USB设备正确接收该令牌包 此时USB主机发送DATAx数据包 或USB设备返回握手信息
PRE令牌包
只包含一个8位的包标识PID字段 是低速数据传输的先导包 在开始低速数据传输前 必须先发送先导包PRE USB集线器才会激活相应的低速数据传输端口 PRE数据流管理操作流程 1).USB主机直接发送PRE令牌包(PRE数据流管理不需要数据包和握手包)
数据包
PID字段-用于指明不同的包类型 数据字段-包含了传输的数据 CRC字段-使用16位的循环冗余校验来对数据字段进行保护
握手包
进由8位的包标识字段PID组成 主要用于在数据传输的末尾报告本次数据传输的状态 握手包之后便是整个事务处理的结束信号EOP
ACK握手包
当USB数据传输的接收方正确接收到数据包时 接收方将返回ACK握手包 ACK握手包表征了一次正确的数据传输 之后才可以进行下一次事务处理
NAK握手包
NAK握手包一般由USB功能设备发出 对于IN数据传输 表示USB设备没有计划向USB主机发送数据 对于OUT数据传输 表示USB设备无法接收USB主机发出的数据
STALL握手包
协议STALL握手包{ 在控制传输中使用 表明了该USB功能设备不支持这个请求协议 } 功能STALL握手包{ 表明该USB功能设备的相应端点已经停止 而无法完成发送数据或者接收数据的操作 }
NYET握手包
如果USB集线器无法正常处理SPLIT请求 则USB集线器向USB主机返回NYET握手包 NYET握手包一般只发生在高速数据传输过程中
ERR握手包
用于表示总线数据传输发生错误 一般发生在高速数据传输过程中
设备状态
连接状态
当USB功能设备通过USB电缆连接到USB主机或集线器的下行端口时 进入连接状态 此时USB总线开始向USB设备供电 直至电源稳定工作
上电状态
当连接到USB主机的USB功能设备得到稳定的USB总线电源后 处于上电状态 此时USB功能设备还没有被复位 不能对任何USB事务进行处理
默认状态
当USB功能设备上电后 USB功能设备会响应USB主机发出的复位信号 进行复位操作 复位结束后 USB功能设备便进入默认状态 默认状态下使用默认的设备地址(0)对一些USB事务进行处理 响应USB主机发出的标准USB设备请求 包括SetAddress SetConfiguration GetDescriptor(Device) GetDescriptor(Configuration)
地址状态
在USB功能设备复位结束后 USB主机重新为该USB设备分配一个新的设备地址 这个地址时唯一的 此时便处于地址状态 在地址状态之后 USB设备将不再使用默认的设备地址 而使用新分配的地址来进行以后的总线活动
配置状态
在USB设备复位和分配地址之后 主机发出SetConfiguration请求 USB在正确响应配置操作后 便进入配置状态 在配置状态下 所有寄存器返回至默认状态 主机软件可以和USB设备功能单元进行数据传输 为主机提供额外的功能
挂起状态
如果USB设备在3ms内没有检测到总线活动 其将自动进入挂起状态 在挂起状态下 USB将保持原有的设备地址和配置值 在USB连接的任何过程中都可以进入挂起状态 USB总线的任何活动都可使其退出挂起状态