Files
ESPC3-wireless/app/utils/crc.c
LokLiang e9b5e42ef2 重构项目配置并添加对 SBDEMO 的支持
更新多个 ESP32 芯片(C2、C3、S3)
的版本配置为 SBDEMO
产品添加新的配置文件实现板卡和应用程序配置模块添加 CRC 实用函数修改系统日志以支持动态日志控制更新 Kconfig 和 sdkconfig 的默认设置以适应新产品
2025-02-21 10:38:22 +08:00

166 lines
8.0 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "crc.h"
static uint8_t const s_crc8_tbl[256] = {
0x00, 0x91, 0xe3, 0x72, 0x07, 0x96, 0xe4, 0x75,
0x0e, 0x9f, 0xed, 0x7c, 0x09, 0x98, 0xea, 0x7b,
0x1c, 0x8d, 0xff, 0x6e, 0x1b, 0x8a, 0xf8, 0x69,
0x12, 0x83, 0xf1, 0x60, 0x15, 0x84, 0xf6, 0x67,
0x38, 0xa9, 0xdb, 0x4a, 0x3f, 0xae, 0xdc, 0x4d,
0x36, 0xa7, 0xd5, 0x44, 0x31, 0xa0, 0xd2, 0x43,
0x24, 0xb5, 0xc7, 0x56, 0x23, 0xb2, 0xc0, 0x51,
0x2a, 0xbb, 0xc9, 0x58, 0x2d, 0xbc, 0xce, 0x5f,
0x70, 0xe1, 0x93, 0x02, 0x77, 0xe6, 0x94, 0x05,
0x7e, 0xef, 0x9d, 0x0c, 0x79, 0xe8, 0x9a, 0x0b,
0x6c, 0xfd, 0x8f, 0x1e, 0x6b, 0xfa, 0x88, 0x19,
0x62, 0xf3, 0x81, 0x10, 0x65, 0xf4, 0x86, 0x17,
0x48, 0xd9, 0xab, 0x3a, 0x4f, 0xde, 0xac, 0x3d,
0x46, 0xd7, 0xa5, 0x34, 0x41, 0xd0, 0xa2, 0x33,
0x54, 0xc5, 0xb7, 0x26, 0x53, 0xc2, 0xb0, 0x21,
0x5a, 0xcb, 0xb9, 0x28, 0x5d, 0xcc, 0xbe, 0x2f,
0xe0, 0x71, 0x03, 0x92, 0xe7, 0x76, 0x04, 0x95,
0xee, 0x7f, 0x0d, 0x9c, 0xe9, 0x78, 0x0a, 0x9b,
0xfc, 0x6d, 0x1f, 0x8e, 0xfb, 0x6a, 0x18, 0x89,
0xf2, 0x63, 0x11, 0x80, 0xf5, 0x64, 0x16, 0x87,
0xd8, 0x49, 0x3b, 0xaa, 0xdf, 0x4e, 0x3c, 0xad,
0xd6, 0x47, 0x35, 0xa4, 0xd1, 0x40, 0x32, 0xa3,
0xc4, 0x55, 0x27, 0xb6, 0xc3, 0x52, 0x20, 0xb1,
0xca, 0x5b, 0x29, 0xb8, 0xcd, 0x5c, 0x2e, 0xbf,
0x90, 0x01, 0x73, 0xe2, 0x97, 0x06, 0x74, 0xe5,
0x9e, 0x0f, 0x7d, 0xec, 0x99, 0x08, 0x7a, 0xeb,
0x8c, 0x1d, 0x6f, 0xfe, 0x8b, 0x1a, 0x68, 0xf9,
0x82, 0x13, 0x61, 0xf0, 0x85, 0x14, 0x66, 0xf7,
0xa8, 0x39, 0x4b, 0xda, 0xaf, 0x3e, 0x4c, 0xdd,
0xa6, 0x37, 0x45, 0xd4, 0xa1, 0x30, 0x42, 0xd3,
0xb4, 0x25, 0x57, 0xc6, 0xb3, 0x22, 0x50, 0xc1,
0xba, 0x2b, 0x59, 0xc8, 0xbd, 0x2c, 0x5e, 0xcf};
uint8_t crc8_calc(const void *data, size_t len)
{
const uint8_t *ptr = data;
uint8_t crc = 0;
while (len-- != 0)
{
crc = s_crc8_tbl[crc ^ *ptr++];
}
return crc;
}
uint16_t crc16_calc(const void *data, size_t length)
{
const uint8_t *ptr = data;
uint16_t crc = 0xffff;
while (length--)
{
crc = crc ^ ((uint16_t)*ptr++ & 0xff);
for (size_t i = 0; i < 8; i++)
{
if (crc & 0x1)
crc = crc >> 1 ^ 0x0000a001;
else
crc = crc >> 1;
}
}
return (crc & 0xFFFF);
}
static struct
{
uint32_t Width : 6; // CRC比特数
uint32_t RefIn : 1; // 表示待测数据的每个字节false 表示不按位颠倒true 表示按位颠倒
uint32_t RefOut : 1; // 表示计算结束后flase 表示输出结果不按位颠倒true 表示输出结果按位颠倒
uint32_t Poly; // 生成项(未颠倒的)
uint32_t Init; // 初始值(注意此值不是计算输出值,而时计算过程的中间值,即对应的查询表值)
uint32_t xOrOut; // 表示计算结束后:进行的 XOR 的值
uint32_t Check; // 表示 CRC 使用这个模型计算字符串 "123456789" 后得到的 CRC 值
uint32_t Tab[1 << 8]; // 生成的查询表
} const s_crc32_tab = {
32,
1,
1,
0x4C11DB7,
0xFFFFFFFF,
0xFFFFFFFF,
0xCBF43926,
{
// CRC Table
0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, // 0x00H ~ 0x03H
0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3, // 0x04H ~ 0x07H
0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, // 0x08H ~ 0x0BH
0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91, // 0x0CH ~ 0x0FH
0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE, // 0x10H ~ 0x13H
0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7, // 0x14H ~ 0x17H
0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, // 0x18H ~ 0x1BH
0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5, // 0x1CH ~ 0x1FH
0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172, // 0x20H ~ 0x23H
0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B, // 0x24H ~ 0x27H
0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, // 0x28H ~ 0x2BH
0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59, // 0x2CH ~ 0x2FH
0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, // 0x30H ~ 0x33H
0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F, // 0x34H ~ 0x37H
0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, // 0x38H ~ 0x3BH
0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D, // 0x3CH ~ 0x3FH
0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A, // 0x40H ~ 0x43H
0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433, // 0x44H ~ 0x47H
0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, // 0x48H ~ 0x4BH
0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01, // 0x4CH ~ 0x4FH
0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, // 0x50H ~ 0x53H
0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457, // 0x54H ~ 0x57H
0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C, // 0x58H ~ 0x5BH
0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65, // 0x5CH ~ 0x5FH
0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, // 0x60H ~ 0x63H
0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB, // 0x64H ~ 0x67H
0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0, // 0x68H ~ 0x6BH
0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9, // 0x6CH ~ 0x6FH
0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086, // 0x70H ~ 0x73H
0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F, // 0x74H ~ 0x77H
0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, // 0x78H ~ 0x7BH
0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD, // 0x7CH ~ 0x7FH
0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A, // 0x80H ~ 0x83H
0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683, // 0x84H ~ 0x87H
0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8, // 0x88H ~ 0x8BH
0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1, // 0x8CH ~ 0x8FH
0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, // 0x90H ~ 0x93H
0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7, // 0x94H ~ 0x97H
0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC, // 0x98H ~ 0x9BH
0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, // 0x9CH ~ 0x9FH
0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, // 0xA0H ~ 0xA3H
0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B, // 0xA4H ~ 0xA7H
0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, // 0xA8H ~ 0xABH
0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79, // 0xACH ~ 0xAFH
0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, // 0xB0H ~ 0xB3H
0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F, // 0xB4H ~ 0xB7H
0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, // 0xB8H ~ 0xBBH
0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D, // 0xBCH ~ 0xBFH
0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, // 0xC0H ~ 0xC3H
0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713, // 0xC4H ~ 0xC7H
0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, // 0xC8H ~ 0xCBH
0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21, // 0xCCH ~ 0xCFH
0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E, // 0xD0H ~ 0xD3H
0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777, // 0xD4H ~ 0xD7H
0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, // 0xD8H ~ 0xDBH
0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45, // 0xDCH ~ 0xDFH
0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2, // 0xE0H ~ 0xE3H
0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB, // 0xE4H ~ 0xE7H
0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0, // 0xE8H ~ 0xEBH
0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9, // 0xECH ~ 0xEFH
0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, // 0xF0H ~ 0xF3H
0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF, // 0xF4H ~ 0xF7H
0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94, // 0xF8H ~ 0xFBH
0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D // 0xFCH ~ 0xFFH
},
};
uint32_t crc32_calc(uint32_t crc, const void *src, size_t size)
{
uint32_t remainder = crc ^ s_crc32_tab.xOrOut;
uint32_t i;
for (i = 0; i < size; i++)
{
remainder = s_crc32_tab.Tab[((uint8_t *)src)[i] ^ (remainder & 0xFF)] ^ (remainder >> 8);
}
return (remainder ^ s_crc32_tab.xOrOut);
}