/* BEGIN_FILE_HDR ******************************************************************************** * NOTICE * This software is the property of HiRain Technologies. Any information * contained in this doc should not be reproduced, or used, or disclosed * without the written authorization from HiRain Technologies. ******************************************************************************** * File Name : Crc16.c ******************************************************************************** * Project/Product : AUTOSAR 4.2.2 AUTOSAR 4.3.1 AUTOSAR 4.4.0 AUTOSAR 4.7.0 * Title : 16-bit CRC function module Source File(using the polynomial 0x8005 ) * Author : Hirain ******************************************************************************** * Description : This service makes a CRC16 calculation on Crc_Length data bytes, using the polynomial 0x8005. * ******************************************************************************** * Limitations : None * ******************************************************************************** * ******************************************************************************** * Revision History: * Reference to Core H File ******************************************************************************** * END_FILE_HDR*/ /******************************************************************************* * Includes *******************************************************************************/ #include "Crc.h" /******************************************************************************* * General QAC Suppression *******************************************************************************/ /*PRQA S 3214,0862,3614 EOF*/ /* According to the requirements of AUTOSAR Specification,when locating address segments in the files of each module,#include "Crc_MemMap.h" is required.Defined XXX_START_SEC_ will undefine in Crc_MemMap.h */ /******************************************************************************* * Macro *******************************************************************************/ #define CRC_16ARC_INIT_VALUE ((uint16)(0x0000)) #define CRC_16ARC_XOR_VALUE ((uint16)(0x0000)) #define CRC_START_SEC_VAR_INIT_16 #include "Crc_MemMap.h" STATIC CONST(uint16, CRC_CONST) Crc_Table16ARC[TABLE_SIZE] = { (uint16)0x0,(uint16)0xc0c1,(uint16)0xc181,(uint16)0x140,(uint16)0xc301,(uint16)0x3c0,(uint16)0x280,(uint16)0xc241, (uint16)0xc601,(uint16)0x6c0,(uint16)0x780,(uint16)0xc741,(uint16)0x500,(uint16)0xc5c1,(uint16)0xc481,(uint16)0x440, (uint16)0xcc01,(uint16)0xcc0,(uint16)0xd80,(uint16)0xcd41,(uint16)0xf00,(uint16)0xcfc1,(uint16)0xce81,(uint16)0xe40, (uint16)0xa00,(uint16)0xcac1,(uint16)0xcb81,(uint16)0xb40,(uint16)0xc901,(uint16)0x9c0,(uint16)0x880,(uint16)0xc841, (uint16)0xd801,(uint16)0x18c0,(uint16)0x1980,(uint16)0xd941,(uint16)0x1b00,(uint16)0xdbc1,(uint16)0xda81,(uint16)0x1a40, (uint16)0x1e00,(uint16)0xdec1,(uint16)0xdf81,(uint16)0x1f40,(uint16)0xdd01,(uint16)0x1dc0,(uint16)0x1c80,(uint16)0xdc41, (uint16)0x1400,(uint16)0xd4c1,(uint16)0xd581,(uint16)0x1540,(uint16)0xd701,(uint16)0x17c0,(uint16)0x1680,(uint16)0xd641, (uint16)0xd201,(uint16)0x12c0,(uint16)0x1380,(uint16)0xd341,(uint16)0x1100,(uint16)0xd1c1,(uint16)0xd081,(uint16)0x1040, (uint16)0xf001,(uint16)0x30c0,(uint16)0x3180,(uint16)0xf141,(uint16)0x3300,(uint16)0xf3c1,(uint16)0xf281,(uint16)0x3240, (uint16)0x3600,(uint16)0xf6c1,(uint16)0xf781,(uint16)0x3740,(uint16)0xf501,(uint16)0x35c0,(uint16)0x3480,(uint16)0xf441, (uint16)0x3c00,(uint16)0xfcc1,(uint16)0xfd81,(uint16)0x3d40,(uint16)0xff01,(uint16)0x3fc0,(uint16)0x3e80,(uint16)0xfe41, (uint16)0xfa01,(uint16)0x3ac0,(uint16)0x3b80,(uint16)0xfb41,(uint16)0x3900,(uint16)0xf9c1,(uint16)0xf881,(uint16)0x3840, (uint16)0x2800,(uint16)0xe8c1,(uint16)0xe981,(uint16)0x2940,(uint16)0xeb01,(uint16)0x2bc0,(uint16)0x2a80,(uint16)0xea41, (uint16)0xee01,(uint16)0x2ec0,(uint16)0x2f80,(uint16)0xef41,(uint16)0x2d00,(uint16)0xedc1,(uint16)0xec81,(uint16)0x2c40, (uint16)0xe401,(uint16)0x24c0,(uint16)0x2580,(uint16)0xe541,(uint16)0x2700,(uint16)0xe7c1,(uint16)0xe681,(uint16)0x2640, (uint16)0x2200,(uint16)0xe2c1,(uint16)0xe381,(uint16)0x2340,(uint16)0xe101,(uint16)0x21c0,(uint16)0x2080,(uint16)0xe041, (uint16)0xa001,(uint16)0x60c0,(uint16)0x6180,(uint16)0xa141,(uint16)0x6300,(uint16)0xa3c1,(uint16)0xa281,(uint16)0x6240, (uint16)0x6600,(uint16)0xa6c1,(uint16)0xa781,(uint16)0x6740,(uint16)0xa501,(uint16)0x65c0,(uint16)0x6480,(uint16)0xa441, (uint16)0x6c00,(uint16)0xacc1,(uint16)0xad81,(uint16)0x6d40,(uint16)0xaf01,(uint16)0x6fc0,(uint16)0x6e80,(uint16)0xae41, (uint16)0xaa01,(uint16)0x6ac0,(uint16)0x6b80,(uint16)0xab41,(uint16)0x6900,(uint16)0xa9c1,(uint16)0xa881,(uint16)0x6840, (uint16)0x7800,(uint16)0xb8c1,(uint16)0xb981,(uint16)0x7940,(uint16)0xbb01,(uint16)0x7bc0,(uint16)0x7a80,(uint16)0xba41, (uint16)0xbe01,(uint16)0x7ec0,(uint16)0x7f80,(uint16)0xbf41,(uint16)0x7d00,(uint16)0xbdc1,(uint16)0xbc81,(uint16)0x7c40, (uint16)0xb401,(uint16)0x74c0,(uint16)0x7580,(uint16)0xb541,(uint16)0x7700,(uint16)0xb7c1,(uint16)0xb681,(uint16)0x7640, (uint16)0x7200,(uint16)0xb2c1,(uint16)0xb381,(uint16)0x7340,(uint16)0xb101,(uint16)0x71c0,(uint16)0x7080,(uint16)0xb041, (uint16)0x5000,(uint16)0x90c1,(uint16)0x9181,(uint16)0x5140,(uint16)0x9301,(uint16)0x53c0,(uint16)0x5280,(uint16)0x9241, (uint16)0x9601,(uint16)0x56c0,(uint16)0x5780,(uint16)0x9741,(uint16)0x5500,(uint16)0x95c1,(uint16)0x9481,(uint16)0x5440, (uint16)0x9c01,(uint16)0x5cc0,(uint16)0x5d80,(uint16)0x9d41,(uint16)0x5f00,(uint16)0x9fc1,(uint16)0x9e81,(uint16)0x5e40, (uint16)0x5a00,(uint16)0x9ac1,(uint16)0x9b81,(uint16)0x5b40,(uint16)0x9901,(uint16)0x59c0,(uint16)0x5880,(uint16)0x9841, (uint16)0x8801,(uint16)0x48c0,(uint16)0x4980,(uint16)0x8941,(uint16)0x4b00,(uint16)0x8bc1,(uint16)0x8a81,(uint16)0x4a40, (uint16)0x4e00,(uint16)0x8ec1,(uint16)0x8f81,(uint16)0x4f40,(uint16)0x8d01,(uint16)0x4dc0,(uint16)0x4c80,(uint16)0x8c41, (uint16)0x4400,(uint16)0x84c1,(uint16)0x8581,(uint16)0x4540,(uint16)0x8701,(uint16)0x47c0,(uint16)0x4680,(uint16)0x8641, (uint16)0x8201,(uint16)0x42c0,(uint16)0x4380,(uint16)0x8341,(uint16)0x4100,(uint16)0x81c1,(uint16)0x8081,(uint16)0x4040 }; #define CRC_STOP_SEC_VAR_INIT_16 #include "Crc_MemMap.h" /******************************************************************************* * Local Data Define *******************************************************************************/ #define CRC_START_SEC_CODE #include "Crc_MemMap.h" /* BEGIN_FUNCTION_HDR ******************************************************************************** * Function Name: Crc_CalculateCRC16ARC * * Description: This service makes a CRC16 calculation on Crc_Length data bytes, , using the polynomial 0x8005. * * * Inputs: Crc_DataPtr Pointer to start address of data block to be calculated. * Crc_Length Length of data block to be calculated in bytes. * Crc_StartValue16 Start value when the algorithm starts. * Crc_IsFirstCall TRUE: First call in a sequence or individual CRC calculation; * start from initial value, ignore Crc_StartValue16. * FALSE: Subsequent call in a call sequence; Crc_StartValue16 * is interpreted to be the return value of the previous function call. * * Outputs: uint16: 16 bit result of CRC calculation. * * Limitations: None ******************************************************************************** END_FUNCTION_HDR*/ /******************************************************************************* * CRC2: The CRC module shall implement the CRC16 routine based on * the CCITT-FALSE CRC16 Standard: *******************************************************************************/ /* CRC19*/ /******************************************************************************* * CRC15: The function Crc_CalculateCRC16 shall perform a CRC16 calculation on * Crc_Length data bytes, pointed to by Crc_DataPtr, with the start-ing value of * Crc_StartValue16. *******************************************************************************/ FUNC(uint16, CRC_CODE) Crc_CalculateCRC16ARC ( P2CONST(uint8, AUTOMATIC, CRC_APPL_DATA) Crc_DataPtr, uint32 Crc_Length, uint16 Crc_StartValue16, boolean Crc_IsFirstCall ) { uint16 crc; uint32 i; if (Crc_IsFirstCall == TRUE) { /* CRC14*/ crc = CRC_16ARC_INIT_VALUE; } else { /* CRC41*/ crc = Crc_StartValue16 ^ CRC_16ARC_XOR_VALUE; } for (i = (uint32)0; i < Crc_Length; i++) { /*PRQA S 4571,4397 ++*/ /*There is no problem with the function pointer shift operation*/ /*get the crc16 table index by data and crc*/ crc = Crc_Table16ARC[Crc_DataPtr[i] ^ (uint8)crc] ^ (crc >> (uint16)RIGHTMOVE_INDEX); /*PRQA S 4571,4397 --*/ } return (crc ^ CRC_16ARC_XOR_VALUE); } #define CRC_STOP_SEC_CODE #include "Crc_MemMap.h"