aboutsummaryrefslogtreecommitdiffstats
path: root/os/hal/ports/NRF5/LLD/hal_rng_lld.h
blob: 5c56be2c1244169b8eed13d614cad4aada37734e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
/*
    RNG for ChibiOS - Copyright (C) 2016 Stephane D'Alu

    Licensed under the Apache License, Version 2.0 (the "License");
    you may not use this file except in compliance with the License.
    You may obtain a copy of the License at

        http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.
*/

/**
 * @file    NRF5/LLD/hal_rng_lld.h
 * @brief   NRF5 RNG subsystem low level driver header.
 *
 * @addtogroup RNG
 * @{
 */

#ifndef HAL_RNG_LLD_H
#define HAL_RNG_LLD_H

#if (HAL_USE_RNG == TRUE) || defined(__DOXYGEN__)

/*===========================================================================*/
/* Driver constants.                                                         */
/*===========================================================================*/

/*===========================================================================*/
/* Driver pre-compile time settings.                                         */
/*===========================================================================*/

/**
 * @name    Configuration options
 * @{
 */
/**
 * @brief   RNGD1 driver enable switch.
 * @details If set to @p TRUE the support for RNGD1 is included.
 * @note    The default is @p FALSE.
 */
#if !defined(NRF5_RNG_USE_RNG0) || defined(__DOXYGEN__)
#define NRF5_RNG_USE_RNG0                  FALSE
#endif

/**
 * @brief   RNG interrupt priority level setting for RNG0.
 */
#if !defined(NRF5_RNG_RNG0_IRQ_PRIORITY) || defined(__DOXYGEN__)
#define NRF5_RNG_RNG0_IRQ_PRIORITY         3
#endif


/*===========================================================================*/
/* Derived constants and error checks.                                       */
/*===========================================================================*/

#if NRF5_RNG_USE_RNG0 == FALSE
#error "Requesting RNG driver, but no RNG peripheric attached"
#endif

#if NRF5_RNG_USE_RNG0 &&					\
    !OSAL_IRQ_IS_VALID_PRIORITY(NRF5_RNG_RNG0_IRQ_PRIORITY)
#error "Invalid IRQ priority assigned to RNG0"
#endif

/*===========================================================================*/
/* Driver data structures and types.                                         */
/*===========================================================================*/

/**
 * @brief   Type of a structure representing an RNG driver.
 */
typedef struct RNGDriver RNGDriver;

/**
 * @brief   Driver configuration structure.
 */
typedef struct {
  /* End of the mandatory fields.*/
  /**
   * @brief   Activate the digital error correction
   *
   * @details A digital corrector algorithm is employed to remove any
   *          bias toward '1' or '0'. Disabling it offers a substantial
   *          speed advantage, but may result in a statistical distribution
   *          that is not perfectly uniform.
   *
   * @note    For nRF51, on average, it take 167µs to get a byte without
   *          digitial error correction and 677µs with, but no garantee 
   *          is made on the necessary time to generate one byte.
   */
  uint8_t digital_error_correction:1;
} RNGConfig;


/**
 * @brief   Structure representing an RNG driver.
 */
struct RNGDriver {
  /**
   * @brief Driver state.
   */
  rngstate_t                state;
  /**
   * @brief Current configuration data.
   */
  const RNGConfig           *config;
#if RNG_USE_MUTUAL_EXCLUSION || defined(__DOXYGEN__)
  /**
   * @brief   Mutex protecting the peripheral.
   */
  mutex_t                   mutex;
#endif /* RNG_USE_MUTUAL_EXCLUSION */
  /* End of the mandatory fields.*/
  /**
   * @brief Pointer to the RNGx registers block.
   */
  NRF_RNG_Type             *rng;
  /**
   * @brief IRQ number
   */
  uint32_t                  irq;
};

/*===========================================================================*/
/* Driver macros.                                                            */
/*===========================================================================*/

/*===========================================================================*/
/* External declarations.                                                    */
/*===========================================================================*/

#if NRF5_RNG_USE_RNG0 && !defined(__DOXYGEN__)
extern RNGDriver RNGD1;
#endif /* NRF5_RNG_USE_RNG0 */

#ifdef __cplusplus
extern "C" {
#endif
  void rng_lld_init(void);
  void rng_lld_start(RNGDriver *rngp);
  void rng_lld_stop(RNGDriver *rngp);
  msg_t rng_lld_write(RNGDriver *rngp, uint8_t *buf, size_t n,
                      systime_t timeout);
#ifdef __cplusplus
}
#endif

#endif /* HAL_USE_RNG */

#endif /* HAL_RNG_LLD_H */

/** @} */