/***************************************************************
 *Copyright (C), 2017, Shanghai Eastsoft Microelectronics Co., Ltd.
 *文件名：
 *作  者:  Liut
 *版  本:  V1.00
 *日  期:  2017/07/14
 *描  述：
 *备  注：  适用于 ES8P508x芯片
 本软件仅供学习和演示使用，对用户直接引用代码所带来的风险或后果不承担任何法律责任。
 ***************************************************************/
#ifndef __LIBCRC_H
#define __LIBCRC_H

#include "ES8P508x.h"
#include "type.h"

#ifdef __cplusplus
extern "C" {
#endif

#define CRC_EmptayCheck_addr    0x10000010
#define CRC_FlashVerify_addr    0x10000014
#define CRC_UserCal_addr        0x10000018
#define CRC_CheckReset_addr     0x1000001C

typedef uint32_t (*CRC_EM)(void *address, uint32_t data_len);
typedef uint32_t (*CRC_FL)(void *address, uint32_t data_len, uint32_t type);
typedef uint32_t (*CRC_US)(void *address, uint32_t data_len, uint32_t type);
typedef uint32_t (*CRC_CH)(void);


typedef enum
{
    CRC_XOROUT_NORMAL = 0x0,   //数据输出不取反
    CRC_XOROUT_ANTI = (1U << 14), //数据输出取反
} CRC_XOROUT;

typedef enum
{
    CRC_REFOUT_NORMAL = 0x0,   //数据输出正序
    CRC_REFOUT_REVERSE = (1U << 13), //数据输出倒序
} CRC_REFOUT;

typedef enum
{
    CRC_REFIN_NORMAL = 0x0,   //数据输入正序
    CRC_REFIN_REVERSE = (1U << 12), //数据输入倒序
} CRC_REFIN;


typedef enum
{
    CRC_MOD_CRC32 = 0x0,       //CRC位宽为字节
    CRC_MOD_CRC16 = (2U << 8), //CRC位宽为半字
    CRC_MOD_CRC16_CCITT = (3U << 8), //CRC位宽为字
} CRC_MOD_TYPE;

typedef enum
{
    CRC_INIT_DATA_ALL_0 = 0x0,       //CRC初始化数据全为0
    CRC_INIT_DATA_ALL_1 = (1U << 3), //CRC初始化数据全为1
} CRC_INIT_DATA;

typedef enum
{
    CRC_HS_TYPE_DISABLE = 0x0,       //CRC高速模式禁止
    CRC_HS_TYPE_ENABLE = (1U << 2), //CRC高速模式使能，当CRC时钟小于24M时才能使能
} CRC_HS_TYPE;


/*CRC_CON 数据配置值结构体初始化*/
typedef struct
{
    CRC_XOROUT xorout;
    CRC_REFOUT refout;
    CRC_REFIN  refin;
    CRC_MOD_TYPE mode;
    CRC_INIT_DATA init_data_type;
    CRC_HS_TYPE hs_type;
} CRC_CONValueStruType;

uint32_t CRC_getTypeValue(CRC_CONValueStruType con_value);
uint32_t CRC_EmptayCheck(void *address, uint32_t data_len);
uint32_t CRC_FlashVerify(void *address, uint32_t data_len, uint32_t type);
uint32_t CRC_UserCal(void *address, uint32_t data_len, uint32_t type);
uint32_t CRC_CheckReset(void);

#ifdef __cplusplus
}
#endif

#endif
/*************************END OF FILE**********************/
