From d866db5c5a24605aa654ff0c442dbdb55cda8f21 Mon Sep 17 00:00:00 2001 From: edolomb Date: Fri, 13 Apr 2018 13:32:58 +0000 Subject: Added TRNG driver git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@11925 110e8d01-0319-4d1e-a829-52ad28d1bb01 --- os/hal/ports/SAMA/SAMA5D2x/hal_lld.c | 3 +- os/hal/ports/SAMA/SAMA5D2x/hal_lld.h | 1 + os/hal/ports/SAMA/SAMA5D2x/platform.mk | 1 + os/hal/ports/SAMA/SAMA5D2x/sama_pmc.h | 14 +++ os/hal/ports/SAMA/SAMA5D2x/sama_trng.c | 190 +++++++++++++++++++++++++++++++++ os/hal/ports/SAMA/SAMA5D2x/sama_trng.h | 99 +++++++++++++++++ 6 files changed, 307 insertions(+), 1 deletion(-) create mode 100644 os/hal/ports/SAMA/SAMA5D2x/sama_trng.c create mode 100644 os/hal/ports/SAMA/SAMA5D2x/sama_trng.h (limited to 'os/hal') diff --git a/os/hal/ports/SAMA/SAMA5D2x/hal_lld.c b/os/hal/ports/SAMA/SAMA5D2x/hal_lld.c index f62a63dd6..030085b1b 100644 --- a/os/hal/ports/SAMA/SAMA5D2x/hal_lld.c +++ b/os/hal/ports/SAMA/SAMA5D2x/hal_lld.c @@ -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); diff --git a/os/hal/ports/SAMA/SAMA5D2x/hal_lld.h b/os/hal/ports/SAMA/SAMA5D2x/hal_lld.h index dda6e9187..0f0a4fec5 100644 --- a/os/hal/ports/SAMA/SAMA5D2x/hal_lld.h +++ b/os/hal/ports/SAMA/SAMA5D2x/hal_lld.h @@ -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" { diff --git a/os/hal/ports/SAMA/SAMA5D2x/platform.mk b/os/hal/ports/SAMA/SAMA5D2x/platform.mk index 2c1f6e15b..026f8c445 100644 --- a/os/hal/ports/SAMA/SAMA5D2x/platform.mk +++ b/os/hal/ports/SAMA/SAMA5D2x/platform.mk @@ -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 diff --git a/os/hal/ports/SAMA/SAMA5D2x/sama_pmc.h b/os/hal/ports/SAMA/SAMA5D2x/sama_pmc.h index 38ac3d069..b2160efed 100644 --- a/os/hal/ports/SAMA/SAMA5D2x/sama_pmc.h +++ b/os/hal/ports/SAMA/SAMA5D2x/sama_pmc.h @@ -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) + /** @} */ diff --git a/os/hal/ports/SAMA/SAMA5D2x/sama_trng.c b/os/hal/ports/SAMA/SAMA5D2x/sama_trng.c new file mode 100644 index 000000000..287d37403 --- /dev/null +++ b/os/hal/ports/SAMA/SAMA5D2x/sama_trng.c @@ -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 */ + +/** @} */ diff --git a/os/hal/ports/SAMA/SAMA5D2x/sama_trng.h b/os/hal/ports/SAMA/SAMA5D2x/sama_trng.h new file mode 100644 index 000000000..4eed31160 --- /dev/null +++ b/os/hal/ports/SAMA/SAMA5D2x/sama_trng.h @@ -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 */ + +/** @} */ -- cgit v1.2.3