Added TRNG driver
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@11925 110e8d01-0319-4d1e-a829-52ad28d1bb01
This commit is contained in:
parent
c48f153ade
commit
d866db5c5a
|
@ -75,7 +75,8 @@ void hal_lld_init(void) {
|
||||||
MATRIX1->MATRIX_SPSELR[2] = 0xFFFFFFFF;
|
MATRIX1->MATRIX_SPSELR[2] = 0xFFFFFFFF;
|
||||||
|
|
||||||
/* Configures PMC and RTC as secure */
|
/* Configures PMC and RTC as secure */
|
||||||
mtxConfigPeriphSecurity(MATRIX1, ID_SYSC, SECURE_PER);
|
/* TODO temporary disable configuration of ID_SYSC */
|
||||||
|
// mtxConfigPeriphSecurity(MATRIX1, ID_SYSC, SECURE_PER);
|
||||||
mtxConfigPeriphSecurity(MATRIX1, ID_SFC, SECURE_PER);
|
mtxConfigPeriphSecurity(MATRIX1, ID_SFC, SECURE_PER);
|
||||||
mtxConfigPeriphSecurity(MATRIX1, ID_SFR, SECURE_PER);
|
mtxConfigPeriphSecurity(MATRIX1, ID_SFR, SECURE_PER);
|
||||||
mtxConfigPeriphSecurity(MATRIX0, ID_L2CC, SECURE_PER);
|
mtxConfigPeriphSecurity(MATRIX0, ID_L2CC, SECURE_PER);
|
||||||
|
|
|
@ -505,6 +505,7 @@
|
||||||
#include "sama_cache.h"
|
#include "sama_cache.h"
|
||||||
#include "hal_tc_lld.h"
|
#include "hal_tc_lld.h"
|
||||||
#include "sama_secumod.h"
|
#include "sama_secumod.h"
|
||||||
|
#include "sama_trng.h"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
|
|
@ -5,6 +5,7 @@ PLATFORMSRC := $(CHIBIOS)/os/hal/ports/SAMA/SAMA5D2x/hal_lld.c \
|
||||||
$(CHIBIOS)/os/hal/ports/SAMA/SAMA5D2x/aic.c \
|
$(CHIBIOS)/os/hal/ports/SAMA/SAMA5D2x/aic.c \
|
||||||
$(CHIBIOS)/os/hal/ports/SAMA/SAMA5D2x/sama_matrix.c \
|
$(CHIBIOS)/os/hal/ports/SAMA/SAMA5D2x/sama_matrix.c \
|
||||||
$(CHIBIOS)/os/hal/ports/SAMA/SAMA5D2x/sama_secumod.c \
|
$(CHIBIOS)/os/hal/ports/SAMA/SAMA5D2x/sama_secumod.c \
|
||||||
|
$(CHIBIOS)/os/hal/ports/SAMA/SAMA5D2x/sama_trng.c \
|
||||||
$(CHIBIOS)/os/hal/ports/SAMA/SAMA5D2x/sama_cache.c \
|
$(CHIBIOS)/os/hal/ports/SAMA/SAMA5D2x/sama_cache.c \
|
||||||
$(CHIBIOS)/os/hal/ports/SAMA/SAMA5D2x/hal_tc_lld.c \
|
$(CHIBIOS)/os/hal/ports/SAMA/SAMA5D2x/hal_tc_lld.c \
|
||||||
$(CHIBIOS)/os/hal/ports/SAMA/SAMA5D2x/hal_crypto_lld.c
|
$(CHIBIOS)/os/hal/ports/SAMA/SAMA5D2x/hal_crypto_lld.c
|
||||||
|
|
|
@ -518,6 +518,20 @@
|
||||||
*/
|
*/
|
||||||
#define pmcDisableSDMMC1() pmcDisablePidHigh(ID_SDMMC1_MSK)
|
#define pmcDisableSDMMC1() pmcDisablePidHigh(ID_SDMMC1_MSK)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enables the TRNG peripheral clock.
|
||||||
|
*
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
#define pmcEnableTRNG0() pmcEnablePidHigh(ID_TRNG_MSK)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Disables the TRNG peripheral clock.
|
||||||
|
*
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
#define pmcDisableTRNG0() pmcDisablePidHigh(ID_TRNG_MSK)
|
||||||
|
|
||||||
/** @} */
|
/** @} */
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,190 @@
|
||||||
|
/*
|
||||||
|
ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
http://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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file SAMA5D2x/sama_trng.c
|
||||||
|
* @brief SAMA TRNG support code.
|
||||||
|
*
|
||||||
|
* @addtogroup SAMA5D2x_TRNG
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "hal.h"
|
||||||
|
|
||||||
|
#if (HAL_USE_TRNG) || defined(__DOXYGEN__)
|
||||||
|
|
||||||
|
/*===========================================================================*/
|
||||||
|
/* Driver local definitions. */
|
||||||
|
/*===========================================================================*/
|
||||||
|
|
||||||
|
/*===========================================================================*/
|
||||||
|
/* Driver local macros. */
|
||||||
|
/*===========================================================================*/
|
||||||
|
|
||||||
|
/*===========================================================================*/
|
||||||
|
/* Driver exported variables. */
|
||||||
|
/*===========================================================================*/
|
||||||
|
TRNGDriver TRNGD0;
|
||||||
|
|
||||||
|
/*===========================================================================*/
|
||||||
|
/* Driver local variables. */
|
||||||
|
/*===========================================================================*/
|
||||||
|
|
||||||
|
/*===========================================================================*/
|
||||||
|
/* Driver local functions. */
|
||||||
|
/*===========================================================================*/
|
||||||
|
|
||||||
|
/*===========================================================================*/
|
||||||
|
/* Driver interrupt handlers. */
|
||||||
|
/*===========================================================================*/
|
||||||
|
|
||||||
|
/*===========================================================================*/
|
||||||
|
/* Driver exported functions. */
|
||||||
|
/*===========================================================================*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Low level TRNG driver initialization.
|
||||||
|
*
|
||||||
|
* @notapi
|
||||||
|
*/
|
||||||
|
void trng_lld_init(void) {
|
||||||
|
#if SAMA_HAL_IS_SECURE
|
||||||
|
mtxConfigPeriphSecurity(MATRIX1, ID_TRNG, SECURE_PER);
|
||||||
|
#endif /* SAMA_HAL_IS_SECURE */
|
||||||
|
/* Driver initialization.*/
|
||||||
|
TRNGD0.state = TRNG_STOP;
|
||||||
|
TRNGD0.trng = TRNG;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Configures and activates the TRNG peripheral.
|
||||||
|
*
|
||||||
|
* @param[in] trngp pointer to the @p TRNGDriver object
|
||||||
|
*
|
||||||
|
* @notapi
|
||||||
|
*/
|
||||||
|
void trng_lld_start(TRNGDriver *trngp) {
|
||||||
|
|
||||||
|
/* Configures the peripheral. */
|
||||||
|
if (trngp->state == TRNG_STOP) {
|
||||||
|
|
||||||
|
/* Enable the TRNG peripheral clock. */
|
||||||
|
pmcEnableTRNG0();
|
||||||
|
|
||||||
|
/* Enable the TRNG. */
|
||||||
|
trngp->trng->TRNG_CR = TRNG_CR_ENABLE | TRNG_CR_KEY_PASSWD;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Deactivates the TRNG peripheral.
|
||||||
|
*
|
||||||
|
* @param[in] trngp pointer to the @p TRNGDriver object
|
||||||
|
*
|
||||||
|
* @notapi
|
||||||
|
*/
|
||||||
|
void trng_lld_stop(TRNGDriver *trngp) {
|
||||||
|
|
||||||
|
if (trngp->state == TRNG_READY) {
|
||||||
|
/* Disable the TRNG. */
|
||||||
|
trngp->trng->TRNG_CR = TRNG_CR_KEY_PASSWD;
|
||||||
|
/* Disable the TRNG clock. */
|
||||||
|
pmcDisableTRNG0();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Get random number from TRNG.
|
||||||
|
*
|
||||||
|
* @param[in] trngp pointer to the @p TRNGDriver object
|
||||||
|
* @return TRNG_ODATA content of the TRNG_ODATA register
|
||||||
|
*
|
||||||
|
* @notapi
|
||||||
|
*/
|
||||||
|
uint32_t trng_lld_get_random_number(TRNGDriver *trngp) {
|
||||||
|
|
||||||
|
while (!(trngp->trng->TRNG_ISR & TRNG_ISR_DATRDY));
|
||||||
|
return trngp->trng->TRNG_ODATA;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief TRNG driver initialization.
|
||||||
|
*
|
||||||
|
* @notapi
|
||||||
|
*/
|
||||||
|
void trngInit(void) {
|
||||||
|
|
||||||
|
trng_lld_init();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Configures and activates the TRNG peripheral.
|
||||||
|
*
|
||||||
|
* @param[in] trngp pointer to the @p TRNGDriver object
|
||||||
|
*
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
void trngStart(TRNGDriver *trngp) {
|
||||||
|
|
||||||
|
osalDbgCheck(trngp != NULL);
|
||||||
|
|
||||||
|
osalSysLock();
|
||||||
|
osalDbgAssert((trngp->state == TRNG_STOP) ||
|
||||||
|
(trngp->state == TRNG_READY), "invalid state");
|
||||||
|
trng_lld_start(trngp);
|
||||||
|
trngp->state = TRNG_READY;
|
||||||
|
osalSysUnlock();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Deactivates the TRNG peripheral.
|
||||||
|
*
|
||||||
|
* @param[in] trngp pointer to the @p TRNGDriver object
|
||||||
|
*
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
void trngStop(TRNGDriver *trngp) {
|
||||||
|
|
||||||
|
osalDbgCheck(trngp != NULL);
|
||||||
|
|
||||||
|
osalSysLock();
|
||||||
|
osalDbgAssert((trngp->state == TRNG_STOP) ||
|
||||||
|
(trngp->state == TRNG_READY), "invalid state");
|
||||||
|
|
||||||
|
trng_lld_stop(trngp);
|
||||||
|
trngp->state = TRNG_STOP;
|
||||||
|
osalSysUnlock();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Get random number from TRNG.
|
||||||
|
*
|
||||||
|
* @param[in] trngp pointer to the @p CLASSDDriver object
|
||||||
|
* @return num random number generated
|
||||||
|
*
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
uint32_t trngGetRandomNumber(TRNGDriver *trngp) {
|
||||||
|
|
||||||
|
osalDbgCheck(trngp != NULL);
|
||||||
|
|
||||||
|
uint32_t num = trng_lld_get_random_number(trngp);
|
||||||
|
return num;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* HAL_USE_TRNG == TRUE */
|
||||||
|
|
||||||
|
/** @} */
|
|
@ -0,0 +1,99 @@
|
||||||
|
/*
|
||||||
|
ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
http://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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file SAMA5D2x/sama_trng.h
|
||||||
|
* @brief SAMA TRNG support macros and structures.
|
||||||
|
*
|
||||||
|
* @addtogroup SAMA5D2x_TRNG
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef SAMA_TRNG_LLD_H
|
||||||
|
#define SAMA_TRNG_LLD_H
|
||||||
|
|
||||||
|
#if (HAL_USE_TRNG) || defined(__DOXYGEN__)
|
||||||
|
|
||||||
|
/*===========================================================================*/
|
||||||
|
/* Driver constants. */
|
||||||
|
/*===========================================================================*/
|
||||||
|
|
||||||
|
/*===========================================================================*/
|
||||||
|
/* Driver pre-compile time settings. */
|
||||||
|
/*===========================================================================*/
|
||||||
|
|
||||||
|
/*===========================================================================*/
|
||||||
|
/* Derived constants and error checks. */
|
||||||
|
/*===========================================================================*/
|
||||||
|
|
||||||
|
/*===========================================================================*/
|
||||||
|
/* Driver data structures and types. */
|
||||||
|
/*===========================================================================*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Driver state machine possible states.
|
||||||
|
*/
|
||||||
|
typedef enum {
|
||||||
|
TRNG_UNINIT = 0, /**< Not initialized. */
|
||||||
|
TRNG_STOP = 1, /**< Stopped. */
|
||||||
|
TRNG_READY = 2 /**< Ready. */
|
||||||
|
} trngstate_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Type of a structure representing an CLASSD driver.
|
||||||
|
*/
|
||||||
|
typedef struct TRNGDriver TRNGDriver;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Structure representing an TRNG driver.
|
||||||
|
*/
|
||||||
|
struct TRNGDriver {
|
||||||
|
/**
|
||||||
|
* @brief Driver state.
|
||||||
|
*/
|
||||||
|
trngstate_t state;
|
||||||
|
/**
|
||||||
|
* @brief Pointer to the WDT registers block.
|
||||||
|
*/
|
||||||
|
Trng *trng;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*===========================================================================*/
|
||||||
|
/* Driver macros. */
|
||||||
|
/*===========================================================================*/
|
||||||
|
|
||||||
|
/*===========================================================================*/
|
||||||
|
/* External declarations. */
|
||||||
|
/*===========================================================================*/
|
||||||
|
|
||||||
|
extern TRNGDriver TRNGD0;
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
void trngInit(void);
|
||||||
|
void trngStart(TRNGDriver *trngp);
|
||||||
|
void trngStop(TRNGDriver *trngp);
|
||||||
|
uint32_t trngGetRandomNumber(TRNGDriver *trngp);
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* HAL_USE_TRNG */
|
||||||
|
|
||||||
|
#endif /* SAMA_TRNG_LLD_H */
|
||||||
|
|
||||||
|
/** @} */
|
Loading…
Reference in New Issue