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;
|
||||
|
||||
/* 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_SFR, SECURE_PER);
|
||||
mtxConfigPeriphSecurity(MATRIX0, ID_L2CC, SECURE_PER);
|
||||
|
|
|
@ -505,6 +505,7 @@
|
|||
#include "sama_cache.h"
|
||||
#include "hal_tc_lld.h"
|
||||
#include "sama_secumod.h"
|
||||
#include "sama_trng.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
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/sama_matrix.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/hal_tc_lld.c \
|
||||
$(CHIBIOS)/os/hal/ports/SAMA/SAMA5D2x/hal_crypto_lld.c
|
||||
|
|
|
@ -518,6 +518,20 @@
|
|||
*/
|
||||
#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