| /* |
| * 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; |
| } |