#ifndef __LKS32MC09X_CRC_H__
#define __LKS32MC09X_CRC_H__

#include "lks32mc09x_reg.h"

/**
 * @brief CRC初始化结构体
 */
typedef struct
{
    uint32_t POLY;   ///< 多项式
    uint32_t INIT;   ///< 初始值
    uint32_t XOROUT; ///< 结果异或值
    uint8_t REFIN;   ///< 输入数据反转
    uint8_t REFOUT;  ///< 输出数据反转
    uint8_t WIDTH;   ///< 宽度
    uint8_t null;    ///< 地址对齐
} CRC_InitTypeDef;

/**
 * @brief CRC模型定义
 */
#define CRC_MODEL_CRC_8              0  ///< 8 07 00 00 false false
#define CRC_MODEL_CRC_8_ITU          1  ///< 8 07 00 55 false false
#define CRC_MODEL_CRC_8_ROHC         2  ///< 8 07 FF 00 true true
#define CRC_MODEL_CRC_8_MAXIMx       3  ///< 8 31 00 00 true true
#define CRC_MODEL_CRC_16_IBMx1       4  ///< 16 8005 0000 0000 true true
#define CRC_MODEL_CRC_16_MAXIM       5  ///< 16 8005 0000 FFFF true true
#define CRC_MODEL_CRC_16_USBx1       6  ///< 16 8005 FFFF FFFF true true
#define CRC_MODEL_CRC_16_MODBU       7  ///< 16 8005 FFFF 0000 true true
#define CRC_MODEL_CRC_16_CCITT       8  ///< 16 1021 0000 0000 true true
#define CRC_MODEL_CRC_16_CCITT_FALSE 9  ///< 16 1021 FFFF 0000 false false
#define CRC_MODEL_CRC_16_X25         10 ///< 16 1021 FFFF FFFF true true
#define CRC_MODEL_CRC_16_XMODEM      11 ///< 16 1021 0000 0000 false false
#define CRC_MODEL_CRC_16_DNP         12 ///< 16 3D65 0000 FFFF true true
#define CRC_MODEL_CRC_32             13 ///< 32 04C11DB7 FFFFFFFF FFFFFFFF true true
#define CRC_MODEL_CRC_32_MPEG_2      14 ///< 32 04C11DB7 FFFFFFFF 00000000 false false

/**
 * @brief CRC宽度定义
 */
#define CRC_WIDTH_32 0 ///< 32bits
#define CRC_WIDTH_16 1 ///< 16bits
#define CRC_WIDTH_8  2 ///< 8bits
#define CRC_WIDTH_7  3 ///< 7bits

/**
 * @brief 初始化CRC模块
 * @param CRCx CRC模块指针
 * @param CRC_InitStruct CRC初始化结构体指针
 */
void CRC_Init(CRC_TypeDef *CRCx, CRC_InitTypeDef *CRC_InitStruct);

/**
 * @brief 初始化CRC结构体为默认值
 * @param CRC_InitStruct CRC初始化结构体指针
 */
void CRC_StructInit(CRC_InitTypeDef *CRC_InitStruct);

/**
 * @brief 计算CRC值
 * @param CRCx CRC模块指针
 * @param data 数据指针
 * @param len 数据长度
 * @return 计算得到的CRC值
 */
uint32_t CRC_Calc(CRC_TypeDef *CRCx, uint8_t *data, uint32_t len);

/**
 * @brief 使用常见模型计算CRC值
 * @param CRCx CRC模块指针
 * @param data 数据指针
 * @param len 数据长度
 * @param CRC_MODEL_x CRC模型
 * @return 计算得到的CRC值
 */
uint32_t CRC_CalcCommon(CRC_TypeDef *CRCx, uint8_t *data, uint32_t len, uint16_t CRC_MODEL_x);

/**
 * @brief 使能CRC模块
 * @param CRCx CRC模块指针
 */
void CRC_Enable(CRC_TypeDef *CRCx);

/**
 * @brief 禁用CRC模块
 * @param CRCx CRC模块指针
 */
void CRC_Disable(CRC_TypeDef *CRCx);

#endif
