All H/W RNG Drivers: Can now be configured to register as /dev/random and/or /dev/urandom
This commit is contained in:
parent
1660329d06
commit
078bbe5e5c
@ -59,6 +59,9 @@
|
||||
#include "sam_periphclks.h"
|
||||
#include "sam_trng.h"
|
||||
|
||||
#if defined(CONFIG_SAMA5_TRNG)
|
||||
#if defined(CONFIG_DEV_RANDOM) || defined(CONFIG_DEV_URANDOM_ARCH)
|
||||
|
||||
/****************************************************************************
|
||||
* Private Function Prototypes
|
||||
****************************************************************************/
|
||||
@ -325,14 +328,10 @@ errout:
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Public Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: devrandom_register
|
||||
* Name: sam_rng_initialize
|
||||
*
|
||||
* Description:
|
||||
* Initialize the TRNG hardware and register the /dev/random driver.
|
||||
* Initialize the TRNG hardware.
|
||||
*
|
||||
* Input Parameters:
|
||||
* None
|
||||
@ -342,7 +341,7 @@ errout:
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
int devrandom_register(void)
|
||||
static int sam_rng_initialize(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
@ -375,17 +374,78 @@ int devrandom_register(void)
|
||||
|
||||
putreg32(TRNG_CR_DISABLE | TRNG_CR_KEY, SAM_TRNG_CR);
|
||||
|
||||
/* Register the character driver */
|
||||
|
||||
ret = register_driver("/dev/random", &g_trngops, 0644, NULL);
|
||||
if (ret < 0)
|
||||
{
|
||||
ferr("ERROR: Failed to register /dev/random\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Enable the TRNG interrupt at the AIC */
|
||||
|
||||
up_enable_irq(SAM_IRQ_TRNG);
|
||||
return OK;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Public Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: devrandom_register
|
||||
*
|
||||
* Description:
|
||||
* Initialize the TRNG hardware and register the /dev/random driver.
|
||||
* Must be called BEFORE devurandom_register.
|
||||
*
|
||||
* Input Parameters:
|
||||
* None
|
||||
*
|
||||
* Returned Value:
|
||||
* None
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#ifdef CONFIG_DEV_RANDOM
|
||||
int devrandom_register(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = sam_rng_initialize();
|
||||
if (ret >= 0)
|
||||
{
|
||||
ret = register_driver("/dev/random", &g_trngops, 0644, NULL);
|
||||
if (ret < 0)
|
||||
{
|
||||
ferr("ERROR: Failed to register /dev/random\n");
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Name: devurandom_register
|
||||
*
|
||||
* Description:
|
||||
* Register /dev/urandom
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#ifdef CONFIG_DEV_URANDOM_ARCH
|
||||
int devurandom_register(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
#ifndef CONFIG_DEV_RANDOM
|
||||
ret = sam_rng_initialize();
|
||||
if (ret >= 0)
|
||||
#endif
|
||||
{
|
||||
ret = register_driver("/dev/urandom", &g_trngops, 0644, NULL);
|
||||
if (ret < 0)
|
||||
{
|
||||
ferr("ERROR: Failed to register /dev/urandom\n");
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* CONFIG_DEV_RANDOM || CONFIG_DEV_URANDOM_ARCH */
|
||||
#endif /* CONFIG_SAMA5_TRNG */
|
||||
|
@ -60,6 +60,9 @@
|
||||
#include "sam_periphclks.h"
|
||||
#include "sam_trng.h"
|
||||
|
||||
#if defined(CONFIG_SAMV7_TRNG)
|
||||
#if defined(CONFIG_DEV_RANDOM) || defined(CONFIG_DEV_URANDOM_ARCH)
|
||||
|
||||
/****************************************************************************
|
||||
* Private Function Prototypes
|
||||
****************************************************************************/
|
||||
@ -326,14 +329,10 @@ errout:
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Public Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: devrandom_register
|
||||
* Name: sam_rng_initialize
|
||||
*
|
||||
* Description:
|
||||
* Initialize the TRNG hardware and register the /dev/random driver.
|
||||
* Initialize the TRNG hardware.
|
||||
*
|
||||
* Input Parameters:
|
||||
* None
|
||||
@ -343,7 +342,7 @@ errout:
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
int devrandom_register(void)
|
||||
static int sam_rng_initialize(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
@ -376,17 +375,77 @@ int devrandom_register(void)
|
||||
|
||||
putreg32(TRNG_CR_DISABLE | TRNG_CR_KEY, SAM_TRNG_CR);
|
||||
|
||||
/* Register the character driver */
|
||||
|
||||
ret = register_driver("/dev/random", &g_trngops, 0644, NULL);
|
||||
if (ret < 0)
|
||||
{
|
||||
ferr("ERROR: Failed to register /dev/random\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Enable the TRNG interrupt at the AIC */
|
||||
|
||||
up_enable_irq(SAM_IRQ_TRNG);
|
||||
return OK;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Public Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: devrandom_register
|
||||
*
|
||||
* Description:
|
||||
* Initialize the TRNG hardware and register the /dev/random driver.
|
||||
* Must be called BEFORE devurandom_register.
|
||||
*
|
||||
* Input Parameters:
|
||||
* None
|
||||
*
|
||||
* Returned Value:
|
||||
* None
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#ifdef CONFIG_DEV_RANDOM
|
||||
int devrandom_register(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = sam_rng_initialize();
|
||||
if (ret >= 0)
|
||||
{
|
||||
ret = register_driver("/dev/random", &g_trngops, 0644, NULL);
|
||||
if (ret < 0)
|
||||
{
|
||||
ferr("ERROR: Failed to register /dev/random\n");
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Name: devurandom_register
|
||||
*
|
||||
* Description:
|
||||
* Register /dev/urandom
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#ifdef CONFIG_DEV_URANDOM_ARCH
|
||||
int devurandom_register(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
#ifndef CONFIG_DEV_RANDOM
|
||||
ret = sam_rng_initialize();
|
||||
if (ret >= 0)
|
||||
#endif
|
||||
{
|
||||
ret = register_driver("/dev/urandom", &g_trngops, 0644, NULL);
|
||||
if (ret < 0)
|
||||
{
|
||||
ferr("ERROR: Failed to register /dev/urandom\n");
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* CONFIG_DEV_RANDOM || CONFIG_DEV_URANDOM_ARCH */
|
||||
|
@ -51,11 +51,14 @@
|
||||
#include "chip/stm32_rng.h"
|
||||
#include "up_internal.h"
|
||||
|
||||
#if defined(CONFIG_STM32_RNG)
|
||||
#if defined(CONFIG_DEV_RANDOM) || defined(CONFIG_DEV_URANDOM_ARCH)
|
||||
|
||||
/****************************************************************************
|
||||
* Private Function Prototypes
|
||||
****************************************************************************/
|
||||
|
||||
static int stm32_rnginitialize(void);
|
||||
static int stm32_rng_initialize(void);
|
||||
static int stm32_interrupt(int irq, void *context);
|
||||
static void stm32_enable(void);
|
||||
static void stm32_disable(void);
|
||||
@ -98,7 +101,7 @@ static const struct file_operations g_rngops =
|
||||
* Private functions
|
||||
****************************************************************************/
|
||||
|
||||
static int stm32_rnginitialize()
|
||||
static int stm32_rng_initialize()
|
||||
{
|
||||
uint32_t regval;
|
||||
|
||||
@ -263,6 +266,7 @@ static ssize_t stm32_read(struct file *filep, char *buffer, size_t buflen)
|
||||
*
|
||||
* Description:
|
||||
* Initialize the RNG hardware and register the /dev/random driver.
|
||||
* Must be called BEFORE devurandom_register.
|
||||
*
|
||||
* Input Parameters:
|
||||
* None
|
||||
@ -272,8 +276,31 @@ static ssize_t stm32_read(struct file *filep, char *buffer, size_t buflen)
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#ifdef CONFIG_DEV_RANDOM
|
||||
int devrandom_register(void)
|
||||
{
|
||||
stm32_rnginitialize();
|
||||
stm32_rng_initialize();
|
||||
return register_driver("/dev/random", &g_rngops, 0444, NULL);
|
||||
}
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Name: devurandom_register
|
||||
*
|
||||
* Description:
|
||||
* Register /dev/urandom
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#ifdef CONFIG_DEV_URANDOM_ARCH
|
||||
int devurandom_register(void)
|
||||
{
|
||||
#ifndef CONFIG_DEV_RANDOM
|
||||
stm32l4_rnginitialize();
|
||||
#endif
|
||||
return register_driver("/dev/urandom", &g_rngops, 0444, NULL);
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* CONFIG_DEV_RANDOM || CONFIG_DEV_URANDOM_ARCH */
|
||||
#endif /* CONFIG_STM32_RNG */
|
||||
|
@ -52,13 +52,14 @@
|
||||
#include "chip/stm32l4_rng.h"
|
||||
#include "up_internal.h"
|
||||
|
||||
#ifdef CONFIG_STM32L4_RNG
|
||||
#if defined(CONFIG_STM32L4_RNG)
|
||||
#if defined(CONFIG_DEV_RANDOM) || defined(CONFIG_DEV_URANDOM_ARCH)
|
||||
|
||||
/****************************************************************************
|
||||
* Private Function Prototypes
|
||||
****************************************************************************/
|
||||
|
||||
static int stm32l4_rnginitialize(void);
|
||||
static int stm32l4_rng_initialize(void);
|
||||
static int stm32l4_rnginterrupt(int irq, void *context);
|
||||
static void stm32l4_rngenable(void);
|
||||
static void stm32l4_rngdisable(void);
|
||||
@ -105,7 +106,7 @@ static const struct file_operations g_rngops =
|
||||
* Private functions
|
||||
****************************************************************************/
|
||||
|
||||
static int stm32l4_rnginitialize(void)
|
||||
static int stm32l4_rng_initialize(void)
|
||||
{
|
||||
_info("Initializing RNG\n");
|
||||
|
||||
@ -294,6 +295,7 @@ static ssize_t stm32l4_rngread(struct file *filep, char *buffer, size_t buflen)
|
||||
*
|
||||
* Description:
|
||||
* Initialize the RNG hardware and register the /dev/random driver.
|
||||
* Must be called BEFORE devurandom_register.
|
||||
*
|
||||
* Input Parameters:
|
||||
* None
|
||||
@ -303,10 +305,31 @@ static ssize_t stm32l4_rngread(struct file *filep, char *buffer, size_t buflen)
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#ifdef CONFIG_DEV_RANDOM
|
||||
int devrandom_register(void)
|
||||
{
|
||||
stm32l4_rnginitialize();
|
||||
stm32l4_rng_initialize();
|
||||
return register_driver("/dev/random", &g_rngops, 0444, NULL);
|
||||
}
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Name: devurandom_register
|
||||
*
|
||||
* Description:
|
||||
* Register /dev/urandom
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#ifdef CONFIG_DEV_URANDOM_ARCH
|
||||
int devurandom_register(void)
|
||||
{
|
||||
#ifndef CONFIG_DEV_RANDOM
|
||||
stm32l4_rng_initialize();
|
||||
#endif
|
||||
return register_driver("/dev/urandom", &g_rngops, 0444, NULL);
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* CONFIG_DEV_RANDOM || CONFIG_DEV_URANDOM_ARCH */
|
||||
#endif /* CONFIG_STM32L4_RNG */
|
||||
|
Loading…
Reference in New Issue
Block a user