mirror of
https://github.com/espressif/esp-idf.git
synced 2025-11-20 17:29:45 +01:00
peripheral enable/disable usually should be managed by driver itself, so make it as espressif private APIs, not recommended for user to use it in application code. However, if user want to re-write the driver or ports to other platform, this is still possible by including the header in this way: "esp_private/peripheral_ctrl.h"
72 lines
1.8 KiB
C
72 lines
1.8 KiB
C
/*
|
|
* SPDX-FileCopyrightText: 2010-2021 Espressif Systems (Shanghai) CO LTD
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
#include "sdkconfig.h"
|
|
#include "bootloader_random.h"
|
|
#include "hal/cpu_hal.h"
|
|
#include "soc/wdev_reg.h"
|
|
|
|
#ifndef BOOTLOADER_BUILD
|
|
#include "esp_system.h"
|
|
#include "esp_private/periph_ctrl.h"
|
|
|
|
__attribute__((weak)) void bootloader_fill_random(void *buffer, size_t length)
|
|
{
|
|
return esp_fill_random(buffer, length);
|
|
}
|
|
|
|
#else
|
|
__attribute__((weak)) void bootloader_fill_random(void *buffer, size_t length)
|
|
{
|
|
uint8_t *buffer_bytes = (uint8_t *)buffer;
|
|
uint32_t random;
|
|
uint32_t start, now;
|
|
|
|
assert(buffer != NULL);
|
|
|
|
for (size_t i = 0; i < length; i++) {
|
|
if (i == 0 || i % 4 == 0) { /* redundant check is for a compiler warning */
|
|
/* in bootloader with ADC feeding HWRNG, we accumulate 1
|
|
bit of entropy per 40 APB cycles (==80 CPU cycles.)
|
|
|
|
To avoid reading the entire RNG hardware state out
|
|
as-is, we repeatedly read the RNG register and XOR all
|
|
values.
|
|
*/
|
|
random = REG_READ(WDEV_RND_REG);
|
|
start = cpu_hal_get_cycle_count();
|
|
do {
|
|
random ^= REG_READ(WDEV_RND_REG);
|
|
now = cpu_hal_get_cycle_count();
|
|
} while (now - start < 80 * 32 * 2); /* extra factor of 2 is precautionary */
|
|
}
|
|
buffer_bytes[i] = random >> ((i % 4) * 8);
|
|
}
|
|
}
|
|
|
|
#ifndef CONFIG_IDF_ENV_FPGA
|
|
|
|
#else // CONFIG_IDF_ENV_FPGA
|
|
#include "esp_log.h"
|
|
|
|
static void s_non_functional(const char *func)
|
|
{
|
|
ESP_EARLY_LOGW("rand", "%s non-functional for FPGA builds", func);
|
|
}
|
|
|
|
void bootloader_random_enable()
|
|
{
|
|
s_non_functional(__func__);
|
|
}
|
|
|
|
void bootloader_random_disable()
|
|
{
|
|
s_non_functional(__func__);
|
|
}
|
|
|
|
#endif // CONFIG_IDF_ENV_FPGA
|
|
|
|
#endif // BOOTLOADER_BUILD
|