CIU32_L051_M307R/Peripheral/CIU32L051_Lib/Include/ciu32l051_std_aes.h

318 lines
8.6 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/************************************************************************************************/
/**
* @file ciu32l051_std_aes.h
* @author MCU Ecosystem Development Team
* @brief AES STD库驱动头文件。
* 提供AES相关的STD库操作函数声明、数据类型以及常量的定义。
*
*
**************************************************************************************************
* @attention
* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
*
**************************************************************************************************
*/
/* 避免头文件重复引用 */
#ifndef CIU32L051_STD_AES_H
#define CIU32L051_STD_AES_H
/************************************************************************************************/
/**
* @addtogroup CIU32L051_STD_Driver
* @{
*/
/**
* @defgroup AES AES
* @brief 高级加密标准协处理器的STD库驱动
* @{
*/
/************************************************************************************************/
#ifdef __cplusplus
extern "C" {
#endif
/*------------------------------------------includes--------------------------------------------*/
#include "ciu32l051_std_common.h"
/*-----------------------------------------type define------------------------------------------*/
/************************************************************************************************/
/**
* @defgroup AES_Types AES Types
* @brief AES数据类型定义
* @{
*/
/************************************************************************************************/
/**
* @brief AES参数配置结构体定义
*/
typedef struct
{
uint32_t mode; /**< 加解密模式选择
@arg AES_MODE_DEC... */
uint32_t swapped_data_type; /**< 数据交换类型,分别为无交换/16位/8位/1位交换
@arg AES_SWAPPED_DATA_NONE... */
} std_aes_init_t;
/**
* @}
*/
/*--------------------------------------------define--------------------------------------------*/
/************************************************************************************************/
/**
* @defgroup AES_Constants AES Constants
* @brief AES常量定义及宏定义
* @{
*
*/
/************************************************************************************************/
/* 加解密模式定义 */
#define AES_MODE_ENC AES_CR_MOD_SEL_ENC /**< 加密模式 */
#define AES_MODE_DEC AES_CR_MOD_SEL_DEC /**< 解密模式 */
/* 数据交换类型 */
#define AES_SWAPPED_DATA_NONE AES_CR_DATA_TYPE_NONE /**< 无交换类型,数据不做交换 */
#define AES_SWAPPED_DATA_16BIT AES_CR_DATA_TYPE_16BIT /**< 16位交换类型数据按半字交换 */
#define AES_SWAPPED_DATA_8BIT AES_CR_DATA_TYPE_8BIT /**< 8位交换类型数据按字节交换 */
#define AES_SWAPPED_DATA_1BIT AES_CR_DATA_TYPE_BIT /**< 1位交换类型数据按位交换 */
/* 中断源定义 */
#define AES_INTERRUPT_COMPLETE AES_CSR_CCIE /**< 加解密完成中断使能 */
/* 状态标志 */
#define AES_FLAG_COMPLETE AES_CSR_DONE /**< 加解密完成标志 */
#define AES_FLAG_BUSY AES_CSR_BUSY /**< 运算过程标志 */
/* 清除标志 */
#define AES_CLEAR_FLAG_COMPLETE AES_CSR_CCFC /**< 加解密完成清除标志 */
/**
* @}
*/
/*-------------------------------------------functions------------------------------------------*/
/************************************************************************************************/
/**
* @defgroup AES_External_Functions AES External Functions
* @brief AES对外函数
* @{
*
*/
/************************************************************************************************/
/**
* @brief 设置加解密模式
* @param mode 加解密模式
* @arg AES_MODE_ENC加密模式
* @arg AES_MODE_DEC解密模式
* @retval 无
*/
__STATIC_INLINE void std_aes_set_cryption_mode(uint32_t mode)
{
MODIFY_REG(AES->CR, AES_CR_MOD_SEL, mode);
}
/**
* @brief 获取加解密模式设置
* @retval uint32_t 返回加解密模式设置
* @arg AES_MODE_ENC设置为加密模式
* @arg AES_MODE_DEC设置为解密模式
*/
__STATIC_INLINE uint32_t std_aes_get_cryption_mode(void)
{
return (AES->CR & AES_CR_MOD_SEL);
}
/**
* @brief 设置数据交换类型
* @param data_type 数据交换类型
* @arg AES_SWAPPED_DATA_NONE无交换类型数据不做交换
* @arg AES_SWAPPED_DATA_16BIT16位交换类型数据按半字交换
* @arg AES_SWAPPED_DATA_8BIT 8位交换类型数据按字节交换
* @arg AES_SWAPPED_DATA_1BIT 1位交换类型数据按位交换
* @retval 无
*/
__STATIC_INLINE void std_aes_set_data_type(uint32_t data_type)
{
MODIFY_REG(AES->CR, AES_CR_DATA_TYPE, data_type);
}
/**
* @brief 获取数据交换类型
* @retval uint32_t 数据交换类型
* @arg AES_SWAPPED_DATA_NONE无交换类型数据不做交换
* @arg AES_SWAPPED_DATA_16BIT 16位交换类型数据按半字交换
* @arg AES_SWAPPED_DATA_8BIT 8位交换类型数据按字节交换
* @arg AES_SWAPPED_DATA_1BIT 1位交换类型数据按位交换
*/
__STATIC_INLINE uint32_t std_aes_get_data_type(void)
{
return (AES->CR & AES_CR_DATA_TYPE);
}
/**
* @brief 获取AES标志的状态
* @param flag 待获取状态的标志
* @arg AES_FLAG_COMPLETE运算完成标志
* @arg AES_FLAG_BUSY运算状态标志
* @retval bool 返回逻辑表达式的判断结果
* @arg true 查询标志置位
* @arg false查询标志未置位
*/
__STATIC_INLINE bool std_aes_get_flag(uint32_t flag)
{
return ((AES->CSR & (flag)) == (flag));
}
/**
* @brief 清除AES状态标志位
* @param flag 待清除的标志
* @arg AES_CLEAR_FLAG_COMPLETE清除计算完成标志
* @retval 无
*/
__STATIC_INLINE void std_aes_clear_flag(uint32_t flag)
{
MODIFY_REG(AES->CSR, AES_CSR_CCFC, flag);
}
/**
* @brief 使能DMA数据输入
* @retval 无
*/
__STATIC_INLINE void std_aes_dmain_enable(void)
{
AES->CSR |= AES_CSR_DMAIN_EN;
}
/**
* @brief 禁止DMA数据输入
* @retval 无
*/
__STATIC_INLINE void std_aes_dmain_disable(void)
{
AES->CSR &= (~AES_CSR_DMAIN_EN);
}
/**
* @brief 使能DMA数据输出
* @retval 无
*/
__STATIC_INLINE void std_aes_dmaout_enable(void)
{
AES->CSR |= AES_CSR_DMAOUT_EN;
}
/**
* @brief 禁止DMA数据输出
* @retval 无
*/
__STATIC_INLINE void std_aes_dmaout_disable(void)
{
AES->CSR &= (~AES_CSR_DMAOUT_EN);
}
/**
* @brief 使能AES中断
* @param interrupt AES中断源
* @arg AES_INTERRUPT_COMPLETE 计算完成中断使能
* @retval 无
*/
__STATIC_INLINE void std_aes_enable_interrupt(uint32_t interrupt)
{
AES->CSR |= (interrupt);
}
/**
* @brief 禁止AES中断
* @param interrupt AES中断源
* @arg AES_INTERRUPT_COMPLETE 计算完成中断
* @retval 无
*/
__STATIC_INLINE void std_aes_disable_interrupt(uint32_t interrupt)
{
AES->CSR &= (~(interrupt));
}
/**
* @brief 获取算法中断使能的状态
* @param interrupt AES中断源
* @arg AES_INTERRUPT_COMPLETE 计算完成中断
* @retval bool 返回逻辑表达式的判断结果
* @arg true使能中断
* @arg false未使能中断
*/
__STATIC_INLINE bool std_aes_get_interrupt_enable(uint32_t interrupt)
{
return ((AES->CSR & (interrupt)) == (interrupt));
}
/**
* @brief 写入密钥
* @param p_key 指向密钥的指针
* @note 密钥长度为4个字
* @retval 无
*/
__STATIC_INLINE void std_aes_write_key(uint32_t *p_key)
{
AES->KEYR[3] = p_key[0];
AES->KEYR[2] = p_key[1];
AES->KEYR[1] = p_key[2];
AES->KEYR[0] = p_key[3];
}
/**
* @brief 写入数据
* @param p_data 指向数据的指针
* @note 数据长度为4个字
* @retval 无
*/
__STATIC_INLINE void std_aes_write_data(uint32_t *p_data)
{
AES->DR = p_data[0];
AES->DR = p_data[1];
AES->DR = p_data[2];
AES->DR = p_data[3];
}
/**
* @brief 读取数据
* @param p_data 指向数据的指针
* @note 数据长度为4个字
* @retval 无
*/
__STATIC_INLINE void std_aes_read_data(uint32_t *p_data)
{
p_data[0] = AES->DR;
p_data[1] = AES->DR;
p_data[2] = AES->DR;
p_data[3] = AES->DR;
}
void std_aes_init(std_aes_init_t *aes_init_param);
void std_aes_deinit(void);
void std_aes_struct_init(std_aes_init_t *aes_init_struct);
/**
* @}
*/
#ifdef __cplusplus
}
#endif
/**
* @}
*/
/**
* @}
*/
#endif /* CIU32L051_STD_AES_H */