0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于DWC2的USB驱动开发-USB复位详解

嵌入式USB开发 来源:嵌入式Lee 作者:嵌入式Lee 2023-07-07 11:18 次阅读

本文转自公众号欢迎关注

基于DWC2的USB驱动开发-USB复位详解 (qq.com)

一.前言

上一篇我们详细介绍了USB枚举的第一步,连接检测。那么第二步是干什么呢? 相信做过嵌入式开发尤其做过驱动开发的都会想到-复位,基本上所有的外设模块在开始都需要进行复位操作,以达到一个默认的状态,USB也不例外。一方面初始化时复位以达到默认状态,一方面在异常时复位以恢复。话说复位可以解决99%的问题就是这么来的,如果还不能解决那就断电复位,相信这是很多人解决问题的第一板斧,且不说是不是最优选择,至少这样一般都有效,当然可靠性考虑是否能直接复位一般都需要评估不能这么直接简单粗暴。

这一篇我们就来详细讲讲USB的复位,老规矩理论结合实践,先看规格书的说明再写驱动实测。

二.USB的复位

2.1复位信号

首先,复位信号到底是什么样的呢?调试外设时序的时候一般都会关注,复位一般用一组特殊的状态时序来表示,USB也一样。

我们看到USB2.0规格书中对复位信号的描述如下

b18e5432-1c5f-11ee-9c1d-dac502259ad0.png

对于发送端要求D+和D-小于VOL(max)持续10mS以上,VOL(max)的值为0.3V,如下

b1bacbd4-1c5f-11ee-9c1d-dac502259ad0.png

而对于接收端要求D+和D-小于VIL(max)持续10mS以上,VIL(max)值为0.8V

b1cca16a-1c5f-11ee-9c1d-dac502259ad0.png

可以看到VIL(max)比VOL(max)是要大的,这是对发送要求严格一些,因为要考虑信号传输的噪声干扰等因素,预留一些裕度。

上述10ms的参数实际有个名字叫(TDRST),规格书中要求如下

b1e05246-1c5f-11ee-9c1d-dac502259ad0.png

而一般要求接收端在D+和D-小于VIL(max)持续2.5uS以上就应该检测到复位,这个时间记住,我们可能会遇到临界情况在这个值附近可能出现不稳定的情况,调试时留个心眼,一旦出现这种很可能就是疑难杂症,但是现在留个心眼以后就可能想起来确认这里。

对于根集线器这里还有个要求就是非连续的复位要有3mS以上的间隔(TRHRSI),复位持续周期50mS(TDRSTR)以上(因为USB拓扑最大有5个集线器)

b1fc778c-1c5f-11ee-9c1d-dac502259ad0.png

2.2复位过程

参考USB2.0的规格书《7.1.7.5 Reset Signaling》

在低速/全速模式下运行的设备,如果其面向上游的端口上出现SE0超过2.5µs(TDETRST),则可以将该信号视为复位信号。复位须在复位信号结束之前生效。注意这里是复位信号结束之前就生效。(实际这里还可能导致隐蔽的BUG,我这里有一个精彩的案例分析,高速设备总是枚举为全速设备的问题,神奇的是在复位中段服务函数中加个打印就好了,后面会分享)

b20fb68a-1c5f-11ee-9c1d-dac502259ad0.png

1.主机(HUB)检测到设备连接,通过DP还是DM拉高区分是低速还是全速/高速。

2.主机(HUB驱动信号SE0以产生复位信号。

3.设备检测到SE0持续2.5uS(TFILTSE0)以上检测到复位,产生复位中断。

对于低速设备完成复位,对于全速和高速设备后面继续进行高速设备的检测。

速度的检测后面会单独再讲。

如果是从non-suspended全速状态复位则必须在SE0

开始后的2.5uS(TFILTSE0)~3.0 ms(TWTRSTFS)时间内进行后续的高速速度检测握手。

如果是从suspend状态复位,则必须在SE0开始后的2.5uS(TFILTSE0)以上时间后进行高速速度检测握手,为什么这里没有最长时间3.0 ms(TWTRSTFS)的限制了呢,因为挂起时时钟是停止的重启时钟需要时间,所以这里不限制上限时间。

如果是从non-suspended高速状态复位,则设备在恢复到全速之前必须等待不少于3.0ms且不多于3.125ms(TWTREV)。通过移除高速端接电阻并重新连接D+上拉电阻器,可实现全速恢复。该设备对总线状态进行采样,并在开始恢复至全速后检查SE0(复位而非挂起)、不小于100µs且不大于875µs(TWTRSTHS)。如果检测到SE0(复位),则设备开始高速检测握手。

注意

设备必须能够在复位恢复时间10 ms(TRSTRCY)后接受SetAddress()请求,这个时间也是一个调试经验,如果不能枚举可以检查设备的响应时间是否过长。

由于面向下游的端口在复位期间不会处于传输状态,因此高速Chirp信号不会引发断开连接检测。

如下图是DWC2驱动的复位波形,黄色为DP,高速模式。

b22b27f8-1c5f-11ee-9c1d-dac502259ad0.png

通过仿真器GDB load程序重新运行,而不是直接上电运行,如果是后者则没有(1)这个状态此时默认是没有拉高的。

DWC2控制器的软件复位不会影响SftDiscon位的状态,所以load程序后SftDiscon保持之前的拉高状态,DWC2控制器复位也不会影响

直到相关UTMI时钟复位,如下代码执行对应到(2)前面的DP拉低,此时UTMI等复位应该是导致了PHY的相关状态复位。

b24e5bd8-1c5f-11ee-9c1d-dac502259ad0.png

然后是软件设置SftDiscon位为0,拉高DP,如下代码处,对应(2)处的拉高

b283e24e-1c5f-11ee-9c1d-dac502259ad0.png

然后DP拉高100mS之后(3),主机发送复位(4),这里看到复位时间非常短,这是因为设备2.5uS以上,实际是8uS就检测到了复位(如下图所示,图中标尺部分,后面的蓝色的高DM的高是设备发出的Chirp K高速握手信号),进行了后续的高速握手,所以覆盖了主机发送的复位信号,所以看不到复位10mS的持续时间。

b2ad1344-1c5f-11ee-9c1d-dac502259ad0.png

三.总结

复位的信号很简单,但是承接的是连接检测到后续的高速速度握手,时序非常重要,尤其是有个参数2.5uS,检测到复位信号持续2.5uS即检测到复位,而不需要等复位信号移除即不需要等10mS,所以会出现主机在驱动复位,设备已经检测到复位开始后续的高速握手,从波形上看就看不到复位信号持续10mS了,而这也可能导致一些性能不达标的主机,高速握手失败,这个后面单独讲案例分析。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • usb
    usb
    +关注

    关注

    59

    文章

    7432

    浏览量

    258161
  • 复位
    +关注

    关注

    0

    文章

    159

    浏览量

    24047
  • USB驱动器
    +关注

    关注

    0

    文章

    8

    浏览量

    5225
  • 复位信号
    +关注

    关注

    0

    文章

    50

    浏览量

    6169
  • DWC2
    +关注

    关注

    0

    文章

    35

    浏览量

    98
收藏 人收藏

    评论

    相关推荐

    基于DWC2USB驱动开发-数据不能发送问题分析案例

    本文转自公众号欢迎关注 基于DWC2USB驱动开发-数据不能发送问题分析案例 (qq.com)   一.前言        对于驱动
    的头像 发表于 08-08 09:43 1126次阅读
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-数据不能发送问题分析案例

    基于DWC2USB驱动开发-抽丝剥茧再论切换到状态阶段标志DOEPINTn.StsPhseRcvd

    本文转自公众号系列文章,欢迎关注 基于DWC2USB驱动开发-USB详解 (qq.com)
    的头像 发表于 07-24 18:04 815次阅读
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-抽丝剥茧再论切换到状态阶段标志DOEPINTn.StsPhseRcvd

    基于DWC2USB驱动开发-控制传输中断相关寄存器

    本篇讲解Scatter/Gather DMA模式下控制传输相关的寄存器。控制传输是USB驱动的核心部分,控制传输调通了驱动就完成了一大半,而驱动的核心又是中断的处理。
    的头像 发表于 07-24 00:07 1303次阅读
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-控制传输中断相关寄存器

    基于DWC2USB驱动开发-USB详解

    不管什么通讯协议,比如UART,SPI,USB等等,不管是并口还是串口,不管是同步还是异步,我们从抽象的角度去看,其本质都是一样的。都是先定义物理信号,物理信号可能是差分,单端,电流驱动电压驱动等等
    的头像 发表于 07-23 17:11 1464次阅读
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-<b class='flag-5'>USB</b>包<b class='flag-5'>详解</b>

    基于DWC2USB驱动开发-发送相关的寄存器DMA寄存器详解

    本文转自公众号,欢迎关注 基于DWC2USB驱动开发-发送相关的寄存器DMA寄存器详解 (qq.com) 前言 如下寄存器DIEPxxx,
    的头像 发表于 07-16 16:42 882次阅读
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-发送相关的寄存器DMA寄存器<b class='flag-5'>详解</b>

    基于DWC2USB驱动开发-设备类驱动框架

    本文转自公众号,欢迎关注 基于DWC2USB驱动开发-设备类驱动框架 (qq.com) 一.前言 从软件顶层,从数据流的角度来看
    的头像 发表于 07-16 15:56 667次阅读
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-设备类<b class='flag-5'>驱动</b>框架

    基于DWC2USB驱动开发-UVC的相机终端详解

    本篇来详细分析下UVC的相机终端相关的内容,同样的我们理论结合实践来进行。
    的头像 发表于 07-13 09:46 1146次阅读
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-UVC的相机终端<b class='flag-5'>详解</b>

    基于DWC2USB驱动开发-高速设备枚举为全速设备问题案例分析

    本文转自公众号,欢迎关注 基于DWC2USB驱动开发-高速设备枚举为全速设备问题案例分析 (qq.com) 一.前言   本文分享一个高速设备被枚举为全速的问题。     高速设备速
    的头像 发表于 07-10 17:12 766次阅读
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-高速设备枚举为全速设备问题案例分析

    基于DWC2USB驱动开发-高速设备速度握手详解

    前面我们分析了USB连接和复位的过程, 也知道低速和全速/高速的USB设备分别是上拉DM和DP,主机通过不同的上拉区分接的是低速还是全速/高速设备的。但是怎么区分全速和高速呢? 这就需要额外的一些握手过程,本篇就来详细介绍该过程
    的头像 发表于 07-08 08:40 1487次阅读
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-高速设备速度握手<b class='flag-5'>详解</b>

    基于DWC2USB驱动开发-USB连接详解

    本文转自公众号,欢迎关注 基于DWC2USB驱动开发-USB连接详解 (qq.com) 一.前
    的头像 发表于 07-07 08:46 2310次阅读
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-<b class='flag-5'>USB</b>连接<b class='flag-5'>详解</b>

    基于DWC2USB驱动开发-IAD描述符详解

    本文转自公众号,欢迎关注 基于DWC2USB驱动开发-IAD描述符详解 (qq.com) 一.  前言 IAD描述符用于一个设备功能关联多
    的头像 发表于 06-27 08:45 1.2w次阅读
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-IAD描述符<b class='flag-5'>详解</b>

    基于DWC2USB驱动开发-0x0E 使用逻辑分析仪分析ULPI数据

    工欲善其事必先利其器,所以在USB开发中工具很重要,示波器,逻辑分析仪,USB协议分析仪等都不可少。在底层问题分析时缺少有力工具时很难进一步分析,本文分享了ULPI抓包分析,实际抓包波形因为信号质量问题可能没有那么理想,所以信号
    的头像 发表于 06-07 16:56 1158次阅读
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-0x0E 使用逻辑分析仪分析ULPI数据

    基于DWC2USB驱动开发-0x07 DWC2 USB2.0 IP 配置参数

    混淆,IP的配置参数固定之后就不能改了,就决定了IP所具有的能力。对于软件开发者来说也要了解其具体的配置,因为只有知道当前IP的配置,知道支持哪些功能,哪些是软件可以配置的哪些是硬件固定了无法配置的,等等这些,后面写驱动才心中有数。 配置相关
    的头像 发表于 05-17 09:49 1346次阅读

    基于DWC2USB驱动开发-0x02 DWC2 USB2.0 IP功能特征介绍

    DWC2即新思(Synopsys )的DesignWare® Cores USB 2.0 HiSpeed On-The-Go (OTG)控制器IP,被大量使用。从linux的内核源码驱动中就带
    的头像 发表于 05-09 10:09 6131次阅读
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-0x02 <b class='flag-5'>DWC2</b> <b class='flag-5'>USB</b>2.0 IP功能特征介绍

    基于DWC2USB驱动开发-0x01开篇介绍与新思DWC2 USB2.0控制器简介

    本文转自公众号,欢迎关注 基于DWC2USB驱动开发-0x01开篇介绍与新思DWC2 USB2
    的头像 发表于 05-08 18:10 3159次阅读
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-0x01开篇介绍与新思<b class='flag-5'>DWC2</b> <b class='flag-5'>USB</b>2.0控制器简介