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

一、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所示。

图1
图1 下行Packet Header的结构

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

图2 上行Packet Header的结构

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

图3 Hub的Route String映射关系

二、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进行了设置

图4 传给Hub本身的数据包

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

图5 通过hub传给其他device的数据包(透传)

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所示。

图6 Repeater模型

关于上图的解释:

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(推迟机制)

图7 deffer举例

上图是一个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中进行了设置,如下图所示),对应步骤③;

图7 DF bit的位置

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

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

5. 该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没有链路级别的重传机制)

参考文献:

1.《MindShare_USB_3.0_Technology_2013_v1.02》

2.《Universal Serial Bus 3.0 Specification (including errata and ECNs through May 1, 2011)》

  • 5
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这个任务需要使用编程语言和相应的库来实现,以下是一个Python示例代码: ```python import cv2 import paho.mqtt.client as mqtt # 设置MQTT连接信息 broker_address = "mqtt.eclipseprojects.io" topic = "camera/stream" # 设置摄像头 cap = cv2.VideoCapture(0) # 创建MQTT客户端实例 client = mqtt.Client() # 连接MQTT服务器 client.connect(broker_address) # 不断读取摄像头帧并发送到MQTT while True: ret, frame = cap.read() if not ret: break # 将图像转换成二进制数据并发布到MQTT img_str = cv2.imencode('.jpg', frame)[1].tostring() client.publish(topic, payload=img_str, qos=0) # 等待一段时间,减少CPU占用 cv2.waitKey(1) # 释放摄像头和MQTT连接 cap.release() client.disconnect() ``` 这段代码使用了OpenCV库来读取USB摄像头的帧,然后将帧转换成二进制数据,并使用paho-mqtt库发布到指定的topic。你需要根据具体的需求修改代码中的MQTT连接信息和topic。 ### 回答2: 要打开USB摄像头并将消息发送到指定的topic,首先需要通过软件或代码来实现这个功能。 首先,我们需要一个可以操作USB摄像头的库或驱动程序。其中一种常用的库是OpenCV。使用OpenCV,我们可以在Python等编程语言中打开和控制USB摄像头。 通过以下代码片段,我们可以使用OpenCV在Python中打开USB摄像头: ``` import cv2 # 打开摄像头 cap = cv2.VideoCapture(0) if not cap.isOpened(): print("无法打开USB摄像头") while True: # 读取摄像头图像 ret, frame = cap.read() # 如果成功读取到图像,则发送到指定的topic if ret: # ... 在这里编写将图像发送到topic的代码 ... # 按下'q'键退出循环 if cv2.waitKey(1) & 0xFF == ord('q'): break # 关闭摄像头 cap.release() cv2.destroyAllWindows() ``` 上述代码中,我们首先通过`cv2.VideoCapture()`函数打开USB摄像头,传入参数0表示使用系统默认的摄像头。在循环中,我们调用`cap.read()`函数来读取摄像头的图像。如果成功读取到图像,我们可以在注释的位置处编写将图像发送到指定topic的代码。 发送图像到指定topic的实现方式取决于你使用的消息传输协议和平台。例如,如果你使用MQTT协议,可以使用Python的paho-mqtt库来连接到指定的MQTT broker,并调用`publish()`函数将图像数据发送到topic。 总结起来,要打开USB摄像头并将消息发送到指定的topic,我们需要用到相应的库或驱动程序控制摄像头,并使用消息传输协议将图像数据发送到指定的topic。 ### 回答3: 要实现将USB摄像头打开并将消息发送到指定的topic,需要进行以下步骤: 首先,需要连接USB摄像头到计算机上,并确保摄像头驱动程序已经正确安装。 接下来,我们可以使用适当的编程语言或者框架,如Python和OpenCV,来实现打开USB摄像头的功能。可以通过使用相关的函数和方法,如cv2.VideoCapture()来访问和控制摄像头。 一旦摄像头被成功打开,我们就可以从摄像头中获取图像数据。可以使用cv2.VideoCapture对象的read()方法来获取图像帧。读取的图像帧可以保存为图像文件,或者进行进一步的处理,如人脸识别等。 要将消息发送到指定的topic,首先需要确定要使用的通信协议,如MQTT或者HTTP。然后,可以使用相应的库或者工具,如paho.mqtt库或者requests库,来实现消息的发送。 如果使用MQTT协议,需要创建一个MQTT客户端,并连接到MQTT代理服务器。然后,可以使用客户端对象的publish()方法来发送消息到指定的topic。 如果使用HTTP协议,可以使用HTTP请求库,如requests库,来发送HTTP请求。可以使用适当的HTTP方法(如POST或PUT)和相应的URL,来发送消息到指定的topic。 在发送消息之前,需要根据需求对消息进行适当的格式化和编码。然后,将消息数据作为参数传递给相应的发送函数,以完成消息的发送操作。 通过以上步骤,我们可以实现打开USB摄像头,并将消息发送到指定的topic。这样就可以实现摄像头图像的获取和消息的传递。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值