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

文摘   科技   2023-06-01 19:28   湖南  

1.1 前言

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

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

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

1.2信号

1.GLPI定义了如下的信号,这些信号是通用的,可以用于传输不同的数据类型。根据应用的不同,数据流可以用于发送和接收数据包、访问寄存器集、生成中断,甚至重新定义接口本身。

2.所有信号都是和clock同步的,如果没有clock则所有信号也可以是异步的。也就是规范本身并没有完全限定死一定要clock,一定要是同步的。

3.作为通用接口,规范并不规定数据流本身,数据流定义是特定应用实现决定的,只要具体的实现明确定义,实现互操作性即可。

4.通常来说控制信号dirstpnxt是在假设PHY是数据总线的主机的情况下指定的。当然为了通用性,也并没有完全限定死。如果需要,实现也可以将LINK定义为主机此时则控制信号的方向和前者要颠倒过来。


信号

方向(PHY的角度看)

描述

PHY 接口


以下都是以PHY作为主机描述

clock

I/O

接口时钟. 双向都可以,即可以LINK产生该时钟也可以PHY产生该时钟,即对应于PHY时钟的两种模式,后面文章会讲到. 如果有clock所有信号都是和clock同步的.当然本规范也没有限定死,即实现也可以没有clock则所有信号都是异步的。

所有信号和clock的上升沿同步。

data

I/O

双向数据总线, 空闲时LINK驱动为低,LINKPHY驱动为非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.比如PHYPLL没有稳定时就会拉高dir,此时LINK不能往PHY发非0数据.

stp

IN

停止. LINK拉高该信号1个时钟来停止当前的数据流(LINKPHY的或者PHYLINK).

如果此时是LINK发送数据到PHY,LINK拉高stp则表示前一个时钟的数据是最后一个数据.

原文是stp indicates the

last byte of data was on the bus in the previous cycle 我觉的从后面波形图理解来说应该不是前一个时钟而应该就是本STP拉高对应的CLK上升沿的数据是最后一个数据。

如果此时是PHY发送数据到LINK,LINK拉高stpPHY会强制停止本次数据发送,并且PHY会拉低dir,表示交出数据总线控制权给LINK

nxt

OUT

 PHY拉高nxt表示是否还有数据或者是否接收到数据.

1.如果LINK发送数据给PHY,PHY拉高 nxt 表示当前字节被PHY接收了.LINK可以在下一个时钟继续发送数据给PHY.

2.如果是PHY发送数据给LINKPHY拉高 nxt 表示后面还有数据LINK可以继续读。

1.3 协议

1.3.1 总线所有权

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

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

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

dir0LINK拥有总线所有权,LINK可以往data总线发数据,

dir1PHY拥有总线所有权,PHY可以往data总线发数据,

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

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

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

(1)dir为低,LINK拥有总线所有权,LINK可以往总线发数据

(2)dir翻转时对应的那一个CLK,LINKPHY都不能发数据,总线上的数据无效,turnaround

(3)dir为高,PHY拥有总线所有权,PHY可以往总线发数据

(4)dirclock同步,dir总是在clk的上升沿翻转

1.3.2 传输数据


(1)dir0, LINK拥有总线所有权,LINK又没有数据要发给PHY,此时就是空闲阶段,LINK驱动data总线为0,此时PHY监听到全0就认为是无效数据.

(2)dir0, LINK拥有总线所有权,LINK有数据要发送给PHY,LINK驱动总线为非0值D0。

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

(3)PHY收到LINK发送过来的数据D0,拉高nxt,表示PHY收到了,这样LINK可以继续发D1。

(4)LINK主动拉高stp表示结束传输

(5)stp保持高一个CLK后拉低,此时PHY也会拉低nxt,如果PHY需要发送数据,需要拥有总线权则会拉高dir,否则会继续拉低dir等待LINK的下一次传输。上图中dir拉高了,说明PHY需要发数据了,dir拉高的一个CLK内是turn around总线无效。

(6)Turn around之后PHY发送数据。

(7)PHY发送数据,同时拉高nxt表示后续还有数据要发。

(8)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拥有总线权了?

(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拉低nxt0表示PHY没有准备好接收数据

(7)由于上一次PHY没有准备好接收数据,LINK只能重新发D0,此时PHY拉高nxt表示接收了数据D0

(8)LINK继续发送D1,PHY拉高nxt表示接收了数据D1

(9)LINK发送stp主动结束发送,此时PHY也要拉低nxt

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

1.1 总结

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

Stp是从机驱动,nxtdir是主机驱动。

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

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

1.2 参考

UTMI+ Low Pin Interface (ULPI) Specification Revision 1.1 October 20, 2004



嵌入式Lee
嵌入式软硬件技术:RTOS,GUI,FS,协议栈,ARM,总线,嵌入式C,开发环境 and blablaba....多年经验分享,非硬货不发,带你扒开每一个技术背后的根本原理。
 最新文章