/**
*@file    sr_crc.h
*@brief   crc校验接口
*@details 提供crc校验接口相关枚举
*@copyright Copyright (c) 2024 lierda. All rights reserved.
*@author  Lierda-RDC
*@date    2024-05-07
*@example ZhaoyangSDK\example\component\crypto\crypto_example.c
*/

#ifndef  _SR_CRC_H
#define  _SR_CRC_H


#include "sr_stddef.h"

#define CRC4_ITU_PARAMS          { 4, 0x03, 0x00, SR_TRUE, SR_TRUE, 0x00 }
#define CRC5_EPC_PARAMS          { 5, 0x09, 0x09, SR_FALSE, SR_FALSE, 0x00 }
#define CRC5_ITU_PARAMS          { 5, 0x15, 0x00, SR_TRUE, SR_TRUE, 0x00 }
#define CRC5_USB_PARAMS          { 5, 0x05, 0x1f, SR_TRUE, SR_TRUE, 0x1f }
#define CRC6_ITU_PARAMS          { 6, 0x03, 0x00, SR_TRUE, SR_TRUE, 0x00 }
#define CRC7_MMC_PARAMS          { 7, 0x09, 0x00, SR_FALSE, SR_FALSE, 0x00 }
#define CRC8_PARAMS              { 8, 0x07, 0x00, SR_FALSE, SR_FALSE, 0x00 }
#define CRC8_ITU_PARAMS          { 8, 0x07, 0x00, SR_FALSE, SR_FALSE, 0x55 }
#define CRC8_ROHC_PARAMS         { 8, 0x07, 0xff, SR_TRUE, SR_TRUE, 0x00 }
#define CRC8_MAXIM_PARAMS        { 8, 0x31, 0x00, SR_TRUE, SR_TRUE, 0x00 }
#define CRC16_IBM_PARAMS         { 16, 0x8005, 0x0000, SR_TRUE, SR_TRUE, 0x0000 }
#define CRC16_MAXIM_PARAMS       { 16, 0x8005, 0x0000, SR_TRUE, SR_TRUE, 0xffff }
#define CRC16_USB_PARAMS         { 16, 0x8005, 0xffff, SR_TRUE, SR_TRUE, 0xffff }
#define CRC16_MODBUS_PARAMS      { 16, 0x8005, 0xffff, SR_TRUE, SR_TRUE, 0x0000 }
#define CRC16_CCITT_PARAMS       { 16, 0x1021, 0x0000, SR_TRUE, SR_TRUE, 0x0000 }
#define CRC16_CCITT_FALSE_PARAMS { 16, 0x1021, 0xffff, SR_FALSE, SR_FALSE, 0x0000 }
#define CRC16_X25_PARAMS         { 16, 0x1021, 0xffff, SR_TRUE, SR_TRUE, 0xffff }
#define CRC16_XMODEM_PARAMS      { 16, 0x1021, 0x0000, SR_FALSE, SR_FALSE, 0x0000 }
#define CRC16_DNP_PARAMS         { 16, 0x3D65, 0x0000, SR_TRUE, SR_TRUE, 0xffff }
#define CRC32_PARAMS             { 32, 0x04c11db7, 0xffffffff, SR_TRUE, SR_TRUE, 0xffffffff }
#define CRC32_MPEG2_PARAMS       { 32, 0x4c11db7, 0xffffffff, SR_FALSE, SR_FALSE, 0x00000000 }


/**
 * @brief CRC算法类型
 */
typedef enum
{
  CRC4_ITU = 0,
  CRC5_EPC ,
  CRC5_ITU ,
  CRC5_USB ,
  CRC6_ITU ,
  CRC7_MMC ,
  CRC8     ,
  CRC8_ITU ,
  CRC8_ROHC   ,    
  CRC8_MAXIM  ,    
  CRC16_IBM   ,    
  CRC16_MAXIM ,    
  CRC16_USB   ,    
  CRC16_MODBUS,  
  CRC16_CCITT ,    
  CRC16_CCITT_FALSE,  
  CRC16_X25   ,    
  CRC16_XMODEM,  
  CRC16_DNP   ,    
  CRC32       ,    
  CRC32_MPEG2 ,
  
  CRC_TYPE_MAX 
}SR_CRC_TYPE_E;



/**
 * @brief CRC算法参数
 */
typedef struct 
{
	uint8_t  width;
	uint32_t poly;
	uint32_t init;
	srBool_t refIn;
	srBool_t refOut;
	uint32_t xorOut;
}SR_CRC_PARAM_T;



/*  
 * @brief CRC校验
 *  
 * @param[in] crcType  CRC算法类型,SR_CRC_TYPE_E类型
 * @param[in] inp    输入数据
 * @param[in] inLen  输入数据的长度（字节）  
 * @param[out] out   计算结果
 *
 * @return 0:成功   负值：失败   
 */ 
int SR_CrcCheck(SR_CRC_TYPE_E type, uint8_t *in, uint32_t inLen,uint32_t *out);



#endif



