5757
5858whal_Error whal_Stm32h5Rng_Init (whal_Rng * rngDev )
5959{
60+ whal_Stm32h5Rng_Cfg * cfg ;
61+ const whal_Regmap * reg ;
62+ whal_Error err ;
63+
6064 if (!rngDev || !rngDev -> cfg )
6165 return WHAL_EINVAL ;
6266
63- return WHAL_SUCCESS ;
67+ cfg = (whal_Stm32h5Rng_Cfg * )rngDev -> cfg ;
68+ reg = & rngDev -> regmap ;
69+
70+ /*
71+ * Apply NIST-certified configuration via CONDRST sequence:
72+ * 1. Write CONDRST=1 with configuration bits, RNGEN=0
73+ * 2. Write HTCR magic key then HTCR value (while CONDRST=1)
74+ * 3. Write NSCR value (while CONDRST=1)
75+ * 4. Write CONDRST=0 with RNGEN=1 to start
76+ */
77+ whal_Reg_Write (reg -> base , RNG_CR_REG ,
78+ RNG_CR_NIST_CFG | RNG_CR_CONDRST_Msk );
79+
80+ whal_Reg_Write (reg -> base , RNG_HTCR_REG , RNG_HTCR_MAGIC );
81+ whal_Reg_Write (reg -> base , RNG_HTCR_REG , RNG_HTCR_NIST_VAL );
82+ whal_Reg_Write (reg -> base , RNG_NSCR_REG , RNG_NSCR_NIST_VAL );
83+
84+ whal_Reg_Write (reg -> base , RNG_CR_REG ,
85+ RNG_CR_NIST_CFG | RNG_CR_RNGEN_Msk );
86+
87+ /* Wait for CONDRST to clear (reset complete) */
88+ err = whal_Reg_ReadPoll (reg -> base , RNG_CR_REG ,
89+ RNG_CR_CONDRST_Msk , 0 , cfg -> timeout );
90+
91+ return err ;
6492}
6593
6694whal_Error whal_Stm32h5Rng_Deinit (whal_Rng * rngDev )
6795{
6896 if (!rngDev || !rngDev -> cfg )
6997 return WHAL_EINVAL ;
7098
99+ /* Disable the RNG peripheral */
100+ whal_Reg_Update (rngDev -> regmap .base , RNG_CR_REG , RNG_CR_RNGEN_Msk ,
101+ whal_SetBits (RNG_CR_RNGEN_Msk , RNG_CR_RNGEN_Pos , 0 ));
102+
71103 return WHAL_SUCCESS ;
72104}
73105
@@ -89,29 +121,6 @@ whal_Error whal_Stm32h5Rng_Generate(whal_Rng *rngDev, uint8_t *rngData,
89121 (void )(cfg );
90122#endif
91123
92- /*
93- * Apply NIST-certified configuration via CONDRST sequence:
94- * 1. Write CONDRST=1 with configuration bits, RNGEN=0
95- * 2. Write HTCR magic key then HTCR value (while CONDRST=1)
96- * 3. Write NSCR value (while CONDRST=1)
97- * 4. Write CONDRST=0 with RNGEN=1 to start
98- */
99- whal_Reg_Write (reg -> base , RNG_CR_REG ,
100- RNG_CR_NIST_CFG | RNG_CR_CONDRST_Msk );
101-
102- whal_Reg_Write (reg -> base , RNG_HTCR_REG , RNG_HTCR_MAGIC );
103- whal_Reg_Write (reg -> base , RNG_HTCR_REG , RNG_HTCR_NIST_VAL );
104- whal_Reg_Write (reg -> base , RNG_NSCR_REG , RNG_NSCR_NIST_VAL );
105-
106- whal_Reg_Write (reg -> base , RNG_CR_REG ,
107- RNG_CR_NIST_CFG | RNG_CR_RNGEN_Msk );
108-
109- /* Wait for CONDRST to clear (reset complete) */
110- err = whal_Reg_ReadPoll (reg -> base , RNG_CR_REG ,
111- RNG_CR_CONDRST_Msk , 0 , cfg -> timeout );
112- if (err )
113- goto exit ;
114-
115124 while (offset < rngDataSz ) {
116125 /* Wait for a random value to be ready */
117126 WHAL_TIMEOUT_START (cfg -> timeout );
@@ -137,18 +146,14 @@ whal_Error whal_Stm32h5Rng_Generate(whal_Rng *rngDev, uint8_t *rngData,
137146 }
138147
139148 /* Read 32-bit random value */
140- uint32_t rnd = * ( volatile uint32_t * ) (reg -> base + RNG_DR_REG );
149+ uint32_t rnd = ( uint32_t ) whal_Reg_Read (reg -> base , RNG_DR_REG );
141150
142151 /* Copy bytes into output buffer */
143152 for (size_t i = 0 ; i < 4 && offset < rngDataSz ; i ++ , offset ++ )
144153 rngData [offset ] = (uint8_t )(rnd >> (i * 8 ));
145154 }
146155
147156exit :
148- /* Disable the RNG peripheral */
149- whal_Reg_Update (reg -> base , RNG_CR_REG , RNG_CR_RNGEN_Msk ,
150- whal_SetBits (RNG_CR_RNGEN_Msk , RNG_CR_RNGEN_Pos , 0 ));
151-
152157 return err ;
153158}
154159
0 commit comments