十四、USB PD之状态机

简单来讲状态机,就是做出某个动作或执行某一个行为满足了某一条件就进入或切换到某一个状态,比如:
人.饿 ->吃饭->人.饱
饿 就是人的状态,吃饭就是人的动作或行为,吃饱了满足条件,进入到另一个饱的状态,这是对状态机的简单举例。

1 状态图

状态图是规范性的,必须定义电源传递策略引擎的操作。请注意,这些状态图并不旨在取代良好编写和强大的设计。
image.png
上图展示了以下各节定义的状态轮廓。在顶部是状态的名称。其后是“进入状态的操作”,列出了进入该状态时执行的操作。如果还有“退出状态的操作”,即退出该状态时执行的操作,那么也会列出;否则,该框从状态中省略。在底部列出了PD的状态

  • “Power”表示Source Port的当前输出功率或Sink Port的输入功率。
  • “PD”表示当前附加状态,可以是“附加”、“脱离”或“未知”。

从一个状态到另一个状态的转换由箭头表示,箭头上列出了条件。如果有多个条件,这些条件使用逻辑OR“|”或逻辑AND“&”连接。

在某些情况下,存在可以从任何状态转移到特定状态的转换。这些由箭头表示,箭头在一端未连接到状态,但在另一端(箭头的点)与最终状态连接。

许多状态中都包含计时器。计时器在被引用的特定状态中被初始化(设置为其起始条件)并运行(计时器正在计数)。一旦退出该状态,计时器就不再处于活动状态。如果计时器在状态之外继续运行(例如NoResponseTimer),则在文本中进行了说明。计时器的超时被列为状态转换的条件。
SenderResponseTimer是一个特殊情况,因为它可能会在使用它的状态之外被停止和启动。为了使其在不使状态图过于复杂的情况下实现,SenderResponseTimer有其自己的状态图(见图8-133“SenderResponseTimer策略引擎状态图”)。该计时器的控制由策略引擎和分块层共享。

状态转换上列出的条件将来自三个来源之一,并在发生冲突时,应按以下顺序处理:
1) 从协议层向策略引擎传递的消息和相关指示(消息发送,消息接收等)。
2) 在策略引擎内触发的事件,例如计时器超时。
3) 与设备策略管理器相关的信息和请求,既可以涉及到本地策略,也可以涉及到设备策略管理器控制的其他模块,例如电源供应和USB-C端口控制。

注意:以下状态图并非旨在涵盖可能遇到的所有可能的边界情况。例如,如果由于协议层的传入消息而丢弃了传出消息(参见第6.12.2.3节“协议层消息接收”),则需要系统的更高层在首先处理传入消息后处理正在启动的消息序列的重试。

1.1 SenderResponseTimer 状态图

图8-133“SenderResponseTimer策略引擎状态图”以下显示了在Source或Sink Port中策略引擎的状态图。以下各节描述了在每个状态中的操作。
image.png

1.1.1 SRT_Stopped State

SRT_Stopped状态应该是SenderResponseTimer在上电或硬复位后的起始状态。进入此状态时,策略引擎应停止增加SR_Timer。

策略引擎应在以下情况下转换到SRT_Running状态:

  • 当SenderResponseTimer从策略引擎状态内部启动时,或
  • 当来自分块层的Start_SRT请求时。

1.1.2 SRT_Running State

进入SRT_Running状态时,SenderResponseTimer状态机应执行以下操作:

  • 将SR_Timer设置为零
  • 启动SR_Timer计时器

SenderResponseTimer状态机应在以下情况下转换到SRT_Expired状态:

  • 当SR_Timer达到其最大计数

SenderResponseTimer状态机应在以下情况下转换到SRT_Stopped状态:

  • 当通过退出策略引擎状态停止SenderResponseTimer时,或
  • 当来自分块层的Stop_SRT请求时。

1.1.3 SRT_Expired State

进入SRT_Running状态时,SenderResponseTimer状态机应通知策略引擎有关SenderResponseTimer超时的信息。
随后,策略引擎应转换到SRT_Stopped状态:

  • 当策略引擎已经收到通知时

2 策略引擎Source端口状态图

image.png
可以看出Source端口的状态图稍微有点复杂,我们一点一点看。
1) CapsCounter的实现是可选的。在未实现此功能的情况下,源应在每次SourceCapabilityTimer超时时继续发送Source_Capabilities消息。
2) 由于要求Sink从提供的功能中发出有效请求,预期的过渡是通过“请求可以满足”,除非源的功能自上次提供以来已更改。
3) “合同无效”意味着先前协商的电压和电流值不再包含在源的新功能中。如果在这种情况下Sink未能发出有效请求,则不再可能进行电源传递操作,并通过硬复位退出电源传递模式。
4) 在进行电源切换后,新的源需要等待额外的tSwapSourceStart时间,然后才能发送Source_Capabilities消息。在首次启动系统时,不需要此延迟。
5) PD Connected被定义为端口合作方正在主动通信的情况。在切换后,端口合作方仍然保持PD Connected状态,直到发生到Disabled状态的转换或连接器能够识别到Detach。
6) 在硬复位后,端口合作方不再是PD Connected,但需要考虑在端口附加的同时是否发生了PD连接,以防止不必要的USB Type-C®错误恢复。
7) 当存在VCONN Source并且需要与Cable Plug建立PD连接时(即,尚未收到GoodCRC消息以响应Discover Identity命令时),将运行DiscoverIdentityTimer。
8) 请参见第5.7节“冲突避免”、第6.6.16节“冲突避免计时器”和第6.10节“冲突避免”。
9) 在PE_SRC_Wait_New_Capabilities状态下,设备策略管理器应该决定要么不发送更多的Source Capabilities,要么发送不同的Source Capabilities。继续发送相同的Source Capabilities可能导致死锁情况。
10) SourcePPSCommTimer仅在当前显式合同为SPR PPS APDO时初始化和运行。不支持SPR PPS的源不需要实现SourcePPSCommTimer。
11) SourceEPRKeepAliveTimer仅在源处于EPR模式时初始化和运行。不支持EPR模式的源不需要实现SourceEPRKeepAliveTimer。
12) 可以请求SPR或EPR Sink Capabilities,而不管源当前是否在SPR或EPR模式中运行。


image.png

2.1 PE_SRC_Startup State

这段文本描述了一个源策略引擎(Policy Engine)的状态转换。在启动或硬重置后,源策略引擎应处于“PE_SRC_Startup”状态。进入此状态时,策略引擎应重置“CapsCounter”并重置协议层。这里明确指出,重置协议层也会重置“MessageIDCounter”和存储的“MessageID”(见6.12.2.3节“协议层消息接收”)。

策略引擎应在以下情况下过渡到“PE_SRC_Send_Capabilities”状态:

  • 如果由于系统首次启动而进入PE_SRC_Startup状态,那么当协议层重置完成后,应过渡到“PE_SRC_Send_Capabilities”状态。
  • 如果因为电源角色交换而进入PE_SRC_Startup状态,那么当SwapSourceStartTimer超时后,应过渡到“PE_SRC_Send_Capabilities”状态。

需要注意的是,在插头连接之前,源应保持在“PE_SRC_Startup”状态,不发送任何“Source_Capabilities”消息。

这是一个关于电源或某种策略引擎系统状态转换的技术性描述,它涉及到了系统启动、硬重置、协议层重置、定时器超时等条件下的状态转换。

2.2 PE_SRC_Discovery State

在进入PE_SRC_Discovery状态时,策略引擎应初始化并运行SourceCapabilityTimer,以触发发送Source_Capabilities消息。

满足以下条件时,策略引擎应过渡到PE_SRC_Send_Capabilities状态:

• SourceCapabilityTimer超时且CapsCounter ≤ nCapsCount。

策略引擎在满足以下条件时可以选择进入PE_SRC_Disabled状态:

• 当前没有Port Partners与PD连接
• SourceCapabilityTimer超时
• CapsCounter > nCapsCount。

策略引擎在满足以下条件时应进入PE_SRC_Disabled状态

• Port Partners从未进行过PD连接(在此次连接期间,源端口仍与其未进行过PD连接的端口相连)
• NoResponseTimer超时
• HardResetCounter > nHardResetCount。

注意,在PE_SRC_Disabled状态下,附加的设备被视为无响应。策略引擎的操作如同设备已断开连接,直到检测到设备断开/重新连接为止。

这是一段关于电源策略引擎在不同条件下的状态转换的描述。它详细说明了在何时应该初始化并运行SourceCapabilityTimer,何时应该转换到PE_SRC_Send_Capabilities状态,以及何时可以选择或必须转换到PE_SRC_Disabled状态。

2.3 PE_SRC_Send_Capabilities State

注:该状态可从PE_SRC_Soft_Reset状态进入。
在进入PE_SRC_Send_Capabilities状态时,策略引擎应请求设备策略管理器提供当前端口的能力。然后,策略引擎应请求协议层发送包含这些能力的能力消息。策略引擎应请求:
• 如果源处于SPR模式,则请求Source_Capabilities消息,或
• 如果源处于EPR模式,则请求EPR_Source_Capabilities消息。
然后,策略引擎应增加CapsCounter(如果已实现)。如果接收到GoodCRC消息,则策略引擎应:
• 停止NoResponseTimer。
• 将HardResetCounter和CapsCounter重置为零。请注意,HardResetCounter仅在此状态和上电时被设置为零;在硬复位期间,其值应保持不变。
• 初始化并运行SenderResponseTimer。
一旦接收并通过GoodCRC消息确认了Source_Capabilities消息,接收端将在tSenderResponse时间内发送请求消息。
当满足以下条件时,策略引擎应过渡到PE_SRC_Negotiate_Capability状态:
• 从接收端接收到请求消息,且源在SPR模式下运行,或
• 从接收端接收到EPR_Request消息,且源在EPR模式下运行。
当:(未完成的文本,请提供剩余部分)
image.png

2.4 PE_SRC_Negotiate_Capability State

在进入PE_SRC_Negotiate_Capability状态时,策略引擎应请求设备策略管理器评估来自连接的Sink的请求。设备策略管理器的响应应为以下之一:
• 请求可以满足。
• 无法满足请求。
• 请求可以稍后从电源储备中满足。
当以下情况发生时,策略引擎应转换到PE_SRC_Transition_Supply状态:
• 请求可以满足。
当以下情况发生时,策略引擎应转换到PE_SRC_Capability_Response状态:
• 请求无法满足。
• 或请求可以稍后从电源储备中满足。

2.5 PE_SRC_Transition_Supply State

策略引擎在电源从一种转换到另一种状态时应处于PE_SRC_Transition_Supply状态。

在进入PE_SRC_Transition_Supply状态时,策略引擎应请求协议层发送一个GotoMin消息(如果设备策略管理器请求了此操作),否则发送一个Accept消息,并通知设备策略管理器它将把电源切换到请求的功率级别。注意:如果电源当前已经在请求的功率上运行,则无需进行更改。

在退出PE_SRC_Transition_Supply状态时,策略引擎应请求协议层发送一个PS_RDY消息。

策略引擎应在以下情况下转换到PE_SRC_Ready状态:
• 设备策略管理器通知策略引擎电源已准备就绪。

策略引擎应在以下情况下转换到PE_SRC_Hard_Reset状态:
• 发生协议错误。

2.6 PE_SRC_Ready State

在PE_SRC_Ready状态下,PD Source应该以稳定的功率运行,没有进行中的协商。它应该对来自Sink的请求以及来自设备策略管理器的事件作出响应。

在进入PE_SRC_Ready状态时,Source应通知协议层原子消息序列(AMS)的结束。如果进入PE_SRC_Ready的过程是由于未引起软复位的协议错误(参见第8.3.3.4.1节“SOP Source Port Soft Reset and Protocol Error State Diagram”),则不应发送通知到协议层,因为有一条消息需要处理。

在进入PE_SRC_Ready状态时,如果这是需要与Cable Plug建立通信的VCONN Source,则策略引擎应该:
• 初始化并运行DiscoverIdentityTimer(尚未收到Discover Identity Message的GoodCRC消息响应)。

在进入PE_SRC_Ready状态时,如果当前的Explicit Contract是SPR PPS APDO,则策略引擎应执行以下操作:
• 初始化并运行SourcePPSCommTimer。

在进入PE_SRC_Ready状态时,如果当前的Explicit Contract是EPR模式,则策略引擎应执行以下操作:
• 初始化并运行SourceEPRKeepAliveTimer。

在退出PE_SRC_Ready状态时,如果Source正在启动AMS,则策略引擎应通知协议层将在AMS中的第一条消息后续发送。

策略引擎应在以下情况下转换到PE_SRC_Send_Capabilities状态:
• 设备策略管理器指示Source Capabilities已更改,或
• 收到Get_Source_Cap消息,且Source处于SPR模式,或
• 收到EPR_Get_Source_Cap消息,且Source处于EPR模式。

策略引擎应在以下情况下转换到PE_SRC_Negotiate_Capability状态:
• 收到Request消息,且Source处于SPR模式,或
• 收到EPR_Request消息,且Source处于EPR模式。

策略引擎应在以下情况下转换到PE_SRC_Transition_Supply状态:
• 从设备策略管理器接收到附加设备转到最小功率的GotoMin请求。

策略引擎应在以下情况下转换到PE_SRC_Get_Sink_Cap状态:
• 设备策略管理器请求Sink的能力。

策略引擎应在以下情况下转换到PE_SRC_Hard_Reset状态:
• Source作为SPR PPS运行,SourcePPSCommTimer计时超时,或
• Source处于EPR模式,SourceEPRKeepAliveTimer计时超时。

策略引擎应在以下情况下转换到PE_SRC_EPR_Keep_Alive状态:
• 收到EPR_KeepAlive消息。

策略引擎应在以下情况下转换到PE_SRC_Give_Source_Cap状态:
• 在EPR模式下收到Get_Source_Cap消息,或
• 在SPR模式下收到EPR_Get_Source_Cap消息。
image.png

2.7 PE_SRC_Disabled State

在PE_SRC_Disabled状态下,PD Source提供默认电源并不响应USB Power Delivery消息,但对硬复位信号会有响应。

2.8 PE_SRC_Capability_Response State

策略引擎应在从Sink接收到的请求无法根据当前能力满足时,进入PE_SRC_Capability_Response状态。当当前Contract不在当前能力范围内时,将其视为无效,并将触发硬复位。

在进入PE_SRC_Capability_Response状态时,策略引擎应请求协议层发送以下之一:
• Reject Message - 如果请求无法满足或当前Contract无效。
• Wait Message - 如果请求可以稍后从电源储备中满足。如果当前Contract无效,则不应发送Wait Message。

策略引擎应在以下情况下转换到PE_SRC_Ready状态:
• 存在显式Contract,并且
• 已发送Reject Message且当前Contract仍然有效,或
• 已发送Wait Message。

策略引擎应在以下情况下转换到PE_SRC_Hard_Reset状态:
• 存在显式Contract,并且
• 已发送Reject Message且当前Contract无效(即,Sink必须请求新值,因此我们将返回到USB默认操作)。

策略引擎应在以下情况下转换到PE_SRC_Wait_New_Capabilities状态:
• 不存在显式Contract,并且
• 已发送Reject Message,或
• 已发送Wait Message。

2.9 PE_SRC_Hard_Reset State

策略引擎应在以下任何状态下转换到PE_SRC_Hard_Reset状态:
• 从设备策略管理器收到硬复位请求,或
• 在EPR模式下,并且
• 收到一个Request消息。

在进入PE_SRC_Hard_Reset状态时,策略引擎应:
• 请求PHY层生成硬复位信号。
• 初始化并运行NoResponseTimer。请注意,NoResponseTimer应在每个状态中继续运行,直到停止或超时。
• 初始化并运行PSHardResetTimer,并递增HardResetCounter。

策略引擎应在以下情况下转换到PE_SRC_Transition_to_default状态:
• PSHardResetTimer超时。
image.png

2.10 PE_SRC_Hard_Reset_Received State

策略引擎应在以下任何状态下转换到PE_SRC_Hard_Reset_Received状态:
• 检测到硬复位信号。

在进入PE_SRC_Hard_Reset_Received状态时,策略引擎应:
• 初始化并运行PSHardResetTimer。
• 初始化并运行NoResponseTimer。请注意,NoResponseTimer应在每个状态中继续运行,直到停止或超时。

策略引擎应在以下情况下转换到PE_SRC_Transition_to_default状态:
• PSHardResetTimer超时。

2.11 PE_SRC_Transition_to_default State

在进入PE_SRC_Transition_to_default状态时,策略引擎应该:
• 向设备策略管理器指示电源应进行硬复位(参见第7.1.5节“对硬复位的响应”)。
• 请求本地硬件的复位。
• 请求设备策略管理器将端口数据角色设置为DFP并关闭VCONN。

在退出PE_SRC_Transition_to_default状态时,策略引擎应该:
• 请求设备策略管理器打开VCONN。
• 通知协议层硬复位已完成。

策略引擎应在以下情况下转换到PE_SRC_Startup状态:
• 设备策略管理器指示电源已达到默认电平。
image.png

2.12 PE_SRC_Get_Sink_Cap State

在PE_SRC_Get_Sink_Cap状态中,由于来自设备策略管理器的请求,策略引擎应请求连接的Sink的能力。
• 进入PE_SRC_Get_Sink_Cap状态时,策略引擎应请求协议层发送一个获取Sink Capabilities消息,以检索Sink的能力。策略引擎应发送:
• 当设备策略管理器请求SPR能力时,发送Get_Sink_Cap消息,或
• 当设备策略管理器请求EPR能力时,发送EPR_Get_Sink_Cap消息。
策略引擎然后启动SenderResponseTimer。
在退出PE_SRC_Get_Sink_Cap状态时,策略引擎应通知设备策略管理器结果(能力或响应超时)。
策略引擎应在以下情况下转换到PE_SRC_Ready状态:
• 请求了SPR Sink能力,并收到Sink_Capabilities消息,或
• 请求了EPR Sink能力,并收到EPR_Sink_Capabilities消息,或
• SenderResponseTimer超时。

2.13 PE_SRC_Wait_New_Capabilities State

在PE_SRC_Wait_New_Capabilities状态中,策略引擎未能协商明确的合同,正在等待设备策略管理器提供新的能力。

策略引擎应在以下情况下转换到PE_SRC_Send_Capabilities状态:
• 设备策略管理器指示Source Capabilities已更改。

2.14 PE_SRC_EPR_Keep_Alive State

在进入PE_SRC_EPR_Keep_Alive状态时,策略引擎应发送一个EPR_KeepAlive_Ack消息。

策略引擎应在以下情况下转换到PE_SRC_Ready状态:
• 已发送EPR_KeepAlive_Ack消息。

2.15 PE_SRC_Give_Source_Cap State

在进入PE_SRC_Give_Source_Cap状态时,策略引擎应请求设备策略管理器提供当前系统的能力。

然后,策略引擎应请求协议层发送一个包含这些能力的Source Capabilities消息。

策略引擎应在以下情况下发送消息:
• 在接收到Get_Source_Cap消息时发送Source_Capabilities消息,或
• 在接收到EPR_Get_Source_Cap消息时发送EPR_Source_Capabilities消息。

策略引擎应在以下情况下转换到PE_SNK_Ready状态:
• Source Capabilities消息已成功发送。

  • 16
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
PD3.0协议是一种用于USB Type-C接口上的协议,它定义了设备之间的通信方式和电源传输方式。在PD3.0协议中,状态机是用来控制电源传输的状态转换的。 PD3.0协议状态机共有5个状态,分别是:Disabled、Unattached、Attached.SNK、Attached.SRC和TryWait.SNK。下面是这些状态之间的状态转换过程: 1. Disabled状态:表示USB Type-C接口未连接,此时PD3.0协议不起作用。 2. Unattached状态:表示USB Type-C接口已连接,但是还未确定连接的角色。从Disabled状态进入Unattached状态时,电源传输会被禁用。 3. Attached.SNK状态:表示USB Type-C接口已连接,且连接的角色是Sink设备(即充电器)。从Unattached状态进入Attached.SNK状态时,Sink设备会发送消息给Source设备,请求电源传输。如果Source设备同意,则会进入下一个状态。 4. Attached.SRC状态:表示USB Type-C接口已连接,且连接的角色是Source设备(即充电设备)。从Unattached状态进入Attached.SRC状态时,Source设备会等待来自Sink设备的请求,并根据请求决定是否开启电源传输。如果电源传输开启,则会进入下一个状态。 5. TryWait.SNK状态:表示USB Type-C接口已连接,但是电源传输还未确定。从Attached.SRC状态进入TryWait.SNK状态时,Source设备会暂停电源传输,并等待一段时间,以便判断Sink设备是否需要电源。如果Sink设备请求电源,则会回到Attached.SNK状态;如果没有请求,则会回到Attached.SRC状态。 以上是PD3.0协议状态机的状态转换过程。在实际应用中,各个设备会根据协议进行相应的状态转换,以实现USB Type-C接口的电源传输和数据传输。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦成大佬的第N天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值