Skip to content

Commit b6dbd65

Browse files
authored
Merge pull request #7 from AlexLanzano/rng
[stm32wb_rng, rng] Implement RNG device type. Implement RNG driver ad test for stm32wb
2 parents ffdd733 + d615ebf commit b6dbd65

17 files changed

Lines changed: 471 additions & 1 deletion

File tree

examples/stm32wb/stm32wb55xx_nucleo.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,3 +146,12 @@ whal_Spi g_whalSpi = {
146146
.clk = &(whal_Stm32wbRcc_Clk) {WHAL_STM32WB55_SPI1_CLOCK},
147147
},
148148
};
149+
150+
whal_Rng g_whalRng = {
151+
WHAL_STM32WB55_RNG_DEVICE,
152+
153+
.cfg = &(whal_Stm32wbRng_Cfg) {
154+
.clkCtrl = &g_whalClock,
155+
.clk = &(whal_Stm32wbRcc_Clk) {WHAL_STM32WB55_RNG_CLOCK},
156+
},
157+
};

examples/stm32wb/stm32wb55xx_nucleo.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,4 +37,7 @@ extern whal_Flash g_whalFlash;
3737
/* SPI controller instance. */
3838
extern whal_Spi g_whalSpi;
3939

40+
/* RNG instance. */
41+
extern whal_Rng g_whalRng;
42+
4043
#endif /* STM32WB55XX_NUCLEO_H */

src/clock/stm32wb_rcc.c

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
/* Clock Control Register - oscillator enables and status */
1919
#define ST_RCC_CR_REG 0x000
2020
#define ST_RCC_CR_MSIRANGE WHAL_MASK_RANGE(7, 4) /* MSI frequency range */
21+
#define ST_RCC_CR_HSION_MASK WHAL_MASK(8) /* HSI enable */
2122
#define ST_RCC_CR_PLLON_MASK WHAL_MASK(24) /* PLL enable */
2223

2324
/* Clock Configuration Register - clock source and prescaler selection */
@@ -73,6 +74,11 @@
7374
#define ST_RCC_APB1ENR2_LPUART1EN WHAL_MASK(0) /* LPUART1 clock enable */
7475
#define ST_RCC_APB1ENR2_LPTIM2EN WHAL_MASK(5) /* LPTIM2 clock enable */
7576

77+
/* Clock Recovery RC Register - HSI48 oscillator control */
78+
#define ST_RCC_CRRCR_REG 0x098
79+
#define ST_RCC_CRRCR_HSI48ON_MASK WHAL_MASK(0) /* HSI48 oscillator enable */
80+
#define ST_RCC_CRRCR_HSI48RDY_MASK WHAL_MASK(1) /* HSI48 oscillator ready */
81+
7682
whal_Error whal_Stm32wbRccPll_Init(whal_Clock *clkDev)
7783
{
7884
whal_Error err;
@@ -303,6 +309,27 @@ whal_Error whal_Stm32wbRccMsi_GetRate(whal_Clock *clkDev, size_t *rateOut)
303309

304310
return WHAL_SUCCESS;
305311
}
312+
313+
whal_Error whal_Stm32wbRcc_Ext_EnableHsi48(whal_Clock *clkDev, uint8_t enable)
314+
{
315+
if (!clkDev) {
316+
return WHAL_EINVAL;
317+
}
318+
319+
whal_Reg_Update(clkDev->regmap.base, ST_RCC_CRRCR_REG, ST_RCC_CRRCR_HSI48ON_MASK,
320+
whal_SetBits(ST_RCC_CRRCR_HSI48ON_MASK, enable));
321+
322+
if (enable) {
323+
size_t rdy;
324+
do {
325+
whal_Reg_Get(clkDev->regmap.base, ST_RCC_CRRCR_REG,
326+
ST_RCC_CRRCR_HSI48RDY_MASK, &rdy);
327+
} while (!rdy);
328+
}
329+
330+
return WHAL_SUCCESS;
331+
}
332+
306333
const whal_ClockDriver whal_Stm32wbRccPll_Driver = {
307334
.Init = whal_Stm32wbRccPll_Init,
308335
.Deinit = whal_Stm32wbRccPll_Deinit,

src/rng/rng.c

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
#include <stdint.h>
2+
#include <wolfHAL/rng/rng.h>
3+
#include <wolfHAL/error.h>
4+
5+
inline whal_Error whal_Rng_Init(whal_Rng *rngDev)
6+
{
7+
if (!rngDev || !rngDev->driver || !rngDev->driver->Init) {
8+
return WHAL_EINVAL;
9+
}
10+
11+
return rngDev->driver->Init(rngDev);
12+
}
13+
14+
inline whal_Error whal_Rng_Deinit(whal_Rng *rngDev)
15+
{
16+
if (!rngDev || !rngDev->driver || !rngDev->driver->Deinit) {
17+
return WHAL_EINVAL;
18+
}
19+
20+
return rngDev->driver->Deinit(rngDev);
21+
}
22+
23+
inline whal_Error whal_Rng_Generate(whal_Rng *rngDev, uint8_t *rngData, size_t rngDataSz)
24+
{
25+
if (!rngDev || !rngDev->driver || !rngDev->driver->Generate || !rngData) {
26+
return WHAL_EINVAL;
27+
}
28+
29+
return rngDev->driver->Generate(rngDev, rngData, rngDataSz);
30+
}

src/rng/stm32wb_rng.c

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
#include <stdint.h>
2+
#include <wolfHAL/rng/stm32wb_rng.h>
3+
#include <wolfHAL/rng/rng.h>
4+
#include <wolfHAL/clock/clock.h>
5+
#include <wolfHAL/error.h>
6+
#include <wolfHAL/regmap.h>
7+
#include <wolfHAL/bitops.h>
8+
9+
/*
10+
* STM32WB RNG Register Definitions
11+
*
12+
* The RNG peripheral uses an analog noise source to produce 32-bit
13+
* random values. One value is available at a time in DR, signaled
14+
* by the DRDY flag in SR.
15+
*/
16+
17+
/* Control Register */
18+
#define SRNG_CR_REG 0x00
19+
#define SRNG_CR_RNGEN WHAL_MASK(2) /* RNG enable */
20+
#define SRNG_CR_CED WHAL_MASK(5) /* Clock error detection disable */
21+
22+
/* Status Register */
23+
#define SRNG_SR_REG 0x04
24+
#define SRNG_SR_DRDY WHAL_MASK(0) /* Data ready */
25+
#define SRNG_SR_CECS WHAL_MASK(1) /* Clock error current status */
26+
#define SRNG_SR_SECS WHAL_MASK(2) /* Seed error current status */
27+
#define SRNG_SR_CEIS WHAL_MASK(5) /* Clock error interrupt status */
28+
#define SRNG_SR_SEIS WHAL_MASK(6) /* Seed error interrupt status */
29+
30+
/* Data Register - 32-bit random value */
31+
#define SRNG_DR_REG 0x08
32+
33+
whal_Error whal_Stm32wbRng_Init(whal_Rng *rngDev)
34+
{
35+
whal_Error err;
36+
whal_Stm32wbRng_Cfg *cfg;
37+
38+
if (!rngDev || !rngDev->cfg) {
39+
return WHAL_EINVAL;
40+
}
41+
42+
cfg = (whal_Stm32wbRng_Cfg *)rngDev->cfg;
43+
44+
err = whal_Clock_Enable(cfg->clkCtrl, cfg->clk);
45+
if (err != WHAL_SUCCESS) {
46+
return err;
47+
}
48+
49+
return WHAL_SUCCESS;
50+
}
51+
52+
whal_Error whal_Stm32wbRng_Deinit(whal_Rng *rngDev)
53+
{
54+
whal_Error err;
55+
56+
if (!rngDev || !rngDev->cfg) {
57+
return WHAL_EINVAL;
58+
}
59+
60+
whal_Stm32wbRng_Cfg *cfg = (whal_Stm32wbRng_Cfg *)rngDev->cfg;
61+
62+
err = whal_Clock_Disable(cfg->clkCtrl, cfg->clk);
63+
if (err) {
64+
return err;
65+
}
66+
67+
return WHAL_SUCCESS;
68+
}
69+
70+
whal_Error whal_Stm32wbRng_Generate(whal_Rng *rngDev, uint8_t *rngData, size_t rngDataSz)
71+
{
72+
if (!rngDev || !rngData) {
73+
return WHAL_EINVAL;
74+
}
75+
76+
whal_Error err = WHAL_SUCCESS;
77+
const whal_Regmap *reg = &rngDev->regmap;
78+
size_t status;
79+
size_t offset = 0;
80+
81+
/* Enable the RNG peripheral */
82+
whal_Reg_Update(reg->base, SRNG_CR_REG, SRNG_CR_RNGEN,
83+
whal_SetBits(SRNG_CR_RNGEN, 1));
84+
85+
while (offset < rngDataSz) {
86+
/* Wait for a random value to be ready */
87+
do {
88+
/* Check for seed or clock error */
89+
whal_Reg_Get(reg->base, SRNG_SR_REG, SRNG_SR_SECS, &status);
90+
if (status) {
91+
err = WHAL_EHARDWARE;
92+
goto exit;
93+
}
94+
whal_Reg_Get(reg->base, SRNG_SR_REG, SRNG_SR_CECS, &status);
95+
if (status) {
96+
err = WHAL_EHARDWARE;
97+
goto exit;
98+
}
99+
100+
whal_Reg_Get(reg->base, SRNG_SR_REG, SRNG_SR_DRDY, &status);
101+
} while (!status);
102+
103+
/* Read 32-bit random value */
104+
uint32_t rnd = *(volatile uint32_t *)(reg->base + SRNG_DR_REG);
105+
106+
/* Copy bytes into output buffer */
107+
for (size_t i = 0; i < 4 && offset < rngDataSz; i++, offset++) {
108+
rngData[offset] = (uint8_t)(rnd >> (i * 8));
109+
}
110+
}
111+
112+
exit:
113+
/* Disable the RNG peripheral */
114+
whal_Reg_Update(reg->base, SRNG_CR_REG, SRNG_CR_RNGEN,
115+
whal_SetBits(SRNG_CR_RNGEN, 0));
116+
117+
return err;
118+
}
119+
120+
const whal_RngDriver whal_Stm32wbRng_Driver = {
121+
.Init = whal_Stm32wbRng_Init,
122+
.Deinit = whal_Stm32wbRng_Deinit,
123+
.Generate = whal_Stm32wbRng_Generate,
124+
};

tests/sim/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ WHAL_SRC = $(WHAL_DIR)/src/clock/clock.c \
1313
$(WHAL_DIR)/src/flash/flash.c \
1414
$(WHAL_DIR)/src/timer/timer.c \
1515
$(WHAL_DIR)/src/spi/spi.c \
16+
$(WHAL_DIR)/src/rng/rng.c \
1617
$(WHAL_DIR)/src/supply/supply.c
1718

1819
SOURCE = $(TEST_SRC) $(WHAL_SRC)

tests/sim/test_dispatch.c

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#include <stdint.h>
22
#include <wolfHAL/wolfHAL.h>
33
#include <wolfHAL/timer/timer.h>
4+
#include <wolfHAL/rng/rng.h>
45
#include "../test.h"
56

67
/*
@@ -78,6 +79,16 @@ static const whal_TimerDriver mockTimerDriver = {
7879
.Reset = mockTimerReset,
7980
};
8081

82+
static whal_Error mockRngInit(whal_Rng *d) { (void)d; return WHAL_SUCCESS; }
83+
static whal_Error mockRngDeinit(whal_Rng *d) { (void)d; return WHAL_SUCCESS; }
84+
static whal_Error mockRngGenerate(whal_Rng *d, uint8_t *data, size_t sz) { (void)d; (void)data; (void)sz; return WHAL_SUCCESS; }
85+
86+
static const whal_RngDriver mockRngDriver = {
87+
.Init = mockRngInit,
88+
.Deinit = mockRngDeinit,
89+
.Generate = mockRngGenerate,
90+
};
91+
8192
/* --- Clock dispatch tests --- */
8293

8394
static void test_clock_null_dev(void)
@@ -222,6 +233,31 @@ static void test_timer_valid_dispatch(void)
222233
WHAL_ASSERT_EQ(whal_Timer_Reset(&dev), WHAL_SUCCESS);
223234
}
224235

236+
/* --- RNG dispatch tests --- */
237+
238+
static void test_rng_null_dev(void)
239+
{
240+
uint8_t buf[1];
241+
WHAL_ASSERT_EQ(whal_Rng_Init(NULL), WHAL_EINVAL);
242+
WHAL_ASSERT_EQ(whal_Rng_Deinit(NULL), WHAL_EINVAL);
243+
WHAL_ASSERT_EQ(whal_Rng_Generate(NULL, buf, 1), WHAL_EINVAL);
244+
}
245+
246+
static void test_rng_null_driver(void)
247+
{
248+
whal_Rng dev = { .driver = NULL };
249+
WHAL_ASSERT_EQ(whal_Rng_Init(&dev), WHAL_EINVAL);
250+
}
251+
252+
static void test_rng_valid_dispatch(void)
253+
{
254+
whal_Rng dev = { .driver = &mockRngDriver };
255+
WHAL_ASSERT_EQ(whal_Rng_Init(&dev), WHAL_SUCCESS);
256+
uint8_t buf[4] = {0};
257+
WHAL_ASSERT_EQ(whal_Rng_Generate(&dev, buf, sizeof(buf)), WHAL_SUCCESS);
258+
WHAL_ASSERT_EQ(whal_Rng_Deinit(&dev), WHAL_SUCCESS);
259+
}
260+
225261
void test_dispatch(void)
226262
{
227263
WHAL_TEST_SUITE_START("dispatch");
@@ -241,5 +277,8 @@ void test_dispatch(void)
241277
WHAL_TEST(test_timer_null_dev);
242278
WHAL_TEST(test_timer_null_driver);
243279
WHAL_TEST(test_timer_valid_dispatch);
280+
WHAL_TEST(test_rng_null_dev);
281+
WHAL_TEST(test_rng_null_driver);
282+
WHAL_TEST(test_rng_valid_dispatch);
244283
WHAL_TEST_SUITE_END();
245284
}

tests/sim/test_sim

3.5 KB
Binary file not shown.

tests/stm32wb/Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ LDFLAGS = --omagic -static
1010
DEPDIR = .deps/
1111

1212
# Test sources
13-
TEST_SRC = test_main.c test_clock.c test_gpio.c test_flash.c test_timer.c
13+
TEST_SRC = test_main.c test_clock.c test_gpio.c test_flash.c test_timer.c test_rng.c
1414

1515
# Board config and IVT from the example
1616
BOARD_SRC = $(EXAMPLE_DIR)/stm32wb55xx_nucleo.c \

tests/stm32wb/test_main.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ void test_clock(void);
4040
void test_gpio(void);
4141
void test_flash(void);
4242
void test_timer(void);
43+
void test_rng(void);
4344

4445
void main(void)
4546
{
@@ -84,6 +85,7 @@ void main(void)
8485
test_gpio();
8586
test_flash();
8687
test_timer();
88+
test_rng();
8789

8890
WHAL_TEST_SUMMARY();
8991

0 commit comments

Comments
 (0)