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

1.1 前言ulpi的同步模式是最主要的模式,内容也比较多,所以单独一篇介绍。
1.2 ulpi命令字节ulpi修改原始的utmi数据流,使其能够适应更多的数据类型。
传输期间pid字节中的冗余信息被ulpi传输命令(tx cmd)重载。
接收流中未使用的数据字节被接收命令(rx cmd)重载。
ulpi定义了由link发送的发送命令字节transmit command 和由phy发送的接收命令字节 **receive command ** 。
以上的发送接收是以link的角度来看的。
1.2.1 发送命令字节(tx cmd)link通过发送下表发送命令字节来启动到phy的传输。tx cmd字节由2位命令代码和6位有效载荷组成。
2位命令代码可以定义4种命令类型。
1.2.2 接收命令字节(rx cmd)phy发送下表的接收命令字节,以更新线路状态、usb接收、断开连接和otg状态信息给link。
rx cmd中的vbusvalid指示来自内部vbusvalid比较器或外部vbus指示输入。
hostdisconnect 主机断开连接状态必须仅在主机模式下指示给link(dppulldown和dmpullddown均设置为1b。
当处于设备模式时,必须忽略hostdisconnect,并且不能屏蔽rxactive或rxerror上的事件。
1.2.3 发送rx cmd的时机rx cmd仅在同步模式下发送,并将两种类型的信息传输到link。第一个是usb接收信息。第二个是中断事件。所有信息被编码到单个rx cmd字节中。
usb接收信息包括线路状态linestate、rxactive和rxerror。
在usb传输之后,phy必须向link发送具有指示eop的linestate的rx cmd。
对于高速,eop就是linestate 的!squelch到squelch 。
对于全速和低速,eop是linestate从se0到j的转换。
中断事件包括hostdisconnect、vbus、idgnd和其他源,如carkit中断。
只要检测到这些事件,相应的usb中断启用上升沿usb interrupt
enable rising 或usb中断启用下降沿寄存器usb interrupt enable falling
配置了,就会向link发送rx cmd。
如图说明了phy如何向link发送rx cmd信息。第一个数据包显示单个rx cmd。如果检测到连续的更改,phy将保持dir拉高并驱动连续的rx cmd,如第二个数据包所示。link必须能够接受任何数量的连续的rx cmd。
rx cmd的优先级低于usb接收和传输数据,但优先级高于寄存器读取和写入命令。
如果ulpi总线忙于传输usb数据,则rx cmd将在phy中排队,并在ulpi总线可用时发送。
当发送到link时,排队的rx cmd必须始终传达当前rx cmd值,而不是以前或旧的值。
当在usb接收数据包期间nxt被拉低,phy也必须向link发送rx cmd。
1.3 usb包本节介绍如何通过ulpi总线传输和接收usb数据包。给出了phy和link处理延迟的限制,以便可以满足usb数据包间延迟。
1.3.1 nopid数据包如图所示,为了发送不包含数据包标识符(pid)的usb数据,link发送nopid类型的tx cmd字节。
phy可以拉低nxt以限制来自link的数据。phy在tx cmd的第一个时钟周期中不能拉低nxt,并且必须在检测到stp高时去拉低nxt。
由于该命令不包含pid数据,phy必须等待下一个数据字节,然后才能开始在usb上传输。
当最后一个字节已经被phy接收时,link拉高stp1个周期,并且如果没有发生传输错误,则将数据驱动到00h空闲状态。在第一个字节被phy接收之前,链路不得拉高stp。
该命令必须用于啁啾chirp 和恢复resume 信号,对于这种信号,必须首先将功能控制寄存器中function control 的opmode位设置为10b。对于啁啾和恢复信号,phy不需要插入填充比特,因此必须保持nxt为高,直到它看到stp脉冲为止。
当link用nopid数据包驱动ulpi总线时,phy不应拉高dir,除非它想中止数据包。
所有usb数据包传输期间的rx cmd更改,必须用在usb传输结束时,ulpi总线可用时,发送的单个rx cmd更新来替换。即usb数据传输过程中状态的变化不需要管了,最后发一个最终的状态rx_cmd给link即可。rx cmd更新必须始终传达当前rx cmd值,而不是以前或旧的值。
1.3.2 pid数据包如图所示,为了传输usb数据包,link首先驱动一个tx cmd字节。命令字节类型设置为01b(传输),并将usb数据包标识符(pid)放置在数据上(3:0)。
phy使用nxt控制数据接收,link在检测到nxt为高之后提供下一个字节,这与utmi的datain和txready相同。当最后一个字节已经被phy接收时,link拉高stp 1个时钟周期,并且如果没有发生传输错误,则将数据驱动到00h空闲状态。
在第一个字节被phy接收之前,link不得拉高stp。
对于所有pid数据包,phy必须自动准备sync域并附加eop域。当tx cmd的pid字段为5h时,phy必须识别出这是帧开始(sof)包,并且自动附加长eop。
在拉高stp之后,link不能发送另一个数据包,直到第一个数据包在usb上完成。
如果在给定定时之前接收到rx cmd表示有eop,link可以开始传输下一个数据包。phy必须始终发送指示eop的rx cmd。
当link用pid数据包驱动ulpi总线时,phy不应拉高dir,除非它想中止数据包。
所有usb数据包传输期间的rx cmd更改,必须用在usb传输结束时,ulpi总线可用时,发送的单个rx cmd更新来替换。即usb数据传输过程中状态的变化不需要管了,最后发一个最终的状态rx_cmd给link即可。rx cmd更新必须始终传达当前rx cmd值,而不是以前或旧的值。
utmi+规格书所述,phy必须在传输期间内部阻塞usb接收路径。
usb data transmit (pid)
phy drives an rx cmd to indicate eop (fs/ls linestate timing not to scale)
1.3.3 usb发送错误如果link在全速或低速usb数据包传输过程中遇到缓冲区运行不足,则必须在数据包结束前在数据包中插入一个位填充错误。为了强制表示传输错误,link在数据包结束时,在它拉高stp的同一时钟周期中,将ffh驱动到数据上。link只能驱动一个字节的ffh,phy将通过在usb总线上发送至少8个连续的1来自动生成全速传输错误。在发送另一个数据包之前,link必须等待指示se0-to-j转换的rx cmd。在第一个字节被phy接收之前,link不得拉高stp。该序列取代了utmi在传输的最后一个字节期间将opmode从00b更改为10b的方法。为了强制表示高速传输错误,link必须在数据包末尾传输值翻转的crc。
1.3.4 usb包接收如图所示,当phy接收到usb数据时,它首先通过拉高dir获得数据总线的所有权。
phy在与utmi的rxactive有效相同的周期中拉高dir。
如果dir先前为低,则phy将拉高dir和nxt,link立即接收rxcmd知道这是usb接收数据包。
如果dir先前为高,phy将拉低nxt并驱动rx cmd,rxevent字段设置为01b(rxactive状态),以便link接收rx cmd直到状态。
phy可以在下一个周期中开始驱动数据,或者输出rx cmd,直到usb数据可用。
phy拉高nxt并在总线上发送一个字节,将有效的usb数据包数据发送给link。
当nxt为低电平时,phy驱动rx cmd字节。
usb包接收过程中的状态变化即rx cmd变化,必须在nxt为低时,发出。
如果nxt在数据包接收期间从不为低,则必须在usb数据包接收结束时ulpi 总线可用时发送单个rx cmd更新来替换所有rx cmd改变,即最后只发送一次rx cmd状态,中间的就不管了。rx cmd更新必须始终传达当前rx cmd值,而不是以前或旧的值。
虽然数据流已从utmi的dataout修改,但nxt与rxvalid相同。
当rx cmd字节显示rxactive被设置为0b或dir被拉低(以先发生者为准)时,link认为数据包已完成。
1.3.5 usb接收错误如果phy检测到usb数据包接收错误,它将忽略任何当前接收的数据字节,拉低nxt,并在rxevent字段设置为11b的情况下驱动rx cmd字节(rxerror状态)。
当rxactive被设置为0时,phy拉低dir。rxerror状态与utmi的rxerror信号相同。
当检测到全速位填充错误时,所有phy实现都必须设置rxerror。
phy可以选择性地为未与字节边界对齐的高速eop、数据溢出、数据下溢或其他有效接收错误条件设置rxerror。
phy在eop之前不对单个全速dribble bit 位设置rxerror。
link必须忽略出现接收错误的数据包。
如图显示了在数据包中间检测到比特填充错误时ulpi接口的行为。
如图显示了在最后一个crc字节中发生位填充错误时的行为。
1.3.6 usb包时序usb规范定义了数据包间时间。ulpi规范通过指定phy和link可用的时钟周期的预算,将这些定时关联回ulpi接口。
phy必须在给定的定时范围内处理数据。
类似地,link必须在给定的决策时间内做出响应,或者如果在给定的时间范围内没有收到响应,则超时。以下详细说明所有要求的ulpi数据包间定时,并源自usb规范和utmi phy处理和同步延迟(来自utmi规范)。
1. usb数据包间延迟和数据包超时全速数据包间延迟是从第一个数据包的se0到j转换到第二个数据包上的sync域开始测量的。
高速包间延迟是从总线在第一包结束时进入空闲状态开始测量的,直到总线在第二个数据包开始时离开空闲状态时计算。
一个时钟周期有8个hs位时间,一个fs位时间有5个时钟周期,一个ls位时间有40个时钟周期。如图所示
usb规格指定的包间时间
位宽和时钟关系
transmit-receive时间:在usb规范中定义为,最大连接的usb系统,包括通过6根usb电缆、5个外部集线器和下游主机或外围设备的来回程时间。
2.phy****管道延迟使用ulpi接口的任何phy必须符合表中给出的时序。
usb总线事件是相对于d+和d-线上的转换来测量的。
ulpi接口定时是相对于检测到转换的时钟边缘来测量的(例如,phy在时钟de 边缘检测stp).
rx cmd delay:与utmi的线路状态延迟2-3个时钟相同,但由于rx cmd期间ulpi总线周转turn around,最大值增加了1个额外的时钟周期。
3.link决策时间下表给出了为各种包序列分配给ulpi link的时间。当link传输第二个数据包时,它必须满足数据包间的延迟。当link期望对传输的数据包做出响应时,它必须对数据包间延迟进行计时,以检测超时。对于连续接收数据包,link必须能够在给定的时间内接收它们。
transmit-transmit,receive-transmit:与utmi的fs sie决策时间7-19时钟相同,但由于ulpi phy在rx cmd期间需要总线周转turn around,因此从最大值减去1个时钟周期.
transmit-receive,utmi规范说明高速传输到接收时间不正确,应忽略。
4.内部包时序图如图说明了各种包序列的phy管道延迟和link决策时间。
高速发送-发送包时序
高速接收-发送包时序
1.4寄存器操作1.4.1 立即寄存器读写寄存器写
link发送寄存器写入命令字节并等待nxt拉高。在nxt拉高之后的时钟周期中,link发送写入寄存器的数据,并等待nxt再次拉高。当nxt第二次拉高时,link在下一个时钟周期中拉高stp以完成操作。phy必须检测stp拉高,然后才能接受另一个传输命令。如果phy通过拉高dir中止regwrite,则link必须在总线空闲时重试regwrite。
寄存器读
link发送寄存器读取命令字节并等待nxt的拉高。在nxt拉高之后的时钟周期中,phy拉高dir以获得对数据总线的控制。在dir拉高之后的时钟周期中,phy必须返回寄存器读取数据。
当在寄存器读取操作期间,即使是在寄存器内容返回的时钟周期拉高dir,phy也不拉高nxt。
这允许usb数据接收在任何时钟周期内始终优先于寄存器读取。如果phy早于下图中所示时刻拉高dir中止regread,则当总线空闲时,link必须重试regread
1.4.2 usb数据接收中止立即寄存器读写寄存器读取是ulpi不使用nxt来掐断数据的唯一实例。nxt信号仅在usb接收期间被拉高,使得link能够始终将usb数据接收与其他数据传输区分开来。
下显示了在初始发送命令字节期间被usb接收中止的寄存器读取或写入。
下图显示了在寄存器读取数据返回到link的同一时钟周期内,usb接收中止了寄存器读取。
在以上两种情况下,phy都拉高dir和nxt以指示rxactive。
寄存器读取和写入操作也会因phy发送rx cmd而中止,除非是在寄存器读取数据返回到link的时钟周期内。
1.4.3 连续的寄存器读写和usb数据接收下图显示了在寄存器读取数据返回到link的同一周期中发生的usb数据接收。phy必须首先返回寄存器读取数据,而不是指示rxactive的rx cmd字节。phy在下一个周期中指示rxactive,将usb接收数据与寄存器读取连续放置
下图显示了在寄存器读取完成后的时钟中立即发生的usb数据接收。phy将usb接收数据与寄存器读取连续放置。
link必须能够接受连续的数据包,其中dir不会在数据包之间拉低。
如下图所示,如果dir在寄存器写入操作结束时拉高stp的同一时钟周期拉高,则phy认为寄存器写入已成功完成。phy不会因为stp而拉低dir。
下图显示了在寄存器读取数据返回到link后的时钟周期中开始的usb数据接收。
注意,当dir在一个周期周期内拉低时,总线周转turn around的两个周期。
在所有情况下,phy拉高dir和nxt以指示rxactive。
1.4.4 扩展寄存器读写对立即寄存器地址2fh的访问表示对扩展寄存器集的访问。在这种情况下,地址在下一个时钟周期内可用。
寄存器写
对于扩展寄存器写入,如图所示,link发送一个地址设置为2fh的寄存器写入命令,并等待nxt拉高。在nxt拉高之后的时钟周期中,link发送扩展寄存器地址,并等待nxt再次拉高。
当 nxt 第二次拉高时,link发送寄存器写入数据并等待 nxt 再次拉高。当nxt第三次拉高,link在接下来的时钟周期拉高stp,以完成操作。如果phy通过拉高dir中止regwrite,则link必须在总线空闲时重试regwrite。
寄存器读
对于扩展寄存器读取,如图所示,link发送一个地址设置为2fh的寄存器读取命令,并等待nxt拉高。在nxt拉高之后的周期中,link发送扩展寄存器地址,并等待nxt再次拉高。当nxt第二次拉高时,phy拉高dir以获得对数据总线的控制。在dir拉高之后的周期中,phy返回寄存器读取数据。当在寄存器读取操作期间拉高dir时,即使在返回寄存器读取数据的时钟周期期间,phy也不拉高nxt。这允许usb接收在任何周期内优先于寄存器读取。如果phy在下图所示之前通过拉高dir中止regread,则当总线空闲时,link必须重试regread
1.4.5 扩展寄存器读写被连续的usb数据接收中止除了扩展地址字节周期外,扩展寄存器读取与立即寄存器读取相同。
有一个额外的情况,如图所示,在扩展地址周期期间,usb接收中止了扩展寄存器读取。
phy发送rx cmd也会中止扩展寄存器读取和写入操作,但在寄存器读取数据返回到link的周期期间除外。
1.5中止ulpi传输1.5.1 link中止phy当link在ulpi总线上传输数据时,phy可以通过拉高dir来中止link。ulpi没有指定任何会导致这种情况发生的条件。
1.5.2 phy中止link当phy在同步模式下拉高了dir时,link可以通过拉高stp来中止phy,如图所示。
在下一个周期中,phy必须拉低dir,并保持拉低dir直到link事务完成。如果link如图所示执行寄存器写入或usb传输,则phy必须等待序列末尾的stp脉冲,然后才能重新拉高dir。如果link执行寄存器读取,phy必须返回寄存器读取数据,如图所示,并且如果需要进行usb接收数据或rx cmd,则允许继续拉高dir。
link不能在拉高dir的同一周期中中止phy,并且phy必须在其首次拉高dir的相同周期中忽略stp。
如果link在与拉低dir相同的周期中拉高stp,则phy必须仍然保证link事务。
当phy中止时,link必须在周转turn around周期后立即驱动tx cmd。如果link没有立即驱动tx cmd,则允许phy重新拉高dir,如图所示。
所有ulpi phy实现必须支持被拉高stp的link中止。虽然该功能可以在任何时候使用,但它主要用于link通过禁用phy来关闭babbling端口。如果link在usb接收数据包期间拉高stp,则phy不能保证当前包和下一包期间usb数据的有效性。
1.6 usb操作以下部分描述了link和phy必须如何在ulpi总线上进行通信,以执行特定的usb操作序列。
图表是在时间轴上水平压缩的,而不是按比例压缩的。
1.6.1 高速检测握手(chirp)高速检测握手,或称chirp,如图所示,注意,图中的时间不是按比例排列的,也没有显示所有rx cmd更新。总线周转周期turn around也没有显示,并且必须在dir的每次拉高和拉低后发生一个周期。
必须遵循以下事件顺序
1.fs/ls检测–如果d-为高,主机检测外围设备连接为低速,如果d+为高,则检测为全速。如果主机检测到低速外围设备,则不遵循此协议的其余部分。
2.主机驱动-如果主机检测到全速外围设备,它会通过写入功能控制寄存器并设置xcvrselect=00b(hs)和termselect=0b来重置外围设备,从而驱动总线上的se0(d+和d-通过45欧接地).主机还设置opmode=10b用于正确的chirp发射和接收,接收chirp会使linestate以不同的方式进行编码,并考虑高速差分接收器输出,以免出现错误的总线活动。se0的起点标记为t0。设备phy拉高dir,并使用rx cmd向link通知线路状态改变。
3.设备响应-在检测到se0不少于2.5us后,如果设备具有高速功能,则设备link将xcvrselect设置为00b(hs),将opmode设置为10b(chirp),并立即发送一个tx cmd(nopid),发送一个chirp k不少于1ms。并且chirp k必须在复位时间t0之后不超过7ms结束。如果设备处于低功率模式,它必须在5.6ms内唤醒其时钟,留下200us用于link开始传输chirp k信号,留下1.2ms用于chirp信号完成(最坏情况下,时钟慢10%)
4.主机响应–如果主机未检测到设备chirp,则必须继续发送se0,直到重置结束。如果主机在总线离开chirp k状态后检测到设chirp k不少于2.5us、然后不多于100us,主机发送具有交替的chirp k和j序列的tx cmd(nopid)。每个单独的chirp k或j必须持续不少于40us且不超过60us。
5.hs空闲–设备必须检测到最小的chirp k-j-k-j-k-j。每个单独的chirp k和j必须被检测至少2.5us。在看到该最小序列之后,设备link设置termselect=0b和opmode=00b。设备现在处于高速模式,看到linestate的!squelch。当设备在linestate上看到squelch(10b)时,它知道主机已经完成了chirp,并等待高速usb通信开始。发送chirp序列后,主机将opmode更改为00b,并开始发送usb数据包.
1.6.2 前导usb将前导数据包定义为低速数据包的报头,低速数据包必须在主机和集线器之间通过全速总线传输。要进入前导码模式,link在功能控制寄存器中设置xcvrselect=11b。当处于前导码模式时,phy的操作与全速模式相同,并以全速上升和下降时间发送所有数据。每当link以前导码模式发送usb数据包时,phy必须在以低速比特率发送link数据包之前以全速比特率自动发送前导码报头。phy必须确保全速pre-pid的最后一位和低速包sync的第一位之间的最小间隙为4个全速位时间。在发送pre pid之后,phy必须驱动j至少1 fs位时间,之后上拉电阻器可以在总线上保持j状态。
在前导码模式中,phy还可以从全速总线接收低速包。
1.6.3 usb挂起和恢复挂起和恢复由host或者hub启动
1. 低速挂起和恢复下图说明了主机或集线器如何进入低速挂起状态,然后启动恢复信号以唤醒下游低速设备。图计中时不是按比例进行的,也没有显示所有rx cmd线路状态更新。总线周转周期也没有显示,并且必须在dir的每次拉高和拉低后发生一个时钟周期。以下描述了事件的过程。
1.ls通讯-最初,主机和设备通过usb总线发送低速流量(xcvrselect设置为10b)。主机有其15kΩ 下拉已启用(dppulldown和dmpullddown设置为1b)和45Ω 终端已禁用(termselect设置为1b)。设备具有1.5kΩ 上拉连接到d-(termselect设置为1b)。
2.ls挂起–当设备在3ms内没有看到总线活动时,它进入挂起状态。设备的link通过设置suspendm位将phy置于低功率模式,从而使phy仅汲取挂起电流。主机可能断电,也可能未断电。
3.恢复k–当主机想要唤醒设备时,它将opmode设置为10b,并传输ls k至少20ms。设备的link看到线路状态上的恢复k(01b),并拉高stp以唤醒phy
4.eop–当stp被拉高时,主机phy自动附加一个ls eop(2位ls se0,后跟1位ls j)。主机phy知道添加ls eop,因为主机的dppulldown和dmpulldown被设置为1b。ls eop完成后,主机link将opmode设置为00b以进行正常ls操作。设备的link看到ls eop并恢复正常ls操作
2. 全速挂起和恢复下图说明了主机或集线器如何进入全速挂起,然后启动恢复信号以唤醒下游全速设备。
图中计时不是按比例进行的,也没有显示所有rx cmd线路状态更新。总线周转周期也没有显示,并且必须在dir的每次拉高和拉低后发生一个周期。以下描述了事件的过程。
1.fs通讯-最初,主机和设备通过usb总线进行全速数据传输(xcvrselect设置为01b)。主机其15kΩ 下拉已启用(dppulldown和dmpullddown设置为1b)和45Ω 终端已禁用(termselect设置为1b)。设备的1.5kΩ 上拉连接到d+(termselect设置为1b)。
2.fs挂起–当设备在3ms内没有看到总线活动时,它进入挂起状态。设备的link通过设置suspendm位将phy置于低功率模式,从而使phy仅汲取挂起电流。主机可能断电,也可能未断电。
3.resume k–当主机想要唤醒设备时,它将opmode设置为10b,并传输fsk至少20ms。设备的link看到线路状态上的恢复k(10b),并拉高stp以唤醒phy
4.eop–当stp被拉高时,主机phy自动附加一个ls eop(2位ls se0,后跟1位fs j)。主机phy知道添加ls eop,因为主机的dppulldown和dmpulldown被设置为1b。ls eop完成后,主机link将opmode设置为00b以进行正常fs操作。设备的link看到ls eop并恢复正常的fs操作。
3. 高速挂起和恢复下图说明了高速主机或集线器如何进入全速挂起状态,然后启动恢复信号以唤醒下游高速设备。图中计时不是按比例进行的,也没有显示所有rx cmd线路状态更新。总线周转周期也没有显示,并且必须在dir的每次拉高和拉低后发生一个周期。以下描述了事件的过程。
1.hs通讯-最初,主机和外围设备通过usb总线进行高速数据传输(xcvrselect设置为00b)。主机的15kΩ 下拉电阻已启用(dppulldown和dmpullddown设置为1b)和45Ω 终端电阻已启用(termselect设置为0b)。设备的45Ω 终端电阻已启用(termselect设置为0b)。
2.fs挂起–当设备在3ms内没有看到总线活动时,它进入挂起状态。设备的link将phy置于全速模式(xcvrselect设置为01b),删除45Ω 终止并启用1.5kΩ d+上拉(termselect设置为1b)。然后,设备的link设置suspendm将phy置于低功率模式,从而使phy仅汲取挂起电流。主机也更改为全速(xcvrselect设置为01b),删除45Ω 终端电阻(termselect设置为1b),然后可能断电也可能不断电
3.resume k–当主机想要唤醒设备时,它将opmode设置为10b,并传输fsk至少20ms。设备的link看到线路状态上的恢复k(10b),并拉高stp以唤醒phy。
4.hs通讯-主机link设置高速(xcvrselect设置为00b),并启用其45Ω 终端(termselect设置为0b)。设备的link在usb总线上看到se0,并设置高速(xcvrselect设置为00b),并启用其45Ω 终端(termselect设置为0b)。主机的link将opmode设置为00b以进行正常hs操作
1.6.4 远程唤醒设备启动远程唤醒(恢复)。当置于usb挂起状态时,link会记住它最初的操作速度。根据原始速度,link遵循以下详细说明的协议之一。下图中,计时不是按比例进行的,并且没有显示所有rx cmd线路状态更新。总线周转周期也没有显示,并且必须在dir的每次拉高和拉低后发生一个周期。
1. 低速远程唤醒
a)主机和设备都以低功耗模式启动。
b) 外设通过重新启用其时钟并设置其suspendm位来开始远程唤醒。
c) 设备开始驱动总线上的k以发出恢复信号。设备的link在传输时应假设线路状态为k(01b)
d) 主机识别恢复,重新启用其时钟并设置其suspendm位
e) 主机在检测到远程唤醒后1毫秒内接管恢复驱动程序。如果时钟不能在1ms内重新启动,phy必须实现自动恢复功能。
f) 设备停止驱动恢复
g) 设备看到主机继续驱动恢复。
h) 主机停止驱动恢复,phy将ls eop添加到低速恢复的末尾。设备将ls eop识别为恢复的结束。t1为ls eop间隔。
j) 主机和设备都通过将opmode写入正常来恢复正常操作。
2. 全速远程唤醒
a)主机和设备都以低功耗模式启动
b)外设通过重新启用其时钟并设置其suspendm位来开始远程唤醒。
c)设备开始驱动总线上的k以发出恢复信号。设备的link在发送时应假定线路状态为k(10b)。
d)主机识别恢复,重新启用其时钟并设置其suspendm位
e)主机在检测到远程唤醒后1毫秒内接管恢复驱动程序。如果时钟不能在1ms内重新启动,phy必须实现自动恢复功能。
f)设备停止驱动恢复
g)设备看到主机继续驱动恢复
h)主机停止驱动恢复,phy将ls eop添加到全速恢复的末尾。设备将ls eop识别为恢复的结束。(t1是ls eop间隔。)
i)主机和设备都通过写入opmode和xcvrselect恢复到正常操作。
3. 高速远程恢复
a)主机和设备都以低功耗模式启动
b)设备通过重新启用其时钟并设置其suspendm位(1)开始远程唤醒
c)设备开始驱动总线上的k以发出恢复信号。设备的link在发送时应假定线路状态为k(10b)。
d)主机识别恢复,重新启用其时钟并设置其suspendm位(2)
e)主机在检测到远程唤醒后1毫秒内接管恢复驱动程序。如果时钟不能在1ms内重新启动,phy必须实现自动恢复功能。
f)设备停止驱动恢复。
g)设备看到主机继续驱动恢复
h)主机停止驱动恢复,总线返回高速空闲状态。设备将高速空闲识别为恢复结束。(t1是ls eop间隔。
i)主机和设备都通过写入opmode、xcvrselect和termselect恢复到正常操作
4. 自动恢复当usb主机检测到来自下游设备或集线器的远程唤醒信号(resume-k)时,主机必须在1ms内接管resume-k信号的驱动。
如果phy处于主机模式,时钟断电,并且phy检测到远程唤醒信号,则link必须唤醒时钟并接管resume-k信号的驱动。如果时钟无法在1ms内重新启动,phy必须提供自动恢复功能。如图所示,phy必须在内部驱动resume-k,直到时钟恢复并接收到nopid类型的txcmd。
当时钟恢复时,link通过发送nopid类型的txcmd来接管resume-k的驱动。当在自动恢复和由nopid命令中的link驱动的恢复-k之间转换时,phy必须确保在恢复序列期间没有故障。phy还必须确保在退出低功率模式之前将suspendm寄存器位自动设置为1b。
实现由phy供应商确定,但是phy供应商必须指定时钟唤醒时间tstart_host。
如果时钟可以在1ms内重新启动,则phy不需要提供自动恢复功能。
接口控制寄存器中的自动恢复位控制自动恢复功能。
1.6.5 设备连接和断开连接检测usb 中断状态寄存器中的主机断开位指示设备何时连接或断开,并且仅在 phy 用作主机时才有效(dppulldown 和 dmpulldown 均设置为 1b)。当用作主机phy时,未屏蔽的hostdisconnect中的更改会导致phy生成中断事件通知。
当用作设备(dppulldown设置为0b)时,phy决不能生成指示主机断开连接事件的中断事件通知。
1.6.6无sync和eop产生(opmode11b)可选此模式会影响数据包的传输方式,并且只能用于高速。
当opmode设置为11b时,phy在发送包时不会自动添加sync和eop。phy必须仍然对数据进行nrzi编码并执行比特填充。当link想要传输usb数据包时,它必须发送nopid类型的tx cmd。在nopid命令之后,link在ulpi总线上发送一个4字节的sync模式(00h,00h,0h,80h),然后是pid、数据有效载荷,最后是一个1字节的eop(feh),如图所示。不支持utmi+的txbitstuffenable信号。phy在启动数据包时自动启用位填充,在拉高stp时禁用位填充。link在其驱动eop字节的同一周期中拉高stp。如果在stp被拉高时数据被设置为00h,则phy将不会在usb总线上传输任何eop。phy必须检测pid字节是否为a5h(sof数据包),并在stp被拉高时自动发送长eop。为了传输chirp和恢复信号,link必须将opmode设置为10b。
当opmode设置为11b时发送pid类型的tx cmd将导致未定义的行为。当opmode为11b时接收rx cmd和usb接收数据包的操作与opmode 00b相同
1.7vbus电源控制(内部和外部)link通过设置otg控制寄存器中的drvvbus位来打开vbus。如果vbus电源在phy外部,则link在otg控制寄存器中设置drvvbus和可选的drvvbusexternal位。vbus控制设置如下表:
1.8 otg操作1.8.1 会话请求协议(srp)ulpi提供完整的srp支持。link使用otg控制寄存器中的chrgvbus和dischrgvbus位来开始和结束会话。
1.8.2 主机协商协议(hnp)(可选)ulpi未定义hnp支持。假设hnp是在link硬件和/或软件中实现的。这并不妨碍phy实现者向任何ulpi phy添加hnp支持,只要其不干扰或违反本规范中定义的ulpi协议即可。
1.8.3 vbus比较器阈值虽然otg规范提供了单独的a设备和b设备可用的比较器,但具有0.8v至2.0v阈值(va_sess_vld)的a设备比较器也可用于需要0.8v至4.0v阈值(vb_sess_vld)的b设备比较器,从而消除了对单独的b设备比较器的需要。具有单独的a设备和b设备比较器的实现可以映射到单个定义(vsess_vld)中。ulpi vbus比较器阈值如表所示。
va_vbus_vld阈值的目的是允许a设备确定其是否能够在vbus上输出有效电压。因此,ulpi未指定va_vbus_vld阈值的上限,然而,该阈值的上限通常取决于a设备电源的特性。因此如果a器件电源通过将vbus驱动到va_vbus_ref的基准来操作,并且当其目标设备列表上的b设备没有汲取太多电流时,输出电压不会下降到x%以下,则阈值电压将是:
4.4v
如果vbus电源在phy外部并且外部电源提供指示vbus何时有效的信号,
建议该信号是可选引脚externalvbusindicator上phy的输入,并且该引脚的状态通过rx cmd字节中的va_vbus_vld≤vbus指示反映到link。otg控制寄存器中的可选useexternalvbusindicator位在内部和外部vbusvalid指示器之间进行选择
为了支持行业标准的usb电源控制设备,phy可以可选地支持接口控制寄存器中的两个附加位,indicatorpassthru和indicatorcomplement。这两个位允许可选的externalvbusindicator引脚与来自功率控制设备的功率有效信号或过电流故障输出互操作,并适应来自功率控制装置的有效高信号或有效低信号。当externalvbusindicator引脚上提供电源故障信号时,phy必须使用内部vbusvalid比较器的输出和外部电源故障信号的逻辑组合来生成va_vbus_vld≤vbus指示。
下表定义了useexternalvbusindicator、indicatorpassthru和indicatorcomplement寄存器位的使用,以控制externalvbusindicator输入引脚和内部vbusvalid比较器输出的使用,从而在rx cmd字节中生成va_vbus_vld≤vbus指示。表中还列出了每种设置的典型应用。
rx cmd vbus有效过电流条件
标准外围设备不应使用vbus valid来开始操作。内部vbusvalid可能不表示vbus在第五集线器层上有效,允许低至4.375v。因此设备应使用session valid。
下图提供了内部和外部vbusvalid源的逻辑组合的图形表示,以及控制寄存器位如何影响rx cmd字节中的va_vbus_vld≤vbus指示。useexternalvbusindicator、indicatorpassthru 和 indicatorcomplement 控制寄存器位是单独可选的。phy可以实现可选控制位的任何组合,然而,如果实现控制位,则它们必须提供表中定义的功能。如果未实现任何控制位,则phy有责任定义可选externalvbusindicator引脚如何影响rx cmd字节中va_vbus_vld≤vbus指示的状态
rx cmd va_vbus_vld≤vbus指示源
根据应用程序的不同,link应启用或禁用适当的vbus中断。下表中给出了典型应用的示例设置,rxcmd中的vbusvalid指示来自内部vbusvalid比较器或外部vbus指示输入。
典型应用所需的rx cmd中的vbus指示器
1.9总结同步模式是ulpi必须支持的且主要的模式,内容比较多,对于软件开发人员来说重点关注下总线时序,即数据是如何交互的,这样必要的的时候可以使用逻辑分析仪进行抓包分析。另外重点关注下各个状态是如何反应在ulpi的寄存器中的,可能底层分析时需要通过寄存器值分析当前状态。

CGH60060D L波段功率放大器
基于光的打印金属纳米结构的方法
惠普在2020年第三季度为医疗行业3D打印了超过400万个零件
奥拓智慧监控室解决方案将点燃LED CHINA 2020
中联通引入WCDMA版黑莓手机
基于DWC2的USB驱动开发-0x0A ULPI接口同步模式介绍
2021年的晶圆产能如何
在研研讨会 | @5/18 IGBT7 在工业及新能源的解决方案
滴滴上线试运营全程录音功能且为乘客提供一键报警功能
CCLINK IE转Profinet网关配置通讯配置案例
传荣耀和高通将达成芯片供应合作
微信黄金红包怎么发?情人节正式开启公测
通过调节CoP/CeOx p-n 结的电子结构提升电化学析氢性能
全球半导体硅片行业变迁:日本半导体与硅片产业
Ampere收购OnSpecta,加速对云原生应用程序的AI推理
三星将会在2019年推出的三款Galaxy A系列手机中配备屏幕指纹技术
电路板中容易损坏的元件有哪些?
低价无线充电器时代或将来临
您了解近红外光谱仪的特点吗?
VX3000系列一键式全自动闪测仪测量教程