182 lines
5.2 KiB
C
182 lines
5.2 KiB
C
|
/*
|
||
|
* Copyright (c) 2016, Freescale Semiconductor, Inc.
|
||
|
* Copyright 2017-2021 NXP
|
||
|
* All rights reserved.
|
||
|
*
|
||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||
|
*/
|
||
|
|
||
|
#ifndef _FSL_IEE_H_
|
||
|
#define _FSL_IEE_H_
|
||
|
|
||
|
#include "fsl_common.h"
|
||
|
|
||
|
/*!
|
||
|
* @addtogroup iee
|
||
|
* @{
|
||
|
*/
|
||
|
|
||
|
/*******************************************************************************
|
||
|
* Definitions
|
||
|
******************************************************************************/
|
||
|
|
||
|
/*! @name Driver version */
|
||
|
/*@{*/
|
||
|
/*! @brief IEE driver version. Version 2.1.1.
|
||
|
*
|
||
|
* Current version: 2.1.1
|
||
|
*
|
||
|
* Change log:
|
||
|
* - Version 2.0.0
|
||
|
* - Initial version
|
||
|
* - Version 2.1.0
|
||
|
* - Add region lock function IEE_LockRegionConfig() and driver clock control
|
||
|
* - Version 2.1.1
|
||
|
* - Fixed MISRA issues.
|
||
|
*/
|
||
|
#define FSL_IEE_DRIVER_VERSION (MAKE_VERSION(2, 1, 1))
|
||
|
/*@}*/
|
||
|
|
||
|
/*! @brief IEE region. */
|
||
|
typedef enum _iee_region
|
||
|
{
|
||
|
kIEE_Region0 = 0U, /*!< IEE region 0 */
|
||
|
kIEE_Region1 = 1U, /*!< IEE region 1 */
|
||
|
kIEE_Region2 = 2U, /*!< IEE region 2 */
|
||
|
kIEE_Region3 = 3U, /*!< IEE region 3 */
|
||
|
kIEE_Region4 = 4U, /*!< IEE region 4 */
|
||
|
kIEE_Region5 = 5U, /*!< IEE region 5 */
|
||
|
kIEE_Region6 = 6U, /*!< IEE region 6 */
|
||
|
kIEE_Region7 = 7U /*!< IEE region 7 */
|
||
|
} iee_region_t;
|
||
|
|
||
|
/*! @brief IEE AES enablement/bypass. */
|
||
|
typedef enum _iee_aes_bypass
|
||
|
{
|
||
|
kIEE_AesUseMdField = 0U, /*!< AES encryption/decryption enabled */
|
||
|
kIEE_AesBypass = 1U /*!< AES encryption/decryption bypass */
|
||
|
} iee_aes_bypass_t;
|
||
|
|
||
|
/*! @brief IEE AES mode. */
|
||
|
typedef enum _iee_aes_mode
|
||
|
{
|
||
|
kIEE_ModeNone = 0U, /*!< AES NONE mode */
|
||
|
kIEE_ModeAesXTS = 1U, /*!< AES XTS mode */
|
||
|
kIEE_ModeAesCTRWAddress = 2U, /*!< CTR w address binding mode */
|
||
|
kIEE_ModeAesCTRWOAddress = 3U, /*!< AES CTR w/o address binding mode */
|
||
|
kIEE_ModeAesCTRkeystream = 4U /*!< AES CTR keystream only */
|
||
|
} iee_aes_mode_t;
|
||
|
|
||
|
/*! @brief IEE AES key size. */
|
||
|
typedef enum _iee_aes_key_size
|
||
|
{
|
||
|
kIEE_AesCTR128XTS256 = 0U, /*!< AES 128 bits (CTR), 256 bits (XTS) */
|
||
|
kIEE_AesCTR256XTS512 = 1U /*!< AES 256 bits (CTR), 512 bits (XTS) */
|
||
|
} iee_aes_key_size_t;
|
||
|
|
||
|
/*! @brief IEE AES ke number. */
|
||
|
typedef enum _iee_aes_key_num
|
||
|
{
|
||
|
kIEE_AesKey1 = 1U, /*!< AES Key 1 */
|
||
|
kIEE_AesKey2 = 2U /*!< AES Key 2 */
|
||
|
} iee_aes_key_num_t;
|
||
|
|
||
|
/*! @brief IEE configuration structure. */
|
||
|
typedef struct _iee_config
|
||
|
{
|
||
|
iee_aes_bypass_t bypass; /*!< AES encryption/decryption bypass */
|
||
|
iee_aes_mode_t mode; /*!< AES mode */
|
||
|
iee_aes_key_size_t keySize; /*!< size of AES key */
|
||
|
uint32_t pageOffset; /*!< Offset to physical memory location from IEE start address */
|
||
|
} iee_config_t;
|
||
|
|
||
|
/*******************************************************************************
|
||
|
* API
|
||
|
******************************************************************************/
|
||
|
#if defined(__cplusplus)
|
||
|
extern "C" {
|
||
|
#endif
|
||
|
|
||
|
/*!
|
||
|
* @brief Resets IEE module to factory default values.
|
||
|
*
|
||
|
* This function performs hardware reset of IEE module. Attributes and keys of all regions are cleared.
|
||
|
*
|
||
|
* @param base IEER peripheral address.
|
||
|
*/
|
||
|
void IEE_Init(IEE_Type *base);
|
||
|
|
||
|
/*!
|
||
|
* @brief Loads default values to the IEE configuration structure.
|
||
|
*
|
||
|
* Loads default values to the IEE region configuration structure. The default values are as follows.
|
||
|
* @code
|
||
|
* config->bypass = kIEE_AesUseMdField;
|
||
|
* config->mode = kIEE_ModeNone;
|
||
|
* config->keySize = kIEE_AesCTR128XTS256;
|
||
|
* config->pageOffset = 0U;
|
||
|
* @endcode
|
||
|
*
|
||
|
* @param config Configuration for the selected IEE region.
|
||
|
*/
|
||
|
void IEE_GetDefaultConfig(iee_config_t *config);
|
||
|
|
||
|
/*!
|
||
|
* @brief Sets the IEE module according to the configuration structure.
|
||
|
*
|
||
|
* This function configures IEE region according to configuration structure.
|
||
|
*
|
||
|
* @param base IEE peripheral address.
|
||
|
* @param region Selection of the IEE region to be configured.
|
||
|
* @param config Configuration for the selected IEE region.
|
||
|
*/
|
||
|
void IEE_SetRegionConfig(IEE_Type *base, iee_region_t region, iee_config_t *config);
|
||
|
|
||
|
/*!
|
||
|
* @brief Sets the IEE module key.
|
||
|
*
|
||
|
* This function sets specified AES key for the given region.
|
||
|
*
|
||
|
* @param base IEE peripheral address.
|
||
|
* @param region Selection of the IEE region to be configured.
|
||
|
* @param keyNum Selection of AES KEY1 or KEY2.
|
||
|
* @param key AES key.
|
||
|
* @param keySize Size of AES key.
|
||
|
*/
|
||
|
status_t IEE_SetRegionKey(
|
||
|
IEE_Type *base, iee_region_t region, iee_aes_key_num_t keyNum, const uint8_t *key, size_t keySize);
|
||
|
|
||
|
/*!
|
||
|
* @brief Computes IEE offset to be set for specifed memory location.
|
||
|
*
|
||
|
* This function calculates offset that must be set for IEE region to access physical memory location.
|
||
|
*
|
||
|
* @param addressIee Address of IEE peripheral.
|
||
|
* @param addressMemory Address of physical memory location.
|
||
|
*/
|
||
|
static inline uint32_t IEE_GetOffset(uint32_t addressIee, uint32_t addressMemory)
|
||
|
{
|
||
|
return (addressMemory - addressIee) >> 12;
|
||
|
}
|
||
|
|
||
|
/*!
|
||
|
* @brief Lock the IEE region configuration.
|
||
|
*
|
||
|
* This function locks IEE region registers for Key, Offset and Attribute.
|
||
|
* Only system reset can clear the Lock bit.
|
||
|
*
|
||
|
* @param base IEE peripheral address.
|
||
|
* @param region Selection of the IEE region to be locked.
|
||
|
*/
|
||
|
void IEE_LockRegionConfig(IEE_Type *base, iee_region_t region);
|
||
|
|
||
|
#if defined(__cplusplus)
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
/*!
|
||
|
*@}
|
||
|
*/
|
||
|
|
||
|
#endif /* _FSL_IEE_H_ */
|