PD3.0协议BMC解码具体实现
时间: 2023-07-07 21:24:12 浏览: 448
USB PD3.0 Spec
PD3.0协议中的BMC解码(Binary Marked Code)是一种将5位二进制数据转换为8位二进制数据的解码方式。它的主要作用是在接收数据时,将BMC编码后的数据转换为原始的8位二进制数据,以便后续处理。
PD3.0协议中的BMC解码规则如下:
- 将10位BMC编码数据拆分为两个5位的BMC编码数据。
- 对每个5位的BMC编码数据进行解码,得到一个4位的二进制数据。
- 将两个4位的二进制数据拼接起来,得到一个8位的二进制数据。
- 重复上述步骤,直到所有的BMC编码数据都解码完成。
具体实现时,可以使用一个指针指向BMC编码后的数据,然后按照上述规则对每个10位BMC编码数据进行解码,并将解码后的8位二进制数据存储到一个缓存区中。具体代码如下:
```c
uint8_t *pd30_bmc_decode(uint8_t *bmc_data, uint32_t len, uint8_t *data)
{
uint8_t *p = bmc_data;
uint8_t *q = data;
uint8_t cur_byte = 0;
uint8_t cur_bit = 0;
for (uint32_t i = 0; i < len; i++) {
// 拆分10位BMC编码数据为两个5位的BMC编码数据
uint8_t high = *p++;
uint8_t low = *p++;
// 对每个5位的BMC编码数据进行解码
for (uint8_t j = 0; j < 5; j++) {
if ((high & (1 << j)) != 0) {
cur_byte |= (1 << cur_bit);
}
if (++cur_bit == 8) {
*q++ = cur_byte;
cur_byte = 0;
cur_bit = 0;
}
}
for (uint8_t j = 0; j < 5; j++) {
if ((low & (1 << j)) != 0) {
cur_byte |= (1 << cur_bit);
}
if (++cur_bit == 8) {
*q++ = cur_byte;
cur_byte = 0;
cur_bit = 0;
}
}
}
return q;
}
```
这段代码中,参数bmc_data是BMC编码后的数据,len是数据的长度,data是存储解码后数据的缓存区。函数返回值是解码后数据的结束地址。
需要注意的是,在解码完成后,如果最后一个BMC编码数据不足10位,需要在末尾补0,使其成为一个完整的10位BMC编码数据。
另外,PD3.0协议中还定义了一些特殊的BMC解码规则,例如掩码解码、ID解码等,需要根据具体的协议规范进行实现。
阅读全文