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

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

3天内不再提示

基于DWC2的USB驱动开发-0x08 GLPI接口详解

嵌入式USB开发 ? 来源:嵌入式USB开发 ? 作者:嵌入式USB开发 ? 2023-06-02 09:05 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

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

基于DWC2的USB驱动开发-0x08 GLPI接口详解 (qq.com)

1.1 前言

进行USB驱动开发,有必要了解整个数据流涉及的设备,而PHY是重要的一环,它负责物理层的处理,是模拟数字的桥梁。而PHY的了解重点是其和LINK之间的接口,USB中PHY和LINK之间的标准接口是UTMI,而ULPI是其低引脚的实现。

介绍ULPI之前有必要先了解下GLPI,因为ULPI是基于GLPI的一个具体的实现。

GLPI即Generic Low Pin Interface,通用低引脚接口,是应用于LINK和PHY之间的接口。可以基于此接口定义特定应用的接口,也就是该接口规范是一个通用的接口设计,可以基于此有具体的应用实现,比如基于该接口实现UTMI协议的低引脚接口即ULPI。

1.2信号

  1. GLPI定义了如下的信号,这些信号是通用的,可以用于传输不同的数据类型。根据应用的不同,数据流可以用于发送和接收数据包、访问寄存器集、生成中断,甚至重新定义接口本身。
  2. 所有信号都是和clock同步的,如果没有clock则所有信号也可以是异步的。也就是规范本身并没有完全限定死一定要clock,一定要是同步的。
  3. 作为通用接口,规范并不规定数据流本身,数据流定义是特定应用实现决定的,只要具体的实现明确定义,实现互操作性即可。
  4. 通常来说控制信号dir、stp和nxt是在假设PHY是数据总线的主机的情况下指定的。当然为了通用性,也并没有完全限定死。如果需要,实现也可以将LINK定义为主机此时则控制信号的方向和前者要颠倒过来。
信号 方向(以PHY的角度看) 描述
PHY****接口 以下都是以PHY作为主机描述
clock I/O 接口时钟.双向都可以,即可以LINK产生该时钟也可以PHY产生该时钟,即对应于PHY时钟的两种模式,后面文章会讲到.如果有clock所有信号都是和clock同步的.当然本规范也没有限定死,即实现也可以没有clock则所有信号都是异步的。所有信号和clock的上升沿同步。
data I/O 双向数据总线,空闲时LINK驱动为低,LINK和PHY驱动为非0的数据则表示有数据传输。(为什么? 如果一方驱动为0则另一方怎么驱动? 因为谁低谁强) .从后面总线权限可以看出不会出现主从都驱动总线的情况,?因为总线所有权由主机调度,且由dir决定。并且驱动为0只是一个特殊值,用于区别其他正常数据的情况,理论上驱动为全1也?可以。这里为什么LINK一定要发一个数据是因为PHY不发数据就拉低dir监听数据,所以CLK上升沿总是会采集到数据用一个特殊值来表示空闲无效数据?。 总线的拥有权是由主机决定的,比如PHY作为主机则由PHY驱动dir来决定.在clock的上升沿同步数据即单边沿模式.当然实现也可以设计为双边沿传输数据模式。
dir OUT 主机驱动dir决定data总线的所有权.如果PHY有数据需要传输给LINK,则PHY驱动dir为高拥有总线.如果PHY没有数据要传输给LINK则拉低dir,表示LINK拥有data总线,此时PHY监听总线有非0 的数据则表示LINK发过来了数据给PHY.如果PHY不能接收LINK的数据也可以拉高dir.比如PHY的PLL没有稳定时就会拉高dir,此时LINK不能往PHY发非0数据.
stp IN 停止.LINK拉高该信号1个时钟来停止当前的数据流(LINK到PHY的或者PHY到LINK的).如果此时是LINK发送数据到PHY,LINK拉高stp则表示前一个时钟的数据是最后一个数据.原文是stp indicates thelast byte of data was on the bus in the previous cycle 我觉的从后面波形图理解来说应该不是前一个时钟而应该就是本STP拉高对应的CLK上升沿的数据是最后一个数据。 如果此时是PHY发送数据到LINK,LINK拉高stp则PHY会强制停止本次数据发送,并且PHY会拉低dir,表示交出数据总线控制权给LINK。
nxt OUT PHY拉高nxt表示是否还有数据或者是否接收到数据.1.如果LINK发送数据给PHY,PHY拉高nxt表示当前字节被PHY接收了.LINK可以在下一个时钟继续发送数据给PHY.。2.如果是PHY发送数据给LINK则PHY拉高nxt表示后面还有数据LINK可以继续读。

1.3 协议

1.3.1 总线所有权

非特殊实现都是PHY作为主机,PHY驱动dir来决定总线的所有权。

PHY需要发送数据时拉高dir,其他时候都是拉低dir监听总线。

如果LINK需要获取总线权可以等PHY发送完不再需要发送数据时PHY主动拉低dir,LINK也可以主动拉高stp一个时钟来结束PHY的发送,让PHY主动让出总线所有权,让LINK来发送数据,这种情况LINK主动请求的则必须进行一次数据发送,PHY才会重新拉高dir重新拥有总线。

dir为0时LINK拥有总线所有权,LINK可以往data总线发数据,

dir为1时PHY拥有总线所有权,PHY可以往data总线发数据,

所有信号都是和CLK同步的,且在CLK的上升沿修改数据,所以CLK的上升沿时dir翻转,

dir翻转时的那一个CLK叫做turnaround,LINK和PHY都不能往data总线发送数据,LINK和PHY也要丢弃该时候的总线数据。

所以在实现时dir可以直接用于控制PHY和LINK的输出缓冲器,只是PHY和LINK两边的使能电平是反的。

image.png

  1. dir为低,LINK拥有总线所有权,LINK可以往总线发数据
  2. dir翻转时对应的那一个CLK,LINK和PHY都不能发数据,总线上的数据无效,即turnaround
  3. dir为高,PHY拥有总线所有权,PHY可以往总线发数据
  4. dir和clock同步,dir总是在clk的上升沿翻转

1.3.2 传输数据

image.png

  1. dir为0, LINK拥有总线所有权,而LINK又没有数据要发给PHY,此时就是空闲阶段,LINK驱动data总线为0,此时PHY监听到全0就认为是无效数据.
  2. dir为0, LINK拥有总线所有权,LINK有数据要发送给PHY,则LINK驱动总线为非0值D0。

但是此时PHY拉低了nxt,表示不能接收,所以LINK只能下一个CLK重发D0

  1. PHY收到LINK发送过来的数据D0,拉高nxt,表示PHY收到了,这样LINK可以继续发D1。
  2. LINK主动拉高stp表示结束传输
  3. stp保持高一个CLK后拉低,此时PHY也会拉低nxt,如果PHY需要发送数据,需要拥有总线权则会拉高dir,否则会继续拉低dir等待LINK的下一次传输。上图中dir拉高了,说明PHY需要发数据了,dir拉高的一个CLK内是turn around总线无效。
  4. Turn around之后PHY发送数据。
  5. PHY发送数据,同时拉高nxt表示后续还有数据要发。
  6. PHY后面没有数据要发了拉低nxt,并且拉低dir交出总线所有权。

所以PHY拉低nxt可以用于掐断数据传输(LINK或者PHY发送的数据), 在传输期间,nxt可以在拉高stp的相同周期中拉高。

从以上可以看出由LINK发送最后一个字节,转到PHY发送第一个字节需要2个周期,即stp要一个周期,turn around需要一个周期。

1.3.3 停止传输数据

PHY可以拉高dir用于结束LINK的发送

LINK可以拉高stp一个时钟来结束PHY的发送,此时PHY需要无条件拉低dir,准备接收LINK的数据。PHY必须等接收完LINK的数据才能重新拉高dir。也就是LINK拉高stp以结束上一次PHY的传输,告诉PHY强制拉低dir来使得LINK拥有总线权,这也是LINK主动需要切换到总线所有权的一种方式,这时则LINK必须进行一次发送,只有这样PHY才会重新拉高dir 使得PHY拥有总线权。这里有个未定义行为,假设LINK进行了stp拉高但是又不发送数据或者一直发送数据不stp,那么PHY是不是只能一直等待,不能重新拉高dir拥有总线权了?。

image.png

  1. dir为高 PHY在发送数据D2,nxt为高说明后面还有数据待发送
  2. dir为高 PHY在发送数据D3,nxt为低说明后面的数据无效
  3. 这个CLK由于前面一次nxt为低,所以数据无效,LINK不接收, nxt拉高说明下一个CLK PHY又有数据要发
  4. 这个CLK PHY发送D4, LINK接收,nxt为高表示PHY还有数据要发,但是在此时LINK想要发送数据,于是拉高stp一个CLK.
  5. Stp拉高一个CLK后要拉低,此时PHY无条件拉低dir交出总线所有权,同时拉低nxt.
  6. 一个turn around时钟后,LINK发送数据D0,此时PHY拉低nxt为0表示PHY没有准备好接收数据
  7. 由于上一次PHY没有准备好接收数据,LINK只能重新发D0,此时PHY拉高nxt表示接收了数据D0
  8. LINK继续发送D1,PHY拉高nxt表示接收了数据D1
  9. LINK发送stp主动结束发送,此时PHY也要拉低nxt。

之后PHY再看需要是不是要发送数据来决定是拉高还是拉低dir。

1.4 总结

GLPI的接口是比较简单的,需要注意主从机,PHY是主机LINK是从机,

Stp是从机驱动,nxt和dir是主机驱动。

需要注意总线的拥有权由主机决定,主机需要发送是拉高dir拥有总线权,其他时候拉低dir交出总线权监听总线。而LINK可以在dir为高,PHY在发送数据时主动拉高stp一个CLK来请求PHY交出总线权,PHY必须无条件交出,并且必须等LINK发送完数据之后才能重新拥有总线。

所以关键点是了解谁驱动什么信号,总线拥有权的切换,了解这两点就基本了解了该接口的逻辑了。

1.5 参考

《UTMI+ Low Pin Interface (ULPI) Specification Revision 1.1 October 20, 2004》
审核编辑:汤梓红

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

    关注

    33

    文章

    9071

    浏览量

    154296
  • usb
    usb
    +关注

    关注

    60

    文章

    8265

    浏览量

    274889
  • 信号
    +关注

    关注

    11

    文章

    2859

    浏览量

    78607
  • 总线
    +关注

    关注

    10

    文章

    2966

    浏览量

    90086
  • DWC2
    +关注

    关注

    0

    文章

    35

    浏览量

    274
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

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

    本文转自公众号,欢迎关注 基于DWC2USB驱动开发-0x01开篇介绍与新思DWC2
    的头像 发表于 05-08 18:10 ?5755次阅读
    基于<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'>0x</b>01开篇介绍与新思<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 ?1.2w次阅读
    基于<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'>0x</b>02 <b class='flag-5'>DWC2</b> <b class='flag-5'>USB</b>2.0 IP功能特征介绍

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

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

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

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

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

    本文转自公众号,欢迎关注 基于DWC2USB驱动开发-IAD描述符详解 (qq.com) 一.? 前言 IAD描述符用于一个设备功能关联多
    的头像 发表于 06-27 08:45 ?45.4w次阅读
    基于<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驱动开发-USB复位详解

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

    本文转自公众号,欢迎关注 基于DWC2USB驱动开发-USB连接详解 (qq.com) 一.前
    的头像 发表于 07-07 08:46 ?4630次阅读
    基于<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驱动开发-高速设备枚举为全速设备问题案例分析

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

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

    本文转自公众号,欢迎关注 基于DWC2USB驱动开发-设备类驱动框架 (qq.com) 一.前言 从软件顶层,从数据流的角度来看
    的头像 发表于 07-16 15:56 ?1929次阅读
    基于<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.com) 前言 如下寄存器DIEPxxx,
    的头像 发表于 07-16 16:42 ?2362次阅读
    基于<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驱动开发-USB详解

    不管什么通讯协议,比如UART,SPI,USB等等,不管是并口还是串口,不管是同步还是异步,我们从抽象的角度去看,其本质都是一样的。都是先定义物理信号,物理信号可能是差分,单端,电流驱动电压驱动等等
    的头像 发表于 07-23 17:11 ?3468次阅读
    基于<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驱动开发-数据不能发送问题分析案例

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

    新思 DWC2 的参考手册从哪里可以下载

    最近在学习STM32F4 USB驱动,有看到 dwc2驱动的代码,但是没有手册用来参考,ST手册上寄存器不全,从网上看到有下面两个手册,但是一直找不到下载的资源 《DesignWar
    发表于 01-22 11:32

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

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

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

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