MSPM0G1X0X_G3X0X Driver Library  1.10.01.05
dl_trng.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2020, Texas Instruments Incorporated
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  *
9  * * Redistributions of source code must retain the above copyright
10  * notice, this list of conditions and the following disclaimer.
11  *
12  * * Redistributions in binary form must reproduce the above copyright
13  * notice, this list of conditions and the following disclaimer in the
14  * documentation and/or other materials provided with the distribution.
15  *
16  * * Neither the name of Texas Instruments Incorporated nor the names of
17  * its contributors may be used to endorse or promote products derived
18  * from this software without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
22  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
24  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
26  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
27  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
28  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
29  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
30  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  */
32 /*!****************************************************************************
33  * @file dl_trng.h
34  * @brief True Random Number Generator (TRNG) Driver Library
35  * @defgroup TRNG True Random Number Generator (TRNG)
36  *
37  * @anchor ti_dl_dl_m0p_trng_Overview
38  * # Overview
39  *
40  * The True Random Number Generator Driver Library allows full configuration of
41  * the MSPM0 TRNG module.
42  * The true random number generator (TRNG) block is an entropy source which
43  * can be used to generate random bit sequences.
44  *
45  * <hr>
46  ******************************************************************************
47  */
51 #ifndef ti_dl_dl_trng__include
52 #define ti_dl_dl_trng__include
53 
54 #include <stdbool.h>
55 #include <stdint.h>
56 
57 #include <ti/devices/msp/msp.h>
58 #include <ti/driverlib/dl_common.h>
59 
60 #ifdef __MSPM0_HAS_TRNG__
61 
62 #ifdef __cplusplus
63 extern "C" {
64 #endif
65 
66 /* clang-format off */
67 
75 #define DL_TRNG_INTERRUPT_HEALTH_FAIL_EVENT (TRNG_IMASK_IRQ_HEALTH_FAIL_MASK)
76 
80 #define DL_TRNG_INTERRUPT_CMD_DONE_EVENT (TRNG_IMASK_IRQ_CMD_DONE_MASK)
81 
85 #define DL_TRNG_INTERRUPT_CMD_FAIL_EVENT (TRNG_IMASK_IRQ_CMD_FAIL_MASK)
86 
90 #define DL_TRNG_INTERRUPT_CAPTURE_RDY_EVENT (TRNG_IMASK_IRQ_CAPTURED_RDY_MASK)
91 
100 #define DL_TRNG_DIGITAL_HEALTH_TEST_SUCCESS (0xFF)
101 
105 #define DL_TRNG_ANALOG_HEALTH_TEST_SUCCESS (0x1)
106 
108 /* clang-format on */
109 
111 typedef enum {
113  DL_TRNG_IIDX_HEALTH_FAIL = TRNG_IIDX_STAT_IRQ_HEALTH_FAIL,
115  DL_TRNG_IIDX_CMD_DONE = TRNG_IIDX_STAT_IRQ_CMD_DONE,
117  DL_TRNG_IIDX_CMD_FAIL = TRNG_IIDX_STAT_IRQ_CMD_FAIL,
119  DL_TRNG_IIDX_CAPTURED_READY = TRNG_IIDX_STAT_IRQ_CAPTURED_RDY,
120 } DL_TRNG_IIDX;
121 
123 typedef enum {
141 
143 typedef enum {
145  DL_TRNG_CMD_PWROFF = TRNG_CTL_CMD_PWR_OFF,
147  DL_TRNG_CMD_TEST_DIG = TRNG_CTL_CMD_PWRUP_DIG,
149  DL_TRNG_CMD_TEST_ANA = TRNG_CTL_CMD_PWRUP_ANA,
151  DL_TRNG_CMD_NORM_FUNC = TRNG_CTL_CMD_NORM_FUNC,
152 } DL_TRNG_CMD;
153 
155 typedef enum {
157  DL_TRNG_CLOCK_DIVIDE_1 = TRNG_CLKDIVIDE_RATIO_DIV_BY_1,
159  DL_TRNG_CLOCK_DIVIDE_2 = TRNG_CLKDIVIDE_RATIO_DIV_BY_2,
161  DL_TRNG_CLOCK_DIVIDE_4 = TRNG_CLKDIVIDE_RATIO_DIV_BY_4,
163  DL_TRNG_CLOCK_DIVIDE_6 = TRNG_CLKDIVIDE_RATIO_DIV_BY_6,
165  DL_TRNG_CLOCK_DIVIDE_8 = TRNG_CLKDIVIDE_RATIO_DIV_BY_8,
167 
169 typedef enum {
184 } DL_TRNG_STATE;
185 
191 typedef struct {
194  uint32_t controlWord;
196  uint32_t clockDivider;
198  uint32_t interruptMask;
201  bool backupRdy;
203 
209 __STATIC_INLINE void DL_TRNG_enablePower(TRNG_Regs *trng)
210 {
211  trng->GPRCM.PWREN = TRNG_PWREN_KEY_UNLOCK_W | TRNG_PWREN_ENABLE_ENABLE;
212 }
213 
219 __STATIC_INLINE void DL_TRNG_disablePower(TRNG_Regs *trng)
220 {
221  trng->GPRCM.PWREN = TRNG_PWREN_KEY_UNLOCK_W | TRNG_PWREN_ENABLE_DISABLE;
222 }
223 
231 __STATIC_INLINE DL_TRNG_CLOCK_DIVIDE DL_TRNG_getClockDivider(TRNG_Regs *trng)
232 {
233  return (DL_TRNG_CLOCK_DIVIDE) trng->CLKDIVIDE;
234 }
235 
244 __STATIC_INLINE void DL_TRNG_setClockDivider(
245  TRNG_Regs *trng, DL_TRNG_CLOCK_DIVIDE clockDivider)
246 {
247  trng->CLKDIVIDE = (uint32_t) clockDivider;
248 }
249 
255 __STATIC_INLINE void DL_TRNG_reset(TRNG_Regs *trng)
256 {
257  trng->GPRCM.RSTCTL =
258  TRNG_RSTCTL_RESETASSERT_ASSERT | TRNG_RSTCTL_KEY_UNLOCK_W;
259 }
260 
269 __STATIC_INLINE bool DL_TRNG_isReset(TRNG_Regs *trng)
270 {
271  return (trng->GPRCM.STAT & TRNG_GPRCM_STAT_RESETSTKY_MASK) ==
272  TRNG_GPRCM_STAT_RESETSTKY_RESET;
273 }
274 
283 __STATIC_INLINE bool DL_TRNG_isCaptureReady(TRNG_Regs *trng)
284 {
285  return ((trng->CPU_INT.RIS & TRNG_RIS_IRQ_CAPTURED_RDY_MASK)) ==
286  TRNG_RIS_IRQ_CAPTURED_RDY_SET;
287 }
288 
297 __STATIC_INLINE bool DL_TRNG_isCommandDone(TRNG_Regs *trng)
298 {
299  return ((trng->CPU_INT.RIS & TRNG_RIS_IRQ_CMD_DONE_MASK)) ==
300  TRNG_RIS_IRQ_CMD_DONE_SET;
301 }
302 
311 __STATIC_INLINE bool DL_TRNG_isCommandFail(TRNG_Regs *trng)
312 {
313  return ((trng->CPU_INT.RIS & TRNG_RIS_IRQ_CMD_FAIL_MASK)) ==
314  TRNG_RIS_IRQ_CMD_FAIL_SET;
315 }
316 
325 __STATIC_INLINE bool DL_TRNG_isHealthTestFail(TRNG_Regs *trng)
326 {
327  return ((trng->CPU_INT.RIS & TRNG_RIS_IRQ_HEALTH_FAIL_MASK)) ==
328  TRNG_RIS_IRQ_HEALTH_FAIL_SET;
329 }
330 
339 __STATIC_INLINE void DL_TRNG_setDecimationRate(
340  TRNG_Regs *trng, DL_TRNG_DECIMATION_RATE decimationRate)
341 {
342  DL_Common_updateReg(&trng->CTL,
343  ((uint32_t) decimationRate << TRNG_CTL_DECIM_RATE_OFS),
344  TRNG_CTL_DECIM_RATE_MASK);
345 }
346 
357  TRNG_Regs *trng)
358 {
359  uint32_t decimationRate =
360  ((trng->CTL & TRNG_CTL_DECIM_RATE_MASK) >> TRNG_CTL_DECIM_RATE_OFS);
361 
362  return (DL_TRNG_DECIMATION_RATE)(decimationRate);
363 }
364 
378 __STATIC_INLINE uint8_t DL_TRNG_getDigitalHealthTestResults(TRNG_Regs *trng)
379 {
380  return (uint8_t)(trng->TEST_RESULTS & TRNG_TEST_RESULTS_DIG_TEST_MASK);
381 }
382 
393 __STATIC_INLINE uint8_t DL_TRNG_getAnalogHealthTestResults(TRNG_Regs *trng)
394 {
395  return (uint8_t)((trng->TEST_RESULTS & TRNG_TEST_RESULTS_ANA_TEST_MASK) >>
396  TRNG_TEST_RESULTS_ANA_TEST_OFS);
397 }
398 
411 __STATIC_INLINE uint32_t DL_TRNG_getCurrentState(TRNG_Regs *trng)
412 {
413  return ((trng->STAT & TRNG_STAT_FSM_STATE_MASK)) >>
414  TRNG_STAT_FSM_STATE_OFS;
415 }
416 
426 __STATIC_INLINE uint32_t DL_TRNG_getIssuedCommand(TRNG_Regs *trng)
427 {
428  return ((trng->STAT & TRNG_STAT_ISSUED_CMD_MASK)) >>
429  TRNG_STAT_ISSUED_CMD_OFS;
430 }
431 
443 __STATIC_INLINE bool DL_TRNG_isRepetitionTestFail(TRNG_Regs *trng)
444 {
445  return ((trng->STAT & TRNG_STAT_REP_FAIL_MASK)) == TRNG_STAT_REP_FAIL_MASK;
446 }
447 
459 __STATIC_INLINE bool DL_TRNG_isAdaptiveTestFail(TRNG_Regs *trng)
460 {
461  return ((trng->STAT & TRNG_STAT_ADAP_FAIL_MASK)) ==
462  TRNG_STAT_ADAP_FAIL_MASK;
463 }
464 
473 __STATIC_INLINE void DL_TRNG_enableInterrupt(
474  TRNG_Regs *trng, uint32_t interruptMask)
475 {
476  trng->CPU_INT.IMASK |= interruptMask;
477 }
478 
487 __STATIC_INLINE void DL_TRNG_disableInterrupt(
488  TRNG_Regs *trng, uint32_t interruptMask)
489 {
490  trng->CPU_INT.IMASK &= ~interruptMask;
491 }
492 
505 __STATIC_INLINE uint32_t DL_TRNG_getEnabledInterrupts(
506  TRNG_Regs *trng, uint32_t interruptMask)
507 {
508  return trng->CPU_INT.IMASK & interruptMask;
509 }
510 
526 __STATIC_INLINE uint32_t DL_TRNG_getEnabledInterruptStatus(
527  TRNG_Regs *trng, uint32_t interruptMask)
528 {
529  return (trng->CPU_INT.MIS & interruptMask);
530 }
531 
546 __STATIC_INLINE uint32_t DL_TRNG_getRawInterruptStatus(
547  TRNG_Regs *trng, uint32_t interruptMask)
548 {
549  return trng->CPU_INT.RIS & interruptMask;
550 }
551 
564 __STATIC_INLINE DL_TRNG_IIDX DL_TRNG_getPendingInterrupt(TRNG_Regs *trng)
565 {
566  return (DL_TRNG_IIDX) trng->CPU_INT.IIDX;
567 }
568 
578 __STATIC_INLINE void DL_TRNG_clearInterruptStatus(
579  TRNG_Regs *trng, uint32_t interruptMask)
580 {
581  trng->CPU_INT.ICLR = interruptMask;
582 }
583 
591 __STATIC_INLINE void DL_TRNG_sendCommand(TRNG_Regs *trng, DL_TRNG_CMD cmd)
592 {
593  DL_Common_updateReg(&trng->CTL, (uint32_t) cmd, TRNG_CTL_CMD_MASK);
594 }
595 
610 __STATIC_INLINE uint32_t DL_TRNG_getCapture(TRNG_Regs *trng)
611 {
612  return trng->DATA_CAPTURE;
613 }
614 
627 bool DL_TRNG_saveConfiguration(TRNG_Regs *trng, DL_TRNG_backupConfig *ptr);
628 
643 bool DL_TRNG_restoreConfiguration(TRNG_Regs *trng, DL_TRNG_backupConfig *ptr);
644 
645 #ifdef __cplusplus
646 }
647 #endif
648 
649 #endif /* __MSPM0_HAS_TRNG__ */
650 
651 #endif /* ti_dl_dl_trng__include */
652 
DL_TRNG_CLOCK_DIVIDE
Definition: dl_trng.h:155
DL_TRNG_STATE
Definition: dl_trng.h:169
__STATIC_INLINE void DL_TRNG_disableInterrupt(TRNG_Regs *trng, uint32_t interruptMask)
Disable TRNG interrupt.
Definition: dl_trng.h:487
__STATIC_INLINE void DL_Common_updateReg(volatile uint32_t *reg, uint32_t val, uint32_t mask)
Writes value to specified register - retaining bits unaffected by mask.
Definition: dl_common.h:63
__STATIC_INLINE bool DL_TRNG_isCaptureReady(TRNG_Regs *trng)
Returns if the data capture is ready.
Definition: dl_trng.h:283
__STATIC_INLINE uint32_t DL_TRNG_getIssuedCommand(TRNG_Regs *trng)
Get the last accepted command that was issued to the TRNG.
Definition: dl_trng.h:426
Definition: dl_trng.h:165
Definition: dl_trng.h:127
Definition: dl_trng.h:113
Definition: dl_trng.h:161
__STATIC_INLINE bool DL_TRNG_isCommandDone(TRNG_Regs *trng)
Returns if the issued TRNG command is done.
Definition: dl_trng.h:297
__STATIC_INLINE uint8_t DL_TRNG_getAnalogHealthTestResults(TRNG_Regs *trng)
Get the analog health test results.
Definition: dl_trng.h:393
Definition: dl_trng.h:157
__STATIC_INLINE void DL_TRNG_enablePower(TRNG_Regs *trng)
Enables power on TRNG module.
Definition: dl_trng.h:209
__STATIC_INLINE uint32_t DL_TRNG_getCapture(TRNG_Regs *trng)
Get word capture from TRNG.
Definition: dl_trng.h:610
Definition: dl_trng.h:173
__STATIC_INLINE bool DL_TRNG_isAdaptiveTestFail(TRNG_Regs *trng)
Indicates if the Adaptive Proportion Test (1,2,3, or 4-bit counters) caused the most recent failure...
Definition: dl_trng.h:459
DL_TRNG_DECIMATION_RATE
Definition: dl_trng.h:123
Definition: dl_trng.h:119
__STATIC_INLINE void DL_TRNG_setDecimationRate(TRNG_Regs *trng, DL_TRNG_DECIMATION_RATE decimationRate)
Set the decimation rate.
Definition: dl_trng.h:339
__STATIC_INLINE void DL_TRNG_clearInterruptStatus(TRNG_Regs *trng, uint32_t interruptMask)
Clear pending TRNG interrupt.
Definition: dl_trng.h:578
bool backupRdy
Definition: dl_trng.h:201
Definition: dl_trng.h:117
Definition: dl_trng.h:171
DriverLib Common APIs.
__STATIC_INLINE void DL_TRNG_sendCommand(TRNG_Regs *trng, DL_TRNG_CMD cmd)
Update control register&#39;s command bits to send a TRNG command.
Definition: dl_trng.h:591
Definition: dl_trng.h:175
Definition: dl_trng.h:125
Definition: dl_trng.h:163
Definition: dl_trng.h:139
Definition: dl_trng.h:115
Definition: dl_trng.h:149
__STATIC_INLINE DL_TRNG_DECIMATION_RATE DL_TRNG_getDecimationRate(TRNG_Regs *trng)
Get the decimation rate.
Definition: dl_trng.h:356
__STATIC_INLINE uint32_t DL_TRNG_getCurrentState(TRNG_Regs *trng)
Get the current state of the TRNG front end FSM.
Definition: dl_trng.h:411
__STATIC_INLINE DL_TRNG_CLOCK_DIVIDE DL_TRNG_getClockDivider(TRNG_Regs *trng)
Get the clock divider on the TRNG module.
Definition: dl_trng.h:231
Definition: dl_trng.h:181
Definition: dl_trng.h:179
Definition: dl_trng.h:177
__STATIC_INLINE DL_TRNG_IIDX DL_TRNG_getPendingInterrupt(TRNG_Regs *trng)
Get highest priority pending TRNG interrupt.
Definition: dl_trng.h:564
__STATIC_INLINE bool DL_TRNG_isHealthTestFail(TRNG_Regs *trng)
Returns if a health test failed.
Definition: dl_trng.h:325
__STATIC_INLINE void DL_TRNG_reset(TRNG_Regs *trng)
Resets the TRNG module.
Definition: dl_trng.h:255
uint32_t interruptMask
Definition: dl_trng.h:198
Definition: dl_trng.h:183
Definition: dl_trng.h:159
__STATIC_INLINE void DL_TRNG_setClockDivider(TRNG_Regs *trng, DL_TRNG_CLOCK_DIVIDE clockDivider)
Set the clock divider on the TRNG module.
Definition: dl_trng.h:244
__STATIC_INLINE uint32_t DL_TRNG_getEnabledInterruptStatus(TRNG_Regs *trng, uint32_t interruptMask)
Check interrupt flag of enabled TRNG interrupt.
Definition: dl_trng.h:526
DL_TRNG_IIDX
Definition: dl_trng.h:111
Configuration structure to backup TRNG peripheral state before going to STOP/STANDBY mode...
Definition: dl_trng.h:191
Definition: dl_trng.h:137
__STATIC_INLINE uint32_t DL_TRNG_getRawInterruptStatus(TRNG_Regs *trng, uint32_t interruptMask)
Check interrupt flag of any TRNG interrupt.
Definition: dl_trng.h:546
bool DL_TRNG_restoreConfiguration(TRNG_Regs *trng, DL_TRNG_backupConfig *ptr)
Restore TRNG configuration after leaving a power loss state. Upon restoration, if the TRNG was not or...
Definition: dl_trng.h:131
Definition: dl_trng.h:135
Definition: dl_trng.h:133
Definition: dl_trng.h:151
DL_TRNG_CMD
Definition: dl_trng.h:143
uint32_t clockDivider
Definition: dl_trng.h:196
__STATIC_INLINE uint8_t DL_TRNG_getDigitalHealthTestResults(TRNG_Regs *trng)
Get the digital health test results.
Definition: dl_trng.h:378
__STATIC_INLINE void DL_TRNG_enableInterrupt(TRNG_Regs *trng, uint32_t interruptMask)
Enable TRNG interrupt.
Definition: dl_trng.h:473
bool DL_TRNG_saveConfiguration(TRNG_Regs *trng, DL_TRNG_backupConfig *ptr)
Save TRNG configuration before entering a power loss state. Only necessary for PG 1...
Definition: dl_trng.h:147
__STATIC_INLINE bool DL_TRNG_isReset(TRNG_Regs *trng)
Returns if TRNG peripheral was reset.
Definition: dl_trng.h:269
__STATIC_INLINE uint32_t DL_TRNG_getEnabledInterrupts(TRNG_Regs *trng, uint32_t interruptMask)
Check which TRNG interrupts are enabled.
Definition: dl_trng.h:505
__STATIC_INLINE void DL_TRNG_disablePower(TRNG_Regs *trng)
Disable power on TRNG module.
Definition: dl_trng.h:219
Definition: dl_trng.h:145
__STATIC_INLINE bool DL_TRNG_isRepetitionTestFail(TRNG_Regs *trng)
Indicates if the repetition counter test caused the most recent failure.
Definition: dl_trng.h:443
__STATIC_INLINE bool DL_TRNG_isCommandFail(TRNG_Regs *trng)
Returns if the issued TRNG command failed.
Definition: dl_trng.h:311
uint32_t controlWord
Definition: dl_trng.h:194
Definition: dl_trng.h:129
© Copyright 1995-2023, Texas Instruments Incorporated. All rights reserved.
Trademarks | Privacy policy | Terms of use | Terms of sale