Files
kunlun/common/utils/iot_crc.c
2024-09-28 14:24:04 +08:00

430 lines
17 KiB
C
Executable File

/****************************************************************************
Copyright(c) 2019 by Aerospace C.Power (Chongqing) Microelectronics. ALL RIGHTS RESERVED.
This Information is proprietary to Aerospace C.Power (Chongqing) Microelectronics and MAY NOT
be copied by any method or incorporated into another program without
the express written consent of Aerospace C.Power. This Information or any portion
thereof remains the property of Aerospace C.Power. The Information contained herein
is believed to be accurate and Aerospace C.Power assumes no responsibility or
liability for its use in any way and conveys no license or title under
any patent or copyright and makes no representation or warranty that this
Information is free from patent or copyright infringement.
****************************************************************************/
#include "iot_config.h"
#include "iot_crc.h"
#include "iot_system_api.h"
#include "iot_utils_api.h"
#ifndef IOT_CRC32_SUPPORT
#define IOT_CRC32_SUPPORT 1
#endif
#ifndef IOT_CRC24_SUPPORT
#define IOT_CRC24_SUPPORT 1
#endif
#ifndef IOT_CRC16_SUPPORT
#define IOT_CRC16_SUPPORT 0
#endif
#ifndef IOT_CRC8_SUPPORT
#define IOT_CRC8_SUPPORT 0
#endif
#if (defined(IOT_CRC32_SUPPORT) && IOT_CRC32_SUPPORT)
/* CRC table for the CRC-32. */
/* The poly is 0x4C11DB7 (x^32+ x^26 + x^23 + x^22 + x^16 + x^12 + x^11 */
/* + x^10 + x^8 + x^7 + x^5 + x^4 + x^2 + x + 1) */
/*static*/ const uint32_t iot_crc32_table[256] =
{
0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F,
0xE963A535, 0x9E6495A3, 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988,
0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91, 0x1DB71064, 0x6AB020F2,
0xF3B97148, 0x84BE41DE, 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,
0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, 0x14015C4F, 0x63066CD9,
0xFA0F3D63, 0x8D080DF5, 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172,
0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B, 0x35B5A8FA, 0x42B2986C,
0xDBBBC9D6, 0xACBCF940, 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,
0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, 0x21B4F4B5, 0x56B3C423,
0xCFBA9599, 0xB8BDA50F, 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924,
0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D, 0x76DC4190, 0x01DB7106,
0x98D220BC, 0xEFD5102A, 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,
0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, 0x7F6A0DBB, 0x086D3D2D,
0x91646C97, 0xE6635C01, 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E,
0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457, 0x65B0D9C6, 0x12B7E950,
0x8BBEB8EA, 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,
0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, 0x4ADFA541, 0x3DD895D7,
0xA4D1C46D, 0xD3D6F4FB, 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0,
0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9, 0x5005713C, 0x270241AA,
0xBE0B1010, 0xC90C2086, 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,
0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17, 0x2EB40D81,
0xB7BD5C3B, 0xC0BA6CAD, 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A,
0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683, 0xE3630B12, 0x94643B84,
0x0D6D6A3E, 0x7A6A5AA8, 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,
0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB,
0x196C3671, 0x6E6B06E7, 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC,
0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, 0xD6D6A3E8, 0xA1D1937E,
0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,
0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, 0xDF60EFC3, 0xA867DF55,
0x316E8EEF, 0x4669BE79, 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236,
0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F, 0xC5BA3BBE, 0xB2BD0B28,
0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,
0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, 0x9C0906A9, 0xEB0E363F,
0x72076785, 0x05005713, 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38,
0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21, 0x86D3D2D4, 0xF1D4E242,
0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,
0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, 0x8F659EFF, 0xF862AE69,
0x616BFFD3, 0x166CCF45, 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2,
0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB, 0xAED16A4A, 0xD9D65ADC,
0x40DF0B66, 0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,
0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605, 0xCDD70693,
0x54DE5729, 0x23D967BF, 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94,
0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D
};
#endif
#if (defined(IOT_CRC24_SUPPORT) && IOT_CRC24_SUPPORT)
/* CRC table for the CRC-24.
* The poly is 0x800063 (x^24 + x^23 + x^6 + x^5 + x + 1)
* This table for little-endian CRC computation.
*/
const uint32_t iot_crc24_table[256] = {
0x00000000, 0x00848401, 0x00850801, 0x00018c00, 0x00861001, 0x00029400,
0x00031800, 0x00879c01, 0x00802001, 0x0004a400, 0x00052800, 0x0081ac01,
0x00063000, 0x0082b401, 0x00833801, 0x0007bc00, 0x008c4001, 0x0008c400,
0x00094800, 0x008dcc01, 0x000a5000, 0x008ed401, 0x008f5801, 0x000bdc00,
0x000c6000, 0x0088e401, 0x00896801, 0x000dec00, 0x008a7001, 0x000ef400,
0x000f7800, 0x008bfc01, 0x00948001, 0x00100400, 0x00118800, 0x00950c01,
0x00129000, 0x00961401, 0x00979801, 0x00131c00, 0x0014a000, 0x00902401,
0x0091a801, 0x00152c00, 0x0092b001, 0x00163400, 0x0017b800, 0x00933c01,
0x0018c000, 0x009c4401, 0x009dc801, 0x00194c00, 0x009ed001, 0x001a5400,
0x001bd800, 0x009f5c01, 0x0098e001, 0x001c6400, 0x001de800, 0x00996c01,
0x001ef000, 0x009a7401, 0x009bf801, 0x001f7c00, 0x00a50001, 0x00218400,
0x00200800, 0x00a48c01, 0x00231000, 0x00a79401, 0x00a61801, 0x00229c00,
0x00252000, 0x00a1a401, 0x00a02801, 0x0024ac00, 0x00a33001, 0x0027b400,
0x00263800, 0x00a2bc01, 0x00294000, 0x00adc401, 0x00ac4801, 0x0028cc00,
0x00af5001, 0x002bd400, 0x002a5800, 0x00aedc01, 0x00a96001, 0x002de400,
0x002c6800, 0x00a8ec01, 0x002f7000, 0x00abf401, 0x00aa7801, 0x002efc00,
0x00318000, 0x00b50401, 0x00b48801, 0x00300c00, 0x00b79001, 0x00331400,
0x00329800, 0x00b61c01, 0x00b1a001, 0x00352400, 0x0034a800, 0x00b02c01,
0x0037b000, 0x00b33401, 0x00b2b801, 0x00363c00, 0x00bdc001, 0x00394400,
0x0038c800, 0x00bc4c01, 0x003bd000, 0x00bf5401, 0x00bed801, 0x003a5c00,
0x003de000, 0x00b96401, 0x00b8e801, 0x003c6c00, 0x00bbf001, 0x003f7400,
0x003ef800, 0x00ba7c01, 0x00c60001, 0x00428400, 0x00430800, 0x00c78c01,
0x00401000, 0x00c49401, 0x00c51801, 0x00419c00, 0x00462000, 0x00c2a401,
0x00c32801, 0x0047ac00, 0x00c03001, 0x0044b400, 0x00453800, 0x00c1bc01,
0x004a4000, 0x00cec401, 0x00cf4801, 0x004bcc00, 0x00cc5001, 0x0048d400,
0x00495800, 0x00cddc01, 0x00ca6001, 0x004ee400, 0x004f6800, 0x00cbec01,
0x004c7000, 0x00c8f401, 0x00c97801, 0x004dfc00, 0x00528000, 0x00d60401,
0x00d78801, 0x00530c00, 0x00d49001, 0x00501400, 0x00519800, 0x00d51c01,
0x00d2a001, 0x00562400, 0x0057a800, 0x00d32c01, 0x0054b000, 0x00d03401,
0x00d1b801, 0x00553c00, 0x00dec001, 0x005a4400, 0x005bc800, 0x00df4c01,
0x0058d000, 0x00dc5401, 0x00ddd801, 0x00595c00, 0x005ee000, 0x00da6401,
0x00dbe801, 0x005f6c00, 0x00d8f001, 0x005c7400, 0x005df800, 0x00d97c01,
0x00630000, 0x00e78401, 0x00e60801, 0x00628c00, 0x00e51001, 0x00619400,
0x00601800, 0x00e49c01, 0x00e32001, 0x0067a400, 0x00662800, 0x00e2ac01,
0x00653000, 0x00e1b401, 0x00e03801, 0x0064bc00, 0x00ef4001, 0x006bc400,
0x006a4800, 0x00eecc01, 0x00695000, 0x00edd401, 0x00ec5801, 0x0068dc00,
0x006f6000, 0x00ebe401, 0x00ea6801, 0x006eec00, 0x00e97001, 0x006df400,
0x006c7800, 0x00e8fc01, 0x00f78001, 0x00730400, 0x00728800, 0x00f60c01,
0x00719000, 0x00f51401, 0x00f49801, 0x00701c00, 0x0077a000, 0x00f32401,
0x00f2a801, 0x00762c00, 0x00f1b001, 0x00753400, 0x0074b800, 0x00f03c01,
0x007bc000, 0x00ff4401, 0x00fec801, 0x007a4c00, 0x00fdd001, 0x00795400,
0x0078d800, 0x00fc5c01, 0x00fbe001, 0x007f6400, 0x007ee800, 0x00fa6c01,
0x007df000, 0x00f97401, 0x00f8f801, 0x007c7c00
};
#endif
#if (defined(IOT_CRC16_SUPPORT) && IOT_CRC16_SUPPORT)
/* CRC table for the CRC-16. */
/* The poly is 0x1021 (x^16 + x^12 + x^5 + 1) */
const uint16_t iot_crc16_table[256] = {
0X0000, 0X1189, 0X2312, 0X329B, 0X4624, 0X57AD, 0X6536, 0X74BF,
0X8C48, 0X9DC1, 0XAF5A, 0XBED3, 0XCA6C, 0XDBE5, 0XE97E, 0XF8F7,
0X1081, 0X0108, 0X3393, 0X221A, 0X56A5, 0X472C, 0X75B7, 0X643E,
0X9CC9, 0X8D40, 0XBFDB, 0XAE52, 0XDAED, 0XCB64, 0XF9FF, 0XE876,
0X2102, 0X308B, 0X0210, 0X1399, 0X6726, 0X76AF, 0X4434, 0X55BD,
0XAD4A, 0XBCC3, 0X8E58, 0X9FD1, 0XEB6E, 0XFAE7, 0XC87C, 0XD9F5,
0X3183, 0X200A, 0X1291, 0X0318, 0X77A7, 0X662E, 0X54B5, 0X453C,
0XBDCB, 0XAC42, 0X9ED9, 0X8F50, 0XFBEF, 0XEA66, 0XD8FD, 0XC974,
0X4204, 0X538D, 0X6116, 0X709F, 0X0420, 0X15A9, 0X2732, 0X36BB,
0XCE4C, 0XDFC5, 0XED5E, 0XFCD7, 0X8868, 0X99E1, 0XAB7A, 0XBAF3,
0X5285, 0X430C, 0X7197, 0X601E, 0X14A1, 0X0528, 0X37B3, 0X263A,
0XDECD, 0XCF44, 0XFDDF, 0XEC56, 0X98E9, 0X8960, 0XBBFB, 0XAA72,
0X6306, 0X728F, 0X4014, 0X519D, 0X2522, 0X34AB, 0X0630, 0X17B9,
0XEF4E, 0XFEC7, 0XCC5C, 0XDDD5, 0XA96A, 0XB8E3, 0X8A78, 0X9BF1,
0X7387, 0X620E, 0X5095, 0X411C, 0X35A3, 0X242A, 0X16B1, 0X0738,
0XFFCF, 0XEE46, 0XDCDD, 0XCD54, 0XB9EB, 0XA862, 0X9AF9, 0X8B70,
0X8408, 0X9581, 0XA71A, 0XB693, 0XC22C, 0XD3A5, 0XE13E, 0XF0B7,
0X0840, 0X19C9, 0X2B52, 0X3ADB, 0X4E64, 0X5FED, 0X6D76, 0X7CFF,
0X9489, 0X8500, 0XB79B, 0XA612, 0XD2AD, 0XC324, 0XF1BF, 0XE036,
0X18C1, 0X0948, 0X3BD3, 0X2A5A, 0X5EE5, 0X4F6C, 0X7DF7, 0X6C7E,
0XA50A, 0XB483, 0X8618, 0X9791, 0XE32E, 0XF2A7, 0XC03C, 0XD1B5,
0X2942, 0X38CB, 0X0A50, 0X1BD9, 0X6F66, 0X7EEF, 0X4C74, 0X5DFD,
0XB58B, 0XA402, 0X9699, 0X8710, 0XF3AF, 0XE226, 0XD0BD, 0XC134,
0X39C3, 0X284A, 0X1AD1, 0X0B58, 0X7FE7, 0X6E6E, 0X5CF5, 0X4D7C,
0XC60C, 0XD785, 0XE51E, 0XF497, 0X8028, 0X91A1, 0XA33A, 0XB2B3,
0X4A44, 0X5BCD, 0X6956, 0X78DF, 0X0C60, 0X1DE9, 0X2F72, 0X3EFB,
0XD68D, 0XC704, 0XF59F, 0XE416, 0X90A9, 0X8120, 0XB3BB, 0XA232,
0X5AC5, 0X4B4C, 0X79D7, 0X685E, 0X1CE1, 0X0D68, 0X3FF3, 0X2E7A,
0XE70E, 0XF687, 0XC41C, 0XD595, 0XA12A, 0XB0A3, 0X8238, 0X93B1,
0X6B46, 0X7ACF, 0X4854, 0X59DD, 0X2D62, 0X3CEB, 0X0E70, 0X1FF9,
0XF78F, 0XE606, 0XD49D, 0XC514, 0XB1AB, 0XA022, 0X92B9, 0X8330,
0X7BC7, 0X6A4E, 0X58D5, 0X495C, 0X3DE3, 0X2C6A, 0X1EF1, 0X0F78
};
#endif
#if (defined(IOT_CRC8_SUPPORT) && IOT_CRC8_SUPPORT)
/* CRC table for the CRC-8. */
/* The poly is 0x31 (x^8 + x^5 + x^4 + 1) */
const uint8_t iot_crc8_table[256] = {
0x00, 0x5e, 0xbc, 0xe2, 0x61, 0x3f, 0xdd, 0x83,
0xc2, 0x9c, 0x7e, 0x20, 0xa3, 0xfd, 0x1f, 0x41,
0x9d, 0xc3, 0x21, 0x7f, 0xfc, 0xa2, 0x40, 0x1e,
0x5f, 0x01, 0xe3, 0xbd, 0x3e, 0x60, 0x82, 0xdc,
0x23, 0x7d, 0x9f, 0xc1, 0x42, 0x1c, 0xfe, 0xa0,
0xe1, 0xbf, 0x5d, 0x03, 0x80, 0xde, 0x3c, 0x62,
0xbe, 0xe0, 0x02, 0x5c, 0xdf, 0x81, 0x63, 0x3d,
0x7c, 0x22, 0xc0, 0x9e, 0x1d, 0x43, 0xa1, 0xff,
0x46, 0x18, 0xfa, 0xa4, 0x27, 0x79, 0x9b, 0xc5,
0x84, 0xda, 0x38, 0x66, 0xe5, 0xbb, 0x59, 0x07,
0xdb, 0x85, 0x67, 0x39, 0xba, 0xe4, 0x06, 0x58,
0x19, 0x47, 0xa5, 0xfb, 0x78, 0x26, 0xc4, 0x9a,
0x65, 0x3b, 0xd9, 0x87, 0x04, 0x5a, 0xb8, 0xe6,
0xa7, 0xf9, 0x1b, 0x45, 0xc6, 0x98, 0x7a, 0x24,
0xf8, 0xa6, 0x44, 0x1a, 0x99, 0xc7, 0x25, 0x7b,
0x3a, 0x64, 0x86, 0xd8, 0x5b, 0x05, 0xe7, 0xb9,
0x8c, 0xd2, 0x30, 0x6e, 0xed, 0xb3, 0x51, 0x0f,
0x4e, 0x10, 0xf2, 0xac, 0x2f, 0x71, 0x93, 0xcd,
0x11, 0x4f, 0xad, 0xf3, 0x70, 0x2e, 0xcc, 0x92,
0xd3, 0x8d, 0x6f, 0x31, 0xb2, 0xec, 0x0e, 0x50,
0xaf, 0xf1, 0x13, 0x4d, 0xce, 0x90, 0x72, 0x2c,
0x6d, 0x33, 0xd1, 0x8f, 0x0c, 0x52, 0xb0, 0xee,
0x32, 0x6c, 0x8e, 0xd0, 0x53, 0x0d, 0xef, 0xb1,
0xf0, 0xae, 0x4c, 0x12, 0x91, 0xcf, 0x2d, 0x73,
0xca, 0x94, 0x76, 0x28, 0xab, 0xf5, 0x17, 0x49,
0x08, 0x56, 0xb4, 0xea, 0x69, 0x37, 0xd5, 0x8b,
0x57, 0x09, 0xeb, 0xb5, 0x36, 0x68, 0x8a, 0xd4,
0x95, 0xcb, 0x29, 0x77, 0xf4, 0xaa, 0x48, 0x16,
0xe9, 0xb7, 0x55, 0x0b, 0x88, 0xd6, 0x34, 0x6a,
0x2b, 0x75, 0x97, 0xc9, 0x4a, 0x14, 0xf6, 0xa8,
0x74, 0x2a, 0xc8, 0x96, 0x15, 0x4b, 0xa9, 0xf7,
0xb6, 0xe8, 0x0a, 0x54, 0xd7, 0x89, 0x6b, 0x35
};
#endif
uint32_t IRAM_ATTR iot_getcrc32_update(uint32_t init_vect, uint8_t *buffer,
uint32_t len)
{
#if (defined(IOT_CRC32_SUPPORT) && IOT_CRC32_SUPPORT)
register uint32_t crc = init_vect;
while (len-- != 0)
{
crc = ((crc >> 8) & 0x00FFFFFF) ^ \
iot_crc32_table[(crc ^ *(buffer++)) & 0x000000FF];
}
return crc;
#else
return 0;
#endif
}
uint32_t IRAM_ATTR iot_getcrc32(uint8_t *buffer, uint32_t len)
{
#if (defined(IOT_CRC32_SUPPORT) && IOT_CRC32_SUPPORT)
uint32_t crc = iot_getcrc32_update(0xFFFFFFFF, buffer, len);
return (crc ^ 0xFFFFFFFF);
#else
return 0;
#endif
}
uint32_t iot_getcrc24_update(uint32_t init_vect, uint8_t *buffer, uint32_t len)
{
#if IOT_CRC_DBG_ENABLE
uint32_t ast_ra = 0;
RISC_GET_REG_RA(ast_ra);
uint32_t buf[3] = {0};
buf[0] = ast_ra;
buf[1] = (uint32_t)buffer;
buf[2] = len;
/* MAX PB SIZE 520 */
IOT_ASSERT_DUMP(((len > 0 && len < 520) &&
(iot_data_addr_legal((uint32_t)buffer))), buf, 3);
#endif
#if (defined(IOT_CRC24_SUPPORT) && IOT_CRC24_SUPPORT)
register uint32_t crc = init_vect & 0x00FFFFFF;
while (len-- != 0)
{
crc = crc ^ *buffer++;
crc = (crc>>8) ^ iot_crc24_table[crc & 0x0FF];
}
return (crc & 0x00FFFFFF);
#elif (defined(IOT_CRC32_SUPPORT) && IOT_CRC32_SUPPORT)
uint32_t crc = iot_getcrc32_update(init_vect, buffer, len);
return (crc >> 8);
#else
return 0;
#endif
}
uint32_t iot_getcrc24(uint8_t *buffer, uint32_t len)
{
#if (defined(IOT_CRC24_SUPPORT) && IOT_CRC24_SUPPORT)
uint32_t crc = iot_getcrc24_update(0, buffer, len);
return crc;
#elif (defined(IOT_CRC32_SUPPORT) && IOT_CRC32_SUPPORT)
uint32_t crc = iot_getcrc32(buffer, len);
return (crc >> 8);
#else
return 0;
#endif
}
uint16_t _iot_getcrc16_update(uint16_t init_vect, uint8_t value)
{
uint16_t crc = init_vect;
crc = (crc >> 8) ^ iot_crc16_table[(crc ^ value) & 0xff];
return crc;
}
uint16_t iot_getcrc16_update(uint16_t init_vect, uint8_t *buffer,
uint32_t len, uint8_t reverse_flag)
{
(void)reverse_flag;
#if (defined(IOT_CRC16_SUPPORT) && IOT_CRC16_SUPPORT)
uint8_t data;
register uint16_t crc = init_vect;
while (len-- != 0) {
if (reverse_flag) {
data = iot_byte_reverse(*buffer++);
} else {
data = *buffer++;
}
crc = _iot_getcrc16_update(crc, data);
}
return crc;
#elif (defined(IOT_CRC32_SUPPORT) && IOT_CRC32_SUPPORT)
uint32_t crc = iot_getcrc32_update(init_vect, buffer, len);
return (crc >> 16);
#else
return 0;
#endif
}
uint16_t iot_getcrc32_h16(uint8_t *buffer, uint32_t len)
{
#if (defined(IOT_CRC32_SUPPORT) && IOT_CRC32_SUPPORT)
uint32_t crc = iot_getcrc32(buffer, len);
return (uint16_t)(crc >> 16);
#else
return 0;
#endif
}
uint16_t iot_getcrc16(uint8_t *buffer, uint32_t len, uint8_t crc16_type)
{
(void)buffer;
(void)len;
(void)crc16_type;
#if (defined(IOT_CRC16_SUPPORT) && IOT_CRC16_SUPPORT)
uint16_t in_data;
uint16_t out_data;
uint8_t reverse_flag = 1;
uint16_t tmp_data = 0;
uint16_t crc;
switch (crc16_type) {
case IOT_CRC16_TYPE_CCITT_FALSE:
{
in_data = 0xffff;
out_data = 0x0000;
reverse_flag = 1;
break;
}
case IOT_CRC16_TYPE_XMODEM:
{
in_data = 0x0000;
out_data = 0x0000;
reverse_flag = 1;
break;
}
case IOT_CRC16_TYPE_X25:
{
in_data = 0xffff;
out_data = 0xffff;
reverse_flag = 0;
break;
}
case IOT_CRC16_TYPE_BT:
{
in_data = 0xffff;
out_data = 0x0000;
reverse_flag = 0;
break;
}
case IOT_CRC16_TYPE_CCITT:
default:
crc16_type = IOT_CRC16_TYPE_CCITT;
in_data = 0x0000;
out_data = 0x0000;
reverse_flag = 0;
break;
}
crc = iot_getcrc16_update(in_data, buffer, len, reverse_flag);
if (reverse_flag) {
tmp_data = iot_byte_reverse((uint8_t)(crc & 0x00ff));
tmp_data <<= 8;
crc = iot_byte_reverse((uint8_t)((crc & 0xff00) >> 8));
crc &= 0x00ff;
crc |= tmp_data;
}
return (crc ^ out_data);
#else
return 0;
#endif
}
uint8_t IRAM_ATTR iot_getcrc8_update(uint8_t init_vect, uint8_t *buffer,
uint32_t len)
{
#if (defined(IOT_CRC8_SUPPORT) && IOT_CRC8_SUPPORT)
register uint8_t crc = init_vect;
while (len-- > 0)
{
crc = iot_crc8_table[(crc ^ *buffer++) & 0xff];
}
return crc;
#elif (defined(IOT_CRC32_SUPPORT) && IOT_CRC32_SUPPORT)
uint32_t crc = iot_getcrc32_update(init_vect, buffer, len);
return (uint8_t)(crc >> 24);
#else
return 0;
#endif
}
uint8_t IRAM_ATTR iot_getcrc8(uint8_t *buffer, uint32_t len)
{
#if (defined(IOT_CRC8_SUPPORT) && IOT_CRC8_SUPPORT)
uint8_t crc = iot_getcrc8_update(0xFF, buffer, len);
return (crc ^ 0xFF);
#elif (defined(IOT_CRC32_SUPPORT) && IOT_CRC32_SUPPORT)
uint32_t crc = iot_getcrc32(buffer, len);
return (uint8_t)(crc >> 24);
#else
return 0;
#endif
}