blob: 2c4cdf87813b6fe3c56d5d354b01d267cfb07051 [file] [log] [blame]
/*
* 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;
}