From 72fac611f2d06475a2014438f5fa2055dbf5b599 Mon Sep 17 00:00:00 2001 From: Martin Kojtal Date: Mon, 19 Sep 2016 11:52:46 +0100 Subject: [PATCH] STM32F4/F7: Add RNG HAL implementation --- hal/targets.json | 6 +- .../TARGET_DISCO_F429ZI/objects.h | 4 ++ .../TARGET_DISCO_F469NI/objects.h | 4 ++ .../TARGET_NUCLEO_F410RB/objects.h | 4 ++ .../TARGET_NUCLEO_F429ZI/objects.h | 4 ++ .../{entropy_hardware_poll.c => rng_api.c} | 56 +++++++++---------- .../TARGET_DISCO_F746NG/objects.h | 4 ++ .../TARGET_DISCO_F769NI/objects.h | 4 ++ .../TARGET_NUCLEO_F746ZG/objects.h | 4 ++ .../TARGET_NUCLEO_F767ZI/objects.h | 3 + .../{entropy_hardware_poll.c => rng_api.c} | 56 +++++++++---------- 11 files changed, 84 insertions(+), 65 deletions(-) rename hal/targets/hal/TARGET_STM/TARGET_STM32F4/{entropy_hardware_poll.c => rng_api.c} (67%) rename hal/targets/hal/TARGET_STM/TARGET_STM32F7/{entropy_hardware_poll.c => rng_api.c} (59%) diff --git a/hal/targets.json b/hal/targets.json index 46f98efa50..b44f3d3b77 100644 --- a/hal/targets.json +++ b/hal/targets.json @@ -795,7 +795,7 @@ "progen": {"target": "nucleo-f410rb"}, "macros": ["MBEDTLS_ENTROPY_HARDWARE_ALT", "TRANSACTION_QUEUE_SIZE_SPI=2"], "detect_code": ["0740"], - "device_has": ["ANALOGIN", "ANALOGOUT", "ERROR_RED", "I2C", "I2CSLAVE", "I2C_ASYNCH", "INTERRUPTIN", "PORTIN", "PORTINOUT", "PORTOUT", "PWMOUT", "RTC", "SERIAL", "SERIAL_ASYNCH", "SERIAL_FC", "SLEEP", "SPI", "SPISLAVE", "SPI_ASYNCH", "STDIO_MESSAGES"], + "device_has": ["ANALOGIN", "ANALOGOUT", "ERROR_RED", "I2C", "I2CSLAVE", "I2C_ASYNCH", "INTERRUPTIN", "PORTIN", "PORTINOUT", "PORTOUT", "PWMOUT", "RTC", "SERIAL", "SERIAL_ASYNCH", "SERIAL_FC", "SLEEP", "SPI", "SPISLAVE", "SPI_ASYNCH", "STDIO_MESSAGES", "RNG"], "release_versions": ["2", "5"] }, "NUCLEO_F411RE": { @@ -1077,7 +1077,7 @@ "macros": ["MBEDTLS_ENTROPY_HARDWARE_ALT","DEVICE_RTC_LSI=1","TRANSACTION_QUEUE_SIZE_SPI=2"], "supported_toolchains": ["ARM", "uARM", "GCC_ARM", "IAR"], "progen": {"target": "disco-f429zi"}, - "device_has": ["ANALOGIN", "ANALOGOUT", "CAN", "ERROR_RED", "I2C", "I2CSLAVE", "I2C_ASYNCH", "INTERRUPTIN", "PORTIN", "PORTINOUT", "PORTOUT", "PWMOUT", "RTC", "SERIAL", "SERIAL_ASYNCH", "SERIAL_FC", "SLEEP", "SPI", "SPISLAVE", "SPI_ASYNCH", "STDIO_MESSAGES"], + "device_has": ["ANALOGIN", "ANALOGOUT", "CAN", "ERROR_RED", "I2C", "I2CSLAVE", "I2C_ASYNCH", "INTERRUPTIN", "PORTIN", "PORTINOUT", "PORTOUT", "PWMOUT", "RTC", "SERIAL", "SERIAL_ASYNCH", "SERIAL_FC", "SLEEP", "SPI", "SPISLAVE", "SPI_ASYNCH", "STDIO_MESSAGES", "RNG"], "release_versions": ["2", "5"] }, "DISCO_F469NI": { @@ -1090,7 +1090,7 @@ "macros": ["MBEDTLS_ENTROPY_HARDWARE_ALT","TRANSACTION_QUEUE_SIZE_SPI=2"], "progen": {"target": "disco-f469ni"}, "detect_code": ["0788"], - "device_has": ["ANALOGIN", "ANALOGOUT", "CAN", "ERROR_RED", "I2C", "I2CSLAVE", "INTERRUPTIN", "PORTIN", "PORTINOUT", "PORTOUT", "PWMOUT", "RTC", "SERIAL", "SERIAL_FC", "SLEEP", "SPI", "SPISLAVE", "STDIO_MESSAGES"], + "device_has": ["ANALOGIN", "ANALOGOUT", "CAN", "ERROR_RED", "I2C", "I2CSLAVE", "INTERRUPTIN", "PORTIN", "PORTINOUT", "PORTOUT", "PWMOUT", "RTC", "SERIAL", "SERIAL_FC", "SLEEP", "SPI", "SPISLAVE", "STDIO_MESSAGES", "RNG"], "release_versions": ["2", "5"] }, "DISCO_L053C8": { diff --git a/hal/targets/hal/TARGET_STM/TARGET_STM32F4/TARGET_DISCO_F429ZI/objects.h b/hal/targets/hal/TARGET_STM/TARGET_STM32F4/TARGET_DISCO_F429ZI/objects.h index 0abbed5d6e..b710252191 100644 --- a/hal/targets/hal/TARGET_STM/TARGET_STM32F4/TARGET_DISCO_F429ZI/objects.h +++ b/hal/targets/hal/TARGET_STM/TARGET_STM32F4/TARGET_DISCO_F429ZI/objects.h @@ -70,6 +70,10 @@ struct can_s { int index; }; +struct rng_s { + RNG_HandleTypeDef handle; +}; + #include "common_objects.h" #include "gpio_object.h" diff --git a/hal/targets/hal/TARGET_STM/TARGET_STM32F4/TARGET_DISCO_F469NI/objects.h b/hal/targets/hal/TARGET_STM/TARGET_STM32F4/TARGET_DISCO_F469NI/objects.h index 1183f54a6c..85ce8557f0 100644 --- a/hal/targets/hal/TARGET_STM/TARGET_STM32F4/TARGET_DISCO_F469NI/objects.h +++ b/hal/targets/hal/TARGET_STM/TARGET_STM32F4/TARGET_DISCO_F469NI/objects.h @@ -70,6 +70,10 @@ struct can_s { int index; }; +struct rng_s { + RNG_HandleTypeDef handle; +}; + #include "common_objects.h" #include "gpio_object.h" diff --git a/hal/targets/hal/TARGET_STM/TARGET_STM32F4/TARGET_NUCLEO_F410RB/objects.h b/hal/targets/hal/TARGET_STM/TARGET_STM32F4/TARGET_NUCLEO_F410RB/objects.h index ee8dbbf03f..f53486d2f7 100644 --- a/hal/targets/hal/TARGET_STM/TARGET_STM32F4/TARGET_NUCLEO_F410RB/objects.h +++ b/hal/targets/hal/TARGET_STM/TARGET_STM32F4/TARGET_NUCLEO_F410RB/objects.h @@ -65,6 +65,10 @@ struct dac_s { uint8_t channel; }; +struct rng_s { + RNG_HandleTypeDef handle; +}; + #include "common_objects.h" #include "gpio_object.h" diff --git a/hal/targets/hal/TARGET_STM/TARGET_STM32F4/TARGET_NUCLEO_F429ZI/objects.h b/hal/targets/hal/TARGET_STM/TARGET_STM32F4/TARGET_NUCLEO_F429ZI/objects.h index e1f877770e..563e1befcd 100644 --- a/hal/targets/hal/TARGET_STM/TARGET_STM32F4/TARGET_NUCLEO_F429ZI/objects.h +++ b/hal/targets/hal/TARGET_STM/TARGET_STM32F4/TARGET_NUCLEO_F429ZI/objects.h @@ -70,6 +70,10 @@ struct can_s { int index; }; +struct rng_s { + RNG_HandleTypeDef handle; +}; + #include "gpio_object.h" #include "common_objects.h" diff --git a/hal/targets/hal/TARGET_STM/TARGET_STM32F4/entropy_hardware_poll.c b/hal/targets/hal/TARGET_STM/TARGET_STM32F4/rng_api.c similarity index 67% rename from hal/targets/hal/TARGET_STM/TARGET_STM32F4/entropy_hardware_poll.c rename to hal/targets/hal/TARGET_STM/TARGET_STM32F4/rng_api.c index 7673491cc9..1fbe730be2 100644 --- a/hal/targets/hal/TARGET_STM/TARGET_STM32F4/entropy_hardware_poll.c +++ b/hal/targets/hal/TARGET_STM/TARGET_STM32F4/rng_api.c @@ -25,58 +25,52 @@ defined(TARGET_STM32F479xx) #include #include "cmsis.h" - -/* RNG handler declaration */ -RNG_HandleTypeDef RngHandle; - +#include "rng_api.h" /** rng_get_byte * @brief Get one byte of entropy from the RNG, assuming it is up and running. * @param pointer to the hardware generated random byte. */ -static void rng_get_byte( unsigned char *byte ) +static void rng_get_byte(rng_t *obj, unsigned char *byte ) { - *byte = (unsigned char)HAL_RNG_GetRandomNumber(&RngHandle); + *byte = (unsigned char)HAL_RNG_GetRandomNumber(&obj->handle); } - -/** mbedtls_hardware_poll - * @brief Get len bytes of entropy from the hardware RNG. - * @param data pointer will be NULL - * @param output pointer to the random generated bytes buffer - * @param len input is the requested length of bytes to be generated - * @param olen is the pointer to the length of bytes effectively generated - * @returns 0 if the generation went well. -1 in case of error - */ -int mbedtls_hardware_poll( void *data, unsigned char *output, size_t len, size_t *olen ) +void rng_init(rng_t *obj) { - int ret; - ((void) data); - /* RNG Peripheral clock enable */ __HAL_RCC_RNG_CLK_ENABLE(); /* Initialize RNG instance */ - RngHandle.Instance = RNG; - HAL_RNG_Init(&RngHandle); + obj->handle.Instance = RNG; + HAL_RNG_Init(&obj->handle); + +} + +void rng_free(rng_t *obj) +{ + /*Disable the RNG peripheral */ + HAL_RNG_DeInit(&obj->handle); + /* RNG Peripheral clock disable - assume we're the only users of RNG */ + __HAL_RCC_RNG_CLK_DISABLE(); +} + +int rng_get_numbers(rng_t *obj, uint8_t *output, size_t length, size_t *output_length) +{ + int ret; /* Get Random byte */ - for( uint32_t i = 0; i < len; i++ ){ - rng_get_byte( output + i ); - + for( uint32_t i = 0; i < length; i++ ){ + rng_get_byte(obj, output + i ); } - *olen = len; + + *output_length = length; /* Just be extra sure that we didn't do it wrong */ - if( ( __HAL_RNG_GET_FLAG(&RngHandle, (RNG_FLAG_CECS|RNG_FLAG_SECS)) ) != 0 ) { + if( ( __HAL_RNG_GET_FLAG(&obj->handle, (RNG_FLAG_CECS | RNG_FLAG_SECS)) ) != 0 ) { ret = -1; } else { ret = 0; } - /*Disable the RNG peripheral */ - HAL_RNG_DeInit(&RngHandle); - /* RNG Peripheral clock disable - assume we're the only users of RNG */ - __HAL_RCC_RNG_CLK_DISABLE(); - return( ret ); } diff --git a/hal/targets/hal/TARGET_STM/TARGET_STM32F7/TARGET_DISCO_F746NG/objects.h b/hal/targets/hal/TARGET_STM/TARGET_STM32F7/TARGET_DISCO_F746NG/objects.h index b09fb7fce2..b8f03b319e 100644 --- a/hal/targets/hal/TARGET_STM/TARGET_STM32F7/TARGET_DISCO_F746NG/objects.h +++ b/hal/targets/hal/TARGET_STM/TARGET_STM32F7/TARGET_DISCO_F746NG/objects.h @@ -90,6 +90,10 @@ struct can_s { int index; }; +struct rng_s { + RNG_HandleTypeDef handle; +}; + #include "common_objects.h" #include "gpio_object.h" diff --git a/hal/targets/hal/TARGET_STM/TARGET_STM32F7/TARGET_DISCO_F769NI/objects.h b/hal/targets/hal/TARGET_STM/TARGET_STM32F7/TARGET_DISCO_F769NI/objects.h index c65f22c258..a1a0675269 100644 --- a/hal/targets/hal/TARGET_STM/TARGET_STM32F7/TARGET_DISCO_F769NI/objects.h +++ b/hal/targets/hal/TARGET_STM/TARGET_STM32F7/TARGET_DISCO_F769NI/objects.h @@ -90,6 +90,10 @@ struct can_s { int index; }; +struct rng_s { + RNG_HandleTypeDef handle; +}; + #include "gpio_object.h" #include "common_objects.h" diff --git a/hal/targets/hal/TARGET_STM/TARGET_STM32F7/TARGET_NUCLEO_F746ZG/objects.h b/hal/targets/hal/TARGET_STM/TARGET_STM32F7/TARGET_NUCLEO_F746ZG/objects.h index a7b920b900..eb7c0345d2 100644 --- a/hal/targets/hal/TARGET_STM/TARGET_STM32F7/TARGET_NUCLEO_F746ZG/objects.h +++ b/hal/targets/hal/TARGET_STM/TARGET_STM32F7/TARGET_NUCLEO_F746ZG/objects.h @@ -90,6 +90,10 @@ struct can_s { int index; }; +struct rng_s { + RNG_HandleTypeDef handle; +}; + #include "common_objects.h" #include "gpio_object.h" diff --git a/hal/targets/hal/TARGET_STM/TARGET_STM32F7/TARGET_NUCLEO_F767ZI/objects.h b/hal/targets/hal/TARGET_STM/TARGET_STM32F7/TARGET_NUCLEO_F767ZI/objects.h index 0c2f3fd453..a1a0675269 100644 --- a/hal/targets/hal/TARGET_STM/TARGET_STM32F7/TARGET_NUCLEO_F767ZI/objects.h +++ b/hal/targets/hal/TARGET_STM/TARGET_STM32F7/TARGET_NUCLEO_F767ZI/objects.h @@ -90,6 +90,9 @@ struct can_s { int index; }; +struct rng_s { + RNG_HandleTypeDef handle; +}; #include "gpio_object.h" #include "common_objects.h" diff --git a/hal/targets/hal/TARGET_STM/TARGET_STM32F7/entropy_hardware_poll.c b/hal/targets/hal/TARGET_STM/TARGET_STM32F7/rng_api.c similarity index 59% rename from hal/targets/hal/TARGET_STM/TARGET_STM32F7/entropy_hardware_poll.c rename to hal/targets/hal/TARGET_STM/TARGET_STM32F7/rng_api.c index 4b777fb243..32edd5f7cf 100644 --- a/hal/targets/hal/TARGET_STM/TARGET_STM32F7/entropy_hardware_poll.c +++ b/hal/targets/hal/TARGET_STM/TARGET_STM32F7/rng_api.c @@ -21,58 +21,52 @@ #include #include "cmsis.h" - -/* RNG handler declaration */ -RNG_HandleTypeDef RngHandle; - +#include "rng_api.h" /** rng_get_byte * @brief Get one byte of entropy from the RNG, assuming it is up and running. * @param pointer to the hardware generated random byte. */ -static void rng_get_byte( unsigned char *byte ) +static void rng_get_byte(rng_t *obj, unsigned char *byte ) { - *byte = (unsigned char)HAL_RNG_GetRandomNumber(&RngHandle); + *byte = (unsigned char)HAL_RNG_GetRandomNumber(&obj->handle); } - -/** mbedtls_hardware_poll - * @brief Get len bytes of entropy from the hardware RNG. - * @param data pointer will be NULL - * @param output pointer to the random generated bytes buffer - * @param len input is the requested length of bytes to be generated - * @param olen is the pointer to the length of bytes effectively generated - * @returns 0 if the generation went well. -1 in case of error - */ -int mbedtls_hardware_poll( void *data, unsigned char *output, size_t len, size_t *olen ) +void rng_init(rng_t *obj) { - int ret; - ((void) data); - /* RNG Peripheral clock enable */ __HAL_RCC_RNG_CLK_ENABLE(); /* Initialize RNG instance */ - RngHandle.Instance = RNG; - HAL_RNG_Init(&RngHandle); + obj->handle.Instance = RNG; + HAL_RNG_Init(&obj->handle); + +} + +void rng_free(rng_t *obj) +{ + /*Disable the RNG peripheral */ + HAL_RNG_DeInit(&obj->handle); + /* RNG Peripheral clock disable - assume we're the only users of RNG */ + __HAL_RCC_RNG_CLK_DISABLE(); +} + +int rng_get_numbers(rng_t *obj, uint8_t *output, size_t length, size_t *output_length) +{ + int ret; /* Get Random byte */ - for( uint32_t i = 0; i < len; i++ ){ - rng_get_byte( output + i ); - + for( uint32_t i = 0; i < length; i++ ){ + rng_get_byte(obj, output + i ); } - *olen = len; + + *output_length = length; /* Just be extra sure that we didn't do it wrong */ - if( ( __HAL_RNG_GET_FLAG(&RngHandle, (RNG_FLAG_CECS|RNG_FLAG_SECS)) ) != 0 ) { + if( ( __HAL_RNG_GET_FLAG(&obj->handle, (RNG_FLAG_CECS | RNG_FLAG_SECS)) ) != 0 ) { ret = -1; } else { ret = 0; } - /*Disable the RNG peripheral */ - HAL_RNG_DeInit(&RngHandle); - /* RNG Peripheral clock disable - assume we're the only users of RNG */ - __HAL_RCC_RNG_CLK_DISABLE(); - return( ret ); }