SoundWire 错误处理¶
SoundWire PHY 的设计非常谨慎,总线上的错误发生的可能性很低,如果发生,也应该仅限于单比特错误。这种设计的例子可以在同步机制(两次错误后同步丢失)和用于批量寄存器访问的短 CRC 中找到。
可以通过多种机制检测错误
总线冲突或奇偶校验错误:此机制依赖于独立于有效负载和用法的低级检测器,它们涵盖控制和音频数据。当前实现仅记录此类错误。改进措施可能包括使整个编程序列无效并从已知位置重新启动。对于在控制/命令序列之外发生的此类错误,SoundWire 协议未启用音频数据的隐藏或恢复,错误的位置也会影响其可听性(最高有效位在 PCM 中受到的影响更大),并且在检测到多个此类错误后,可能会重置总线。请注意,由于编程错误(两个流使用相同的位槽)或在发送/接收转换期间的电气问题导致的总线冲突无法区分,尽管在启用音频时反复出现总线冲突表明存在总线分配问题。中断机制还可以帮助识别检测到总线冲突或奇偶校验错误的从设备,但它们可能不是错误的责任方,因此单独重置它们不是可行的恢复策略。
命令状态:每个命令都与一个状态相关联,该状态仅涵盖设备之间的数据传输。ACK 状态表示命令已收到,并将在当前帧结束时执行。NAK 表示命令出错,将不会应用。如果编程错误(命令发送到不存在的从设备或未实现的寄存器)或电气问题,则无响应信号表示命令被忽略。某些主设备实现允许命令重传多次。如果重传失败,则回溯并重新启动整个编程序列可能是一种解决方案。或者,某些实现可能会直接发出总线复位并重新枚举所有设备。
超时:在许多情况下,例如 ChannelPrepare 或 ClockStopPrepare,总线驱动程序应该轮询一个寄存器字段,直到它转换为零值的 NotFinished 值。MIPI SoundWire 规范 1.1 未定义超时,但 MIPI SoundWire DisCo 文档添加了有关超时的建议。如果此类配置未完成,驱动程序将返回 -ETIMEOUT。此类超时是故障从设备的症状,并且很可能无法从中恢复。
全局重新配置序列期间的错误非常难处理
BankSwitch:在发出 BankSwitch 的最后一个命令期间发生的错误很难回溯。在单段设置中,可能可以重新传输 Bank Switch 命令,但这可能会导致启用多个总线段时出现同步问题(具有副作用的命令,例如帧重新配置,会在不同的时间处理)。全局硬重置可能是最好的解决方案。
请注意,SoundWire 不提供检测写入有效寄存器中的非法值的机制。在许多情况下,该标准甚至提到从设备可能会以实现定义的方式运行。总线实现不提供对此类错误的恢复机制,从设备或主设备驱动程序实现人员负责在有效寄存器中写入有效值,并在需要时实现额外的范围检查。