RabbitECUTeensyMCUXpresso/source/Peripherals/CRC16HA.c

123 lines
3.3 KiB
C

/******************************************************************************/
/* Copyright (c) 2016 MD Automotive Controls. Original Work. */
/* License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher */
/******************************************************************************/
/* CONTEXT:KERNEL */
/* PACKAGE TITLE: CRC16 */
/* DESCRIPTION: This code provides CRC16 functions */
/* */
/* FILE NAME: CRC16HA.c */
/* REVISION HISTORY: 28-03-2016 | 1.0 | Initial revision */
/* */
/******************************************************************************/
#define CRC16HA_C
#include "sys.h"
#include "CPUAbstract.h"
#include "declarations.h"
#include "SIM.h"
#include "CRC16.h"
#include "types.h"
uint16 CRC16_u16CRC;
#ifdef BUILD_SAM3X8E
static uint16 CRC16HA_u16CalcTableCRC(uint16, puint8, uint16);
static puint16 CRC16HA_pu16CalcTableCRC(uint16, puint8, uint16);
#endif //BUILD_SAM3X8E
void CRC16HA_vStart(uint32* const u32Stat)
{
#if defined(BUILD_MK60) || defined(BUILD_MK64)
SIM_vSetReg32(SIM_SCGC6, SIM_SCGC6_CRC_MASK);
#endif
}
void CRC16HA_vRun(uint32* const u32Stat)
{
}
void CRC16HA_vTerminate(uint32* const u32Stat)
{
}
uint16 CRC16HA_u16CalcCRC(uint16 u16CRC, uint8* pu8Data, uint16 u16Len)
{
#if defined(BUILD_MK60) || defined(BUILD_MK64)
uint16 u16IDX;
CRC_Type* pstCRC0 = (CRC_Type*)CRC_BASE;
pstCRC0 -> GPOLY_ACCESS16BIT.GPOLYL = CRC_GPOLY_LOW(0x1021);
pstCRC0 -> CTRL |= CRC_CTRL_WAS_MASK;
pstCRC0 -> DATA = u16CRC;
pstCRC0 -> CTRL &= ~CRC_CTRL_WAS_MASK;
for (u16IDX = 0; u16IDX < u16Len; u16IDX++)
{
pstCRC0 -> ACCESS8BIT.DATALL = pu8Data[u16IDX];
}
return (uint16)pstCRC0 -> ACCESS16BIT.DATAL;
#endif //BUILD_MK6X
#ifdef BUILD_SAM3X8E
return CRC16HA_u16CalcTableCRC(u16CRC, pu8Data, u16Len);
#endif
}
puint16 CRC16HA_pu16CalcCRC(uint16 u16CRC, uint8* pu8Data, uint16 u16Len)
{
#if defined(BUILD_MK60) || defined(BUILD_MK64)
uint16 u16IDX;
CRC_Type* pstCRC0 = (CRC_Type*)CRC_BASE;
pstCRC0 -> GPOLY_ACCESS16BIT.GPOLYL = CRC_GPOLY_LOW(0x1021);
pstCRC0 -> CTRL |= CRC_CTRL_WAS_MASK;
pstCRC0 -> ACCESS16BIT.DATAL = u16CRC;
pstCRC0 -> CTRL &= ~CRC_CTRL_WAS_MASK;
for (u16IDX = 0; u16IDX < u16Len; u16IDX++)
{
pstCRC0 -> ACCESS8BIT.DATALU = pu8Data[u16IDX];
}
CRC16_u16CRC = (uint16)pstCRC0 -> ACCESS16BIT.DATAL;
return (puint16)&CRC16_u16CRC;
#endif
#ifdef BUILD_SAM3X8E
return CRC16HA_pu16CalcTableCRC(u16CRC, pu8Data, u16Len);
#endif
}
#ifdef BUILD_SAM3X8E
static uint16 CRC16HA_u16CalcTableCRC(uint16 crc_seed, puint8 pu8Data, uint16 len)
{
uint16 crc = crc_seed;
while (len--){
crc = (crc << 8) ^ CRC16HA_au16CRCTable[((crc >> 8) ^ *pu8Data++)];
}
return (crc);
}
#endif //BUILD_SAM3X8E
#ifdef BUILD_SAM3X8E
static puint16 CRC16HA_pu16CalcTableCRC(uint16 crc_seed, puint8 pu8Data, uint16 len)
{
CRC16_u16CRC = crc_seed;
while (len--){
CRC16_u16CRC = (CRC16_u16CRC << 8) ^ CRC16HA_au16CRCTable[((CRC16_u16CRC >> 8) ^ *pu8Data++)];
}
return (puint16)&CRC16_u16CRC;
}
#endif //BUILD_SAM3X8E