校验和生成
当使用C-PHY/D-PHY时,为了检测传输过程中可能发生的错误,每个组成长包的Packet Data的WC个字节会对应计算出一个校验和;组成每个包头的Reserved、VCX、DI和WC字段,总共四字节,也有类似的校验和被计算出来用于错误校验。所有情况中,校验和的实现都是16-bit CRC,生成多项式是,参与计算的所有字节的顺序,按照字节被LLP层呈现到Lane Distributor的顺序来进行的。
下图展示了校验和的字节流发送给Lane Distributor的顺序。
当计算长包的Packet Data数据字的校验和时,16-bit的校验和序列作为包尾PF(Packet Footer)的一部分发送。如果WC(Word Count)为0, CRC应该为0xFFFF。当计算C-PHY物理层的包头的Reserved,VCX(Virtual Channel Extension),DI(Data Ideitifier)以及WC(Word Count)的校验和时,16-bit的校验和序列作为包头CRC(PH-CRC)字段的一部分发送。
长包载荷数据(Payload Data)的校验和
下面两幅图,分别展示了串行CRC实现方案示意以及对应的C语言代码。
16-bit CRC移位寄存器定义
16-bit CRC软件实现例子(C语言)
CRC移位寄存器在每个包开始处理的时候,初始化为0xFFFF。需要注意的是,对于C-PHY物理层来说,如果相同的电路要同时用于包头和包尾的CRC计算,那么CRC移位寄存器对于每个包来说要初始化两次,即,一次在包开始的时候,另一次是在计算包头CRC的时候。在所有数据载荷都过了CRC电路之后,CRC电路会包含校验和。例子中C语言中返回的16-bit crc变量的值和CRC电路中的移位寄存器的[15:0]值是一样的。校验和通过CSI-2物理层发送给CSI-2接收器,用来验证传输过程中是否有错误。
C语言例子函数的输入数据data_p数组,下表从0开始,对于数据载荷,length由WC指定,data是payload data;对于包头CRC计算,length为4个字节,data是:[Reserved, VCX], Data Identifier,WC(LS byte)和WC(MS byte)字段。
CRC计算的例子
包间隔(Packet Spacing)
所有的CSI-2实现方案,要支持在LLP包之间进入和退出LPS(Low Power State)状态。但是也有可选的实现方案会在包之间保持高速状态HS。下图展示了使用LPS的包间隔。
图中所展示的包间隔不需要是8-bit数据字的整数倍,因为接收器会在下一个包的包头之前的SoT序列处理中重新同步并修正对齐字节边界。