aboutsummaryrefslogtreecommitdiffstats
path: root/os/hal/ports
diff options
context:
space:
mode:
Diffstat (limited to 'os/hal/ports')
-rw-r--r--os/hal/ports/SAMA/SAMA5D2x/hal_lld.c3
-rw-r--r--os/hal/ports/SAMA/SAMA5D2x/hal_lld.h1
-rw-r--r--os/hal/ports/SAMA/SAMA5D2x/platform.mk1
-rw-r--r--os/hal/ports/SAMA/SAMA5D2x/sama_pmc.h14
-rw-r--r--os/hal/ports/SAMA/SAMA5D2x/sama_trng.c190
-rw-r--r--os/hal/ports/SAMA/SAMA5D2x/sama_trng.h99
6 files changed, 307 insertions, 1 deletions
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 */
+
+/** @} */