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:
edolomb 2018-04-13 13:32:58 +00:00
parent c48f153ade
commit d866db5c5a
6 changed files with 307 additions and 1 deletions

View File

@ -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);

View File

@ -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" {

View File

@ -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

View File

@ -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)
/** @} */

View File

@ -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 */
/** @} */

View File

@ -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 */
/** @} */