基于DWC2的USB驱动开发-0x08 GLPI接口详解 (qq.com)
进行USB驱动开发,有必要了解整个数据流涉及的设备,而PHY是重要的一环,它负责物理层的处理,是模拟数字的桥梁。而PHY的了解重点是其和LINK之间的接口,USB中PHY和LINK之间的标准接口是UTMI,而ULPI是其低引脚的实现。
介绍ULPI之前有必要先了解下GLPI,因为ULPI是基于GLPI的一个具体的实现。
GLPI即Generic Low Pin Interface,通用低引脚接口,是应用于LINK和PHY之间的接口。可以基于此接口定义特定应用的接口,也就是该接口规范是一个通用的接口设计,可以基于此有具体的应用实现,比如基于该接口实现UTMI协议的低引脚接口即ULPI。
信号 | 方向(以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可以继续读。 |
非特殊实现都是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两边的使能电平是反的。
但是此时PHY拉低了nxt,表示不能接收,所以LINK只能下一个CLK重发D0
所以PHY拉低nxt可以用于掐断数据传输(LINK或者PHY发送的数据), 在传输期间,nxt可以在拉高stp的相同周期中拉高。
从以上可以看出由LINK发送最后一个字节,转到PHY发送第一个字节需要2个周期,即stp要一个周期,turn around需要一个周期。
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拥有总线权了?。
之后PHY再看需要是不是要发送数据来决定是拉高还是拉低dir。
GLPI的接口是比较简单的,需要注意主从机,PHY是主机LINK是从机,
Stp是从机驱动,nxt和dir是主机驱动。
需要注意总线的拥有权由主机决定,主机需要发送是拉高dir拥有总线权,其他时候拉低dir交出总线权监听总线。而LINK可以在dir为高,PHY在发送数据时主动拉高stp一个CLK来请求PHY交出总线权,PHY必须无条件交出,并且必须等LINK发送完数据之后才能重新拥有总线。
所以关键点是了解谁驱动什么信号,总线拥有权的切换,了解这两点就基本了解了该接口的逻辑了。
《UTMI+ Low Pin Interface (ULPI) Specification Revision 1.1 October 20, 2004》
审核编辑:汤梓红
全部0条评论
快来发表一下你的评论吧 !