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

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

3天内不再提示

基于DWC2的USB驱动开发-0x0B ULPI接口寄存器介绍

嵌入式USB开发 来源:嵌入式USB开发 作者:嵌入式USB开发 2023-06-05 15:36 次阅读

本文转自公众号,欢迎关注

基于DWC2的USB驱动开发-0x0B ULPI接口寄存器介绍 (qq.com)

一. ULPI(寄存器介绍)

1.1 前言

前面同步模式中我们介绍了寄存器的读写, 对于软件的角度来说无非就是通过LINK的ULPI接口读写PHY的寄存器来设置和获取状态,同时通过ULPI接口来进行USB数据的收发。

只是这个过程主要由硬件LINK完成,软件只需要进行一些中断的处理简单的设置即可。当然在某些必要的时候我们也需要通过软件直接读写PHY的寄存器以进行操作和获取状态,这主要是在某些底层问题调试或者性能分析时需要用到。DWC2提供了直接访问PHY寄存器的寄存器接口,这个后面再讲。

1.2 寄存器读写回顾

在同步模式介绍中详细介绍了寄存器的读写操作,这里重新回顾下对应的时序图。

立即寄存器写

图片

立即寄存器读

图片

立即寄存器读写在TX CMD时被USB接收中断

图片

立即寄存器读写在turn around时被USB接收中断

image.png

USB接收和寄存器读的Data时钟在同一个时钟,USB接收延迟

image.png

寄存器读后紧接着USB接收

图片

寄存器写stp拉高时紧接着USB接收

图片

寄存器读紧接着USB接收

图片

扩展寄存器写

图片

扩展寄存器读

图片

扩展寄存器读在扩展地址对应的时钟被USB接收中断

image.png

1.3 寄存器表

如表所示,ULPI提供了一个立即寄存器集,该寄存器集具有6位地址,该地址构成传输命令字节Transmit Command Byte的一部分。扩展寄存器还提供需要额外时钟周期才能完成的8位地址。立即数寄存器集被映射到扩展地址的低位。也就是说,读取或写入扩展地址“00XXXXXX”实际上将对立即寄存器集进行操作。PHY必须支持立即和扩展寄存器操作。

扩展寄存器访问需要多一个CLK来发送寄存器地址,因为地址大小为8位,不能直接编码在命令字节中了,所以要单独发送。实际上立即寄存器也可以使用扩展寄存器的方式操作,即寄存器地址的高2位为0,所以采用扩展寄存器方式是统一编码所有寄存器的,操作高2位为0的扩展寄存器和立即寄存器操作是一样的。那为什么不统一为扩展寄存器操作一种方式呢,

因为USB关注数据传输带宽,所以要减少其他控制操作:寄存器读写占用的ULPI接口带宽,

所以把关键的寄存器直接编码在命令字中,减少一个CLK的时间,减少寄存器读写占用的带宽,提高数据传输的带宽。

image.png

下表的寄存器访问图例适用

支持位操作,在只需要置位或者清除某些位时比"读-修改-写"更高效,

因为ULPI接口即要进行USB数据传输又要进行寄存器读写控制,数据传输才是重点,要保证高数据传输带宽所以要尽量减少寄存器读写占用的带宽,所以增加set clr两种寄存器操作模式,而不是只有rd和wr,不同的操作通过寄存器地址区分。

图片

1.4立即寄存器

1.4.1 VID和PID

地址:00h-03h只读。

图片

1.4.2 功能控制Function Control

控制PHY的UTMI功能设置,是最频繁使用的寄存器。

地址:04h-06h(读取)、04h(写入)、05h(设置)、06h(清除)。

图片

1.4.3 接口控制Interface Control

启用替代接口和物理层功能。此寄存器中的所有位都是PHY的可选功能

地址:07h-09h(读取)、07h(写入)、08h(设置)、09h(清除)。

图片

图片

15:适用于切换到串行或Carkit模式的LINK实现,并且不需要来自PHY的时钟源。

1.4.4 OTG控制 OTG Control

控制PHY的UTMI+OTG功能。

地址:0Ah-0Ch(读取)、0Ah(写入)、0Bh(设置)、0Ch(清除)。

图片

16:如果采用Carkit模式寄存器,上拉电阻器检测电路应符合[CEA-936A]

1.4.5 USB中断上升沿使能

地址:0Dh-0Fh(读取),0Dh(写入),0Eh(设置),0Fh。

如果设置,则当相应的PHY信号从低变高时,该寄存器中的位导致生成中断事件通知。默认情况下,所有转换都处于启用状态。RxActive和RxError必须始终立即通信,因此不包括在此寄存器中。当上升沿和下降沿使能都被禁用时,中断电路可以在任何模式下断电。

为了确保时钟断电时能够检测到中断,LINK应同时启用上升沿和下降沿。

图片

1.4.6 USB中断下降沿使能

地址:10h-12h(读取)、10h(写入)、11h(设置)、12h(清除)

如果设置,则当相应的PHY信号从高变为低时,该寄存器中的位导致生成中断事件通知。默认情况下,所有转换都处于启用状态。RxActive和RxError必须始终立即通信,因此不包括在此寄存器中。当上升沿和下降沿使能都被禁用时,中断电路可以在任何模式下断电。为了确保时钟断电时能够检测到中断,LINK应同时启用上升沿和下降沿。

图片

1.4.7 USB中断状态

地址:13h(只读)。

指示中断源信号的当前值。当上升沿和下降沿使能都被禁用时,中断电路可以在任何模式下断电。为了确保时钟断电时能够检测到中断,LINK应同时启用上升沿和下降沿。

image.png

1.4.8 USB中断锁存

地址:14小时(只读,自动清除)。

当在对应的内部信号上发生未屏蔽的改变时,这些比特由PHY设置。当LINK读取此寄存器时,或当进入低功率模式时,PHY将自动清除所有位。无论ClockSuspendM的值如何,当进入串行模式或Carkit套件模式时,PHY也会清除此寄存器。当上升沿和下降沿使能都被禁用时,中断电路可以在任何模式下断电。为了确保时钟断电时能够检测到中断,LINK应同时启用上升沿和下降沿。

图片

PHY必须遵循下表中的规则来设置任何锁存寄存器位。需要注意的是,如果寄存器读取数据在设置USB中断锁存位的同一周期内返回到LINK,则中断条件会立即在寄存器读取数据中给出,而锁存位不会设置。

图片

注意,LINK在同步模式下读取USB中断锁存寄存器是可选的,因为RX CMD字节已经直接指示中断源。

1.4.9 调试寄存器

地址:15h(只读)

指示对调试有用的各种信号的当前值。

图片

1.4.10 自定义使用寄存器Scratch寄存器

地址:16h-18h(读取)、16h(写入)、17h(设置)、18h(清除)。

用户可自定义写入任何值,可作为测试使用

图片

1.4.11 Carkit控制寄存器

地址:19h-1Bh(读取)、19h(写入)、1Ah(设置)、1Bh(清除)。

此寄存器是可选的控制PHY内Carkit电路的操作。如果未设置接口控制寄存器中的CarkitMode位,则忽略TxdEn和RxdEn位。如果CarkitMode位被设置,而RxdEn位未被设置,则数据(1)引脚保持在逻辑高。

图片

1.4.12 Carkit中断延迟

地址:1Ch(读取),1Ch(写入)。

此寄存器是可选的当Carkit中断电话时,它会在很长一段时间内将D+拉低。如果D+在TPH_DP_INT时间内低于VPH_DP_LO电压阈值,则电话必须检测到中断。

只要设置了Carkit中断启用寄存器中的CarIntDet位,PHY中的Carkit中断定时器就会启用。如果启用,当D+电压低于VPH_DP_LO时,Carkit中断定时器会递增。如果D+电压高于VPH_DP_LO,则车载套件中断定时器复位。当D+高于VPH_DP_LO的时间短至TCR_INJ_WDTH时,Carkit中断定时器必须复位。

当Carkit中断定时器达到存储在CarIntDly中的值时,设置Carkit中断锁存寄存器中的CarIntDet位,并生成中断。

image.png

1.4.13 Carkit中断使能

地址:1Dh-1Fh(读取)、1Dh(写入)、1Eh(设置)、1Fh(清除)。

此寄存器是可选的如果设置,则当相应的PHY信号发生变化时,该寄存器中的位会导致生成中断事件通知。默认情况下,此寄存器中的所有位都被清除。

image.png

1.4.14 Carkit状态寄存器

地址:20h(只读)。

此寄存器是可选的当carkit中断事件通知发生时,LINK可以读取此寄存器,以确定是哪个事件触发了中断。

图片

1.4.15 Carkit中断锁存

地址:21h(只读,自动清除)

此寄存器是可选的上一页当LINK读取此寄存器时,或当进入低功率模式时,PHY将自动清除所有位。

图片

PHY必须遵循下表中的规则来设置任何锁存寄存器位。需要注意的是,如果寄存器读取数据在与设置Carkit中断锁存位相同的周期内返回到LINK,则中断条件会立即在寄存器读取数据中给出,而锁存位不会设置。

图片

1.4.16 Carkit脉冲控制

地址:22h-24h(读取)、22h(写入)、23h(设置)、24h(清除)。

此寄存器是可选的它在PHY内的音频功能期间控制Carkit数据的操作。如果未设置接口控制寄存器中的车载设备模式位,则忽略TxPlsEn和RxPlsEn。

图片

TxPlsEn:当设置TxPlsSen位,并设置Carkit控制寄存器中的SpkLeftEn位时,PHY应在79UTMI+低引脚接口规范(修订版1.1,2004年10月20日)数据(0)线上的每个上升沿或下降沿后,在D线上输出一个正脉冲,然后输出一个负脉冲。当生成这样的脉冲对时,PHY应执行Carkit规范中定义的步骤。以下步骤列表提供了有关Carkit规格意图的信息

1.三态驱动D线的扬声器缓冲器

2.将D线驱动至3.3V+/-10%的电压

3.等待传输正宽度寄存器中指定的时间

4.将D路驱动至地

5.等待传输负宽度寄存器中规定的时间

6.停止将D路驱动器至地

7.启用驱动D线扬声器缓冲器

RxPlsEn:当RxPlsSen位被设置,并且Carkit控制寄存器中的MicEn位被设置时,每当在D+线上检测到下降沿超过VPH_DP_LO的车载套件中断阈值时,PHY应切换数据(1)输出。设置RxPlsEn位时,应启用接收极性恢复计时器。

1.4.17 发送正脉冲宽度

地址:25h(读),25h(写)

此寄存器是可选的它指定设置TxPlsEn位时在D线上输出的正脉冲的宽度。%1小时必须支持的最小TxPosWdth为8。必须支持的最大TxPosWdth为64。

图片

1.4.18 发送负脉冲宽度

地址:26h(读),26h(写)

此寄存器是可选的它指定设置TxPlsEn位时在D线上输出的负脉冲的宽度。%1小时必须支持的最小TxNegWdth为8。必须支持的最大TxNegWdth为64。

图片

1.4.19 接收极性恢复

地址:27h (Read), 27h (Write)

该寄存器是可选的

当在Carkit中启用了音频中的数据功能时,然后,Carkit通过将非归零(NRZ)的UART信号转换为一系列脉冲,将UART数据发送到手机,将这些脉冲信号通过D+发送到手机。

然后,在每次接收到一个脉冲时,手机中的PHY通过切换到数据(1)线,将这些脉冲转换为NRZ UART信号。如果PHY错误地错过了一个脉冲,或者检测到一个额外的脉冲,那么数据(1)线上的极性将是不正确的。为了从此条件中恢复,当数据(1)行的极性为逻辑极性低时,PHY自动将数据(1)行的极性重置为逻辑高。

只有在设置了Carkit脉冲控制寄存器中的RxPlsEn位时,接收极性恢复才会被激活。时间以0.25 ms为单位测量。必须支持的最小RxPolRcvry为1。必须支持的最大RxPolRcvry为255。

图片

1.4.20 保留

28H~2EH部分保留以后使用。

1.4.21 访问扩展寄存器集

2FH(读/写)

命令字中的低6位填该值,在下一个CLJ中发送8位的扩展寄存器地址。

1.4.22 厂商指定

30H~3FH

厂商自定义使用

1.5扩展寄存器

扩展寄存器集的地址00h到3Fh直接映射到立即寄存器集。对扩展地址00h到3Fh的读、写、设置或清除操作实际是在立即寄存器组上操作。地址40h到7Fh被保留以供将来使用。地址80h至FFh被分配给供应商特定用途。

1.6所有上行和下行信号模型的寄存器设置

前面也说过ULPI是通过将UTMI的一部分相对静态的的信号映射到寄存器,通过寄存器去操作这些信号来减少引脚的数量的。

下表显示了LINK必须应用哪些寄存器设置才能实现所需的信号模式。PHY必须根据需要自动生成正确的信号、准备SYNC和附加EOP。该表还显示了由于寄存器设置而启用的电阻器。

以下信号概念上存在于PHY内部。所有电阻器信号均为高电平有效,值1b启用电阻器,值0b禁用电阻器。

1.rpu_dp_en启用D+上的1.5kΩ上拉电阻器

2.rpu_dm_en启用D-上的1.5kΩ上拉电阻器

3.rpd_dp_en启用D+下的15kΩ下拉电阻器

4.rpd-dm_en启用D-上的15kΩ下拉电阻器

5.hsterm_en启用D+和D-上的45Ω终端电阻器。

图片

1.7总结

以上详细介绍了PHY相关的寄存器内容,标准部分是所有PHY都需要按照该规范实现的,还有厂商自定义部分可以自定义。正是因为规范对寄存器功能进行了规范所以LINK部分的IP才能做到兼容通过。

PHY寄存器的内软件开发人员容一般情况接触不到,但是真正遇到底层疑难问题时可能只有通过PHY的一些寄存器才能进行进一步分析,所以也是需要了解的。
审核编辑:汤梓红

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

    关注

    30

    文章

    5028

    浏览量

    117721
  • 接口
    +关注

    关注

    33

    文章

    7639

    浏览量

    148494
  • usb
    usb
    +关注

    关注

    59

    文章

    7432

    浏览量

    258168
  • 驱动开发
    +关注

    关注

    0

    文章

    129

    浏览量

    12010
  • DWC2
    +关注

    关注

    0

    文章

    35

    浏览量

    98
收藏 人收藏

    评论

    相关推荐

    基于DWC2USB驱动开发-0x06 DWC2 USB2.0 IP 头文件与寄存器的读写操作

    上一篇我们介绍了控制器的寄存器,而驱动的编写底层无非就是配置各种寄存器,所以第一步先要准备寄存器的头文件,对
    的头像 发表于 05-16 14:04 2003次阅读
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-0x06 <b class='flag-5'>DWC2</b> <b class='flag-5'>USB</b>2.0 IP 头文件与<b class='flag-5'>寄存器</b>的读写操作

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

    本文转自公众号,欢迎关注 基于DWC2USB驱动开发-0x01开篇介绍与新思DWC2
    的头像 发表于 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'>介绍</b>与新思<b class='flag-5'>DWC2</b> <b class='flag-5'>USB</b>2.0控制器简介

    基于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功能特征<b class='flag-5'>介绍</b>

    基于DWC2USB驱动开发-0x05 DWC2 USB2.0 IP 寄存器介绍

    本文对控制器的寄存器有了一个整体上的概览,先了解个大概,了解寄存器的组织结构,大致了解一下常用的寄存器。后面编程时再一个个对照每一个寄存器的描述去编写代码。
    的头像 发表于 05-16 12:50 2047次阅读
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-0x05 <b class='flag-5'>DWC2</b> <b class='flag-5'>USB</b>2.0 IP <b class='flag-5'>寄存器</b><b class='flag-5'>介绍</b>

    基于DWC2USB驱动开发-0x08 ULPI接口协议概览

    本篇概述了ULPI相关的内容,内容比较多后面还有工作模式和寄存器相关内容会分开讲。
    的头像 发表于 06-02 13:08 5845次阅读
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-0x08 <b class='flag-5'>ULPI</b><b class='flag-5'>接口</b>协议概览

    基于DWC2USB驱动开发-0x0D PHY寄存器读写代码编写与测试

    我们前面重点介绍ULPI接口和PHY的寄存器,这一篇来进行PHY寄存器读写的代码编写与测试。从这一篇开始就正真进入了
    的头像 发表于 06-06 13:03 1242次阅读
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-0x0D PHY<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描述符详解

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

    本文转自公众号欢迎关注 基于DWC2USB驱动开发-USB复位详解 (qq.com) 一.前言          上一篇我们详细
    的头像 发表于 07-07 11:18 1.6w次阅读
    基于<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>复位详解

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

    本文转自公众号,欢迎关注 基于DWC2USB驱动开发-USB连接详解 (qq.com) 一.前言   之前一直在阅读手册,规格书,练习招式
    的头像 发表于 07-07 08:46 2312次阅读
    基于<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>连接详解

    基于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驱动开发-发送相关的寄存器DMA寄存器详解

    本文转自公众号,欢迎关注 基于DWC2USB驱动开发-发送相关的寄存器DMA寄存器详解 (qq
    的头像 发表于 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>-发送相关的<b class='flag-5'>寄存器</b>DMA<b class='flag-5'>寄存器</b>详解

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

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

    回读寄存器寄存器0x2A和0x2B是固定的是什么原因

    当我回读寄存器时,即使重新启动传感电源,寄存器0x2A和0x2B也是固定的。在回读寄存器之前配
    发表于 09-11 16:37

    如何对基于hal库的DWC2 USB IP进行调试呢

    背景之前适配 DWC2 USB IP 的时候,主要是基于 st 的 hal 库来走的,当时我就对他们的 hal 库代码不满,只是无奈,迫于时间就没重构,果不其然,usb bug 一堆,随意举例,这还
    发表于 06-14 15:23

    基于DWC2USB驱动开发-0x0A ULPI接口同步模式介绍

    同步模式是ULPI必须支持的且主要的模式,内容比较多,对于软件开发人员来说重点关注下总线时序,即数据是如何交互的,这样必要的的时候可以使用逻辑分析仪进行抓包分析。另外重点关注下各个状态是如何反应在ULPI
    的头像 发表于 06-04 15:35 2609次阅读
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-0x0A <b class='flag-5'>ULPI</b><b class='flag-5'>接口</b>同步模式<b class='flag-5'>介绍</b>