/**************************************************************************** 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 }