#include "bl_crc.h" #include "sysctrl_drv.h" #include "../uds/uds_vmemcfg.h" #define BL_USE_CRC16 #define ChangAn_CRC16_Test #ifdef ChangAn_CRC16_Test #define MASK 0x1021 /* CRC16-CITT mask */ /* function declarations */ uint16_t CalcCRC(uint16_t size,uint8_t *data); /* test data array */ uint8_t data[256] = { 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f, 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f, 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f, 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f, 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f, 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5a,0x5b,0x5c,0x5d,0x5e,0x5f, 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f, 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x7b,0x7c,0x7d,0x7e,0x7f, 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f, 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f, 0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf, 0xb0,0xb1,0xb2,0xb3,0xb4,0xb5,0xb6,0xb7,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,0xbe,0xbf, 0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf, 0xd0,0xd1,0xd2,0xd3,0xd4,0xd5,0xd6,0xd7,0xd8,0xd9,0xda,0xdb,0xdc,0xdd,0xde,0xdf, 0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,0xeb,0xec,0xed,0xee,0xef, 0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff }; #endif /* Define CRC parameters*/ #ifdef BL_USE_CRC16 #define CRC_DATA_SIZE (120U) #define CRC_MODE CRC_MODE_16BIT #define SEED_VALUE (0xFFFFU) #define POL_VALUE (0x00001021) #else #define CRC_DATA_SIZE (120U) #define CRC_MODE CRC_MODE_32BIT #define SEED_VALUE (0xFFFFFFFFU) #define POL_VALUE (0x04C11DB7) #endif /* The expected checksum*/ /*#define EXPECT_CRC_CHECKSUM (0xFEBF026A)*/ #ifdef BL_USE_CRC16 #define EXPECT_CRC_CHECKSUM (0xD9E9)/*use CRC-16/CCITT-FALSE*/ #else #define EXPECT_CRC_CHECKSUM (0x1B6BB9F1) #endif #define EXPECT_CRCTest_CHECKSUM (0x5FA7EE00) /* crc input data array. Total Data Size = 120 bytes */ uint8_t CRC_dataValue[] = { 0xE0, 0xA6, 0x18, 0x24, 0x00, 0x0C, 0x34, 0x2C, 0x4C, 0x80, 0x08, 0x38, 0x51, 0x44, 0x60, 0x3E, 0x21, 0xBC, 0x54, 0x91, 0x40, 0x63, 0x8B, 0x57, 0x4F, 0x3E, 0x4C, 0x85, 0x3B, 0x92, 0x8C, 0x8D, 0x0E, 0x4D, 0x5C, 0x3A, 0x9B, 0x14, 0x39, 0xAC, 0x35, 0x9F, 0x11, 0x12, 0x13, 0x22, 0x32, 0x42, 0x52, 0x83, 0x23, 0x27, 0x56, 0x98, 0x7F, 0x7D, 0x93, 0x81, 0x61, 0x50, 0x7C, 0x90, 0x0D, 0x0B, 0x48, 0x59, 0x3F, 0x6F, 0x8A, 0x8F, 0x7E, 0x9E, 0x1E, 0x0E, 0x5B, 0xFF, 0xF8, 0xAF, 0xBF, 0x1F, 0xDE, 0xD8, 0xD0, 0xC3, 0xB9, 0xC8, 0xA8, 0xB0, 0xB1, 0xCD, 0xFC, 0x25, 0x74, 0x7B, 0x7A, 0x9C, 0x68, 0xCF, 0xFE, 0x25, 0x35, 0x9F, 0x11, 0x12, 0x13, 0x1E, 0xC8, 0xDB, 0xC3, 0xB6, 0xC9, 0xAA, 0xB0, 0xBD, 0xCF, 0xFC, 0x28, 0x78, 0x7D, 0x7C, }; #ifdef BL_USE_CRC16 const CRC_Config_t tCrcConfigStruct = { .seedValue = 0x00000000, /* Write seed values */ .poly = POL_VALUE, /* Polynomial */ .complementRead = CRC_COMPREAD_NO_XOR, /* CRC complement read */ .dataMode = CRC_MODE, /* CRC mode*/ .readType = CRC_READ_NO, /* CRC read type Of transpose */ .writeType = CRC_WRITE_NO /* CRC write type Of transpose */ }; #else const CRC_Config_t tCrcConfigStruct = { .seedValue = 0x00000000, /* Write seed values */ .poly = POL_VALUE, /* Polynomial */ .complementRead = CRC_COMPREAD_INVERT_COMP, /* CRC complement read */ .dataMode = CRC_MODE, /* CRC mode*/ .readType = CRC_READ_BIT_Y_BYTE_Y, /* CRC read type Of transpose */ .writeType = CRC_WRITE_BIT_Y_BYTE_N /* CRC write type Of transpose */ }; #endif void Crc_HwInit(void) { /* enable clock for crc */ SYSCTRL_EnableModule(SYSCTRL_CRC); /* initiate crc */ CRC_Init(&tCrcConfigStruct); } uint8_t Crc_Test(void) { uint8_t ret = 0x0; uint32_t checksumResult = 0; /* Calculate the checksum result*/ #ifdef BL_USE_CRC16 checksumResult = CRC_CalcCRC16bit(CRC_dataValue,CRC_DATA_SIZE, ENABLE, SEED_VALUE); #else checksumResult = CRC_CalcCRC32bit(CRC_dataValue,CRC_DATA_SIZE, ENABLE, SEED_VALUE); #endif if(checksumResult == EXPECT_CRC_CHECKSUM) { ret = 0x01; } /*checksumResult = CRC_CalcCRC32bit((uint8_t *)(COD_APPL_ADDR_START),MEM_COD_APP_LEN, ENABLE, SEED_VALUE); if(checksumResult == EXPECT_CRCTest_CHECKSUM) { ret = 0x01; }*/ #ifdef ChangAn_CRC16_Test uint16_t crc_sw = 0x00; uint16_t crc_hw = 0x00; crc_sw = CalcCRC(256,data); crc_hw = CRC_CalcCRC16bit(data,256, ENABLE, SEED_VALUE); /* the result of the above calculation shall be: crc=0x3FBD */ if(crc_sw == crc_hw) { ret = 0x01; } #endif return ret; } #ifdef ChangAn_CRC16_Test /* Calculate CRC */ uint16_t CalcCRC(uint16_t size, uint8_t *data_input) { uint16_t crc=0xffff; /* initial value */ uint16_t tmp; uint16_t i,j; for(i=0;i