rt-thread/bsp/essemi/es32vf2264/libraries/ALD/ES32VF2264/Include/ald_crc.h

213 lines
5.8 KiB
C

/**
*********************************************************************************
*
* @file ald_crc.h
* @brief Header file of CRC module driver.
*
* @version V1.0
* @date 06 Mar. 2023
* @author AE Team
* @note
* Change Logs:
* Date Author Notes
* 06 Mar. 2023 Lisq The first version
*
* Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved.
*
* SPDX-License-Identifier: Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the License); you may
* not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
**********************************************************************************
*/
#ifndef __ALD_CRC_H__
#define __ALD_CRC_H__
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
#include "ald_utils.h"
#include "ald_dma.h"
/** @addtogroup ES32VF2264_ALD
* @{
*/
/** @addtogroup CRC
* @{
*/
/** @defgroup CRC_Public_Types CRC Public Types
* @{
*/
/**
* @brief CRC mode
*/
typedef enum {
ALD_CRC_MODE_CCITT = 0U, /**< CCITT */
ALD_CRC_MODE_8 = 1U, /**< CRC8 */
ALD_CRC_MODE_16 = 2U, /**< CRC16 */
ALD_CRC_MODE_32 = 3U, /**< CRC32 */
} ald_crc_mode_t;
/**
* @brief CRC input length
*/
typedef enum {
ALD_CRC_LEN_AUTO = 0U, /**< Auto */
ALD_CRC_DATASIZE_8 = 1U, /**< Byte */
ALD_CRC_DATASIZE_16 = 2U, /**< Half word */
ALD_CRC_DATASIZE_32 = 3U, /**< Word */
} ald_crc_datasize_t;
/**
* @brief CRC whether write error or no
*/
typedef enum {
ALD_CRC_WERR_NO = 0U, /**< No error */
ALD_CRC_WERR_ERR = 1U, /**< Error */
} ald_crc_werr_t;
/**
* @brief CRC state structures definition
*/
typedef enum {
ALD_CRC_STATE_RESET = 0x0U, /**< Peripheral is not initialized */
ALD_CRC_STATE_READY = 0x1U, /**< Peripheral Initialized and ready for use */
ALD_CRC_STATE_BUSY = 0x2U, /**< An internal process is ongoing */
ALD_CRC_STATE_ERROR = 0x4U, /**< Error */
} ald_crc_state_t;
/**
* @brief CRC init structure definition
*/
typedef struct {
ald_crc_mode_t mode; /**< CRC mode */
type_func_t data_rev; /**< CRC data reverse or no */
type_func_t data_inv; /**< CRC data inverse or no */
type_func_t chs_rev; /**< CRC check sum reverse or no */
type_func_t chs_inv; /**< CRC check sum inverse or no */
uint32_t seed; /**< CRC seed */
} ald_crc_init_t;
/**
* @brief CRC Handle Structure definition
*/
typedef struct ald_crc_handle_s {
CRC_TypeDef *perh; /**< Register base address */
ald_crc_init_t init; /**< CRC required parameters */
uint8_t *cal_buf; /**< The pointer of preparing buffer */
uint32_t *cal_res; /**< The pointer of result */
ald_dma_handle_t hdma; /**< CRC DMA handle parameters */
lock_state_t lock; /**< Locking object */
ald_crc_state_t state; /**< CRC operation state */
void (*cal_cplt_cbk)(struct ald_crc_handle_s *arg); /**< Calculate completed callback */
void (*err_cplt_cbk)(struct ald_crc_handle_s *arg); /**< Calculate error callback */
} ald_crc_handle_t;
/**
* @}
*/
/** @defgroup CRC_Public_Macros CRC Public Macros
* @{
*/
#define ALD_CRC_ENABLE(handle) (SET_BIT((handle)->perh->CR, CRC_CR_EN_MSK))
#define ALD_CRC_DISABLE(handle) (CLEAR_BIT((handle)->perh->CR, CRC_CR_EN_MSK))
#define ALD_CRC_RESET(handle) (SET_BIT((handle)->perh->CR, CRC_CR_RST_MSK))
#define ALD_CRC_DMA_ENABLE(handle) (SET_BIT((handle)->perh->CR, CRC_CR_DMAEN_MSK))
#define ALD_CRC_DMA_DISABLE(handle) (CLEAR_BIT((handle)->perh->CR, CRC_CR_DMAEN_MSK))
#define ALD_CRC_CLEAR_ERROR_FLAG(handle) (SET_BIT((handle)->perh->CR, CRC_CR_WERR_MSK))
/**
* @}
*/
/** @defgroup CRC_Private_Macros CRC Private Macros
* @{
*/
#define IS_CRC(x) ((x) == CRC)
#define IS_CRC_MODE(x) (((x) == ALD_CRC_MODE_CCITT) || \
((x) == ALD_CRC_MODE_8) || \
((x) == ALD_CRC_MODE_16) || \
((x) == ALD_CRC_MODE_32))
/**
* @}
*/
/** @addtogroup CRC_Public_Functions
* @{
*/
/** @addtogroup CRC_Public_Functions_Group1
* @{
*/
ald_status_t ald_crc_init(ald_crc_handle_t *hperh);
void ald_crc_reset(ald_crc_handle_t *hperh);
/**
* @}
*/
/** @addtogroup CRC_Public_Functions_Group2
* @{
*/
uint32_t ald_crc_calculate(ald_crc_handle_t *hperh, uint8_t *buf, uint32_t size);
uint32_t ald_crc_calculate_halfword(ald_crc_handle_t *hperh, uint16_t *buf, uint32_t size);
uint32_t ald_crc_calculate_word(ald_crc_handle_t *hperh, uint32_t *buf, uint32_t size);
/**
* @}
*/
/** @addtogroup CRC_Public_Functions_Group3
* @{
*/
ald_status_t ald_crc_calculate_by_dma(ald_crc_handle_t *hperh, uint8_t *buf, uint32_t *res, uint16_t size, uint8_t channel);
ald_status_t ald_crc_calculate_halfword_by_dma(ald_crc_handle_t *hperh, uint16_t *buf, uint32_t *res, uint16_t size, uint8_t channel);
ald_status_t ald_crc_calculate_word_by_dma(ald_crc_handle_t *hperh, uint32_t *buf, uint32_t *res, uint16_t size, uint8_t channel);
ald_status_t ald_crc_dma_pause(ald_crc_handle_t *hperh);
ald_status_t ald_crc_dma_resume(ald_crc_handle_t *hperh);
ald_status_t ald_crc_dma_stop(ald_crc_handle_t *hperh);
/**
* @}
*/
/** @addtogroup CRC_Public_Functions_Group4
* @{
*/
ald_crc_state_t ald_crc_get_state(ald_crc_handle_t *hperh);
/**
* @}
*/
/**
* @}
*/
/**
* @}
*/
/**
* @}
*/
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* __ALD_CRC_H__ */