MSPM0L122X_L222X Driver Library  2.05.00.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 
190 typedef struct {
193  uint32_t controlWord;
195  uint32_t clockDivider;
197  uint32_t interruptMask;
200  bool backupRdy;
202 
212 __STATIC_INLINE void DL_TRNG_enablePower(TRNG_Regs *trng)
213 {
214  trng->GPRCM.PWREN = TRNG_PWREN_KEY_UNLOCK_W | TRNG_PWREN_ENABLE_ENABLE;
215 }
216 
227 __STATIC_INLINE void DL_TRNG_disablePower(TRNG_Regs *trng)
228 {
229  trng->GPRCM.PWREN = TRNG_PWREN_KEY_UNLOCK_W | TRNG_PWREN_ENABLE_DISABLE;
230 }
231 
248 __STATIC_INLINE bool DL_TRNG_isPowerEnabled(TRNG_Regs *trng)
249 {
250  return ((TRNG->GPRCM.PWREN & TRNG_PWREN_ENABLE_MASK) ==
251  TRNG_PWREN_ENABLE_ENABLE);
252 }
253 
261 __STATIC_INLINE DL_TRNG_CLOCK_DIVIDE DL_TRNG_getClockDivider(
262  const TRNG_Regs *trng)
263 {
264  return (DL_TRNG_CLOCK_DIVIDE) trng->CLKDIVIDE;
265 }
266 
275 __STATIC_INLINE void DL_TRNG_setClockDivider(
276  TRNG_Regs *trng, DL_TRNG_CLOCK_DIVIDE clockDivider)
277 {
278  trng->CLKDIVIDE = (uint32_t) clockDivider;
279 }
280 
286 __STATIC_INLINE void DL_TRNG_reset(TRNG_Regs *trng)
287 {
288  trng->GPRCM.RSTCTL =
289  TRNG_RSTCTL_RESETASSERT_ASSERT | TRNG_RSTCTL_KEY_UNLOCK_W;
290 }
291 
300 __STATIC_INLINE bool DL_TRNG_isReset(const TRNG_Regs *trng)
301 {
302  return (trng->GPRCM.STAT & TRNG_GPRCM_STAT_RESETSTKY_MASK) ==
303  TRNG_GPRCM_STAT_RESETSTKY_RESET;
304 }
305 
314 __STATIC_INLINE bool DL_TRNG_isCaptureReady(const TRNG_Regs *trng)
315 {
316  return ((trng->CPU_INT.RIS & TRNG_RIS_IRQ_CAPTURED_RDY_MASK)) ==
317  TRNG_RIS_IRQ_CAPTURED_RDY_SET;
318 }
319 
328 __STATIC_INLINE bool DL_TRNG_isCommandDone(const TRNG_Regs *trng)
329 {
330  return ((trng->CPU_INT.RIS & TRNG_RIS_IRQ_CMD_DONE_MASK)) ==
331  TRNG_RIS_IRQ_CMD_DONE_SET;
332 }
333 
342 __STATIC_INLINE bool DL_TRNG_isCommandFail(const TRNG_Regs *trng)
343 {
344  return ((trng->CPU_INT.RIS & TRNG_RIS_IRQ_CMD_FAIL_MASK)) ==
345  TRNG_RIS_IRQ_CMD_FAIL_SET;
346 }
347 
356 __STATIC_INLINE bool DL_TRNG_isHealthTestFail(const TRNG_Regs *trng)
357 {
358  return ((trng->CPU_INT.RIS & TRNG_RIS_IRQ_HEALTH_FAIL_MASK)) ==
359  TRNG_RIS_IRQ_HEALTH_FAIL_SET;
360 }
361 
370 __STATIC_INLINE void DL_TRNG_setDecimationRate(
371  TRNG_Regs *trng, DL_TRNG_DECIMATION_RATE decimationRate)
372 {
373  DL_Common_updateReg(&trng->CTL,
374  ((uint32_t) decimationRate << TRNG_CTL_DECIM_RATE_OFS),
375  TRNG_CTL_DECIM_RATE_MASK);
376 }
377 
388  const TRNG_Regs *trng)
389 {
390  uint32_t decimationRate =
391  ((trng->CTL & TRNG_CTL_DECIM_RATE_MASK) >> TRNG_CTL_DECIM_RATE_OFS);
392 
393  return (DL_TRNG_DECIMATION_RATE)(decimationRate);
394 }
395 
409 __STATIC_INLINE uint8_t DL_TRNG_getDigitalHealthTestResults(
410  const TRNG_Regs *trng)
411 {
412  return (uint8_t)(trng->TEST_RESULTS & TRNG_TEST_RESULTS_DIG_TEST_MASK);
413 }
414 
425 __STATIC_INLINE uint8_t DL_TRNG_getAnalogHealthTestResults(
426  const TRNG_Regs *trng)
427 {
428  return (uint8_t)((trng->TEST_RESULTS & TRNG_TEST_RESULTS_ANA_TEST_MASK) >>
429  TRNG_TEST_RESULTS_ANA_TEST_OFS);
430 }
431 
444 __STATIC_INLINE uint32_t DL_TRNG_getCurrentState(const TRNG_Regs *trng)
445 {
446  return ((trng->STAT & TRNG_STAT_FSM_STATE_MASK)) >>
447  TRNG_STAT_FSM_STATE_OFS;
448 }
449 
459 __STATIC_INLINE uint32_t DL_TRNG_getIssuedCommand(const TRNG_Regs *trng)
460 {
461  return ((trng->STAT & TRNG_STAT_ISSUED_CMD_MASK)) >>
462  TRNG_STAT_ISSUED_CMD_OFS;
463 }
464 
476 __STATIC_INLINE bool DL_TRNG_isRepetitionTestFail(const TRNG_Regs *trng)
477 {
478  return ((trng->STAT & TRNG_STAT_REP_FAIL_MASK)) == TRNG_STAT_REP_FAIL_MASK;
479 }
480 
492 __STATIC_INLINE bool DL_TRNG_isAdaptiveTestFail(const TRNG_Regs *trng)
493 {
494  return ((trng->STAT & TRNG_STAT_ADAP_FAIL_MASK)) ==
495  TRNG_STAT_ADAP_FAIL_MASK;
496 }
497 
506 __STATIC_INLINE void DL_TRNG_enableInterrupt(
507  TRNG_Regs *trng, uint32_t interruptMask)
508 {
509  trng->CPU_INT.IMASK |= interruptMask;
510 }
511 
520 __STATIC_INLINE void DL_TRNG_disableInterrupt(
521  TRNG_Regs *trng, uint32_t interruptMask)
522 {
523  trng->CPU_INT.IMASK &= ~interruptMask;
524 }
525 
538 __STATIC_INLINE uint32_t DL_TRNG_getEnabledInterrupts(
539  const TRNG_Regs *trng, uint32_t interruptMask)
540 {
541  return trng->CPU_INT.IMASK & interruptMask;
542 }
543 
559 __STATIC_INLINE uint32_t DL_TRNG_getEnabledInterruptStatus(
560  const TRNG_Regs *trng, uint32_t interruptMask)
561 {
562  return (trng->CPU_INT.MIS & interruptMask);
563 }
564 
579 __STATIC_INLINE uint32_t DL_TRNG_getRawInterruptStatus(
580  const TRNG_Regs *trng, uint32_t interruptMask)
581 {
582  return trng->CPU_INT.RIS & interruptMask;
583 }
584 
597 __STATIC_INLINE DL_TRNG_IIDX DL_TRNG_getPendingInterrupt(const TRNG_Regs *trng)
598 {
599  return (DL_TRNG_IIDX) trng->CPU_INT.IIDX;
600 }
601 
611 __STATIC_INLINE void DL_TRNG_clearInterruptStatus(
612  TRNG_Regs *trng, uint32_t interruptMask)
613 {
614  trng->CPU_INT.ICLR = interruptMask;
615 }
616 
624 __STATIC_INLINE void DL_TRNG_sendCommand(TRNG_Regs *trng, DL_TRNG_CMD cmd)
625 {
626  DL_Common_updateReg(&trng->CTL, (uint32_t) cmd, TRNG_CTL_CMD_MASK);
627 }
628 
643 __STATIC_INLINE uint32_t DL_TRNG_getCapture(const TRNG_Regs *trng)
644 {
645  return trng->DATA_CAPTURE;
646 }
647 
660  const TRNG_Regs *trng, DL_TRNG_backupConfig *ptr);
661 
675 bool DL_TRNG_restoreConfiguration(TRNG_Regs *trng, DL_TRNG_backupConfig *ptr);
676 
677 #ifdef __cplusplus
678 }
679 #endif
680 
681 #endif /* __MSPM0_HAS_TRNG__ */
682 
683 #endif /* ti_dl_dl_trng__include */
684 
DL_TRNG_CLOCK_DIVIDE
Definition: dl_trng.h:155
__STATIC_INLINE bool DL_TRNG_isCommandFail(const TRNG_Regs *trng)
Returns if the issued TRNG command failed.
Definition: dl_trng.h:342
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:520
__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
Definition: dl_trng.h:165
Definition: dl_trng.h:127
Definition: dl_trng.h:113
__STATIC_INLINE DL_TRNG_IIDX DL_TRNG_getPendingInterrupt(const TRNG_Regs *trng)
Get highest priority pending TRNG interrupt.
Definition: dl_trng.h:597
__STATIC_INLINE bool DL_TRNG_isCaptureReady(const TRNG_Regs *trng)
Returns if the data capture is ready.
Definition: dl_trng.h:314
Definition: dl_trng.h:161
__STATIC_INLINE uint32_t DL_TRNG_getEnabledInterruptStatus(const TRNG_Regs *trng, uint32_t interruptMask)
Check interrupt flag of enabled TRNG interrupt.
Definition: dl_trng.h:559
Definition: dl_trng.h:157
__STATIC_INLINE void DL_TRNG_enablePower(TRNG_Regs *trng)
Enables the Peripheral Write Enable (PWREN) register for the TRNG.
Definition: dl_trng.h:212
__STATIC_INLINE uint32_t DL_TRNG_getCapture(const TRNG_Regs *trng)
Get word capture from TRNG.
Definition: dl_trng.h:643
Definition: dl_trng.h:173
DL_TRNG_DECIMATION_RATE
Definition: dl_trng.h:123
__STATIC_INLINE uint32_t DL_TRNG_getIssuedCommand(const TRNG_Regs *trng)
Get the last accepted command that was issued to the TRNG.
Definition: dl_trng.h:459
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:370
__STATIC_INLINE bool DL_TRNG_isAdaptiveTestFail(const 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:492
__STATIC_INLINE void DL_TRNG_clearInterruptStatus(TRNG_Regs *trng, uint32_t interruptMask)
Clear pending TRNG interrupt.
Definition: dl_trng.h:611
bool backupRdy
Definition: dl_trng.h:200
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:624
Definition: dl_trng.h:175
Definition: dl_trng.h:125
__STATIC_INLINE uint32_t DL_TRNG_getEnabledInterrupts(const TRNG_Regs *trng, uint32_t interruptMask)
Check which TRNG interrupts are enabled.
Definition: dl_trng.h:538
Definition: dl_trng.h:163
Definition: dl_trng.h:139
Definition: dl_trng.h:115
Definition: dl_trng.h:149
__STATIC_INLINE uint32_t DL_TRNG_getRawInterruptStatus(const TRNG_Regs *trng, uint32_t interruptMask)
Check interrupt flag of any TRNG interrupt.
Definition: dl_trng.h:579
Definition: dl_trng.h:181
Definition: dl_trng.h:179
Definition: dl_trng.h:177
__STATIC_INLINE void DL_TRNG_reset(TRNG_Regs *trng)
Resets the TRNG module.
Definition: dl_trng.h:286
uint32_t interruptMask
Definition: dl_trng.h:197
Definition: dl_trng.h:183
Definition: dl_trng.h:159
__STATIC_INLINE uint8_t DL_TRNG_getAnalogHealthTestResults(const TRNG_Regs *trng)
Get the analog health test results.
Definition: dl_trng.h:425
__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:275
__STATIC_INLINE DL_TRNG_CLOCK_DIVIDE DL_TRNG_getClockDivider(const TRNG_Regs *trng)
Get the clock divider on the TRNG module.
Definition: dl_trng.h:261
__STATIC_INLINE bool DL_TRNG_isReset(const TRNG_Regs *trng)
Returns if TRNG peripheral was reset.
Definition: dl_trng.h:300
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:190
Definition: dl_trng.h:137
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
bool DL_TRNG_saveConfiguration(const TRNG_Regs *trng, DL_TRNG_backupConfig *ptr)
Save TRNG configuration before entering a power loss state.
Definition: dl_trng.h:133
__STATIC_INLINE bool DL_TRNG_isCommandDone(const TRNG_Regs *trng)
Returns if the issued TRNG command is done.
Definition: dl_trng.h:328
Definition: dl_trng.h:151
DL_TRNG_CMD
Definition: dl_trng.h:143
uint32_t clockDivider
Definition: dl_trng.h:195
__STATIC_INLINE bool DL_TRNG_isRepetitionTestFail(const TRNG_Regs *trng)
Indicates if the repetition counter test caused the most recent failure.
Definition: dl_trng.h:476
__STATIC_INLINE void DL_TRNG_enableInterrupt(TRNG_Regs *trng, uint32_t interruptMask)
Enable TRNG interrupt.
Definition: dl_trng.h:506
Definition: dl_trng.h:147
__STATIC_INLINE void DL_TRNG_disablePower(TRNG_Regs *trng)
Disables the Peripheral Write Enable (PWREN) register for the TRNG.
Definition: dl_trng.h:227
__STATIC_INLINE uint8_t DL_TRNG_getDigitalHealthTestResults(const TRNG_Regs *trng)
Get the digital health test results.
Definition: dl_trng.h:409
__STATIC_INLINE bool DL_TRNG_isHealthTestFail(const TRNG_Regs *trng)
Returns if a health test failed.
Definition: dl_trng.h:356
__STATIC_INLINE bool DL_TRNG_isPowerEnabled(TRNG_Regs *trng)
Returns if the Peripheral Write Enable (PWREN) register for the TRNG is enabled.
Definition: dl_trng.h:248
Definition: dl_trng.h:145
__STATIC_INLINE uint32_t DL_TRNG_getCurrentState(const TRNG_Regs *trng)
Get the current state of the TRNG front end FSM.
Definition: dl_trng.h:444
uint32_t controlWord
Definition: dl_trng.h:193
Definition: dl_trng.h:129
__STATIC_INLINE DL_TRNG_DECIMATION_RATE DL_TRNG_getDecimationRate(const TRNG_Regs *trng)
Get the decimation rate.
Definition: dl_trng.h:387
© Copyright 1995-2025, Texas Instruments Incorporated. All rights reserved.
Trademarks | Privacy policy | Terms of use | Terms of sale