MIPI CSI-2笔记(6) -- Low Level Protocol(D-PHY物理层包头ECC)

       (注:网友nucfive对syndrome一词翻译提出了更符合的意见,下文中的syndrome,按照“校正子”来理解更符合ECC的场景。做笔记时并未仔细深究,感谢nucfive的指正)

        正确地解析数据包的Data Identifier、Word Count和Virtual Channel Extension字段是至关重要的,这是所有后续处理的前提。D-PHY物理层中定义了6-bit包头ECC,能够修正单bit错误,检测2 bits错误。C-PHY物理层不使用ECC,后面的笔记会讨论C-PHY的包纠错检错机制。

        如上图所示,Data Identifier字段DI[7:0]被映射到了ECC输入的D[7:0],Word Cound的LSB,WC[7:0]被映射到了D[15:8],Word Count的MSB,WC[15:8]被映射到了D[23:16],VCX被映射到了D[25:24]。

包头使用的通用hamming code

        错误检测bit(奇偶校验bit)的个数按照汉明码编码规则而定,是一个参数为传输的数据有效信息位的函数。汉明码规则如下:

       2^p \geq d + p + 1

        d - 表示有效数据信息位的数量

        p - 表示奇偶校验位的数量

        将计算后的奇偶校验位添加到数据位后的结果称为汉明码字(Hanmming code word)。我们用c来代表这个code word,其大小为d+p个bit。汉明码字通过有序集合(c,d)来描述。汉明码字由数据位和生成器矩阵G相乘得出,结果是码字的向量(c1,c2,c3...,cn),包含了原始数据位和计算的奇偶校验位。构造汉明码的生成器矩阵G,由I(单位矩阵)和奇偶校验产生矩阵A构成:

         

         包头加上ECC码的获取方式:PH = p* G, 其中p表示包头(26或64 bits),G是对应的生成器矩阵。

        要验证接收的代码字r,需要将它乘以一个奇偶校验矩阵来得到s,s是故障校验(syndrome check)向量或称奇偶校验向量,。s = H * PH,其中PH是接收到的包头,H是奇偶校验矩阵。

       

        如果s的全部元素都为0,则表示接收到的码字正确。如果s包含了非零元素,那么至少有1个错误发生。如果发生了单bit错误,那么故障s是H里的某个元素,其指向了错误bit。进一步讲,这种情况下,如果错误bit是奇偶校验位中的某一位,那么故障(syndrome)会是I上的某个元素,否则的话发生错误的就是数据位,通过中的故障位置识别。

Hanmming-Modified Code(修正(改进)汉明码)

        纠错码是一个7 + 1 位的Hanmming-modified code(72,64),以及它的5+1位的子集(32,26)。汉明码使用奇偶校验机制来修正单bit错误以及检测两bits错误,但并不能同时做纠错和检错,因此这里多加了1个奇偶校验位。这种编码方式允许相同的6-bit故障(syndromes)能够修正一个64-bit序列的前26比特。下表包含了奇偶校验编码和故障解码矩阵:

表1 - ECC Syndrome Association Matrix 

         矩阵中每个元素代表了一个故障(syndrome),前26个元素(橙色)使用了前3或前5比特来构建故障。矩阵中每个故障是MSB居左对齐:

        比如0x07 = 0b0000_0111 = P7 P6 P5 P4 P3 P2 P1 P0

        行定义了数据位置bit的3个LSB,最左边的列定义了数据位置bit的3个MSB(总共64-bit)。举例来说,第37个bit位置被编码为0b100_101,对应故障为0x68。

        要派生26-bits的奇偶校验P0,橙色元素中的P0会定义对应的bit位置是否在P0奇偶校验位中所用到。

        举个例子,P0_{24-bits}= D0^D1^D2^D4^D5^D7^D10^D11^D13^D16^D20^D21^D22^D23^D24

        派生64-bits的奇偶校验P0是类似的,下标中所有的P0会定义所要使用的相应的bit位置。

表2 -  ECC Parity Generation Rules

         为了纠正一个单数据bit错误,故障(syndrome)必须是表1中的故障的其中之一。这些故障标识了错误的bit位置。故障的计算规则:

        S = P_{SEND}^P_{RECEIVED},其中P_{SEND}是header中的8/6 bit ECC字段,P_{RECEIVED}是对接收到的header计算的奇偶校验结果。

        表2和表1所表达的信息其实是一样的,表2的组织形式是为了能更清晰地展示出数据位之外的奇偶校验位是如何生成的。表格中橙色区域用来产生保护26-bit header的所需要的ECC,整张表用来保护一个64-bit的header。

        之前的CSI-2规范版本并不支持虚拟通道扩展字段VCX,这种情况下,使用的是一个30-bit的Hanmming-modified码字,带有24个数据位以及5+1 奇偶校验位,奇偶校验位基于表2的前24 bit位置相关信息。包头的bit24和bit25被发送器设置为0,接收侧会忽略这两位。

TX侧ECC生成方式

        ECC可以通过使用一个并行的方法轻松地实现。

        对于一个64-bit header来说,如下图:

        对于一个26-bit header来说,如下图:

        

         奇偶校验生成器基于表2:

        例如,P3_{26-bit} = D1^D2^D3^D7^D8^D9^D13^D14^D15^D19^D20^D21^D23^D24^D25

        如果接收器只支持较早版本的CSI-2规范,不支持VCX,那么发送器需要将包头的bit24和bit25设置为0。

RX侧ECC应用

        RX侧要使用ECC,需要对接收的包头再生成一个新的ECC,然后用这个 ECC和接收到的ECC进行计算,得出故障(syndrome),解码故障,找出是否有单bit错误,如果有就修正这个错误。下图描绘了处理一个64为包头数据加8个就校验位的流程。

         解码故障(syndrome)会有四种可能的结果:

        1. 如果故障为0,表示没有错误

        2. 如果故障和表1中的矩阵元素中的某一个匹配上了,表示发生了单bit错误,对应bit位置可以通过反转的方式进行修正(例如,通过和1异或做反转)。

         3. 如果故障只有1个bit被设置,表示发生了奇偶校验位中的单bit错误,错误位置就是故障bit的位置,接收的包头剩余数据没有错误。

        4. 如果故障找不到与之相符的任意结果,表示发生了不可修复的错误,此时需要置位一个错误标志(该flag用来指示包头损坏)。

        26-bit的实现方案如下图,此方案使用了更少的项来计算奇偶校验,因此相比于64bit的实现方案来讲,故障解码模块会简单得多。

         对于不支持VCX字段的发送器,接收器要在任何奇偶校验生成或故障解码动作之前,强制将收到的包头中的bit24,bit25设置为0(图中“VCX Override”功能)。

猜你喜欢

转载自blog.csdn.net/vivo01/article/details/126410826#comments_27379273
今日推荐