初始提交卡包 USB 工程
纳入固件源码、屏幕组件、nand_xfer 工具和文档。忽略本机构建产物、sdkconfig,以及含本机路径的依赖锁。 Co-authored-by: Cursor <[email protected]>
This commit is contained in:
@@ -0,0 +1,54 @@
|
||||
#include "crc.h"
|
||||
#include "config.h"
|
||||
|
||||
|
||||
// 蓝牙标准CRC16-CCITT多项式
|
||||
#define CRC16_CCITT_POLY 0x1021
|
||||
|
||||
// 增量式更新CRC(核心函数)
|
||||
uint16_t crc16_ccitt_update(uint16_t crc_prev, uint8_t data)
|
||||
{
|
||||
// 将当前字节与CRC高8位异或
|
||||
crc_prev ^= (uint16_t)data << 8;
|
||||
|
||||
// 逐位处理8个bit
|
||||
for (uint8_t i = 0; i < 8; i++)
|
||||
{
|
||||
// 判断最高位是否为1
|
||||
if (crc_prev & 0x8000)
|
||||
{
|
||||
// 左移1位后异或多项式
|
||||
crc_prev = (crc_prev << 1) ^ CRC16_CCITT_POLY;
|
||||
}
|
||||
else
|
||||
{
|
||||
// 仅左移1位
|
||||
crc_prev <<= 1;
|
||||
}
|
||||
}
|
||||
|
||||
return crc_prev;
|
||||
}
|
||||
|
||||
// 完整数据CRC计算
|
||||
uint16_t crc16_ccitt_calculate(const uint8_t *data, size_t length)
|
||||
{
|
||||
// 入参校验:空指针/长度0直接返回初始值
|
||||
if (data == NULL || length == 0)
|
||||
{
|
||||
return 0xFFFF;
|
||||
}
|
||||
|
||||
// 初始化CRC为蓝牙标准初始值
|
||||
uint16_t crc = 0xFFFF;
|
||||
|
||||
// 遍历所有字节计算
|
||||
for (size_t i = 0; i < length; i++)
|
||||
{
|
||||
crc = crc16_ccitt_update(crc, data[i]);
|
||||
}
|
||||
|
||||
// 返回最终CRC值(无反转、无异或)
|
||||
return crc;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
#ifndef __CRC_H__
|
||||
#define __CRC_H__
|
||||
|
||||
#include "config.h"
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
|
||||
uint16_t crc16_ccitt_update(uint16_t crc_prev, uint8_t data);
|
||||
uint16_t crc16_ccitt_calculate(const uint8_t *data, size_t length);
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user