PeripheralDriver_Flagchip_F.../Src/fc7xxx_driver_crc.c

168 lines
4.6 KiB
C

/**
* @file fc7xxx_driver_crc.c
* @author Flagchip
* @brief FC7xxx CRC driver source code
* @version 0.1.0
* @date 2024-01-12
*
* @copyright Copyright (c) 2024 Flagchip Semiconductors Co., Ltd.
*
*/
/********************************************************************************
* Revision History:
*
* Version Date Initials CR# Descriptions
* --------- ---------- ------------ ---------- ---------------
* 0.1.0 2024-01-12 Flagchip119 N/A First version for FC7240
********************************************************************************/
#include "fc7xxx_driver_crc.h"
/********* Local Variables ************/
static CRC_Type *const s_apCrcBase[CRC_INSTANCE_COUNT] = CRC_BASE_PTRS;
/********* Local Functions ************/
void CRC_Init(uint8_t u8Instance, const CRC_InitType *const pInitCfg)
{
DEV_ASSERT(u8Instance < CRC_INSTANCE_COUNT);
DEV_ASSERT(pInitCfg != NULL);
CRC_Type *const pCrc = s_apCrcBase[u8Instance];
if (pInitCfg->eBitWidth == CRC_BIT_8)
{
/* set CRC bit width(8-bit) */
CRC_HWA_Set_8Bit_Width(pCrc, (CRC_BitWidthType)(pInitCfg->eBitWidth - 1));
CRC_HWA_SetBitWidth(pCrc, (CRC_BitWidthType)0);
}
else
{
/* set CRC bit width(16-bit or 32-bit) */
CRC_HWA_Set_8Bit_Width(pCrc, (CRC_BitWidthType)0);
CRC_HWA_SetBitWidth(pCrc, pInitCfg->eBitWidth);
}
/* set CRC write/read swap and FXOR */
CRC_HWA_SetWriteDataSwap(pCrc, pInitCfg->eWriteDataSwap);
CRC_HWA_SetReadDataSwap(pCrc, pInitCfg->eReadDataSwap);
CRC_HWA_SetReadDataFXOR(pCrc, pInitCfg->eReadDataFXOR);
/* set CRC polynomial value */
CRC_HWA_SetPolyVal(pCrc, pInitCfg->u32Polynomial);
/* set CRC seed value */
CRC_SetSeed(u8Instance, pInitCfg->u32SeedValue);
}
void CRC_DeInit(uint8_t u8Instance)
{
DEV_ASSERT(u8Instance < CRC_INSTANCE_COUNT);
CRC_Type *const pCrc = s_apCrcBase[u8Instance];
/* set CRC bit width(32-bit) */
CRC_HWA_SetBitWidth(pCrc, CRC_BIT_32);
/* set CRC write/read swap and FXOR */
CRC_HWA_SetWriteDataSwap(pCrc, WRITE_DATASWAP_NONE);
CRC_HWA_SetReadDataSwap(pCrc, READ_DATASWAP_NONE);
CRC_HWA_SetReadDataFXOR(pCrc, READ_DATA_NORMAL);
/* set CRC polynomial value */
CRC_HWA_SetPolyVal(pCrc, CRC_DEFAULT_POLY);
/* set CRC seed value */
CRC_SetSeed(u8Instance, CRC_DEFAULT_INTVAL);
}
uint32_t CRC_GetCrcResult(uint8_t u8Instance)
{
DEV_ASSERT(u8Instance < CRC_INSTANCE_COUNT);
CRC_Type *const pCrc = s_apCrcBase[u8Instance];
CRC_ReadDataSwapType eTempVal;
uint32_t u32Ret;
eTempVal = CRC_HWA_GetReadDataSwap(pCrc);
if (CRC_BIT_8 == CRC_HWA_Get8BitWidth(pCrc))
{
/* Returns upper 8 bits of CRC because of swap in 8 bits mode */
if ((eTempVal == READ_DATASWAP_BIT_BYTE) || (eTempVal == READ_DATASWAP_BYTE))
{
u32Ret = CRC_HWA_GetData_U8_H(pCrc);
}
else
{
u32Ret = CRC_HWA_GetData_U8_L(pCrc);
}
return u32Ret;
}
else if (CRC_BIT_16 == CRC_HWA_GetBitWidth(pCrc))
{
/* Returns upper 16 bits of CRC because of swap in 16 bits mode */
if ((eTempVal == READ_DATASWAP_BIT_BYTE) || (eTempVal == READ_DATASWAP_BYTE))
{
u32Ret = CRC_HWA_GetData_U16_H(pCrc);
}
else
{
u32Ret = CRC_HWA_GetData_U16_L(pCrc);
}
}
else
{
u32Ret = CRC_HWA_GetData_U32(pCrc);
}
return u32Ret;
}
void CRC_SetCalcData_U8(uint8_t u8Instance, uint8_t u8Data)
{
DEV_ASSERT(u8Instance < CRC_INSTANCE_COUNT);
CRC_Type *const pCrc = s_apCrcBase[u8Instance];
CRC_HWA_SetData_U8(pCrc, u8Data);
}
void CRC_SetCalcData_U16(uint8_t u8Instance, uint16_t u16Data)
{
DEV_ASSERT(u8Instance < CRC_INSTANCE_COUNT);
CRC_Type *const pCrc = s_apCrcBase[u8Instance];
CRC_HWA_SetData_U16(pCrc, u16Data);
}
void CRC_SetCalcData_U32(uint8_t u8Instance, uint32_t u32Data)
{
DEV_ASSERT(u8Instance < CRC_INSTANCE_COUNT);
CRC_Type *const pCrc = s_apCrcBase[u8Instance];
CRC_HWA_SetData_U32(pCrc, u32Data);
}
void CRC_SetSeed(uint8_t u8Instance, uint32_t u32SeedVal)
{
DEV_ASSERT(u8Instance < CRC_INSTANCE_COUNT);
CRC_Type *const pCrc = s_apCrcBase[u8Instance];
CRC_HWA_SetDataOrSeed(pCrc, WRITE_COMMAND_SEED);
CRC_HWA_SetData_U32(pCrc, u32SeedVal);
CRC_HWA_SetDataOrSeed(pCrc, WRITE_COMMAND_DATA);
}
void CRC_SetInputData(uint8_t u8Instance, const uint8_t pData[], uint32_t u32DataSize)
{
DEV_ASSERT(u8Instance < CRC_INSTANCE_COUNT);
uint32_t i;
for (i = 0U; i < u32DataSize; i++)
{
CRC_SetCalcData_U8(u8Instance, pData[i]);
}
}