首页 > 其他分享 >【USB3.0协议学习】Topic1·USB3.0Hub的一些机制

【USB3.0协议学习】Topic1·USB3.0Hub的一些机制

时间:2024-09-15 16:26:32浏览次数:1  
标签:Hub hub header Topic1 packet USB3.0 buffer payload

一、USB3.0 Hub的单播(非广播)机制

Hub通过解析下行packet header中的Route String字段识别packet要传递的终点,其中4'b0000代表hub本身,4'b0001-4'b1111分别代表hub的各downstream port,由于USB3.0规定Host Controller最多级联5级hub,所以每个packet header中的Route String字段共有4x5=20bit。Packet中Route String字段位于Downstream Packet Header的DW0中,如图1所示。

对于上行Packet,由于都是传递给Host Controller的Packet,因此没有Route String字段,如图2所示。

图3是Hub的链接拓扑和Route String的映射关系,通过Route String可以明确指定该Packet要传递到的位置。

二、USB3.0 Hub的存储转发机制

Hub的两种下行数据包:

Hub本身可以作为一个device,其在usb的拓扑结构中也拥有地址,所以host传递给hub的包分两种情况:

1. host传递给Hub本身的数据包。例如 SetHubAddress或者GetPortStatus操作,这些数据包的终点就是Hub本身,这种是会牵扯到hub的protocol layer。如图4所示,host传递了一个packet给hub,hub的协议层对数据包处理后对downstream port0进行了设置

2. host通过hub透传给device的数据包。这些包是link to link级别传递的,不会牵扯到hub的protocol layer;

Hub的buffer需求

Hub中分为两类buffer:Header buffer和Data Buffer,前者用于缓存packet header,后者用于缓存data payload。Header 的大小是16Bytes,hub的每个downstream port和upstream port都分别有4个tx buffer和4个rx buffer(每个buffer只存一个packet header)。一个hub只有一个下行data buffer和一个上行data buffer,如图6所示。

关于上图的解释:

1.payload很大,所有payload全部存下来浪费资源,因此hub收到payload的第一时间就会传递,但是前提是header已经传递了(因为header必须在payload之前发送)。在header还没传递之前的小部分Data payload会被data buffer缓存下来。

2.左边downstream port1的Data15的header还在buffer中没有传递,所以Date15的payload会在hub的downstream data buffer中先缓存住,直到DATA15的header传给了对应的device,则Date15的payload往下传递;

3.右边同理,DATA31的header在upstream port的header buffer里还没传递,在upstream Data Buffer中会缓存住Data30的payload;

注意:Hub往device发的packet顺序必须和host给hub发的packet顺序一致

三、Hub的Deferred(推迟机制)

上图是一个deferred的示意图,解释如下:

  1. Host起初试图发起In Transfer,于是给Device B发送了ACK。此时Downstream Port4的LTSSM状态机处于U1状态,不能立马传递信息,对应步骤①②;
  2. Downstream port4给Host传回ACK(将Deferred bit,Delayed Bit和Hub Depth在ACK packet的Link Control Word中进行了设置,如下图所示),对应步骤③;

  1. Host收到该消息后,暂时将该任务放一边,并发起Device A的传输任务,对应步骤④;

  2. Hub的Downstream Port4把之前deferred的ACK存下来了,等到LTSSM状态机恢复到U0状态后再把ACK传递给Device B,然后Device B传回ERDY,对应步骤⑤⑥;

  3. 该ERDY收到后,Host会重新给Device B发起ACK,完成之前被推迟的传输。

四、Hub的错误检测和重传机制

Hub的错误检测是通过对packet中的CRC进行校验完成的:

  1. 对于header错误会执行链路级的重传,并丢弃掉对应的data payload。例如,Hub的downstream port发送了header后,该header仍然会存在对应port的header buffer中,直到收到device传回的LGOOD_n。这个机制跟host和device的链路重传是一样的)
  2. 若header没错,但payload错误则hub不会进行处理(它把该packet继续传下去,因为payload没有链路级别的重传机制)

标签:Hub,hub,header,Topic1,packet,USB3.0,buffer,payload
From: https://www.cnblogs.com/linhaostudy/p/18415329

相关文章

  • USB总线-Linux内核USB3.0 Hub驱动分析(十四)
    1.概述USBHub提供了连接USB主机和USB设备的电气接口。USBHub拥有一个上行口,至少一个下行口,上行口连接上一级的Hub的下行口或者USB主机,连接主机的为RootHub,下行口连接下一级Hub的上行口或者USB设备。经过Hub的扩展,一个USB主机可以和多个USB设备通信。USBHub有如下特性:良好的......
  • 在shell中使用github copilot
    brewinstallghghauthloginghextensioninstallgithub/gh-copilot createalias:aliascopilot='ghcopilot';echo'aliascopilot="ghcopilot"'>>~/.zshrc&&source~/.zshrcaliasgcs='ghcopilotsuggest&#......
  • 如何在 Fork 的 GitHub 项目中保留自己的修改并同步上游更新?github_fork_update
    如何在Fork的GitHub项目中保留自己的修改并同步上游更新?在GitHub上Fork了一个项目后,你可能会对项目进行一些修改,同时原作者也在不断更新。如果想要在保留自己修改的基础上,同步原作者的最新更新,很多人会不知所措。本文将详细讲解如何在不丢失自己改动的情况下,将上游仓库的更......
  • github push项目
    新建项目进入项目文件夹,打开gitbash执行ls检查文件目录执行gitinit初始化执行gitadd.把文件都加到缓存区执行gitcommit-m"添加说明(注意代码规范)"gitbranch-Mmain重命名当前分支为miangitremoteaddoriginhttps://github.com/用户没/项目名.git向本地Git仓库......
  • Github数据泄露事件处置常见技巧
    手动获取个人邮箱方法一:通过commits找到作者提交的,点击箭头位置在出现的url后面加上.patchhttps://github.com/xxxx/xxxexample/commit/4a0b0613da9ca66c61bc9e8eeebe7325c4908afeb修改后的https://github.com/xxxx/xxxexample/commit/4a0b0613da9ca66c61bc9e8eeebe7325c4......
  • GitHub狂飙3万star的LLM公开资料
    先用一张图片说明这篇blog多火热!本篇大型语言模型(LLM)课程分为三个部分:......
  • immich docker-compose.yml下载慢、github下载慢、ghcr.io镜像
    解决方案:将:image:ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-release}改为:image:ghcr.nju.edu.cn/immich-app/immich-server:${IMMICH_VERSION:-release}使用镜像下载,给出修改后的文件,直接复制然后就可以运行。点击查看代码##WARNING:Makesuretousethed......
  • USB总线-Linux内核USB3.0设备控制器中断处理程序分析(九)
    1.概述USB设备枚举、请求处理、数据交互都涉及USB设备控制器中断。当有事件发生时,USB设备控制器首先将事件信息通过DMA写入到事件缓冲区中,然后向CPU发出中断,随后CPU调用中断处理函数开始处理中断事件。2.事件dwc3USB设备控制器事件使用dwc3_event数据结构描述,由4个字节组成。......
  • 如何将本地项目上传到GitHub(SSH连接)
    在个人GitHub中新建项目(远程仓库),添加一个README文件,方便后面验证记住这个默认分支,我这里是main,你的可能是master或其他先复制下SSH地址在项目文件夹中右键打开Git命令行初始化本地仓库,同时指定默认分支为main,与远程仓库的main保持一致gitinit-bmain关联本地Git......
  • USB总线-Linux内核USB3.0主机控制器驱动框架分析(十二)
    1.概述如下图所示,Linux内核中USB主机体系结构由五部分组成,分别为ApplicationSoftware、USBClassDriver、USBCore((USBDriver)、USBHostControllerDriver、USBHostController。应用程序处于用户空间,通过系统调用访问ClassDriver,从而间接的访问USB设备,如主机端的应用程......