Paparazzi UAS  v5.15_devel-112-g521f3cf
Paparazzi is a free software Unmanned Aircraft System.
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
rng_arch.c
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2017 Michal Podhradsky <mpodhradsky@galois.com>
3  *
4  * This file is part of Paparazzi.
5  *
6  * Paparazzi is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2, or (at your option)
9  * any later version.
10  *
11  * Paparazzi is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with Paparazzi; see the file COPYING. If not, write to
18  * the Free Software Foundation, 59 Temple Place - Suite 330,
19  * Boston, MA 02111-1307, USA.
20  *
21  */
22 
27 #include "mcu_periph/rng.h"
28 #include <libopencm3/stm32/rcc.h>
29 #include <libopencm3/stm32/rng.h>
30 
32 
33 void rng_init(void) {
34  rcc_periph_clock_enable(RCC_RNG);
35  rng_enable();
36  // dont forget to throw away the first generated number
38 }
39 
40 void rng_deinit(void) {
41  rng_disable();
42  rcc_periph_clock_disable(RCC_RNG);
43 }
44 
45 // Return true only if we got a new number
46 // that is different from the previous one
47 bool rng_get(uint32_t *rand_nr) {
48  uint32_t tmp = 0;
49  if (rng_get_random(&tmp) && (tmp != last)) {
50  last = tmp;
51  *rand_nr = tmp;
52  return true;
53  } else {
54  return false;
55  }
56 }
57 
58 // Wait until we get a new number that is different
59 // from the previous one. We can wait forever here if
60 // the clocks are not setup properly.
62  uint32_t tmp = last;
63  while (tmp == last) {
64  tmp = rng_get_random_blocking();
65  }
66  last = tmp;
67  return tmp;
68 }
bool rng_get(uint32_t *rand_nr)
Definition: rng_arch.c:40
unsigned long uint32_t
Definition: types.h:18
void rng_deinit(void)
Definition: rng_arch.c:36
void rng_init(void)
Definition: rng_arch.c:34
arch independent Random Number Generator API
uint32_t last
Definition: rng_arch.c:31
uint32_t rng_wait_and_get(void)
Definition: rng_arch.c:62