打印
[在线研讨会]

【技术分享】一起由usb控制器错误导致的异常状态解决方案

[复制链接]
753|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 76290391 于 2023-10-13 10:02 编辑

#申请原创#    @21小跑堂
由于公司设备需要usb支持,且使用最频繁的通信方式,一直使用的usb2.0,且较稳定。最近增加了对usb3.0协议支持,遇到挺多问题。
下面这个解决了挺久时间,下面来描述一下解决方案。本人usb协议认识不深,浮于表面,如果解释错误,请指正,虚心继续学习。
1 问题描述:
控制器本身状态机健壮性比较差。测试人员使用usb通信线质量很差,链路训练的过程惨不忍睹,逻辑分析仪抓包没法看。通过查看状态机切换,能看到链路训练到了polling,然后迁移到ss.disable,下一步会循环进入hot reset状态,距离usb枚举还有挺多距离。
2 相关知识

usb3.0的状态机切换比较复杂。如下图。


状态解释:
ss.disable:此状态说明对端移除了低阻抗接收器,对端不支持superspeed连接。对于自供电设备,是一个逻辑上的掉电状态。
SS.Inactive:是一个进行superspeed操作失败的状态。
Rx.Detect:检测对端存在的状态。
polling:链路训练的状态
U0 U1 U2 U3:处于可通讯的四个状态。分别是正常工作,空闲状态,休眠状态和挂起状态。
recovery:如果物理数据传输错误,会进入此状态,重新进行训练。

--------------------------------------------------------------------
控制器如果做的稳健,在训练完成后,不会进入recovery状态进行循环,会高效率持续传输数据。
我工作经历 的错误是控制器状态机不太好,如果host端设备不稳定或者状态不正常,会跑飞。

虽然usb3.0再训练失败次数过多,会自动调整为usb2.0协议继续使用,但是项目使用的控制器状态机跑飞,并没有正常切换,而是蹲在一个warm reset持续不停的发出中断。
3 解决方案
关闭控制器,写调整控制器的寄存器,使用usb2.0的控制器,再开启usb控制器,此问题解决。


使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

11

主题

79

帖子

1

粉丝