【USB笔记】CRC-5/USB 简介

一、CRC-5/USB算法应用场景

CRC5/USB算法应用于USB协议的协议层(Protocol Layer),用于Token包(令牌包)数据的校验。tokens使用5位的CRC字段,它涵盖了IN、SETUP 和OUT tokens的ADDR和ENDP字段或者SOF tokens的时间戳字段。PING和SPLIT 特殊tokens也包含5位的CRC字段。生成多项式为
多项式
用二进制来表示这个多项式就是00101B。如果tokens的所有位都被正确接收,那么接收器的5位余数是01100B。
Token Packets格式如下:

Token Packets格式

二、计算CRC-5/USB

通过USB分析仪抓包,选取一个Token Packets作为示例

USB分析仪抓包
可以得到addr 为0x05,endpoint为0x04,CRC为0x10。

1.计算CRC

我们先通过addr 和endpoint的值来计算CRC。
addr 0x05转换为二进制为 000 0101B,endpoint 0x04 转换为二进制为0100B。
原始序列为101 0000 0010B,低位在前,高位在后,这是由USB的发送顺序决定的。
多项式序列用二进制表示为10 0101B。
多项式序列位数为6,原始序列需要在后面增加5个0,变成1010 0000 0100 0000B,然后加上一个系数全1的4阶多项式的二进制表示,这里为1111 1000 0000 0000B ,两者进行异或,得到101 1000 0100 0000B。
如下图示:
异或计算
然后把这个数以“模2除法”方式除以生成多项式,得到的余数1 1110B。
如下图示:
模二除法
然后对余数1 1110B进行按位取反0 0001B,由于这个数是从低位到高位,进行反向,变成高位到低位1 0000B,转换成16进制,就是0x10,与USB抓包实例的结果相同。

2.校验整个包结果

接下来我们加入CRC进行计算。
addr 0x05转换为二进制为 000 0101B,endpoint 0x04 转换为二进制为0100B,CRC 0x10转换为二进制为1 0000B。
原始序列为1010 0000 0100 0001B,低位在前,高位在后多项式序列位数为6,原始序列需要在后面增加5个0,变成1010 0000 0100 0001 0000 0B,然后加上一个系数全1的4阶多项式的二进制表示,这里为1111 1000 0000 0000 0000 0B ,两者进行异或,得到101 1000 0100 0001 0000 0B。
如下图所示:
异或计算
然后把这个数以“模2除法”方式除以生成多项式。
如下图所示:

最后得到的余数01100B,USBCRC5的计算结果都会为01100B,所以结果正确。
模二除法

  • 8
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值