29 lines
834 B
C
29 lines
834 B
C
|
/*
|
||
|
* Copyright (c) 2020 Raspberry Pi (Trading) Ltd.
|
||
|
*
|
||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||
|
*/
|
||
|
|
||
|
#include "pico.h"
|
||
|
#include "hardware/structs/rosc.h"
|
||
|
|
||
|
static uint8_t pico_lwip_random_byte(int cycles) {
|
||
|
static uint8_t byte;
|
||
|
assert(cycles >= 8);
|
||
|
assert(rosc_hw->status & ROSC_STATUS_ENABLED_BITS);
|
||
|
for(int i=0;i<cycles;i++) {
|
||
|
// picked a fairly arbitrary polynomial of 0x35u - this doesn't have to be crazily uniform.
|
||
|
byte = ((byte << 1) | rosc_hw->randombit) ^ (byte & 0x80u ? 0x35u : 0);
|
||
|
// delay a little because the random bit is a little slow
|
||
|
busy_wait_at_least_cycles(30);
|
||
|
}
|
||
|
return byte;
|
||
|
}
|
||
|
|
||
|
unsigned int pico_lwip_rand(void) {
|
||
|
uint32_t value = 0;
|
||
|
for (int i = 0; i < 4; i++) {
|
||
|
value = (value << 8u) | pico_lwip_random_byte(32);
|
||
|
}
|
||
|
return value;
|
||
|
}
|