mirror of https://github.com/ARMmbed/mbed-os.git
				
				
				
			STM32WB RNG: enable use from both M4 and M0+ core
							parent
							
								
									ffeb926a67
								
							
						
					
					
						commit
						c8737c593d
					
				| 
						 | 
				
			
			@ -28,6 +28,9 @@
 | 
			
		|||
 * Semaphores
 | 
			
		||||
 * THIS SHALL NO BE CHANGED AS THESE SEMAPHORES ARE USED AS WELL ON THE CM0+
 | 
			
		||||
 *****************************************************************************/
 | 
			
		||||
/* Index of the semaphore used to update HSI48 oscillator configuration */
 | 
			
		||||
#define CFG_HW_HSI48_SEMID                                      5
 | 
			
		||||
 | 
			
		||||
/* Index of the semaphore used to manage the entry Stop Mode procedure */
 | 
			
		||||
#define CFG_HW_ENTRY_STOP_MODE_SEMID                            4
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -67,6 +67,7 @@ void SetSysClock(void)
 | 
			
		|||
 | 
			
		||||
    __HAL_RCC_HSEM_CLK_ENABLE();
 | 
			
		||||
 | 
			
		||||
    /* This prevents the CPU2 (M0+) to configure RCC */
 | 
			
		||||
    while (LL_HSEM_1StepLock(HSEM, CFG_HW_RCC_SEMID));
 | 
			
		||||
 | 
			
		||||
    Config_HSE();
 | 
			
		||||
| 
						 | 
				
			
			@ -74,6 +75,9 @@ void SetSysClock(void)
 | 
			
		|||
    __HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW);
 | 
			
		||||
    __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
 | 
			
		||||
 | 
			
		||||
    /* This prevents the CPU2 (M0+) to disable the HSI48 oscillator */
 | 
			
		||||
    while (LL_HSEM_1StepLock(HSEM, CFG_HW_HSI48_SEMID));
 | 
			
		||||
 | 
			
		||||
    /* Initializes the CPU, AHB and APB busses clocks */
 | 
			
		||||
    RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_HSI48 | RCC_OSCILLATORTYPE_HSE | RCC_OSCILLATORTYPE_LSE;
 | 
			
		||||
    RCC_OscInitStruct.HSEState = RCC_HSE_ON;
 | 
			
		||||
| 
						 | 
				
			
			@ -101,8 +105,8 @@ void SetSysClock(void)
 | 
			
		|||
        error("HAL_RCC_ClockConfig error\n");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Initializes the peripherals clocks
 | 
			
		||||
    */
 | 
			
		||||
    /* Initializes the peripherals clocks */
 | 
			
		||||
    /* RNG needs to be configured like in M0 core, i.e. with HSI48 */
 | 
			
		||||
    PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_SMPS | RCC_PERIPHCLK_RFWAKEUP | RCC_PERIPHCLK_RNG | RCC_PERIPHCLK_USB;
 | 
			
		||||
    PeriphClkInitStruct.UsbClockSelection = RCC_USBCLKSOURCE_HSI48;
 | 
			
		||||
    PeriphClkInitStruct.RngClockSelection = RCC_RNGCLKSOURCE_HSI48;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -24,6 +24,7 @@ extern void restore_timer_ctx(void);
 | 
			
		|||
extern int serial_is_tx_ongoing(void);
 | 
			
		||||
extern void PWR_EnterStopMode(void);
 | 
			
		||||
extern void PWR_ExitStopMode(void);
 | 
			
		||||
extern void SetSysClock(void);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
extern int mbed_sdk_inited;
 | 
			
		||||
| 
						 | 
				
			
			@ -58,6 +59,9 @@ void hal_deepsleep(void)
 | 
			
		|||
    PWR_EnterStopMode();
 | 
			
		||||
    PWR_ExitStopMode();
 | 
			
		||||
 | 
			
		||||
    /* Force complete clock reconfiguration */
 | 
			
		||||
    SetSysClock();
 | 
			
		||||
 | 
			
		||||
    restore_timer_ctx();
 | 
			
		||||
 | 
			
		||||
    /* us_ticker context restored, allow HAL_GetTick() to read the us_ticker
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -25,27 +25,22 @@
 | 
			
		|||
#include "trng_api.h"
 | 
			
		||||
#include "mbed_error.h"
 | 
			
		||||
#include "mbed_atomic.h"
 | 
			
		||||
 | 
			
		||||
#if defined (TARGET_STM32WB)
 | 
			
		||||
/*  Family specific include for WB with HW semaphores */
 | 
			
		||||
#include "hw.h"
 | 
			
		||||
#include "hw_conf.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
static uint8_t users = 0;
 | 
			
		||||
 | 
			
		||||
void trng_init(trng_t *obj)
 | 
			
		||||
{
 | 
			
		||||
    uint32_t dummy;
 | 
			
		||||
 | 
			
		||||
    /*  We're only supporting a single user of RNG */
 | 
			
		||||
    if (core_util_atomic_incr_u8(&users, 1) > 1) {
 | 
			
		||||
        error("Only 1 RNG instance supported\r\n");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#if defined(RCC_PERIPHCLK_RNG) /* STM32L4 / STM32H7 / STM32WB */
 | 
			
		||||
 | 
			
		||||
#if defined(TARGET_STM32WB)
 | 
			
		||||
    /*  No need to reconfigure RngClockSelection as RNG is already clocked by M0 */
 | 
			
		||||
    /*  No need to configure RngClockSelection as already done in SetSysClock */
 | 
			
		||||
 | 
			
		||||
#elif defined(TARGET_STM32H7)
 | 
			
		||||
    RCC_PeriphCLKInitTypeDef PeriphClkInitStruct;
 | 
			
		||||
| 
						 | 
				
			
			@ -92,6 +87,7 @@ void trng_init(trng_t *obj)
 | 
			
		|||
#else
 | 
			
		||||
#error("RNG clock not configured");
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif /* defined(RCC_PERIPHCLK_RNG) */
 | 
			
		||||
 | 
			
		||||
    /* RNG Peripheral clock enable */
 | 
			
		||||
| 
						 | 
				
			
			@ -109,6 +105,7 @@ void trng_init(trng_t *obj)
 | 
			
		|||
    /*  In case RNG is a shared ressource, get the HW semaphore first */
 | 
			
		||||
    while (LL_HSEM_1StepLock(HSEM, CFG_HW_RNG_SEMID));
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    if (HAL_RNG_Init(&obj->handle) != HAL_OK) {
 | 
			
		||||
        error("trng_init: HAL_RNG_Init\n");
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -123,6 +120,7 @@ void trng_init(trng_t *obj)
 | 
			
		|||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void trng_free(trng_t *obj)
 | 
			
		||||
{
 | 
			
		||||
#if defined(CFG_HW_RNG_SEMID)
 | 
			
		||||
| 
						 | 
				
			
			@ -139,10 +137,9 @@ void trng_free(trng_t *obj)
 | 
			
		|||
    /* RNG Peripheral clock disable - assume we're the only users of RNG  */
 | 
			
		||||
    __HAL_RCC_RNG_CLK_DISABLE();
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    users = 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int trng_get_bytes(trng_t *obj, uint8_t *output, size_t length, size_t *output_length)
 | 
			
		||||
{
 | 
			
		||||
    int ret = 0;
 | 
			
		||||
| 
						 | 
				
			
			@ -154,6 +151,11 @@ int trng_get_bytes(trng_t *obj, uint8_t *output, size_t length, size_t *output_l
 | 
			
		|||
    while (LL_HSEM_1StepLock(HSEM, CFG_HW_RNG_SEMID));
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(TARGET_STM32WB)
 | 
			
		||||
    /* M0+ could have disabled RNG */
 | 
			
		||||
    __HAL_RNG_ENABLE(&obj->handle);
 | 
			
		||||
#endif // TARGET_STM32WB
 | 
			
		||||
 | 
			
		||||
    /* Get Random byte */
 | 
			
		||||
    while ((*output_length < length) && (ret == 0)) {
 | 
			
		||||
        if (HAL_RNG_GenerateRandomNumber(&obj->handle, (uint32_t *)random) != HAL_OK) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue