M480 BSP V3.05.005
The Board Support Package for M480 Series
trng.c
Go to the documentation of this file.
1/**************************************************************************/
10#include <stdio.h>
11
12#include "NuMicro.h"
13
14#define TIMEOUT_TRNG SystemCoreClock /* 1 second time-out */
15
36int32_t TRNG_Open(void)
37{
38 int32_t tout = TIMEOUT_TRNG;
39
40 SYS->IPRST1 |= SYS_IPRST1_TRNGRST_Msk;
41 SYS->IPRST1 ^= SYS_IPRST1_TRNGRST_Msk;
42
43 TRNG->ACT |= TRNG_ACT_ACT_Msk;
44
45 /* Waiting for ready */
46 while ((tout-- > 0) && !(TRNG->CTL & TRNG_CTL_READY_Msk))
47 {
48 }
49 if (tout <= 0)
50 return -1;
51
53 return 0;
54}
55
56
65int32_t TRNG_GenWord(uint32_t *u32RndNum)
66{
67 uint32_t i, u32Reg, timeout;
68
69 *u32RndNum = 0;
70 u32Reg = TRNG->CTL;
71
72 for (i = 0; i < 4; i++)
73 {
74 TRNG->CTL = TRNG_CTL_TRNGEN_Msk | u32Reg;
75
76 /* TRNG should generate one byte per 125*8 us */
77 for (timeout = (CLK_GetHCLKFreq() / 100); timeout > 0; timeout--)
78 {
79 if (TRNG->CTL & TRNG_CTL_DVIF_Msk)
80 break;
81 }
82
83 if (timeout == 0)
84 return -1;
85
86 *u32RndNum |= ((TRNG->DATA & 0xff) << i*8);
87
88 }
89 return 0;
90}
91
101int32_t TRNG_GenBignum(uint8_t u8BigNum[], int32_t i32Len)
102{
103 uint32_t i, u32Reg, timeout;
104
105 u32Reg = TRNG->CTL;
106
107 for (i = 0; i < i32Len/8; i++)
108 {
109 TRNG->CTL = TRNG_CTL_TRNGEN_Msk | u32Reg;
110
111 /* TRNG should generate one byte per 125*8 us */
112 for (timeout = (CLK_GetHCLKFreq() / 100); timeout > 0; timeout--)
113 {
114 if (TRNG->CTL & TRNG_CTL_DVIF_Msk)
115 break;
116 }
117
118 if (timeout == 0)
119 return -1;
120
121 u8BigNum[i] = (TRNG->DATA & 0xff);
122 }
123 return 0;
124}
125
135int32_t TRNG_GenBignumHex(char cBigNumHex[], int32_t i32Len)
136{
137 uint32_t i, idx, u32Reg, timeout;
138 uint32_t data;
139
140 u32Reg = TRNG->CTL;
141 idx = 0;
142 for (i = 0; i < i32Len/8; i++)
143 {
144 TRNG->CTL = TRNG_CTL_TRNGEN_Msk | u32Reg;
145
146 /* TRNG should generate one byte per 125*8 us */
147 for (timeout = (CLK_GetHCLKFreq() / 100); timeout > 0; timeout--)
148 {
149 if (TRNG->CTL & TRNG_CTL_DVIF_Msk)
150 break;
151 }
152
153 if (timeout == 0)
154 return -1;
155
156 data = (TRNG->DATA & 0xff);
157
158 if (data >= 0xA0)
159 cBigNumHex[idx++] = ((data >> 4) & 0xf) - 10 + 'A';
160 else
161 cBigNumHex[idx++] = ((data >> 4) & 0xf) + '0';
162
163 data &= 0xf;
164 if (data >= 0xA)
165 cBigNumHex[idx++] = data - 10 + 'A';
166 else
167 cBigNumHex[idx++] = data + '0';
168 }
169 cBigNumHex[idx] = 0;
170 return 0;
171}
172
173 /* end of group TRNG_EXPORTED_FUNCTIONS */
175 /* end of group TRNG_Driver */
177 /* end of group Standard_Driver */
179
180/*** (C) COPYRIGHT 2019 Nuvoton Technology Corp. ***/
181
182
NuMicro peripheral access layer header file.
uint32_t CLK_GetHCLKFreq(void)
Get HCLK frequency.
Definition: clk.c:246
#define TRNG
Definition: M480.h:447
#define SYS
Definition: M480.h:367
#define TRNG_CTL_DVIF_Msk
Definition: trng_reg.h:191
#define TRNG_ACT_ACT_Msk
Definition: trng_reg.h:212
#define SYS_IPRST1_TRNGRST_Msk
Definition: sys_reg.h:4978
#define TRNG_CTL_TRNGEN_Msk
Definition: trng_reg.h:188
#define TRNG_CTL_READY_Msk
Definition: trng_reg.h:200
int32_t TRNG_GenWord(uint32_t *u32RndNum)
Generate a 32-bits random number word.
Definition: trng.c:65
int32_t TRNG_GenBignum(uint8_t u8BigNum[], int32_t i32Len)
Generate a big number in binary format.
Definition: trng.c:101
int32_t TRNG_GenBignumHex(char cBigNumHex[], int32_t i32Len)
Generate a big number in hex format.
Definition: trng.c:135
int32_t TRNG_Open(void)
Initialize TRNG hardware.
Definition: trng.c:36
#define TIMEOUT_TRNG
Definition: trng.c:14