mirror of
https://github.com/espressif/esp-idf.git
synced 2024-10-05 20:47:46 -04:00
spi_flash: Remove legacy spi_flash drivers
This commit is contained in:
parent
d9b4b82edc
commit
a690a87829
@ -945,7 +945,7 @@ UT_C3_SDSPI:
|
|||||||
|
|
||||||
UT_S3:
|
UT_S3:
|
||||||
extends: .unit_test_esp32s3_template
|
extends: .unit_test_esp32s3_template
|
||||||
parallel: 28
|
parallel: 29
|
||||||
tags:
|
tags:
|
||||||
- ESP32S3_IDF
|
- ESP32S3_IDF
|
||||||
- UT_T1_1
|
- UT_T1_1
|
||||||
|
@ -14,11 +14,10 @@
|
|||||||
|
|
||||||
#include "esp_err.h"
|
#include "esp_err.h"
|
||||||
#include "esp_partition.h"
|
#include "esp_partition.h"
|
||||||
#include "esp_spi_flash.h"
|
#include "spi_flash_mmap.h"
|
||||||
#include "esp_image_format.h"
|
#include "esp_image_format.h"
|
||||||
#include "esp_secure_boot.h"
|
#include "esp_secure_boot.h"
|
||||||
#include "esp_flash_encrypt.h"
|
#include "esp_flash_encrypt.h"
|
||||||
#include "esp_spi_flash.h"
|
|
||||||
#include "sdkconfig.h"
|
#include "sdkconfig.h"
|
||||||
|
|
||||||
#include "esp_ota_ops.h"
|
#include "esp_ota_ops.h"
|
||||||
|
@ -7,7 +7,8 @@
|
|||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <esp_err.h>
|
#include <esp_err.h>
|
||||||
#include <esp_spi_flash.h> /* including in bootloader for error values */
|
#include "spi_flash_mmap.h" /* including in bootloader for error values */
|
||||||
|
#include "esp_private/spi_flash_os.h"
|
||||||
#include "sdkconfig.h"
|
#include "sdkconfig.h"
|
||||||
#include "soc/soc_caps.h"
|
#include "soc/soc_caps.h"
|
||||||
#include "bootloader_flash_override.h"
|
#include "bootloader_flash_override.h"
|
||||||
|
@ -10,7 +10,7 @@
|
|||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <esp_err.h>
|
#include <esp_err.h>
|
||||||
#include <esp_spi_flash.h> /* including in bootloader for error values */
|
#include <spi_flash_mmap.h> /* including in bootloader for error values */
|
||||||
#include "sdkconfig.h"
|
#include "sdkconfig.h"
|
||||||
#include "bootloader_flash.h"
|
#include "bootloader_flash.h"
|
||||||
|
|
||||||
|
@ -23,6 +23,9 @@
|
|||||||
# define SPIFLASH SPIMEM1
|
# define SPIFLASH SPIMEM1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// This dependency will be removed in the future. IDF-5025
|
||||||
|
#include "esp_flash.h"
|
||||||
|
|
||||||
#include "esp_rom_spiflash.h"
|
#include "esp_rom_spiflash.h"
|
||||||
|
|
||||||
#ifdef CONFIG_EFUSE_VIRTUAL_KEEP_IN_FLASH
|
#ifdef CONFIG_EFUSE_VIRTUAL_KEEP_IN_FLASH
|
||||||
@ -43,7 +46,7 @@
|
|||||||
#define ESP_BOOTLOADER_SPIFLASH_QE_SR1_2BYTE BIT9 // QE position when you write 16 bits at one time.
|
#define ESP_BOOTLOADER_SPIFLASH_QE_SR1_2BYTE BIT9 // QE position when you write 16 bits at one time.
|
||||||
|
|
||||||
#ifndef BOOTLOADER_BUILD
|
#ifndef BOOTLOADER_BUILD
|
||||||
/* Normal app version maps to esp_spi_flash.h operations...
|
/* Normal app version maps to spi_flash_mmap.h operations...
|
||||||
*/
|
*/
|
||||||
static const char *TAG = "bootloader_mmap";
|
static const char *TAG = "bootloader_mmap";
|
||||||
|
|
||||||
@ -82,33 +85,31 @@ void bootloader_munmap(const void *mapping)
|
|||||||
esp_err_t bootloader_flash_read(size_t src, void *dest, size_t size, bool allow_decrypt)
|
esp_err_t bootloader_flash_read(size_t src, void *dest, size_t size, bool allow_decrypt)
|
||||||
{
|
{
|
||||||
if (allow_decrypt && esp_flash_encryption_enabled()) {
|
if (allow_decrypt && esp_flash_encryption_enabled()) {
|
||||||
return spi_flash_read_encrypted(src, dest, size);
|
return esp_flash_read_encrypted(NULL, src, dest, size);
|
||||||
} else {
|
} else {
|
||||||
return spi_flash_read(src, dest, size);
|
return esp_flash_read(NULL, dest, src, size);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
esp_err_t bootloader_flash_write(size_t dest_addr, void *src, size_t size, bool write_encrypted)
|
esp_err_t bootloader_flash_write(size_t dest_addr, void *src, size_t size, bool write_encrypted)
|
||||||
{
|
{
|
||||||
if (write_encrypted && !ENCRYPTION_IS_VIRTUAL) {
|
if (write_encrypted && !ENCRYPTION_IS_VIRTUAL) {
|
||||||
#if CONFIG_IDF_TARGET_ESP32
|
return esp_flash_write_encrypted(NULL, dest_addr, src, size);
|
||||||
return spi_flash_write_encrypted(dest_addr, src, size);
|
|
||||||
#else
|
|
||||||
return esp_rom_spiflash_write_encrypted(dest_addr, src, size);
|
|
||||||
#endif
|
|
||||||
} else {
|
} else {
|
||||||
return spi_flash_write(dest_addr, src, size);
|
return esp_flash_write(NULL, src, dest_addr, size);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
esp_err_t bootloader_flash_erase_sector(size_t sector)
|
esp_err_t bootloader_flash_erase_sector(size_t sector)
|
||||||
{
|
{
|
||||||
return spi_flash_erase_sector(sector);
|
// Will de-dependency IDF-5025
|
||||||
|
return esp_flash_erase_region(NULL, sector * SPI_FLASH_SEC_SIZE, SPI_FLASH_SEC_SIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
esp_err_t bootloader_flash_erase_range(uint32_t start_addr, uint32_t size)
|
esp_err_t bootloader_flash_erase_range(uint32_t start_addr, uint32_t size)
|
||||||
{
|
{
|
||||||
return spi_flash_erase_range(start_addr, size);
|
// Will de-dependency IDF-5025
|
||||||
|
return esp_flash_erase_region(NULL, start_addr, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
#else //BOOTLOADER_BUILD
|
#else //BOOTLOADER_BUILD
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
#include "esp_attr.h"
|
#include "esp_attr.h"
|
||||||
#include "esp_err.h"
|
#include "esp_err.h"
|
||||||
#ifndef BOOTLOADER_BUILD
|
#ifndef BOOTLOADER_BUILD
|
||||||
#include "esp_spi_flash.h"
|
#include "spi_flash_mmap.h"
|
||||||
#endif
|
#endif
|
||||||
#include "hal/efuse_ll.h"
|
#include "hal/efuse_ll.h"
|
||||||
#include "sdkconfig.h"
|
#include "sdkconfig.h"
|
||||||
|
@ -11,7 +11,7 @@
|
|||||||
#include <esp_fault.h>
|
#include <esp_fault.h>
|
||||||
#include <esp_log.h>
|
#include <esp_log.h>
|
||||||
#include <esp_attr.h>
|
#include <esp_attr.h>
|
||||||
#include <esp_spi_flash.h>
|
#include <spi_flash_mmap.h>
|
||||||
#include <bootloader_flash_priv.h>
|
#include <bootloader_flash_priv.h>
|
||||||
#include <bootloader_random.h>
|
#include <bootloader_random.h>
|
||||||
#include <bootloader_sha.h>
|
#include <bootloader_sha.h>
|
||||||
|
@ -11,7 +11,7 @@
|
|||||||
#include "esp_log.h"
|
#include "esp_log.h"
|
||||||
#include "esp_image_format.h"
|
#include "esp_image_format.h"
|
||||||
#include "esp_secure_boot.h"
|
#include "esp_secure_boot.h"
|
||||||
#include "esp_spi_flash.h"
|
#include "spi_flash_mmap.h"
|
||||||
#include "esp_fault.h"
|
#include "esp_fault.h"
|
||||||
#include "esp32/rom/sha.h"
|
#include "esp32/rom/sha.h"
|
||||||
#include "uECC_verify_antifault.h"
|
#include "uECC_verify_antifault.h"
|
||||||
|
@ -26,7 +26,7 @@
|
|||||||
#include "test/test_common_spi.h"
|
#include "test/test_common_spi.h"
|
||||||
#include "soc/gpio_periph.h"
|
#include "soc/gpio_periph.h"
|
||||||
#include "sdkconfig.h"
|
#include "sdkconfig.h"
|
||||||
#include "../cache_utils.h"
|
#include "esp_private/cache_utils.h"
|
||||||
#include "soc/soc_memory_layout.h"
|
#include "soc/soc_memory_layout.h"
|
||||||
#include "esp_private/spi_common_internal.h"
|
#include "esp_private/spi_common_internal.h"
|
||||||
#include "esp_private/esp_clk.h"
|
#include "esp_private/esp_clk.h"
|
||||||
|
@ -29,8 +29,9 @@
|
|||||||
#include "sdkconfig.h"
|
#include "sdkconfig.h"
|
||||||
#include "esp_rom_uart.h"
|
#include "esp_rom_uart.h"
|
||||||
#include "esp_rom_sys.h"
|
#include "esp_rom_sys.h"
|
||||||
#include "esp_spi_flash.h"
|
#include "spi_flash_mmap.h"
|
||||||
#include "esp_attr.h"
|
#include "esp_attr.h"
|
||||||
|
#include "esp_private/spi_flash_os.h"
|
||||||
|
|
||||||
// Enable internal routing for the output and input gpio pins
|
// Enable internal routing for the output and input gpio pins
|
||||||
#define TEST_GPIO_INTERNAL_ROUTING 1
|
#define TEST_GPIO_INTERNAL_ROUTING 1
|
||||||
|
@ -11,7 +11,8 @@
|
|||||||
#include "freertos/semphr.h"
|
#include "freertos/semphr.h"
|
||||||
#include "unity.h"
|
#include "unity.h"
|
||||||
#include "driver/gptimer.h"
|
#include "driver/gptimer.h"
|
||||||
#include "esp_spi_flash.h"
|
#include "spi_flash_mmap.h"
|
||||||
|
#include "esp_flash.h"
|
||||||
#include "soc/soc_caps.h"
|
#include "soc/soc_caps.h"
|
||||||
|
|
||||||
#if CONFIG_GPTIMER_ISR_IRAM_SAFE
|
#if CONFIG_GPTIMER_ISR_IRAM_SAFE
|
||||||
@ -41,7 +42,7 @@ static void flash_read_task(void *varg)
|
|||||||
{
|
{
|
||||||
read_task_arg_t *arg = (read_task_arg_t *)varg;
|
read_task_arg_t *arg = (read_task_arg_t *)varg;
|
||||||
for (size_t i = 0; i < arg->repeat_count; i++) {
|
for (size_t i = 0; i < arg->repeat_count; i++) {
|
||||||
TEST_ESP_OK(spi_flash_read(arg->flash_addr, arg->buf, arg->buf_size));
|
TEST_ESP_OK(esp_flash_read(NULL, arg->buf, arg->flash_addr, arg->buf_size));
|
||||||
}
|
}
|
||||||
xSemaphoreGive(arg->done_sem);
|
xSemaphoreGive(arg->done_sem);
|
||||||
vTaskDelete(NULL);
|
vTaskDelete(NULL);
|
||||||
|
@ -11,10 +11,10 @@
|
|||||||
#include "freertos/semphr.h"
|
#include "freertos/semphr.h"
|
||||||
#include "unity.h"
|
#include "unity.h"
|
||||||
#include "driver/i2s_std.h"
|
#include "driver/i2s_std.h"
|
||||||
#include "esp_spi_flash.h"
|
|
||||||
#include "esp_attr.h"
|
#include "esp_attr.h"
|
||||||
#include "soc/soc_caps.h"
|
#include "soc/soc_caps.h"
|
||||||
#include "esp_private/i2s_platform.h"
|
#include "esp_private/i2s_platform.h"
|
||||||
|
#include "esp_private/spi_flash_os.h"
|
||||||
#include "test_inc/test_i2s.h"
|
#include "test_inc/test_i2s.h"
|
||||||
|
|
||||||
#if CONFIG_I2S_ISR_IRAM_SAFE
|
#if CONFIG_I2S_ISR_IRAM_SAFE
|
||||||
|
@ -12,9 +12,10 @@
|
|||||||
#include "unity.h"
|
#include "unity.h"
|
||||||
#include "driver/pulse_cnt.h"
|
#include "driver/pulse_cnt.h"
|
||||||
#include "driver/gpio.h"
|
#include "driver/gpio.h"
|
||||||
#include "esp_spi_flash.h"
|
#include "spi_flash_mmap.h"
|
||||||
#include "esp_attr.h"
|
#include "esp_attr.h"
|
||||||
#include "soc/soc_caps.h"
|
#include "soc/soc_caps.h"
|
||||||
|
#include "esp_private/spi_flash_os.h"
|
||||||
#include "test_pulse_cnt_board.h"
|
#include "test_pulse_cnt_board.h"
|
||||||
|
|
||||||
#if CONFIG_PCNT_ISR_IRAM_SAFE
|
#if CONFIG_PCNT_ISR_IRAM_SAFE
|
||||||
|
@ -47,9 +47,6 @@
|
|||||||
#if __has_include("esp_ping.h")
|
#if __has_include("esp_ping.h")
|
||||||
#include "esp_ping.h"
|
#include "esp_ping.h"
|
||||||
#endif
|
#endif
|
||||||
#if __has_include("esp_spi_flash.h")
|
|
||||||
#include "esp_spi_flash.h"
|
|
||||||
#endif
|
|
||||||
#if __has_include("esp_tls_errors.h")
|
#if __has_include("esp_tls_errors.h")
|
||||||
#include "esp_tls_errors.h"
|
#include "esp_tls_errors.h"
|
||||||
#endif
|
#endif
|
||||||
@ -71,6 +68,9 @@
|
|||||||
#if __has_include("soc/esp32s2/esp_ds.h")
|
#if __has_include("soc/esp32s2/esp_ds.h")
|
||||||
#include "soc/esp32s2/esp_ds.h"
|
#include "soc/esp32s2/esp_ds.h"
|
||||||
#endif
|
#endif
|
||||||
|
#if __has_include("spi_flash_mmap.h")
|
||||||
|
#include "spi_flash_mmap.h"
|
||||||
|
#endif
|
||||||
#if __has_include("ulp_fsm_common.h")
|
#if __has_include("ulp_fsm_common.h")
|
||||||
#include "ulp_fsm_common.h"
|
#include "ulp_fsm_common.h"
|
||||||
#endif
|
#endif
|
||||||
@ -565,7 +565,7 @@ static const esp_err_msg_t esp_err_msg_table[] = {
|
|||||||
# ifdef ESP_ERR_FLASH_BASE
|
# ifdef ESP_ERR_FLASH_BASE
|
||||||
ERR_TBL_IT(ESP_ERR_FLASH_BASE), /* 24576 0x6000 Starting number of flash error codes */
|
ERR_TBL_IT(ESP_ERR_FLASH_BASE), /* 24576 0x6000 Starting number of flash error codes */
|
||||||
# endif
|
# endif
|
||||||
// components/spi_flash/include/esp_spi_flash.h
|
// components/spi_flash/include/spi_flash_mmap.h
|
||||||
# ifdef ESP_ERR_FLASH_OP_FAIL
|
# ifdef ESP_ERR_FLASH_OP_FAIL
|
||||||
ERR_TBL_IT(ESP_ERR_FLASH_OP_FAIL), /* 24577 0x6001 */
|
ERR_TBL_IT(ESP_ERR_FLASH_OP_FAIL), /* 24577 0x6001 */
|
||||||
# endif
|
# endif
|
||||||
|
@ -9,7 +9,9 @@
|
|||||||
#include "soc/dport_reg.h"
|
#include "soc/dport_reg.h"
|
||||||
#include "esp_attr.h"
|
#include "esp_attr.h"
|
||||||
#include "string.h"
|
#include "string.h"
|
||||||
#include "esp_spi_flash.h"
|
#include "esp_private/spi_flash_os.h"
|
||||||
|
#include "esp_private/cache_utils.h"
|
||||||
|
#include "spi_flash_mmap.h"
|
||||||
|
|
||||||
//Errors that can be returned
|
//Errors that can be returned
|
||||||
#define MMU_SET_ADDR_ALIGNED_ERROR 1
|
#define MMU_SET_ADDR_ALIGNED_ERROR 1
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* SPDX-FileCopyrightText: 2021 Espressif Systems (Shanghai) CO LTD
|
* SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
*/
|
*/
|
||||||
@ -19,7 +19,7 @@ This code tests the interaction between PSRAM and SPI flash routines.
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "esp_heap_caps.h"
|
#include "esp_heap_caps.h"
|
||||||
#include "esp_spi_flash.h"
|
#include "spi_flash_mmap.h"
|
||||||
#include "esp_partition.h"
|
#include "esp_partition.h"
|
||||||
#include "test_utils.h"
|
#include "test_utils.h"
|
||||||
#include "soc/soc.h"
|
#include "soc/soc.h"
|
||||||
|
@ -12,8 +12,9 @@
|
|||||||
#include "esp_lcd_panel_ops.h"
|
#include "esp_lcd_panel_ops.h"
|
||||||
#include "esp_random.h"
|
#include "esp_random.h"
|
||||||
#include "esp_attr.h"
|
#include "esp_attr.h"
|
||||||
#include "esp_spi_flash.h"
|
#include "spi_flash_mmap.h"
|
||||||
#include "test_rgb_board.h"
|
#include "test_rgb_board.h"
|
||||||
|
#include "esp_private/spi_flash_os.h"
|
||||||
|
|
||||||
#if CONFIG_LCD_RGB_ISR_IRAM_SAFE
|
#if CONFIG_LCD_RGB_ISR_IRAM_SAFE
|
||||||
#define TEST_LCD_CALLBACK_ATTR IRAM_ATTR
|
#define TEST_LCD_CALLBACK_ATTR IRAM_ATTR
|
||||||
|
@ -12,8 +12,9 @@
|
|||||||
#include "freertos/semphr.h"
|
#include "freertos/semphr.h"
|
||||||
#include "freertos/ringbuf.h"
|
#include "freertos/ringbuf.h"
|
||||||
#include "driver/gptimer.h"
|
#include "driver/gptimer.h"
|
||||||
|
#include "esp_private/spi_flash_os.h"
|
||||||
#include "esp_heap_caps.h"
|
#include "esp_heap_caps.h"
|
||||||
#include "esp_spi_flash.h"
|
#include "spi_flash_mmap.h"
|
||||||
#include "unity.h"
|
#include "unity.h"
|
||||||
#include "test_utils.h"
|
#include "test_utils.h"
|
||||||
#include "esp_rom_sys.h"
|
#include "esp_rom_sys.h"
|
||||||
|
@ -43,6 +43,7 @@ PROVIDE ( esp_rom_get_cpu_ticks_per_us = ets_get_cpu_frequency );
|
|||||||
PROVIDE( esp_rom_spiflash_attach = spi_flash_attach );
|
PROVIDE( esp_rom_spiflash_attach = spi_flash_attach );
|
||||||
PROVIDE ( esp_rom_spiflash_clear_bp = esp_rom_spiflash_unlock );
|
PROVIDE ( esp_rom_spiflash_clear_bp = esp_rom_spiflash_unlock );
|
||||||
PROVIDE ( esp_rom_spiflash_write_enable = SPI_write_enable);
|
PROVIDE ( esp_rom_spiflash_write_enable = SPI_write_enable);
|
||||||
|
PROVIDE ( esp_rom_spiflash_erase_area = SPIEraseArea );
|
||||||
|
|
||||||
PROVIDE ( esp_rom_regi2c_read = rom_i2c_readReg );
|
PROVIDE ( esp_rom_regi2c_read = rom_i2c_readReg );
|
||||||
PROVIDE ( esp_rom_regi2c_read_mask = rom_i2c_readReg_Mask );
|
PROVIDE ( esp_rom_regi2c_read_mask = rom_i2c_readReg_Mask );
|
||||||
|
@ -45,6 +45,7 @@ PROVIDE ( esp_rom_get_cpu_ticks_per_us = ets_get_cpu_frequency );
|
|||||||
|
|
||||||
PROVIDE ( esp_rom_spiflash_clear_bp = esp_rom_spiflash_unlock );
|
PROVIDE ( esp_rom_spiflash_clear_bp = esp_rom_spiflash_unlock );
|
||||||
PROVIDE ( esp_rom_spiflash_write_enable = SPI_write_enable );
|
PROVIDE ( esp_rom_spiflash_write_enable = SPI_write_enable );
|
||||||
|
PROVIDE ( esp_rom_spiflash_erase_area = SPIEraseArea );
|
||||||
|
|
||||||
PROVIDE ( esp_rom_regi2c_read = rom_i2c_readReg );
|
PROVIDE ( esp_rom_regi2c_read = rom_i2c_readReg );
|
||||||
PROVIDE ( esp_rom_regi2c_read_mask = rom_i2c_readReg_Mask );
|
PROVIDE ( esp_rom_regi2c_read_mask = rom_i2c_readReg_Mask );
|
||||||
|
@ -48,6 +48,7 @@ PROVIDE ( esp_rom_get_cpu_ticks_per_us = ets_get_cpu_frequency );
|
|||||||
|
|
||||||
PROVIDE ( esp_rom_spiflash_clear_bp = esp_rom_spiflash_unlock );
|
PROVIDE ( esp_rom_spiflash_clear_bp = esp_rom_spiflash_unlock );
|
||||||
PROVIDE ( esp_rom_spiflash_write_enable = SPI_write_enable);
|
PROVIDE ( esp_rom_spiflash_write_enable = SPI_write_enable);
|
||||||
|
PROVIDE ( esp_rom_spiflash_erase_area = SPIEraseArea );
|
||||||
|
|
||||||
PROVIDE ( esp_rom_regi2c_read = rom_i2c_readReg );
|
PROVIDE ( esp_rom_regi2c_read = rom_i2c_readReg );
|
||||||
PROVIDE ( esp_rom_regi2c_read_mask = rom_i2c_readReg_Mask );
|
PROVIDE ( esp_rom_regi2c_read_mask = rom_i2c_readReg_Mask );
|
||||||
|
@ -48,6 +48,7 @@ PROVIDE ( esp_rom_get_cpu_ticks_per_us = ets_get_cpu_frequency );
|
|||||||
|
|
||||||
PROVIDE ( esp_rom_spiflash_clear_bp = esp_rom_spiflash_unlock );
|
PROVIDE ( esp_rom_spiflash_clear_bp = esp_rom_spiflash_unlock );
|
||||||
PROVIDE ( esp_rom_spiflash_write_enable = SPI_write_enable);
|
PROVIDE ( esp_rom_spiflash_write_enable = SPI_write_enable);
|
||||||
|
PROVIDE ( esp_rom_spiflash_erase_area = SPIEraseArea );
|
||||||
|
|
||||||
PROVIDE ( esp_rom_regi2c_read = rom_i2c_readReg );
|
PROVIDE ( esp_rom_regi2c_read = rom_i2c_readReg );
|
||||||
PROVIDE ( esp_rom_regi2c_read_mask = rom_i2c_readReg_Mask );
|
PROVIDE ( esp_rom_regi2c_read_mask = rom_i2c_readReg_Mask );
|
||||||
|
@ -23,3 +23,4 @@ PROVIDE ( esp_rom_spiflash_wait_idle = SPI_Wait_Idle );
|
|||||||
PROVIDE ( esp_rom_spiflash_config_readmode = SPIReadModeCnfig );
|
PROVIDE ( esp_rom_spiflash_config_readmode = SPIReadModeCnfig );
|
||||||
PROVIDE ( esp_rom_spiflash_erase_block = SPIEraseBlock );
|
PROVIDE ( esp_rom_spiflash_erase_block = SPIEraseBlock );
|
||||||
PROVIDE ( esp_rom_spiflash_write_encrypted = SPI_Encrypt_Write );
|
PROVIDE ( esp_rom_spiflash_write_encrypted = SPI_Encrypt_Write );
|
||||||
|
PROVIDE ( esp_rom_spiflash_erase_area = SPIEraseArea );
|
||||||
|
@ -49,6 +49,7 @@ PROVIDE ( esp_rom_get_cpu_ticks_per_us = ets_get_cpu_frequency );
|
|||||||
PROVIDE( esp_rom_spiflash_attach = spi_flash_attach );
|
PROVIDE( esp_rom_spiflash_attach = spi_flash_attach );
|
||||||
PROVIDE ( esp_rom_spiflash_clear_bp = esp_rom_spiflash_unlock );
|
PROVIDE ( esp_rom_spiflash_clear_bp = esp_rom_spiflash_unlock );
|
||||||
PROVIDE ( esp_rom_spiflash_write_enable = SPI_write_enable);
|
PROVIDE ( esp_rom_spiflash_write_enable = SPI_write_enable);
|
||||||
|
PROVIDE ( esp_rom_spiflash_erase_area = SPIEraseArea );
|
||||||
|
|
||||||
PROVIDE ( esp_rom_regi2c_read = rom_i2c_readReg );
|
PROVIDE ( esp_rom_regi2c_read = rom_i2c_readReg );
|
||||||
PROVIDE ( esp_rom_regi2c_read_mask = rom_i2c_readReg_Mask );
|
PROVIDE ( esp_rom_regi2c_read_mask = rom_i2c_readReg_Mask );
|
||||||
|
@ -1,22 +1,15 @@
|
|||||||
// Copyright 2015-2016 Espressif Systems (Shanghai) PTE LTD
|
/*
|
||||||
//
|
* SPDX-FileCopyrightText: 2015-2022 Espressif Systems (Shanghai) CO LTD
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
*
|
||||||
// you may not use this file except in compliance with the License.
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
// You may obtain a copy of the License at
|
*/
|
||||||
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "esp_err.h"
|
#include "esp_err.h"
|
||||||
#include "esp_spi_flash.h"
|
#include "spi_flash_mmap.h"
|
||||||
|
#include "esp_private/cache_utils.h"
|
||||||
|
|
||||||
#include "esp_rom_sys.h"
|
#include "esp_rom_sys.h"
|
||||||
|
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
#include "esp_spi_flash.h"
|
#include "spi_flash_mmap.h"
|
||||||
|
|
||||||
#include "soc/extmem_reg.h"
|
#include "soc/extmem_reg.h"
|
||||||
#include "esp_private/panic_internal.h"
|
#include "esp_private/panic_internal.h"
|
||||||
|
@ -72,7 +72,7 @@
|
|||||||
#include "soc/periph_defs.h"
|
#include "soc/periph_defs.h"
|
||||||
#include "esp_cpu.h"
|
#include "esp_cpu.h"
|
||||||
#include "esp_private/esp_clk.h"
|
#include "esp_private/esp_clk.h"
|
||||||
#include "esp_spi_flash.h"
|
#include "spi_flash_mmap.h"
|
||||||
|
|
||||||
#if CONFIG_ESP32_TRAX || CONFIG_ESP32S2_TRAX || CONFIG_ESP32S3_TRAX
|
#if CONFIG_ESP32_TRAX || CONFIG_ESP32S2_TRAX || CONFIG_ESP32S3_TRAX
|
||||||
#include "esp_private/trax.h"
|
#include "esp_private/trax.h"
|
||||||
|
@ -6,9 +6,10 @@
|
|||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
#include "esp_spi_flash.h"
|
#include "spi_flash_mmap.h"
|
||||||
#include "esp_ipc_isr.h"
|
#include "esp_ipc_isr.h"
|
||||||
#include "esp_private/system_internal.h"
|
#include "esp_private/system_internal.h"
|
||||||
|
#include "esp_private/cache_utils.h"
|
||||||
|
|
||||||
#include "soc/soc_memory_layout.h"
|
#include "soc/soc_memory_layout.h"
|
||||||
#include "esp_cpu.h"
|
#include "esp_cpu.h"
|
||||||
|
@ -23,7 +23,7 @@
|
|||||||
#include "esp_system.h"
|
#include "esp_system.h"
|
||||||
#include "esp_log.h"
|
#include "esp_log.h"
|
||||||
#include "esp_heap_caps_init.h"
|
#include "esp_heap_caps_init.h"
|
||||||
#include "esp_spi_flash.h"
|
#include "spi_flash_mmap.h"
|
||||||
#include "esp_flash_internal.h"
|
#include "esp_flash_internal.h"
|
||||||
#include "esp_newlib.h"
|
#include "esp_newlib.h"
|
||||||
#include "esp_timer.h"
|
#include "esp_timer.h"
|
||||||
@ -289,9 +289,9 @@ static void do_core_init(void)
|
|||||||
err = esp_pthread_init();
|
err = esp_pthread_init();
|
||||||
assert(err == ESP_OK && "Failed to init pthread module!");
|
assert(err == ESP_OK && "Failed to init pthread module!");
|
||||||
|
|
||||||
spi_flash_init();
|
#if CONFIG_SPI_FLASH_ROM_IMPL
|
||||||
/* init default OS-aware flash access critical section */
|
spi_flash_rom_impl_init();
|
||||||
spi_flash_guard_set(&g_flash_guard_default_ops);
|
#endif
|
||||||
|
|
||||||
esp_flash_app_init();
|
esp_flash_app_init();
|
||||||
esp_err_t flash_ret = esp_flash_init_default_chip();
|
esp_err_t flash_ret = esp_flash_init_default_chip();
|
||||||
|
@ -6,8 +6,9 @@
|
|||||||
#include "freertos/FreeRTOS.h"
|
#include "freertos/FreeRTOS.h"
|
||||||
#include "freertos/task.h"
|
#include "freertos/task.h"
|
||||||
#include "freertos/semphr.h"
|
#include "freertos/semphr.h"
|
||||||
#include "esp_spi_flash.h"
|
#include "spi_flash_mmap.h"
|
||||||
#include "esp_rom_sys.h"
|
#include "esp_rom_sys.h"
|
||||||
|
#include "esp_private/spi_flash_os.h"
|
||||||
#if CONFIG_IDF_TARGET_ESP32
|
#if CONFIG_IDF_TARGET_ESP32
|
||||||
#include "esp32/rom/ets_sys.h" // for ETSTimer type
|
#include "esp32/rom/ets_sys.h" // for ETSTimer type
|
||||||
#elif CONFIG_IDF_TARGET_ESP32S2
|
#elif CONFIG_IDF_TARGET_ESP32S2
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
#include "esp_attr.h"
|
#include "esp_attr.h"
|
||||||
#include "esp_partition.h"
|
#include "esp_partition.h"
|
||||||
#include "esp_ota_ops.h"
|
#include "esp_ota_ops.h"
|
||||||
#include "esp_spi_flash.h"
|
#include "spi_flash_mmap.h"
|
||||||
#include "esp_flash_encrypt.h"
|
#include "esp_flash_encrypt.h"
|
||||||
#include "sdkconfig.h"
|
#include "sdkconfig.h"
|
||||||
#include "core_dump_checksum.h"
|
#include "core_dump_checksum.h"
|
||||||
|
@ -11,6 +11,7 @@
|
|||||||
#include "esp_flash_internal.h"
|
#include "esp_flash_internal.h"
|
||||||
#include "esp_flash_encrypt.h"
|
#include "esp_flash_encrypt.h"
|
||||||
#include "esp_rom_crc.h"
|
#include "esp_rom_crc.h"
|
||||||
|
#include "esp_private/spi_flash_os.h"
|
||||||
|
|
||||||
#define BLANK_COREDUMP_SIZE 0xFFFFFFFF
|
#define BLANK_COREDUMP_SIZE 0xFFFFFFFF
|
||||||
|
|
||||||
@ -41,15 +42,9 @@ typedef struct _core_dump_flash_config_t
|
|||||||
/* Core dump flash data. */
|
/* Core dump flash data. */
|
||||||
static core_dump_flash_config_t s_core_flash_config;
|
static core_dump_flash_config_t s_core_flash_config;
|
||||||
|
|
||||||
#ifdef CONFIG_SPI_FLASH_USE_LEGACY_IMPL
|
|
||||||
#define ESP_COREDUMP_FLASH_WRITE(_off_, _data_, _len_) spi_flash_write(_off_, _data_, _len_)
|
|
||||||
#define ESP_COREDUMP_FLASH_WRITE_ENCRYPTED(_off_, _data_, _len_) spi_flash_write_encrypted(_off_, _data_, _len_)
|
|
||||||
#define ESP_COREDUMP_FLASH_ERASE(_off_, _len_) spi_flash_erase_range(_off_, _len_)
|
|
||||||
#else
|
|
||||||
#define ESP_COREDUMP_FLASH_WRITE(_off_, _data_, _len_) esp_flash_write(esp_flash_default_chip, _data_, _off_, _len_)
|
#define ESP_COREDUMP_FLASH_WRITE(_off_, _data_, _len_) esp_flash_write(esp_flash_default_chip, _data_, _off_, _len_)
|
||||||
#define ESP_COREDUMP_FLASH_WRITE_ENCRYPTED(_off_, _data_, _len_) esp_flash_write_encrypted(esp_flash_default_chip, _off_, _data_, _len_)
|
#define ESP_COREDUMP_FLASH_WRITE_ENCRYPTED(_off_, _data_, _len_) esp_flash_write_encrypted(esp_flash_default_chip, _off_, _data_, _len_)
|
||||||
#define ESP_COREDUMP_FLASH_ERASE(_off_, _len_) esp_flash_erase_region(esp_flash_default_chip, _off_, _len_)
|
#define ESP_COREDUMP_FLASH_ERASE(_off_, _len_) esp_flash_erase_region(esp_flash_default_chip, _off_, _len_)
|
||||||
#endif
|
|
||||||
|
|
||||||
esp_err_t esp_core_dump_image_check(void);
|
esp_err_t esp_core_dump_image_check(void);
|
||||||
static esp_err_t esp_core_dump_partition_and_size_get(const esp_partition_t **partition, uint32_t* size);
|
static esp_err_t esp_core_dump_partition_and_size_get(const esp_partition_t **partition, uint32_t* size);
|
||||||
|
@ -9,8 +9,6 @@
|
|||||||
|
|
||||||
#define CONFIG_PARTITION_TABLE_OFFSET 0x8000
|
#define CONFIG_PARTITION_TABLE_OFFSET 0x8000
|
||||||
#define CONFIG_ESPTOOLPY_FLASHSIZE "8MB"
|
#define CONFIG_ESPTOOLPY_FLASHSIZE "8MB"
|
||||||
//currently use the legacy implementation, since the stubs for new HAL are not done yet
|
|
||||||
#define CONFIG_SPI_FLASH_USE_LEGACY_IMPL 1
|
|
||||||
|
|
||||||
#define CONFIG_FATFS_VOLUME_COUNT 2
|
#define CONFIG_FATFS_VOLUME_COUNT 2
|
||||||
#define CONFIG_MMU_PAGE_SIZE 0X10000 // 64KB
|
#define CONFIG_MMU_PAGE_SIZE 0X10000 // 64KB
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
#include "unity.h"
|
#include "unity.h"
|
||||||
#include "esp_attr.h"
|
#include "esp_attr.h"
|
||||||
#include "esp_heap_caps.h"
|
#include "esp_heap_caps.h"
|
||||||
#include "esp_spi_flash.h"
|
#include "spi_flash_mmap.h"
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
@ -7,8 +7,9 @@
|
|||||||
#include "unity.h"
|
#include "unity.h"
|
||||||
#include "esp_attr.h"
|
#include "esp_attr.h"
|
||||||
#include "esp_heap_caps.h"
|
#include "esp_heap_caps.h"
|
||||||
#include "esp_spi_flash.h"
|
#include "spi_flash_mmap.h"
|
||||||
#include "esp_memory_utils.h"
|
#include "esp_memory_utils.h"
|
||||||
|
#include "esp_private/spi_flash_os.h"
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
|
|
||||||
|
@ -7,8 +7,9 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
#include "esp_system.h"
|
#include "esp_system.h"
|
||||||
#include "esp_spi_flash.h"
|
#include "spi_flash_mmap.h"
|
||||||
#include "soc/soc_memory_layout.h"
|
#include "soc/soc_memory_layout.h"
|
||||||
|
#include "esp_private/cache_utils.h"
|
||||||
|
|
||||||
#define ASSERT_STR "assert failed: "
|
#define ASSERT_STR "assert failed: "
|
||||||
#define CACHE_DISABLED_STR "<cached disabled>"
|
#define CACHE_DISABLED_STR "<cached disabled>"
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
#include "esp_log.h"
|
#include "esp_log.h"
|
||||||
#include "esp_attr.h"
|
#include "esp_attr.h"
|
||||||
#include "hal/cpu_hal.h"
|
#include "hal/cpu_hal.h"
|
||||||
#include "../cache_utils.h"
|
#include "esp_private/cache_utils.h"
|
||||||
|
|
||||||
#define RECORD_TIME_PREPARE() uint32_t __t1, __t2
|
#define RECORD_TIME_PREPARE() uint32_t __t1, __t2
|
||||||
#define RECORD_TIME_START() do {__t1 = cpu_hal_get_cycle_count();}while(0)
|
#define RECORD_TIME_START() do {__t1 = cpu_hal_get_cycle_count();}while(0)
|
||||||
|
@ -12,7 +12,7 @@
|
|||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include "esp_spi_flash.h"
|
#include "spi_flash_mmap.h"
|
||||||
#include "compressed_enum_table.hpp"
|
#include "compressed_enum_table.hpp"
|
||||||
#include "intrusive_list.h"
|
#include "intrusive_list.h"
|
||||||
#include "nvs_item_hash_list.hpp"
|
#include "nvs_item_hash_list.hpp"
|
||||||
|
@ -1,6 +1,4 @@
|
|||||||
#define CONFIG_NVS_ENCRYPTION 1
|
#define CONFIG_NVS_ENCRYPTION 1
|
||||||
//currently use the legacy implementation, since the stubs for new HAL are not done yet
|
|
||||||
#define CONFIG_SPI_FLASH_USE_LEGACY_IMPL 1
|
|
||||||
#define CONFIG_LOG_MAXIMUM_LEVEL 3
|
#define CONFIG_LOG_MAXIMUM_LEVEL 3
|
||||||
#define CONFIG_LOG_TIMESTAMP_SOURCE_RTOS 1
|
#define CONFIG_LOG_TIMESTAMP_SOURCE_RTOS 1
|
||||||
#define CONFIG_IDF_TARGET_LINUX 1
|
#define CONFIG_IDF_TARGET_LINUX 1
|
||||||
|
@ -1,16 +1,8 @@
|
|||||||
// Copyright 2015-2016 Espressif Systems (Shanghai) PTE LTD
|
/*
|
||||||
//
|
* SPDX-FileCopyrightText: 2015-2022 Espressif Systems (Shanghai) CO LTD
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
*
|
||||||
// you may not use this file except in compliance with the License.
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
// You may obtain a copy of the License at
|
*/
|
||||||
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
#ifndef spi_flash_emulation_h
|
#ifndef spi_flash_emulation_h
|
||||||
#define spi_flash_emulation_h
|
#define spi_flash_emulation_h
|
||||||
|
|
||||||
@ -18,7 +10,7 @@
|
|||||||
#include <cassert>
|
#include <cassert>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <random>
|
#include <random>
|
||||||
#include "esp_spi_flash.h"
|
#include "spi_flash_mmap.h"
|
||||||
#include "catch.hpp"
|
#include "catch.hpp"
|
||||||
|
|
||||||
using std::copy;
|
using std::copy;
|
||||||
|
@ -22,6 +22,7 @@ else()
|
|||||||
"flash_ops.c"
|
"flash_ops.c"
|
||||||
"${target}/flash_ops_${target}.c"
|
"${target}/flash_ops_${target}.c"
|
||||||
)
|
)
|
||||||
|
|
||||||
set(srcs
|
set(srcs
|
||||||
"partition.c"
|
"partition.c"
|
||||||
"partition_target.c"
|
"partition_target.c"
|
||||||
|
@ -100,19 +100,10 @@ menu "SPI Flash driver"
|
|||||||
bool "Allowed"
|
bool "Allowed"
|
||||||
endchoice
|
endchoice
|
||||||
|
|
||||||
config SPI_FLASH_USE_LEGACY_IMPL
|
|
||||||
bool "Use the legacy implementation before IDF v4.0"
|
|
||||||
default n
|
|
||||||
help
|
|
||||||
The implementation of SPI flash has been greatly changed in IDF v4.0.
|
|
||||||
Enable this option to use the legacy implementation.
|
|
||||||
|
|
||||||
config SPI_FLASH_SHARE_SPI1_BUS
|
config SPI_FLASH_SHARE_SPI1_BUS
|
||||||
bool "Support other devices attached to SPI1 bus"
|
bool "Support other devices attached to SPI1 bus"
|
||||||
default n
|
default n
|
||||||
# The bus lock on SPI1 is meaningless when the legacy implementation is used, or the SPI
|
depends on !IDF_TARGET_ESP32S2
|
||||||
# driver does not support SPI1.
|
|
||||||
depends on !SPI_FLASH_USE_LEGACY_IMPL && !IDF_TARGET_ESP32S2
|
|
||||||
help
|
help
|
||||||
Each SPI bus needs a lock for arbitration among devices. This allows multiple
|
Each SPI bus needs a lock for arbitration among devices. This allows multiple
|
||||||
devices on a same bus, but may reduce the speed of esp_flash driver access to the
|
devices on a same bus, but may reduce the speed of esp_flash driver access to the
|
||||||
@ -160,7 +151,7 @@ menu "SPI Flash driver"
|
|||||||
config SPI_FLASH_AUTO_SUSPEND
|
config SPI_FLASH_AUTO_SUSPEND
|
||||||
bool "Auto suspend long erase/write operations (READ DOCS FIRST)"
|
bool "Auto suspend long erase/write operations (READ DOCS FIRST)"
|
||||||
default n
|
default n
|
||||||
depends on IDF_TARGET_ESP32C3 && !SPI_FLASH_USE_LEGACY_IMPL && !SPI_FLASH_ROM_IMPL
|
depends on IDF_TARGET_ESP32C3 && !SPI_FLASH_ROM_IMPL
|
||||||
help
|
help
|
||||||
This option is default n before ESP32-C3, because it needs bootloader support.
|
This option is default n before ESP32-C3, because it needs bootloader support.
|
||||||
|
|
||||||
@ -191,14 +182,12 @@ menu "SPI Flash driver"
|
|||||||
|
|
||||||
config SPI_FLASH_CHECK_ERASE_TIMEOUT_DISABLED
|
config SPI_FLASH_CHECK_ERASE_TIMEOUT_DISABLED
|
||||||
bool "Flash timeout checkout disabled"
|
bool "Flash timeout checkout disabled"
|
||||||
depends on !SPI_FLASH_USE_LEGACY_IMPL
|
|
||||||
default n
|
default n
|
||||||
help
|
help
|
||||||
This option is helpful if you are using a flash chip whose timeout is quite large or unpredictable.
|
This option is helpful if you are using a flash chip whose timeout is quite large or unpredictable.
|
||||||
|
|
||||||
config SPI_FLASH_OVERRIDE_CHIP_DRIVER_LIST
|
config SPI_FLASH_OVERRIDE_CHIP_DRIVER_LIST
|
||||||
bool "Override default chip driver list"
|
bool "Override default chip driver list"
|
||||||
depends on !SPI_FLASH_USE_LEGACY_IMPL
|
|
||||||
default n
|
default n
|
||||||
help
|
help
|
||||||
This option allows the chip driver list to be customized, instead of using the default list provided by
|
This option allows the chip driver list to be customized, instead of using the default list provided by
|
||||||
|
@ -44,7 +44,7 @@
|
|||||||
#endif
|
#endif
|
||||||
#include "esp_attr.h"
|
#include "esp_attr.h"
|
||||||
#include "esp_intr_alloc.h"
|
#include "esp_intr_alloc.h"
|
||||||
#include "esp_spi_flash.h"
|
#include "spi_flash_mmap.h"
|
||||||
#include "esp_log.h"
|
#include "esp_log.h"
|
||||||
#include "esp_cpu.h"
|
#include "esp_cpu.h"
|
||||||
|
|
||||||
|
@ -1,74 +0,0 @@
|
|||||||
// Copyright 2015-2016 Espressif Systems (Shanghai) PTE LTD
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
|
|
||||||
#ifndef ESP_SPI_FLASH_CACHE_UTILS_H
|
|
||||||
#define ESP_SPI_FLASH_CACHE_UTILS_H
|
|
||||||
|
|
||||||
#include "sdkconfig.h"
|
|
||||||
#include <stdbool.h>
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This header file contains declarations of cache manipulation functions
|
|
||||||
* used both in flash_ops.c and flash_mmap.c.
|
|
||||||
*
|
|
||||||
* These functions are considered internal and are not designed to be called from applications.
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Init mutex protecting access to spi_flash_* APIs
|
|
||||||
void spi_flash_init_lock(void);
|
|
||||||
|
|
||||||
// Take mutex protecting access to spi_flash_* APIs
|
|
||||||
void spi_flash_op_lock(void);
|
|
||||||
|
|
||||||
// Release said mutex
|
|
||||||
void spi_flash_op_unlock(void);
|
|
||||||
|
|
||||||
// Suspend the scheduler on both CPUs, disable cache.
|
|
||||||
// Contrary to its name this doesn't do anything with interrupts, yet.
|
|
||||||
// Interrupt disabling capability will be added once we implement
|
|
||||||
// interrupt allocation API.
|
|
||||||
void spi_flash_disable_interrupts_caches_and_other_cpu(void);
|
|
||||||
|
|
||||||
// Enable cache, enable interrupts (to be added in future), resume scheduler
|
|
||||||
void spi_flash_enable_interrupts_caches_and_other_cpu(void);
|
|
||||||
|
|
||||||
// Disables non-IRAM interrupt handlers on current CPU and caches on both CPUs.
|
|
||||||
// This function is implied to be called when other CPU is not running or running code from IRAM.
|
|
||||||
void spi_flash_disable_interrupts_caches_and_other_cpu_no_os(void);
|
|
||||||
|
|
||||||
// Enable cache, enable interrupts on current CPU.
|
|
||||||
// This function is implied to be called when other CPU is not running or running code from IRAM.
|
|
||||||
void spi_flash_enable_interrupts_caches_no_os(void);
|
|
||||||
|
|
||||||
// Mark the pages containing a flash region as having been
|
|
||||||
// erased or written to. This means the flash cache needs
|
|
||||||
// to be evicted before these pages can be flash_mmap()ed again,
|
|
||||||
// as they may contain stale data
|
|
||||||
//
|
|
||||||
// Only call this while holding spi_flash_op_lock()
|
|
||||||
// Returns true if cache was flushed, false otherwise
|
|
||||||
bool spi_flash_check_and_flush_cache(size_t start_addr, size_t length);
|
|
||||||
|
|
||||||
//config cache mode
|
|
||||||
#if !CONFIG_IDF_TARGET_ESP32
|
|
||||||
//config instrcutin cache size and cache block size by menuconfig
|
|
||||||
void esp_config_instruction_cache_mode(void);
|
|
||||||
//config data cache size and cache block size by menuconfig
|
|
||||||
void esp_config_data_cache_mode(void);
|
|
||||||
//enable cache wrap mode for instruction cache and data cache
|
|
||||||
esp_err_t esp_enable_cache_wrap(bool icache_wrap_enable, bool dcache_wrap_enable);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#endif //ESP_SPI_FLASH_CACHE_UTILS_H
|
|
@ -3,77 +3,3 @@
|
|||||||
*
|
*
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
*/
|
*/
|
||||||
#include <string.h>
|
|
||||||
#include "esp_spi_flash.h"
|
|
||||||
#include "esp32/rom/cache.h"
|
|
||||||
#include "esp_rom_spiflash.h"
|
|
||||||
|
|
||||||
static inline void IRAM_ATTR spi_flash_guard_start(void)
|
|
||||||
{
|
|
||||||
const spi_flash_guard_funcs_t *ops = spi_flash_guard_get();
|
|
||||||
if (ops && ops->start) {
|
|
||||||
ops->start();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void IRAM_ATTR spi_flash_guard_end(void)
|
|
||||||
{
|
|
||||||
const spi_flash_guard_funcs_t *ops = spi_flash_guard_get();
|
|
||||||
if (ops && ops->end) {
|
|
||||||
ops->end();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
extern void IRAM_ATTR flash_rom_init(void);
|
|
||||||
esp_rom_spiflash_result_t IRAM_ATTR spi_flash_write_encrypted_chip(size_t dest_addr, const void *src, size_t size)
|
|
||||||
{
|
|
||||||
const uint8_t *ssrc = (const uint8_t *)src;
|
|
||||||
esp_rom_spiflash_result_t rc = ESP_ROM_SPIFLASH_RESULT_OK;
|
|
||||||
|
|
||||||
assert((dest_addr % 16) == 0);
|
|
||||||
assert((size % 16) == 0);
|
|
||||||
|
|
||||||
/* esp_rom_spiflash_write_encrypted encrypts data in RAM as it writes,
|
|
||||||
so copy to a temporary buffer - 32 bytes at a time.
|
|
||||||
|
|
||||||
Each call to esp_rom_spiflash_write_encrypted takes a 32 byte "row" of
|
|
||||||
data to encrypt, and each row is two 16 byte AES blocks
|
|
||||||
that share a key (as derived from flash address).
|
|
||||||
*/
|
|
||||||
uint8_t encrypt_buf[32] __attribute__((aligned(4)));
|
|
||||||
uint32_t row_size;
|
|
||||||
for (size_t i = 0; i < size; i += row_size) {
|
|
||||||
uint32_t row_addr = dest_addr + i;
|
|
||||||
if (i == 0 && (row_addr % 32) != 0) {
|
|
||||||
/* writing to second block of a 32 byte row */
|
|
||||||
row_size = 16;
|
|
||||||
row_addr -= 16;
|
|
||||||
/* copy to second block in buffer */
|
|
||||||
memcpy(encrypt_buf + 16, ssrc + i, 16);
|
|
||||||
/* decrypt the first block from flash, will reencrypt to same bytes */
|
|
||||||
spi_flash_read_encrypted(row_addr, encrypt_buf, 16);
|
|
||||||
} else if (size - i == 16) {
|
|
||||||
/* 16 bytes left, is first block of a 32 byte row */
|
|
||||||
row_size = 16;
|
|
||||||
/* copy to first block in buffer */
|
|
||||||
memcpy(encrypt_buf, ssrc + i, 16);
|
|
||||||
/* decrypt the second block from flash, will reencrypt to same bytes */
|
|
||||||
spi_flash_read_encrypted(row_addr + 16, encrypt_buf + 16, 16);
|
|
||||||
} else {
|
|
||||||
/* Writing a full 32 byte row (2 blocks) */
|
|
||||||
row_size = 32;
|
|
||||||
memcpy(encrypt_buf, ssrc + i, 32);
|
|
||||||
}
|
|
||||||
|
|
||||||
spi_flash_guard_start();
|
|
||||||
flash_rom_init();
|
|
||||||
rc = esp_rom_spiflash_write_encrypted(row_addr, (uint32_t *)encrypt_buf, 32);
|
|
||||||
spi_flash_guard_end();
|
|
||||||
if (rc != ESP_ROM_SPIFLASH_RESULT_OK) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
bzero(encrypt_buf, sizeof(encrypt_buf));
|
|
||||||
|
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
|
|
||||||
#include "esp_spi_flash.h"
|
#include "spi_flash_mmap.h"
|
||||||
#include "soc/system_reg.h"
|
#include "soc/system_reg.h"
|
||||||
#include "soc/soc_memory_layout.h"
|
#include "soc/soc_memory_layout.h"
|
||||||
#include "esp32c2/rom/cache.h"
|
#include "esp32c2/rom/cache.h"
|
||||||
@ -16,61 +16,11 @@
|
|||||||
#include "esp_log.h"
|
#include "esp_log.h"
|
||||||
#include "esp_attr.h"
|
#include "esp_attr.h"
|
||||||
#include "esp_rom_spiflash.h"
|
#include "esp_rom_spiflash.h"
|
||||||
|
#include "esp_private/spi_flash_os.h"
|
||||||
static const char *TAG = "spiflash_esp32c2";
|
|
||||||
|
|
||||||
#define SPICACHE SPIMEM0
|
#define SPICACHE SPIMEM0
|
||||||
#define SPIFLASH SPIMEM1
|
#define SPIFLASH SPIMEM1
|
||||||
|
|
||||||
extern void IRAM_ATTR flash_rom_init(void);
|
|
||||||
esp_rom_spiflash_result_t IRAM_ATTR spi_flash_write_encrypted_chip(size_t dest_addr, const void *src, size_t size)
|
|
||||||
{
|
|
||||||
const spi_flash_guard_funcs_t *ops = spi_flash_guard_get();
|
|
||||||
esp_rom_spiflash_result_t rc;
|
|
||||||
|
|
||||||
assert((dest_addr % 16) == 0);
|
|
||||||
assert((size % 16) == 0);
|
|
||||||
|
|
||||||
/* src needs to be 32 bit aligned */
|
|
||||||
if (!esp_ptr_internal(src) || (intptr_t)src & 0x3) {
|
|
||||||
WORD_ALIGNED_ATTR uint8_t block[128]; // Need to buffer in RAM as we write
|
|
||||||
while (size > 0) {
|
|
||||||
size_t next_block = MIN(size, sizeof(block));
|
|
||||||
memcpy(block, src, next_block);
|
|
||||||
|
|
||||||
esp_rom_spiflash_result_t r = spi_flash_write_encrypted_chip(dest_addr, block, next_block);
|
|
||||||
if (r != ESP_ROM_SPIFLASH_RESULT_OK) {
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
|
|
||||||
size -= next_block;
|
|
||||||
dest_addr += next_block;
|
|
||||||
src = ((uint8_t *)src) + next_block;
|
|
||||||
}
|
|
||||||
bzero(block, sizeof(block));
|
|
||||||
|
|
||||||
return ESP_ROM_SPIFLASH_RESULT_OK;
|
|
||||||
} else { // Already in internal memory
|
|
||||||
ESP_LOGV(TAG, "calling esp_rom_spiflash_write_encrypted addr 0x%x src %p size 0x%x", dest_addr, src, size);
|
|
||||||
|
|
||||||
#ifndef CONFIG_SPI_FLASH_USE_LEGACY_IMPL
|
|
||||||
/* The ROM function SPI_Encrypt_Write assumes ADDR_BITLEN is already set but new
|
|
||||||
implementation doesn't automatically set this to a usable value */
|
|
||||||
SPIFLASH.user1.usr_addr_bitlen = 23;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (ops && ops->start) {
|
|
||||||
ops->start();
|
|
||||||
}
|
|
||||||
flash_rom_init();
|
|
||||||
rc = esp_rom_spiflash_write_encrypted(dest_addr, (uint32_t *)src, size);
|
|
||||||
if (ops && ops->end) {
|
|
||||||
ops->end();
|
|
||||||
}
|
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#define FLASH_WRAP_CMD 0x77
|
#define FLASH_WRAP_CMD 0x77
|
||||||
esp_err_t spi_flash_wrap_set(spi_flash_wrap_mode_t mode)
|
esp_err_t spi_flash_wrap_set(spi_flash_wrap_mode_t mode)
|
||||||
{
|
{
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
|
|
||||||
#include "esp_spi_flash.h"
|
#include "spi_flash_mmap.h"
|
||||||
#include "soc/system_reg.h"
|
#include "soc/system_reg.h"
|
||||||
#include "soc/soc_memory_layout.h"
|
#include "soc/soc_memory_layout.h"
|
||||||
#include "esp32c3/rom/cache.h"
|
#include "esp32c3/rom/cache.h"
|
||||||
@ -16,61 +16,11 @@
|
|||||||
#include "esp_log.h"
|
#include "esp_log.h"
|
||||||
#include "esp_attr.h"
|
#include "esp_attr.h"
|
||||||
#include "esp_rom_spiflash.h"
|
#include "esp_rom_spiflash.h"
|
||||||
|
#include "esp_private/spi_flash_os.h"
|
||||||
static const char *TAG = "spiflash_c3";
|
|
||||||
|
|
||||||
#define SPICACHE SPIMEM0
|
#define SPICACHE SPIMEM0
|
||||||
#define SPIFLASH SPIMEM1
|
#define SPIFLASH SPIMEM1
|
||||||
|
|
||||||
extern void IRAM_ATTR flash_rom_init(void);
|
|
||||||
esp_rom_spiflash_result_t IRAM_ATTR spi_flash_write_encrypted_chip(size_t dest_addr, const void *src, size_t size)
|
|
||||||
{
|
|
||||||
const spi_flash_guard_funcs_t *ops = spi_flash_guard_get();
|
|
||||||
esp_rom_spiflash_result_t rc;
|
|
||||||
|
|
||||||
assert((dest_addr % 16) == 0);
|
|
||||||
assert((size % 16) == 0);
|
|
||||||
|
|
||||||
/* src needs to be 32 bit aligned */
|
|
||||||
if (!esp_ptr_internal(src) || (intptr_t)src & 0x3) {
|
|
||||||
WORD_ALIGNED_ATTR uint8_t block[128]; // Need to buffer in RAM as we write
|
|
||||||
while (size > 0) {
|
|
||||||
size_t next_block = MIN(size, sizeof(block));
|
|
||||||
memcpy(block, src, next_block);
|
|
||||||
|
|
||||||
esp_rom_spiflash_result_t r = spi_flash_write_encrypted_chip(dest_addr, block, next_block);
|
|
||||||
if (r != ESP_ROM_SPIFLASH_RESULT_OK) {
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
|
|
||||||
size -= next_block;
|
|
||||||
dest_addr += next_block;
|
|
||||||
src = ((uint8_t *)src) + next_block;
|
|
||||||
}
|
|
||||||
bzero(block, sizeof(block));
|
|
||||||
|
|
||||||
return ESP_ROM_SPIFLASH_RESULT_OK;
|
|
||||||
} else { // Already in internal memory
|
|
||||||
ESP_LOGV(TAG, "calling esp_rom_spiflash_write_encrypted addr 0x%x src %p size 0x%x", dest_addr, src, size);
|
|
||||||
|
|
||||||
#ifndef CONFIG_SPI_FLASH_USE_LEGACY_IMPL
|
|
||||||
/* The ROM function SPI_Encrypt_Write assumes ADDR_BITLEN is already set but new
|
|
||||||
implementation doesn't automatically set this to a usable value */
|
|
||||||
SPIFLASH.user1.usr_addr_bitlen = 23;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (ops && ops->start) {
|
|
||||||
ops->start();
|
|
||||||
}
|
|
||||||
flash_rom_init();
|
|
||||||
rc = esp_rom_spiflash_write_encrypted(dest_addr, (uint32_t *)src, size);
|
|
||||||
if (ops && ops->end) {
|
|
||||||
ops->end();
|
|
||||||
}
|
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#define FLASH_WRAP_CMD 0x77
|
#define FLASH_WRAP_CMD 0x77
|
||||||
esp_err_t spi_flash_wrap_set(spi_flash_wrap_mode_t mode)
|
esp_err_t spi_flash_wrap_set(spi_flash_wrap_mode_t mode)
|
||||||
{
|
{
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
|
|
||||||
#include "esp_spi_flash.h"
|
#include "spi_flash_mmap.h"
|
||||||
#include "soc/system_reg.h"
|
#include "soc/system_reg.h"
|
||||||
#include "soc/soc_memory_layout.h"
|
#include "soc/soc_memory_layout.h"
|
||||||
#include "esp32h2/rom/cache.h"
|
#include "esp32h2/rom/cache.h"
|
||||||
@ -16,61 +16,11 @@
|
|||||||
#include "esp_log.h"
|
#include "esp_log.h"
|
||||||
#include "esp_attr.h"
|
#include "esp_attr.h"
|
||||||
#include "esp_rom_spiflash.h"
|
#include "esp_rom_spiflash.h"
|
||||||
|
#include "esp_private/spi_flash_os.h"
|
||||||
static const char *TAG = "spiflash_h2";
|
|
||||||
|
|
||||||
#define SPICACHE SPIMEM0
|
#define SPICACHE SPIMEM0
|
||||||
#define SPIFLASH SPIMEM1
|
#define SPIFLASH SPIMEM1
|
||||||
|
|
||||||
extern void IRAM_ATTR flash_rom_init(void);
|
|
||||||
esp_rom_spiflash_result_t IRAM_ATTR spi_flash_write_encrypted_chip(size_t dest_addr, const void *src, size_t size)
|
|
||||||
{
|
|
||||||
const spi_flash_guard_funcs_t *ops = spi_flash_guard_get();
|
|
||||||
esp_rom_spiflash_result_t rc;
|
|
||||||
|
|
||||||
assert((dest_addr % 16) == 0);
|
|
||||||
assert((size % 16) == 0);
|
|
||||||
|
|
||||||
/* src needs to be 32 bit aligned */
|
|
||||||
if (!esp_ptr_internal(src) || (intptr_t)src & 0x3) {
|
|
||||||
WORD_ALIGNED_ATTR uint8_t block[128]; // Need to buffer in RAM as we write
|
|
||||||
while (size > 0) {
|
|
||||||
size_t next_block = MIN(size, sizeof(block));
|
|
||||||
memcpy(block, src, next_block);
|
|
||||||
|
|
||||||
esp_rom_spiflash_result_t r = spi_flash_write_encrypted_chip(dest_addr, block, next_block);
|
|
||||||
if (r != ESP_ROM_SPIFLASH_RESULT_OK) {
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
|
|
||||||
size -= next_block;
|
|
||||||
dest_addr += next_block;
|
|
||||||
src = ((uint8_t *)src) + next_block;
|
|
||||||
}
|
|
||||||
bzero(block, sizeof(block));
|
|
||||||
|
|
||||||
return ESP_ROM_SPIFLASH_RESULT_OK;
|
|
||||||
} else { // Already in internal memory
|
|
||||||
ESP_LOGV(TAG, "calling esp_rom_spiflash_write_encrypted addr 0x%x src %p size 0x%x", dest_addr, src, size);
|
|
||||||
|
|
||||||
#ifndef CONFIG_SPI_FLASH_USE_LEGACY_IMPL
|
|
||||||
/* The ROM function SPI_Encrypt_Write assumes ADDR_BITLEN is already set but new
|
|
||||||
implementation doesn't automatically set this to a usable value */
|
|
||||||
SPIFLASH.user1.usr_addr_bitlen = 23;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (ops && ops->start) {
|
|
||||||
ops->start();
|
|
||||||
}
|
|
||||||
flash_rom_init();
|
|
||||||
rc = esp_rom_spiflash_write_encrypted(dest_addr, (uint32_t *)src, size);
|
|
||||||
if (ops && ops->end) {
|
|
||||||
ops->end();
|
|
||||||
}
|
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#define FLASH_WRAP_CMD 0x77
|
#define FLASH_WRAP_CMD 0x77
|
||||||
esp_err_t spi_flash_wrap_set(spi_flash_wrap_mode_t mode)
|
esp_err_t spi_flash_wrap_set(spi_flash_wrap_mode_t mode)
|
||||||
{
|
{
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
|
|
||||||
#include "esp_spi_flash.h"
|
#include "spi_flash_mmap.h"
|
||||||
#include "soc/system_reg.h"
|
#include "soc/system_reg.h"
|
||||||
#include "soc/soc_memory_layout.h"
|
#include "soc/soc_memory_layout.h"
|
||||||
#include "esp32s2/rom/cache.h"
|
#include "esp32s2/rom/cache.h"
|
||||||
@ -17,60 +17,9 @@
|
|||||||
#include "esp_log.h"
|
#include "esp_log.h"
|
||||||
#include "esp_rom_spiflash.h"
|
#include "esp_rom_spiflash.h"
|
||||||
|
|
||||||
static const char *TAG = "spiflash_s2";
|
|
||||||
|
|
||||||
#define SPICACHE SPIMEM0
|
#define SPICACHE SPIMEM0
|
||||||
#define SPIFLASH SPIMEM1
|
#define SPIFLASH SPIMEM1
|
||||||
|
|
||||||
extern void IRAM_ATTR flash_rom_init(void);
|
|
||||||
esp_rom_spiflash_result_t IRAM_ATTR spi_flash_write_encrypted_chip(size_t dest_addr, const void *src, size_t size)
|
|
||||||
{
|
|
||||||
const spi_flash_guard_funcs_t *ops = spi_flash_guard_get();
|
|
||||||
esp_rom_spiflash_result_t rc;
|
|
||||||
|
|
||||||
assert((dest_addr % 16) == 0);
|
|
||||||
assert((size % 16) == 0);
|
|
||||||
|
|
||||||
if (!esp_ptr_internal(src)) {
|
|
||||||
uint8_t block[128]; // Need to buffer in RAM as we write
|
|
||||||
while (size > 0) {
|
|
||||||
size_t next_block = MIN(size, sizeof(block));
|
|
||||||
memcpy(block, src, next_block);
|
|
||||||
|
|
||||||
esp_rom_spiflash_result_t r = spi_flash_write_encrypted_chip(dest_addr, block, next_block);
|
|
||||||
if (r != ESP_ROM_SPIFLASH_RESULT_OK) {
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
|
|
||||||
size -= next_block;
|
|
||||||
dest_addr += next_block;
|
|
||||||
src = ((uint8_t *)src) + next_block;
|
|
||||||
}
|
|
||||||
bzero(block, sizeof(block));
|
|
||||||
|
|
||||||
return ESP_ROM_SPIFLASH_RESULT_OK;
|
|
||||||
}
|
|
||||||
else { // Already in internal memory
|
|
||||||
ESP_LOGV(TAG, "calling SPI_Encrypt_Write addr 0x%x src %p size 0x%x", dest_addr, src, size);
|
|
||||||
|
|
||||||
#ifndef CONFIG_SPI_FLASH_USE_LEGACY_IMPL
|
|
||||||
/* The ROM function SPI_Encrypt_Write assumes ADDR_BITLEN is already set but new
|
|
||||||
implementation doesn't automatically set this to a usable value */
|
|
||||||
SPIFLASH.user1.usr_addr_bitlen = 23;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (ops && ops->start) {
|
|
||||||
ops->start();
|
|
||||||
}
|
|
||||||
flash_rom_init();
|
|
||||||
rc = esp_rom_spiflash_write_encrypted(dest_addr, (uint32_t*)src, size);
|
|
||||||
if (ops && ops->end) {
|
|
||||||
ops->end();
|
|
||||||
}
|
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
esp_err_t spi_flash_wrap_set(spi_flash_wrap_mode_t mode)
|
esp_err_t spi_flash_wrap_set(spi_flash_wrap_mode_t mode)
|
||||||
{
|
{
|
||||||
return bootloader_flash_wrap_set(mode);
|
return bootloader_flash_wrap_set(mode);
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
|
|
||||||
#include "esp_spi_flash.h"
|
#include "spi_flash_mmap.h"
|
||||||
#include "soc/system_reg.h"
|
#include "soc/system_reg.h"
|
||||||
#include "soc/soc_memory_layout.h"
|
#include "soc/soc_memory_layout.h"
|
||||||
#include "esp32s3/rom/cache.h"
|
#include "esp32s3/rom/cache.h"
|
||||||
@ -17,59 +17,9 @@
|
|||||||
#include "esp_log.h"
|
#include "esp_log.h"
|
||||||
#include "esp_rom_spiflash.h"
|
#include "esp_rom_spiflash.h"
|
||||||
|
|
||||||
static const char *TAG = "spiflash_s3";
|
|
||||||
|
|
||||||
#define SPICACHE SPIMEM0
|
#define SPICACHE SPIMEM0
|
||||||
#define SPIFLASH SPIMEM1
|
#define SPIFLASH SPIMEM1
|
||||||
|
|
||||||
extern void IRAM_ATTR flash_rom_init(void);
|
|
||||||
esp_rom_spiflash_result_t IRAM_ATTR spi_flash_write_encrypted_chip(size_t dest_addr, const void *src, size_t size)
|
|
||||||
{
|
|
||||||
const spi_flash_guard_funcs_t *ops = spi_flash_guard_get();
|
|
||||||
esp_rom_spiflash_result_t rc;
|
|
||||||
|
|
||||||
assert((dest_addr % 16) == 0);
|
|
||||||
assert((size % 16) == 0);
|
|
||||||
|
|
||||||
if (!esp_ptr_internal(src)) {
|
|
||||||
uint8_t block[128]; // Need to buffer in RAM as we write
|
|
||||||
while (size > 0) {
|
|
||||||
size_t next_block = MIN(size, sizeof(block));
|
|
||||||
memcpy(block, src, next_block);
|
|
||||||
|
|
||||||
esp_rom_spiflash_result_t r = spi_flash_write_encrypted_chip(dest_addr, block, next_block);
|
|
||||||
if (r != ESP_ROM_SPIFLASH_RESULT_OK) {
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
|
|
||||||
size -= next_block;
|
|
||||||
dest_addr += next_block;
|
|
||||||
src = ((uint8_t *)src) + next_block;
|
|
||||||
}
|
|
||||||
bzero(block, sizeof(block));
|
|
||||||
|
|
||||||
return ESP_ROM_SPIFLASH_RESULT_OK;
|
|
||||||
} else { // Already in internal memory
|
|
||||||
ESP_LOGV(TAG, "calling SPI_Encrypt_Write addr 0x%x src %p size 0x%x", dest_addr, src, size);
|
|
||||||
|
|
||||||
#ifndef CONFIG_SPI_FLASH_USE_LEGACY_IMPL
|
|
||||||
/* The ROM function SPI_Encrypt_Write assumes ADDR_BITLEN is already set but new
|
|
||||||
implementation doesn't automatically set this to a usable value */
|
|
||||||
SPIFLASH.user1.usr_addr_bitlen = 23;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (ops && ops->start) {
|
|
||||||
ops->start();
|
|
||||||
}
|
|
||||||
flash_rom_init();
|
|
||||||
rc = esp_rom_spiflash_write_encrypted(dest_addr, (void *)src, size);
|
|
||||||
if (ops && ops->end) {
|
|
||||||
ops->end();
|
|
||||||
}
|
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
esp_err_t spi_flash_wrap_set(spi_flash_wrap_mode_t mode)
|
esp_err_t spi_flash_wrap_set(spi_flash_wrap_mode_t mode)
|
||||||
{
|
{
|
||||||
return bootloader_flash_wrap_set(mode);
|
return bootloader_flash_wrap_set(mode);
|
||||||
|
@ -16,6 +16,7 @@
|
|||||||
#include "sdkconfig.h"
|
#include "sdkconfig.h"
|
||||||
#include "esp_flash_internal.h"
|
#include "esp_flash_internal.h"
|
||||||
#include "spi_flash_defs.h"
|
#include "spi_flash_defs.h"
|
||||||
|
#include "spi_flash_mmap.h"
|
||||||
#include "esp_rom_caps.h"
|
#include "esp_rom_caps.h"
|
||||||
#include "esp_rom_spiflash.h"
|
#include "esp_rom_spiflash.h"
|
||||||
#if CONFIG_IDF_TARGET_ESP32S2
|
#if CONFIG_IDF_TARGET_ESP32S2
|
||||||
@ -1051,19 +1052,32 @@ inline static IRAM_ATTR bool regions_overlap(uint32_t a_start, uint32_t a_len,ui
|
|||||||
return (a_end > b_start && b_end > a_start);
|
return (a_end > b_start && b_end > a_start);
|
||||||
}
|
}
|
||||||
|
|
||||||
//currently the legacy implementation is used, from flash_ops.c
|
|
||||||
esp_err_t spi_flash_read_encrypted(size_t src, void *dstv, size_t size);
|
|
||||||
|
|
||||||
esp_err_t IRAM_ATTR esp_flash_read_encrypted(esp_flash_t *chip, uint32_t address, void *out_buffer, uint32_t length)
|
esp_err_t IRAM_ATTR esp_flash_read_encrypted(esp_flash_t *chip, uint32_t address, void *out_buffer, uint32_t length)
|
||||||
{
|
{
|
||||||
/*
|
|
||||||
* Since currently this feature is supported only by the hardware, there
|
|
||||||
* is no way to support non-standard chips. We use the legacy
|
|
||||||
* implementation and skip the chip and driver layers.
|
|
||||||
*/
|
|
||||||
esp_err_t err = rom_spiflash_api_funcs->chip_check(&chip);
|
esp_err_t err = rom_spiflash_api_funcs->chip_check(&chip);
|
||||||
if (err != ESP_OK) return err;
|
if (err != ESP_OK) return err;
|
||||||
return spi_flash_read_encrypted(address, out_buffer, length);
|
if (address + length > g_rom_flashchip.chip_size) {
|
||||||
|
return ESP_ERR_INVALID_SIZE;
|
||||||
|
}
|
||||||
|
if (length == 0) {
|
||||||
|
return ESP_OK;
|
||||||
|
}
|
||||||
|
if (out_buffer == NULL) {
|
||||||
|
return ESP_ERR_INVALID_ARG;
|
||||||
|
}
|
||||||
|
|
||||||
|
const uint8_t *map;
|
||||||
|
spi_flash_mmap_handle_t map_handle;
|
||||||
|
size_t map_src = address & ~(SPI_FLASH_MMU_PAGE_SIZE - 1);
|
||||||
|
size_t map_size = length + (address - map_src);
|
||||||
|
|
||||||
|
err = spi_flash_mmap(map_src, map_size, SPI_FLASH_MMAP_DATA, (const void **)&map, &map_handle);
|
||||||
|
if (err != ESP_OK) {
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
memcpy(out_buffer, map + (address - map_src), length);
|
||||||
|
spi_flash_munmap(map_handle);
|
||||||
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
// test only, non-public
|
// test only, non-public
|
||||||
@ -1115,7 +1129,6 @@ esp_err_t esp_flash_suspend_cmd_init(esp_flash_t* chip)
|
|||||||
return chip->chip_drv->sus_setup(chip);
|
return chip->chip_drv->sus_setup(chip);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef CONFIG_SPI_FLASH_USE_LEGACY_IMPL
|
|
||||||
esp_err_t esp_flash_app_disable_protect(bool disable)
|
esp_err_t esp_flash_app_disable_protect(bool disable)
|
||||||
{
|
{
|
||||||
if (disable) {
|
if (disable) {
|
||||||
@ -1124,65 +1137,3 @@ esp_err_t esp_flash_app_disable_protect(bool disable)
|
|||||||
return esp_flash_app_enable_os_functions(esp_flash_default_chip);
|
return esp_flash_app_enable_os_functions(esp_flash_default_chip);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
/*------------------------------------------------------------------------------
|
|
||||||
Adapter layer to original api before IDF v4.0
|
|
||||||
------------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#ifndef CONFIG_SPI_FLASH_USE_LEGACY_IMPL
|
|
||||||
|
|
||||||
/* Translate any ESP_ERR_FLASH_xxx error code (new API) to a generic ESP_ERR_xyz error code
|
|
||||||
*/
|
|
||||||
static IRAM_ATTR esp_err_t spi_flash_translate_rc(esp_err_t err)
|
|
||||||
{
|
|
||||||
switch (err) {
|
|
||||||
case ESP_OK:
|
|
||||||
case ESP_ERR_INVALID_ARG:
|
|
||||||
case ESP_ERR_INVALID_SIZE:
|
|
||||||
case ESP_ERR_NO_MEM:
|
|
||||||
return err;
|
|
||||||
|
|
||||||
case ESP_ERR_FLASH_NOT_INITIALISED:
|
|
||||||
case ESP_ERR_FLASH_PROTECTED:
|
|
||||||
return ESP_ERR_INVALID_STATE;
|
|
||||||
|
|
||||||
case ESP_ERR_NOT_FOUND:
|
|
||||||
case ESP_ERR_FLASH_UNSUPPORTED_HOST:
|
|
||||||
case ESP_ERR_FLASH_UNSUPPORTED_CHIP:
|
|
||||||
return ESP_ERR_NOT_SUPPORTED;
|
|
||||||
|
|
||||||
case ESP_ERR_FLASH_NO_RESPONSE:
|
|
||||||
return ESP_ERR_INVALID_RESPONSE;
|
|
||||||
|
|
||||||
default:
|
|
||||||
ESP_EARLY_LOGE(TAG, "unexpected spi flash error code: 0x%x", err);
|
|
||||||
abort();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
esp_err_t IRAM_ATTR spi_flash_erase_range(uint32_t start_addr, uint32_t size)
|
|
||||||
{
|
|
||||||
esp_err_t err = esp_flash_erase_region(NULL, start_addr, size);
|
|
||||||
return spi_flash_translate_rc(err);
|
|
||||||
}
|
|
||||||
|
|
||||||
esp_err_t IRAM_ATTR spi_flash_write(size_t dst, const void *srcv, size_t size)
|
|
||||||
{
|
|
||||||
esp_err_t err = esp_flash_write(NULL, srcv, dst, size);
|
|
||||||
return spi_flash_translate_rc(err);
|
|
||||||
}
|
|
||||||
|
|
||||||
esp_err_t IRAM_ATTR spi_flash_read(size_t src, void *dstv, size_t size)
|
|
||||||
{
|
|
||||||
esp_err_t err = esp_flash_read(NULL, dstv, src, size);
|
|
||||||
return spi_flash_translate_rc(err);
|
|
||||||
}
|
|
||||||
|
|
||||||
esp_err_t IRAM_ATTR spi_flash_write_encrypted(size_t dest_addr, const void *src, size_t size)
|
|
||||||
{
|
|
||||||
esp_err_t err = esp_flash_write_encrypted(NULL, dest_addr, src, size);
|
|
||||||
return spi_flash_translate_rc(err);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // CONFIG_SPI_FLASH_USE_LEGACY_IMPL
|
|
||||||
|
@ -20,6 +20,8 @@
|
|||||||
#include "esp_flash_internal.h"
|
#include "esp_flash_internal.h"
|
||||||
#include "esp_rom_gpio.h"
|
#include "esp_rom_gpio.h"
|
||||||
#include "esp_private/spi_flash_os.h"
|
#include "esp_private/spi_flash_os.h"
|
||||||
|
#include "esp_private/cache_utils.h"
|
||||||
|
#include "esp_spi_flash_counters.h"
|
||||||
#include "esp_rom_spiflash.h"
|
#include "esp_rom_spiflash.h"
|
||||||
|
|
||||||
__attribute__((unused)) static const char TAG[] = "spi_flash";
|
__attribute__((unused)) static const char TAG[] = "spi_flash";
|
||||||
@ -29,8 +31,6 @@ __attribute__((unused)) static const char TAG[] = "spi_flash";
|
|||||||
esp_flash_t *esp_flash_default_chip = NULL;
|
esp_flash_t *esp_flash_default_chip = NULL;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef CONFIG_SPI_FLASH_USE_LEGACY_IMPL
|
|
||||||
|
|
||||||
#if defined CONFIG_ESPTOOLPY_FLASHFREQ_120M
|
#if defined CONFIG_ESPTOOLPY_FLASHFREQ_120M
|
||||||
#define DEFAULT_FLASH_SPEED 120
|
#define DEFAULT_FLASH_SPEED 120
|
||||||
#elif defined CONFIG_ESPTOOLPY_FLASHFREQ_80M
|
#elif defined CONFIG_ESPTOOLPY_FLASHFREQ_80M
|
||||||
@ -387,6 +387,11 @@ esp_err_t esp_flash_init_default_chip(void)
|
|||||||
esp_err_t esp_flash_app_init(void)
|
esp_err_t esp_flash_app_init(void)
|
||||||
{
|
{
|
||||||
esp_err_t err = ESP_OK;
|
esp_err_t err = ESP_OK;
|
||||||
|
spi_flash_init_lock();
|
||||||
|
spi_flash_guard_set(&g_flash_guard_default_ops);
|
||||||
|
#if CONFIG_SPI_FLASH_ENABLE_COUNTERS
|
||||||
|
spi_flash_reset_counters();
|
||||||
|
#endif
|
||||||
#if CONFIG_SPI_FLASH_SHARE_SPI1_BUS
|
#if CONFIG_SPI_FLASH_SHARE_SPI1_BUS
|
||||||
err = esp_flash_init_main_bus_lock();
|
err = esp_flash_init_main_bus_lock();
|
||||||
if (err != ESP_OK) return err;
|
if (err != ESP_OK) return err;
|
||||||
@ -394,5 +399,3 @@ esp_err_t esp_flash_app_init(void)
|
|||||||
err = esp_flash_app_enable_os_functions(&default_chip);
|
err = esp_flash_app_enable_os_functions(&default_chip);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif //!CONFIG_SPI_FLASH_USE_LEGACY_IMPL
|
|
||||||
|
@ -15,11 +15,12 @@
|
|||||||
#include "soc/mmu.h"
|
#include "soc/mmu.h"
|
||||||
#include "sdkconfig.h"
|
#include "sdkconfig.h"
|
||||||
#include "esp_attr.h"
|
#include "esp_attr.h"
|
||||||
#include "esp_spi_flash.h"
|
#include "spi_flash_mmap.h"
|
||||||
#include "esp_flash_encrypt.h"
|
#include "esp_flash_encrypt.h"
|
||||||
#include "esp_log.h"
|
#include "esp_log.h"
|
||||||
#include "cache_utils.h"
|
#include "esp_private/cache_utils.h"
|
||||||
#include "hal/mmu_ll.h"
|
#include "hal/mmu_ll.h"
|
||||||
|
#include "esp_rom_spiflash.h"
|
||||||
|
|
||||||
#if CONFIG_IDF_TARGET_ESP32
|
#if CONFIG_IDF_TARGET_ESP32
|
||||||
#include "soc/dport_reg.h"
|
#include "soc/dport_reg.h"
|
||||||
@ -129,7 +130,7 @@ esp_err_t IRAM_ATTR spi_flash_mmap(size_t src_addr, size_t size, spi_flash_mmap_
|
|||||||
if (src_addr & INVALID_PHY_PAGE(CONFIG_MMU_PAGE_SIZE)) {
|
if (src_addr & INVALID_PHY_PAGE(CONFIG_MMU_PAGE_SIZE)) {
|
||||||
return ESP_ERR_INVALID_ARG;
|
return ESP_ERR_INVALID_ARG;
|
||||||
}
|
}
|
||||||
if ((src_addr + size) > spi_flash_get_chip_size()) {
|
if ((src_addr + size) > g_rom_flashchip.chip_size) {
|
||||||
return ESP_ERR_INVALID_ARG;
|
return ESP_ERR_INVALID_ARG;
|
||||||
}
|
}
|
||||||
// region which should be mapped
|
// region which should be mapped
|
||||||
@ -162,7 +163,7 @@ esp_err_t IRAM_ATTR spi_flash_mmap_pages(const int *pages, size_t page_count, sp
|
|||||||
return ESP_ERR_INVALID_ARG;
|
return ESP_ERR_INVALID_ARG;
|
||||||
}
|
}
|
||||||
for (int i = 0; i < page_count; i++) {
|
for (int i = 0; i < page_count; i++) {
|
||||||
if (pages[i] < 0 || pages[i]*SPI_FLASH_MMU_PAGE_SIZE >= spi_flash_get_chip_size()) {
|
if (pages[i] < 0 || pages[i]*SPI_FLASH_MMU_PAGE_SIZE >= g_rom_flashchip.chip_size) {
|
||||||
return ESP_ERR_INVALID_ARG;
|
return ESP_ERR_INVALID_ARG;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
#include <soc/soc_memory_layout.h>
|
#include <soc/soc_memory_layout.h>
|
||||||
#include "sdkconfig.h"
|
#include "sdkconfig.h"
|
||||||
#include "esp_attr.h"
|
#include "esp_attr.h"
|
||||||
#include "esp_spi_flash.h"
|
#include "spi_flash_mmap.h"
|
||||||
#include "esp_log.h"
|
#include "esp_log.h"
|
||||||
#include "esp_private/system_internal.h"
|
#include "esp_private/system_internal.h"
|
||||||
#include "esp_private/spi_flash_os.h"
|
#include "esp_private/spi_flash_os.h"
|
||||||
@ -41,14 +41,12 @@
|
|||||||
#endif
|
#endif
|
||||||
#include "esp_rom_spiflash.h"
|
#include "esp_rom_spiflash.h"
|
||||||
#include "esp_flash_partitions.h"
|
#include "esp_flash_partitions.h"
|
||||||
#include "cache_utils.h"
|
#include "esp_private/cache_utils.h"
|
||||||
#include "esp_flash.h"
|
#include "esp_flash.h"
|
||||||
#include "esp_attr.h"
|
#include "esp_attr.h"
|
||||||
#include "bootloader_flash.h"
|
#include "bootloader_flash.h"
|
||||||
#include "esp_compiler.h"
|
#include "esp_compiler.h"
|
||||||
|
|
||||||
esp_rom_spiflash_result_t IRAM_ATTR spi_flash_write_encrypted_chip(size_t dest_addr, const void *src, size_t size);
|
|
||||||
|
|
||||||
/* bytes erased by SPIEraseBlock() ROM function */
|
/* bytes erased by SPIEraseBlock() ROM function */
|
||||||
#define BLOCK_ERASE_SIZE 65536
|
#define BLOCK_ERASE_SIZE 65536
|
||||||
|
|
||||||
@ -87,34 +85,29 @@ static spi_flash_counters_t s_flash_stats;
|
|||||||
|
|
||||||
#endif //CONFIG_SPI_FLASH_ENABLE_COUNTERS
|
#endif //CONFIG_SPI_FLASH_ENABLE_COUNTERS
|
||||||
|
|
||||||
#if CONFIG_SPI_FLASH_USE_LEGACY_IMPL
|
|
||||||
static esp_err_t spi_flash_translate_rc(esp_rom_spiflash_result_t rc);
|
|
||||||
#endif //CONFIG_SPI_FLASH_USE_LEGACY_IMPL
|
|
||||||
static bool is_safe_write_address(size_t addr, size_t size);
|
|
||||||
static void spi_flash_os_yield(void);
|
|
||||||
|
|
||||||
const DRAM_ATTR spi_flash_guard_funcs_t g_flash_guard_default_ops = {
|
const DRAM_ATTR spi_flash_guard_funcs_t g_flash_guard_default_ops = {
|
||||||
.start = spi_flash_disable_interrupts_caches_and_other_cpu,
|
.start = spi_flash_disable_interrupts_caches_and_other_cpu,
|
||||||
.end = spi_flash_enable_interrupts_caches_and_other_cpu,
|
.end = spi_flash_enable_interrupts_caches_and_other_cpu,
|
||||||
.op_lock = spi_flash_op_lock,
|
|
||||||
.op_unlock = spi_flash_op_unlock,
|
|
||||||
#if !CONFIG_SPI_FLASH_DANGEROUS_WRITE_ALLOWED
|
|
||||||
.is_safe_write_address = is_safe_write_address,
|
|
||||||
#endif
|
|
||||||
.yield = spi_flash_os_yield,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const DRAM_ATTR spi_flash_guard_funcs_t g_flash_guard_no_os_ops = {
|
const DRAM_ATTR spi_flash_guard_funcs_t g_flash_guard_no_os_ops = {
|
||||||
.start = spi_flash_disable_interrupts_caches_and_other_cpu_no_os,
|
.start = spi_flash_disable_interrupts_caches_and_other_cpu_no_os,
|
||||||
.end = spi_flash_enable_interrupts_caches_no_os,
|
.end = spi_flash_enable_interrupts_caches_no_os,
|
||||||
.op_lock = NULL,
|
|
||||||
.op_unlock = NULL,
|
|
||||||
#if !CONFIG_SPI_FLASH_DANGEROUS_WRITE_ALLOWED
|
|
||||||
.is_safe_write_address = NULL,
|
|
||||||
#endif
|
|
||||||
.yield = NULL,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const spi_flash_guard_funcs_t *s_flash_guard_ops;
|
||||||
|
|
||||||
|
void IRAM_ATTR spi_flash_guard_set(const spi_flash_guard_funcs_t *funcs)
|
||||||
|
{
|
||||||
|
s_flash_guard_ops = funcs;
|
||||||
|
}
|
||||||
|
|
||||||
|
const spi_flash_guard_funcs_t *IRAM_ATTR spi_flash_guard_get(void)
|
||||||
|
{
|
||||||
|
return s_flash_guard_ops;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#ifdef CONFIG_SPI_FLASH_DANGEROUS_WRITE_ABORTS
|
#ifdef CONFIG_SPI_FLASH_DANGEROUS_WRITE_ABORTS
|
||||||
#define UNSAFE_WRITE_ADDRESS abort()
|
#define UNSAFE_WRITE_ADDRESS abort()
|
||||||
#else
|
#else
|
||||||
@ -122,20 +115,6 @@ const DRAM_ATTR spi_flash_guard_funcs_t g_flash_guard_no_os_ops = {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* CHECK_WRITE_ADDRESS macro to fail writes which land in the
|
|
||||||
bootloader, partition table, or running application region.
|
|
||||||
*/
|
|
||||||
#if CONFIG_SPI_FLASH_DANGEROUS_WRITE_ALLOWED
|
|
||||||
// Following helps in masking "unused variable" warning
|
|
||||||
#define CHECK_WRITE_ADDRESS(ADDR, SIZE) ({(void) guard;})
|
|
||||||
#else /* FAILS or ABORTS */
|
|
||||||
#define CHECK_WRITE_ADDRESS(ADDR, SIZE) do { \
|
|
||||||
if (guard && guard->is_safe_write_address && !guard->is_safe_write_address(ADDR, SIZE)) { \
|
|
||||||
return ESP_ERR_INVALID_ARG; \
|
|
||||||
} \
|
|
||||||
} while(0)
|
|
||||||
#endif // CONFIG_SPI_FLASH_DANGEROUS_WRITE_ALLOWED
|
|
||||||
|
|
||||||
static __attribute__((unused)) bool is_safe_write_address(size_t addr, size_t size)
|
static __attribute__((unused)) bool is_safe_write_address(size_t addr, size_t size)
|
||||||
{
|
{
|
||||||
if (!esp_partition_main_flash_region_safe(addr, size)) {
|
if (!esp_partition_main_flash_region_safe(addr, size)) {
|
||||||
@ -146,12 +125,23 @@ static __attribute__((unused)) bool is_safe_write_address(size_t addr, size_t si
|
|||||||
|
|
||||||
#if CONFIG_SPI_FLASH_ROM_IMPL
|
#if CONFIG_SPI_FLASH_ROM_IMPL
|
||||||
#include "esp_heap_caps.h"
|
#include "esp_heap_caps.h"
|
||||||
typedef void *(*malloc_internal_cb_t)(size_t size);
|
|
||||||
|
|
||||||
void IRAM_ATTR *spi_flash_malloc_internal(size_t size)
|
void IRAM_ATTR *spi_flash_malloc_internal(size_t size)
|
||||||
{
|
{
|
||||||
return heap_caps_malloc(size, MALLOC_CAP_8BIT|MALLOC_CAP_INTERNAL);
|
return heap_caps_malloc(size, MALLOC_CAP_8BIT|MALLOC_CAP_INTERNAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void IRAM_ATTR spi_flash_rom_impl_init(void)
|
||||||
|
{
|
||||||
|
spi_flash_guard_set(&g_flash_guard_default_ops);
|
||||||
|
|
||||||
|
/* These two functions are in ROM only */
|
||||||
|
extern void spi_flash_mmap_os_func_set(void *(*func1)(size_t size), void (*func2)(void *p));
|
||||||
|
spi_flash_mmap_os_func_set(spi_flash_malloc_internal, heap_caps_free);
|
||||||
|
|
||||||
|
extern esp_err_t spi_flash_mmap_page_num_init(uint32_t page_num);
|
||||||
|
spi_flash_mmap_page_num_init(128);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void IRAM_ATTR esp_mspi_pin_init(void)
|
void IRAM_ATTR esp_mspi_pin_init(void)
|
||||||
@ -179,695 +169,6 @@ esp_err_t IRAM_ATTR spi_flash_init_chip_state(void)
|
|||||||
#endif // CONFIG_ESPTOOLPY_OCT_FLASH
|
#endif // CONFIG_ESPTOOLPY_OCT_FLASH
|
||||||
}
|
}
|
||||||
|
|
||||||
void spi_flash_init(void)
|
|
||||||
{
|
|
||||||
spi_flash_init_lock();
|
|
||||||
#if CONFIG_SPI_FLASH_ENABLE_COUNTERS
|
|
||||||
spi_flash_reset_counters();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if CONFIG_SPI_FLASH_ROM_IMPL
|
|
||||||
spi_flash_guard_set(&g_flash_guard_default_ops);
|
|
||||||
|
|
||||||
/* These two functions are in ROM only */
|
|
||||||
extern void spi_flash_mmap_os_func_set(void *(*func1)(size_t size), void (*func2)(void *p));
|
|
||||||
spi_flash_mmap_os_func_set(spi_flash_malloc_internal, heap_caps_free);
|
|
||||||
|
|
||||||
extern esp_err_t spi_flash_mmap_page_num_init(uint32_t page_num);
|
|
||||||
spi_flash_mmap_page_num_init(128);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
#if !CONFIG_SPI_FLASH_ROM_IMPL
|
|
||||||
|
|
||||||
static const spi_flash_guard_funcs_t *s_flash_guard_ops;
|
|
||||||
|
|
||||||
void IRAM_ATTR spi_flash_guard_set(const spi_flash_guard_funcs_t *funcs)
|
|
||||||
{
|
|
||||||
s_flash_guard_ops = funcs;
|
|
||||||
}
|
|
||||||
|
|
||||||
const spi_flash_guard_funcs_t *IRAM_ATTR spi_flash_guard_get(void)
|
|
||||||
{
|
|
||||||
return s_flash_guard_ops;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
size_t IRAM_ATTR spi_flash_get_chip_size(void)
|
|
||||||
{
|
|
||||||
return g_rom_flashchip.chip_size;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void IRAM_ATTR spi_flash_guard_start(void)
|
|
||||||
{
|
|
||||||
const spi_flash_guard_funcs_t *guard = spi_flash_guard_get();
|
|
||||||
if (guard && guard->start) {
|
|
||||||
guard->start();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void IRAM_ATTR spi_flash_guard_end(void)
|
|
||||||
{
|
|
||||||
const spi_flash_guard_funcs_t *guard = spi_flash_guard_get();
|
|
||||||
if (guard && guard->end) {
|
|
||||||
guard->end();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void IRAM_ATTR spi_flash_guard_op_lock(void)
|
|
||||||
{
|
|
||||||
const spi_flash_guard_funcs_t *guard = spi_flash_guard_get();
|
|
||||||
if (guard && guard->op_lock) {
|
|
||||||
guard->op_lock();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void IRAM_ATTR spi_flash_guard_op_unlock(void)
|
|
||||||
{
|
|
||||||
const spi_flash_guard_funcs_t *guard = spi_flash_guard_get();
|
|
||||||
if (guard && guard->op_unlock) {
|
|
||||||
guard->op_unlock();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void IRAM_ATTR spi_flash_os_yield(void)
|
|
||||||
{
|
|
||||||
#ifdef CONFIG_SPI_FLASH_YIELD_DURING_ERASE
|
|
||||||
if (likely(xTaskGetSchedulerState() == taskSCHEDULER_RUNNING)) {
|
|
||||||
vTaskDelay(CONFIG_SPI_FLASH_ERASE_YIELD_TICKS);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef CONFIG_SPI_FLASH_USE_LEGACY_IMPL
|
|
||||||
static esp_rom_spiflash_result_t IRAM_ATTR spi_flash_unlock(void)
|
|
||||||
{
|
|
||||||
static bool unlocked = false;
|
|
||||||
if (!unlocked) {
|
|
||||||
spi_flash_guard_start();
|
|
||||||
bootloader_flash_unlock();
|
|
||||||
spi_flash_guard_end();
|
|
||||||
unlocked = true;
|
|
||||||
}
|
|
||||||
return ESP_ROM_SPIFLASH_RESULT_OK;
|
|
||||||
}
|
|
||||||
#endif // CONFIG_SPI_FLASH_USE_LEGACY_IMPL
|
|
||||||
|
|
||||||
esp_err_t IRAM_ATTR spi_flash_erase_sector(size_t sec)
|
|
||||||
{
|
|
||||||
const spi_flash_guard_funcs_t *guard = spi_flash_guard_get();
|
|
||||||
CHECK_WRITE_ADDRESS(sec * SPI_FLASH_SEC_SIZE, SPI_FLASH_SEC_SIZE);
|
|
||||||
return spi_flash_erase_range(sec * SPI_FLASH_SEC_SIZE, SPI_FLASH_SEC_SIZE);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef CONFIG_SPI_FLASH_USE_LEGACY_IMPL
|
|
||||||
//deprecated, only used in compatible mode
|
|
||||||
esp_err_t IRAM_ATTR spi_flash_erase_range(size_t start_addr, size_t size)
|
|
||||||
{
|
|
||||||
const spi_flash_guard_funcs_t *guard = spi_flash_guard_get();
|
|
||||||
CHECK_WRITE_ADDRESS(start_addr, size);
|
|
||||||
if (start_addr % SPI_FLASH_SEC_SIZE != 0) {
|
|
||||||
return ESP_ERR_INVALID_ARG;
|
|
||||||
}
|
|
||||||
if (size % SPI_FLASH_SEC_SIZE != 0) {
|
|
||||||
return ESP_ERR_INVALID_SIZE;
|
|
||||||
}
|
|
||||||
if (size + start_addr > spi_flash_get_chip_size()) {
|
|
||||||
return ESP_ERR_INVALID_SIZE;
|
|
||||||
}
|
|
||||||
size_t start = start_addr / SPI_FLASH_SEC_SIZE;
|
|
||||||
size_t end = start + size / SPI_FLASH_SEC_SIZE;
|
|
||||||
const size_t sectors_per_block = BLOCK_ERASE_SIZE / SPI_FLASH_SEC_SIZE;
|
|
||||||
COUNTER_START();
|
|
||||||
esp_rom_spiflash_result_t rc;
|
|
||||||
rc = spi_flash_unlock();
|
|
||||||
if (rc == ESP_ROM_SPIFLASH_RESULT_OK) {
|
|
||||||
#ifdef CONFIG_SPI_FLASH_YIELD_DURING_ERASE
|
|
||||||
int64_t no_yield_time_us = 0;
|
|
||||||
#endif
|
|
||||||
for (size_t sector = start; sector != end && rc == ESP_ROM_SPIFLASH_RESULT_OK; ) {
|
|
||||||
#ifdef CONFIG_SPI_FLASH_YIELD_DURING_ERASE
|
|
||||||
int64_t start_time_us = esp_system_get_time();
|
|
||||||
#endif
|
|
||||||
spi_flash_guard_start();
|
|
||||||
#ifndef CONFIG_SPI_FLASH_BYPASS_BLOCK_ERASE
|
|
||||||
if (sector % sectors_per_block == 0 && end - sector >= sectors_per_block) {
|
|
||||||
rc = esp_rom_spiflash_erase_block(sector / sectors_per_block);
|
|
||||||
sector += sectors_per_block;
|
|
||||||
COUNTER_ADD_BYTES(erase, sectors_per_block * SPI_FLASH_SEC_SIZE);
|
|
||||||
} else
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
rc = esp_rom_spiflash_erase_sector(sector);
|
|
||||||
++sector;
|
|
||||||
COUNTER_ADD_BYTES(erase, SPI_FLASH_SEC_SIZE);
|
|
||||||
}
|
|
||||||
spi_flash_guard_end();
|
|
||||||
#ifdef CONFIG_SPI_FLASH_YIELD_DURING_ERASE
|
|
||||||
no_yield_time_us += (esp_system_get_time() - start_time_us);
|
|
||||||
if (no_yield_time_us / 1000 >= CONFIG_SPI_FLASH_ERASE_YIELD_DURATION_MS) {
|
|
||||||
no_yield_time_us = 0;
|
|
||||||
if (s_flash_guard_ops && s_flash_guard_ops->yield) {
|
|
||||||
s_flash_guard_ops->yield();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
|
||||||
COUNTER_STOP(erase);
|
|
||||||
|
|
||||||
spi_flash_guard_start();
|
|
||||||
// Ensure WEL is 0 after the operation, even if the erase failed.
|
|
||||||
esp_rom_spiflash_write_disable();
|
|
||||||
spi_flash_check_and_flush_cache(start_addr, size);
|
|
||||||
spi_flash_guard_end();
|
|
||||||
|
|
||||||
return spi_flash_translate_rc(rc);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Wrapper around esp_rom_spiflash_write() that verifies data as written if CONFIG_SPI_FLASH_VERIFY_WRITE is set.
|
|
||||||
|
|
||||||
If CONFIG_SPI_FLASH_VERIFY_WRITE is not set, this is esp_rom_spiflash_write().
|
|
||||||
*/
|
|
||||||
static IRAM_ATTR esp_rom_spiflash_result_t spi_flash_write_inner(uint32_t target, const uint32_t *src_addr, int32_t len)
|
|
||||||
{
|
|
||||||
#ifndef CONFIG_SPI_FLASH_VERIFY_WRITE
|
|
||||||
return esp_rom_spiflash_write(target, src_addr, len);
|
|
||||||
#else // CONFIG_SPI_FLASH_VERIFY_WRITE
|
|
||||||
esp_rom_spiflash_result_t res = ESP_ROM_SPIFLASH_RESULT_OK;
|
|
||||||
assert(len % sizeof(uint32_t) == 0);
|
|
||||||
|
|
||||||
uint32_t before_buf[ESP_ROM_SPIFLASH_BUFF_BYTE_READ_NUM / sizeof(uint32_t)];
|
|
||||||
uint32_t after_buf[ESP_ROM_SPIFLASH_BUFF_BYTE_READ_NUM / sizeof(uint32_t)];
|
|
||||||
uint32_t *expected_buf = before_buf;
|
|
||||||
int32_t remaining = len;
|
|
||||||
for(int i = 0; i < len; i += sizeof(before_buf)) {
|
|
||||||
int i_w = i / sizeof(uint32_t); // index in words (i is an index in bytes)
|
|
||||||
int32_t read_len = MIN(sizeof(before_buf), remaining);
|
|
||||||
|
|
||||||
// Read "before" contents from flash
|
|
||||||
res = esp_rom_spiflash_read(target + i, before_buf, read_len);
|
|
||||||
if (res != ESP_ROM_SPIFLASH_RESULT_OK) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int r = 0; r < read_len; r += sizeof(uint32_t)) {
|
|
||||||
int r_w = r / sizeof(uint32_t); // index in words (r is index in bytes)
|
|
||||||
|
|
||||||
uint32_t write = src_addr[i_w + r_w];
|
|
||||||
uint32_t before = before_buf[r_w];
|
|
||||||
uint32_t expected = write & before;
|
|
||||||
#ifdef CONFIG_SPI_FLASH_WARN_SETTING_ZERO_TO_ONE
|
|
||||||
if ((before & write) != write) {
|
|
||||||
spi_flash_guard_end();
|
|
||||||
ESP_LOGW(TAG, "Write at offset 0x%x requests 0x%08x but will write 0x%08x -> 0x%08x",
|
|
||||||
target + i + r, write, before, before & write);
|
|
||||||
spi_flash_guard_start();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
expected_buf[r_w] = expected;
|
|
||||||
}
|
|
||||||
|
|
||||||
res = esp_rom_spiflash_write(target + i, &src_addr[i_w], read_len);
|
|
||||||
if (res != ESP_ROM_SPIFLASH_RESULT_OK) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
res = esp_rom_spiflash_read(target + i, after_buf, read_len);
|
|
||||||
if (res != ESP_ROM_SPIFLASH_RESULT_OK) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int r = 0; r < read_len; r += sizeof(uint32_t)) {
|
|
||||||
int r_w = r / sizeof(uint32_t); // index in words (r is index in bytes)
|
|
||||||
|
|
||||||
uint32_t expected = expected_buf[r_w];
|
|
||||||
uint32_t actual = after_buf[r_w];
|
|
||||||
if (expected != actual) {
|
|
||||||
#ifdef CONFIG_SPI_FLASH_LOG_FAILED_WRITE
|
|
||||||
spi_flash_guard_end();
|
|
||||||
ESP_LOGE(TAG, "Bad write at offset 0x%x expected 0x%08x readback 0x%08x", target + i + r, expected, actual);
|
|
||||||
spi_flash_guard_start();
|
|
||||||
#endif
|
|
||||||
res = ESP_ROM_SPIFLASH_RESULT_ERR;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (res != ESP_ROM_SPIFLASH_RESULT_OK) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
remaining -= read_len;
|
|
||||||
}
|
|
||||||
return res;
|
|
||||||
#endif // CONFIG_SPI_FLASH_VERIFY_WRITE
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
esp_err_t IRAM_ATTR spi_flash_write(size_t dst, const void *srcv, size_t size)
|
|
||||||
{
|
|
||||||
const spi_flash_guard_funcs_t *guard = spi_flash_guard_get();
|
|
||||||
CHECK_WRITE_ADDRESS(dst, size);
|
|
||||||
// Out of bound writes are checked in ROM code, but we can give better
|
|
||||||
// error code here
|
|
||||||
if (dst + size > g_rom_flashchip.chip_size) {
|
|
||||||
return ESP_ERR_INVALID_SIZE;
|
|
||||||
}
|
|
||||||
if (size == 0) {
|
|
||||||
return ESP_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
esp_rom_spiflash_result_t rc = ESP_ROM_SPIFLASH_RESULT_OK;
|
|
||||||
COUNTER_START();
|
|
||||||
const uint8_t *srcc = (const uint8_t *) srcv;
|
|
||||||
/*
|
|
||||||
* Large operations are split into (up to) 3 parts:
|
|
||||||
* - Left padding: 4 bytes up to the first 4-byte aligned destination offset.
|
|
||||||
* - Middle part
|
|
||||||
* - Right padding: 4 bytes from the last 4-byte aligned offset covered.
|
|
||||||
*/
|
|
||||||
size_t left_off = dst & ~3U;
|
|
||||||
size_t left_size = MIN(((dst + 3) & ~3U) - dst, size);
|
|
||||||
size_t mid_off = left_size;
|
|
||||||
size_t mid_size = (size - left_size) & ~3U;
|
|
||||||
size_t right_off = left_size + mid_size;
|
|
||||||
size_t right_size = size - mid_size - left_size;
|
|
||||||
|
|
||||||
rc = spi_flash_unlock();
|
|
||||||
if (rc != ESP_ROM_SPIFLASH_RESULT_OK) {
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
if (left_size > 0) {
|
|
||||||
uint32_t t = 0xffffffff;
|
|
||||||
memcpy(((uint8_t *) &t) + (dst - left_off), srcc, left_size);
|
|
||||||
spi_flash_guard_start();
|
|
||||||
rc = spi_flash_write_inner(left_off, &t, 4);
|
|
||||||
spi_flash_guard_end();
|
|
||||||
if (rc != ESP_ROM_SPIFLASH_RESULT_OK) {
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
COUNTER_ADD_BYTES(write, 4);
|
|
||||||
}
|
|
||||||
if (mid_size > 0) {
|
|
||||||
/* If src buffer is 4-byte aligned as well and is not in a region that requires cache access to be enabled, we
|
|
||||||
* can write directly without buffering in RAM. */
|
|
||||||
#ifdef ESP_PLATFORM
|
|
||||||
bool direct_write = esp_ptr_internal(srcc)
|
|
||||||
&& esp_ptr_byte_accessible(srcc)
|
|
||||||
&& ((uintptr_t) srcc + mid_off) % 4 == 0;
|
|
||||||
#else
|
|
||||||
bool direct_write = true;
|
|
||||||
#endif
|
|
||||||
while(mid_size > 0 && rc == ESP_ROM_SPIFLASH_RESULT_OK) {
|
|
||||||
uint32_t write_buf[8];
|
|
||||||
uint32_t write_size = MIN(mid_size, MAX_WRITE_CHUNK);
|
|
||||||
const uint8_t *write_src = srcc + mid_off;
|
|
||||||
if (!direct_write) {
|
|
||||||
write_size = MIN(write_size, sizeof(write_buf));
|
|
||||||
memcpy(write_buf, write_src, write_size);
|
|
||||||
write_src = (const uint8_t *)write_buf;
|
|
||||||
}
|
|
||||||
spi_flash_guard_start();
|
|
||||||
rc = spi_flash_write_inner(dst + mid_off, (const uint32_t *) write_src, write_size);
|
|
||||||
spi_flash_guard_end();
|
|
||||||
COUNTER_ADD_BYTES(write, write_size);
|
|
||||||
mid_size -= write_size;
|
|
||||||
mid_off += write_size;
|
|
||||||
}
|
|
||||||
if (rc != ESP_ROM_SPIFLASH_RESULT_OK) {
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (right_size > 0) {
|
|
||||||
uint32_t t = 0xffffffff;
|
|
||||||
memcpy(&t, srcc + right_off, right_size);
|
|
||||||
spi_flash_guard_start();
|
|
||||||
rc = spi_flash_write_inner(dst + right_off, &t, 4);
|
|
||||||
spi_flash_guard_end();
|
|
||||||
if (rc != ESP_ROM_SPIFLASH_RESULT_OK) {
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
COUNTER_ADD_BYTES(write, 4);
|
|
||||||
}
|
|
||||||
out:
|
|
||||||
COUNTER_STOP(write);
|
|
||||||
|
|
||||||
spi_flash_guard_start();
|
|
||||||
// Ensure WEL is 0 after the operation, even if the write failed.
|
|
||||||
esp_rom_spiflash_write_disable();
|
|
||||||
spi_flash_check_and_flush_cache(dst, size);
|
|
||||||
spi_flash_guard_end();
|
|
||||||
|
|
||||||
return spi_flash_translate_rc(rc);
|
|
||||||
}
|
|
||||||
#endif // CONFIG_SPI_FLASH_USE_LEGACY_IMPL
|
|
||||||
|
|
||||||
#if !CONFIG_SPI_FLASH_USE_LEGACY_IMPL
|
|
||||||
#if !CONFIG_ESPTOOLPY_OCT_FLASH // Test for encryption on opi flash, IDF-3852.
|
|
||||||
extern void spi_common_set_dummy_output(esp_rom_spiflash_read_mode_t mode);
|
|
||||||
extern void spi_dummy_len_fix(uint8_t spi, uint8_t freqdiv);
|
|
||||||
void IRAM_ATTR flash_rom_init(void)
|
|
||||||
{
|
|
||||||
uint32_t freqdiv = 0;
|
|
||||||
|
|
||||||
#if CONFIG_IDF_TARGET_ESP32
|
|
||||||
uint32_t dummy_bit = 0;
|
|
||||||
#if CONFIG_ESPTOOLPY_FLASHFREQ_80M
|
|
||||||
dummy_bit = ESP_ROM_SPIFLASH_DUMMY_LEN_PLUS_80M;
|
|
||||||
#elif CONFIG_ESPTOOLPY_FLASHFREQ_40M
|
|
||||||
dummy_bit = ESP_ROM_SPIFLASH_DUMMY_LEN_PLUS_40M;
|
|
||||||
#elif CONFIG_ESPTOOLPY_FLASHFREQ_26M
|
|
||||||
dummy_bit = ESP_ROM_SPIFLASH_DUMMY_LEN_PLUS_26M;
|
|
||||||
#elif CONFIG_ESPTOOLPY_FLASHFREQ_20M
|
|
||||||
dummy_bit = ESP_ROM_SPIFLASH_DUMMY_LEN_PLUS_20M;
|
|
||||||
#endif
|
|
||||||
#endif//CONFIG_IDF_TARGET_ESP32
|
|
||||||
|
|
||||||
#if CONFIG_ESPTOOLPY_FLASHFREQ_80M
|
|
||||||
freqdiv = 1;
|
|
||||||
#elif CONFIG_ESPTOOLPY_FLASHFREQ_40M
|
|
||||||
freqdiv = 2;
|
|
||||||
#elif CONFIG_ESPTOOLPY_FLASHFREQ_26M
|
|
||||||
freqdiv = 3;
|
|
||||||
#elif CONFIG_ESPTOOLPY_FLASHFREQ_20M
|
|
||||||
freqdiv = 4;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if !CONFIG_IDF_TARGET_ESP32S2 && !CONFIG_IDF_TARGET_ESP32
|
|
||||||
esp_rom_spiflash_read_mode_t read_mode;
|
|
||||||
#if CONFIG_ESPTOOLPY_FLASHMODE_QIO
|
|
||||||
read_mode = ESP_ROM_SPIFLASH_QIO_MODE;
|
|
||||||
#elif CONFIG_ESPTOOLPY_FLASHMODE_QOUT
|
|
||||||
read_mode = ESP_ROM_SPIFLASH_QOUT_MODE;
|
|
||||||
#elif CONFIG_ESPTOOLPY_FLASHMODE_DIO
|
|
||||||
read_mode = ESP_ROM_SPIFLASH_DIO_MODE;
|
|
||||||
#elif CONFIG_ESPTOOLPY_FLASHMODE_DOUT
|
|
||||||
read_mode = ESP_ROM_SPIFLASH_DOUT_MODE;
|
|
||||||
#endif
|
|
||||||
#endif //!CONFIG_IDF_TARGET_ESP32S2 && !CONFIG_IDF_TARGET_ESP32
|
|
||||||
|
|
||||||
#if CONFIG_IDF_TARGET_ESP32
|
|
||||||
g_rom_spiflash_dummy_len_plus[1] = dummy_bit;
|
|
||||||
#else
|
|
||||||
spi_dummy_len_fix(1, freqdiv);
|
|
||||||
#endif //CONFIG_IDF_TARGET_ESP32
|
|
||||||
|
|
||||||
#if !CONFIG_IDF_TARGET_ESP32S2 && !CONFIG_IDF_TARGET_ESP32
|
|
||||||
spi_common_set_dummy_output(read_mode);
|
|
||||||
#endif //!CONFIG_IDF_TARGET_ESP32S2
|
|
||||||
esp_rom_spiflash_config_clk(freqdiv, 1);
|
|
||||||
}
|
|
||||||
#endif //CONFIG_ESPTOOLPY_OCT_FLASH
|
|
||||||
#else
|
|
||||||
void IRAM_ATTR flash_rom_init(void)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
esp_err_t IRAM_ATTR spi_flash_write_encrypted(size_t dest_addr, const void *src, size_t size)
|
|
||||||
{
|
|
||||||
esp_err_t err = ESP_OK;
|
|
||||||
const spi_flash_guard_funcs_t *guard = spi_flash_guard_get();
|
|
||||||
CHECK_WRITE_ADDRESS(dest_addr, size);
|
|
||||||
if ((dest_addr % 16) != 0) {
|
|
||||||
return ESP_ERR_INVALID_ARG;
|
|
||||||
}
|
|
||||||
if ((size % 16) != 0) {
|
|
||||||
return ESP_ERR_INVALID_SIZE;
|
|
||||||
}
|
|
||||||
|
|
||||||
COUNTER_START();
|
|
||||||
esp_rom_spiflash_result_t rc = spi_flash_unlock();
|
|
||||||
err = spi_flash_translate_rc(rc);
|
|
||||||
if (err != ESP_OK) {
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifndef CONFIG_SPI_FLASH_VERIFY_WRITE
|
|
||||||
err = spi_flash_write_encrypted_chip(dest_addr, src, size);
|
|
||||||
COUNTER_ADD_BYTES(write, size);
|
|
||||||
spi_flash_guard_start();
|
|
||||||
esp_rom_spiflash_write_disable();
|
|
||||||
spi_flash_check_and_flush_cache(dest_addr, size);
|
|
||||||
spi_flash_guard_end();
|
|
||||||
#else
|
|
||||||
const uint32_t* src_w = (const uint32_t*)src;
|
|
||||||
uint32_t read_buf[ESP_ROM_SPIFLASH_BUFF_BYTE_READ_NUM / sizeof(uint32_t)];
|
|
||||||
int32_t remaining = size;
|
|
||||||
for(int i = 0; i < size; i += sizeof(read_buf)) {
|
|
||||||
int i_w = i / sizeof(uint32_t); // index in words (i is an index in bytes)
|
|
||||||
int32_t read_len = MIN(sizeof(read_buf), remaining);
|
|
||||||
|
|
||||||
// Read "before" contents from flash
|
|
||||||
esp_err_t err = spi_flash_read(dest_addr + i, read_buf, read_len);
|
|
||||||
if (err != ESP_OK) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef CONFIG_SPI_FLASH_WARN_SETTING_ZERO_TO_ONE
|
|
||||||
//The written data cannot be predicted, so warning is shown if any of the bits is not 1.
|
|
||||||
for (int r = 0; r < read_len; r += sizeof(uint32_t)) {
|
|
||||||
uint32_t before = read_buf[r / sizeof(uint32_t)];
|
|
||||||
if (before != 0xFFFFFFFF) {
|
|
||||||
ESP_LOGW(TAG, "Encrypted write at offset 0x%x but not erased (0x%08x)",
|
|
||||||
dest_addr + i + r, before);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
err = spi_flash_write_encrypted_chip(dest_addr + i, src + i, read_len);
|
|
||||||
if (err != ESP_OK) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
COUNTER_ADD_BYTES(write, size);
|
|
||||||
|
|
||||||
spi_flash_guard_start();
|
|
||||||
esp_rom_spiflash_write_disable();
|
|
||||||
spi_flash_check_and_flush_cache(dest_addr, size);
|
|
||||||
spi_flash_guard_end();
|
|
||||||
|
|
||||||
err = spi_flash_read_encrypted(dest_addr + i, read_buf, read_len);
|
|
||||||
if (err != ESP_OK) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int r = 0; r < read_len; r += sizeof(uint32_t)) {
|
|
||||||
int r_w = r / sizeof(uint32_t); // index in words (r is index in bytes)
|
|
||||||
|
|
||||||
uint32_t expected = src_w[i_w + r_w];
|
|
||||||
uint32_t actual = read_buf[r_w];
|
|
||||||
if (expected != actual) {
|
|
||||||
#ifdef CONFIG_SPI_FLASH_LOG_FAILED_WRITE
|
|
||||||
ESP_LOGE(TAG, "Bad write at offset 0x%x expected 0x%08x readback 0x%08x", dest_addr + i + r, expected, actual);
|
|
||||||
#endif
|
|
||||||
err = ESP_FAIL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (err != ESP_OK) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
remaining -= read_len;
|
|
||||||
}
|
|
||||||
#endif // CONFIG_SPI_FLASH_VERIFY_WRITE
|
|
||||||
|
|
||||||
fail:
|
|
||||||
|
|
||||||
COUNTER_STOP(write);
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
esp_err_t IRAM_ATTR spi_flash_read(size_t src, void *dstv, size_t size)
|
|
||||||
{
|
|
||||||
// Out of bound reads are checked in ROM code, but we can give better
|
|
||||||
// error code here
|
|
||||||
if (src + size > g_rom_flashchip.chip_size) {
|
|
||||||
return ESP_ERR_INVALID_SIZE;
|
|
||||||
}
|
|
||||||
if (size == 0) {
|
|
||||||
return ESP_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
esp_rom_spiflash_result_t rc = ESP_ROM_SPIFLASH_RESULT_OK;
|
|
||||||
COUNTER_START();
|
|
||||||
spi_flash_guard_start();
|
|
||||||
/* To simplify boundary checks below, we handle small reads separately. */
|
|
||||||
if (size < 16) {
|
|
||||||
uint32_t t[6]; /* Enough for 16 bytes + 4 on either side for padding. */
|
|
||||||
uint32_t read_src = src & ~3U;
|
|
||||||
uint32_t left_off = src & 3U;
|
|
||||||
uint32_t read_size = (left_off + size + 3) & ~3U;
|
|
||||||
rc = esp_rom_spiflash_read(read_src, t, read_size);
|
|
||||||
if (rc != ESP_ROM_SPIFLASH_RESULT_OK) {
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
COUNTER_ADD_BYTES(read, read_size);
|
|
||||||
#ifdef ESP_PLATFORM
|
|
||||||
if (esp_ptr_external_ram(dstv)) {
|
|
||||||
spi_flash_guard_end();
|
|
||||||
memcpy(dstv, ((uint8_t *) t) + left_off, size);
|
|
||||||
spi_flash_guard_start();
|
|
||||||
} else {
|
|
||||||
memcpy(dstv, ((uint8_t *) t) + left_off, size);
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
memcpy(dstv, ((uint8_t *) t) + left_off, size);
|
|
||||||
#endif
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
uint8_t *dstc = (uint8_t *) dstv;
|
|
||||||
intptr_t dsti = (intptr_t) dstc;
|
|
||||||
/*
|
|
||||||
* Large operations are split into (up to) 3 parts:
|
|
||||||
* - The middle part: from the first 4-aligned position in src to the first
|
|
||||||
* 4-aligned position in dst.
|
|
||||||
*/
|
|
||||||
size_t src_mid_off = (src % 4 == 0 ? 0 : 4 - (src % 4));
|
|
||||||
size_t dst_mid_off = (dsti % 4 == 0 ? 0 : 4 - (dsti % 4));
|
|
||||||
size_t mid_size = (size - MAX(src_mid_off, dst_mid_off)) & ~3U;
|
|
||||||
/*
|
|
||||||
* - Once the middle part is in place, src_mid_off bytes from the preceding
|
|
||||||
* 4-aligned source location are added on the left.
|
|
||||||
*/
|
|
||||||
size_t pad_left_src = src & ~3U;
|
|
||||||
size_t pad_left_size = src_mid_off;
|
|
||||||
/*
|
|
||||||
* - Finally, the right part is added: from the end of the middle part to
|
|
||||||
* the end. Depending on the alignment of source and destination, this may
|
|
||||||
* be a 4 or 8 byte read from pad_right_src.
|
|
||||||
*/
|
|
||||||
size_t pad_right_src = (src + pad_left_size + mid_size) & ~3U;
|
|
||||||
size_t pad_right_off = (pad_right_src - src);
|
|
||||||
size_t pad_right_size = (size - pad_right_off);
|
|
||||||
|
|
||||||
#ifdef ESP_PLATFORM
|
|
||||||
bool direct_read = esp_ptr_internal(dstc)
|
|
||||||
&& esp_ptr_byte_accessible(dstc)
|
|
||||||
&& ((uintptr_t) dstc + dst_mid_off) % 4 == 0;
|
|
||||||
#else
|
|
||||||
bool direct_read = true;
|
|
||||||
#endif
|
|
||||||
if (mid_size > 0) {
|
|
||||||
uint32_t mid_remaining = mid_size;
|
|
||||||
uint32_t mid_read = 0;
|
|
||||||
while (mid_remaining > 0) {
|
|
||||||
uint32_t read_size = MIN(mid_remaining, MAX_READ_CHUNK);
|
|
||||||
uint32_t read_buf[8];
|
|
||||||
uint8_t *read_dst_final = dstc + dst_mid_off + mid_read;
|
|
||||||
uint8_t *read_dst = read_dst_final;
|
|
||||||
if (!direct_read) {
|
|
||||||
read_size = MIN(read_size, sizeof(read_buf));
|
|
||||||
read_dst = (uint8_t *) read_buf;
|
|
||||||
}
|
|
||||||
rc = esp_rom_spiflash_read(src + src_mid_off + mid_read,
|
|
||||||
(uint32_t *) read_dst, read_size);
|
|
||||||
if (rc != ESP_ROM_SPIFLASH_RESULT_OK) {
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
mid_remaining -= read_size;
|
|
||||||
mid_read += read_size;
|
|
||||||
if (!direct_read) {
|
|
||||||
spi_flash_guard_end();
|
|
||||||
memcpy(read_dst_final, read_buf, read_size);
|
|
||||||
spi_flash_guard_start();
|
|
||||||
} else if (mid_remaining > 0) {
|
|
||||||
/* Drop guard momentarily, allows other tasks to preempt */
|
|
||||||
spi_flash_guard_end();
|
|
||||||
spi_flash_guard_start();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
COUNTER_ADD_BYTES(read, mid_size);
|
|
||||||
/*
|
|
||||||
* If offsets in src and dst are different, perform an in-place shift
|
|
||||||
* to put destination data into its final position.
|
|
||||||
* Note that the shift can be left (src_mid_off < dst_mid_off) or right.
|
|
||||||
*/
|
|
||||||
if (src_mid_off != dst_mid_off) {
|
|
||||||
if (!direct_read) {
|
|
||||||
spi_flash_guard_end();
|
|
||||||
}
|
|
||||||
memmove(dstc + src_mid_off, dstc + dst_mid_off, mid_size);
|
|
||||||
if (!direct_read) {
|
|
||||||
spi_flash_guard_start();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (pad_left_size > 0) {
|
|
||||||
uint32_t t;
|
|
||||||
rc = esp_rom_spiflash_read(pad_left_src, &t, 4);
|
|
||||||
if (rc != ESP_ROM_SPIFLASH_RESULT_OK) {
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
COUNTER_ADD_BYTES(read, 4);
|
|
||||||
if (!direct_read) {
|
|
||||||
spi_flash_guard_end();
|
|
||||||
}
|
|
||||||
memcpy(dstc, ((uint8_t *) &t) + (4 - pad_left_size), pad_left_size);
|
|
||||||
if (!direct_read) {
|
|
||||||
spi_flash_guard_start();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (pad_right_size > 0) {
|
|
||||||
uint32_t t[2];
|
|
||||||
int32_t read_size = (pad_right_size <= 4 ? 4 : 8);
|
|
||||||
rc = esp_rom_spiflash_read(pad_right_src, t, read_size);
|
|
||||||
if (rc != ESP_ROM_SPIFLASH_RESULT_OK) {
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
COUNTER_ADD_BYTES(read, read_size);
|
|
||||||
if (!direct_read) {
|
|
||||||
spi_flash_guard_end();
|
|
||||||
}
|
|
||||||
memcpy(dstc + pad_right_off, t, pad_right_size);
|
|
||||||
if (!direct_read) {
|
|
||||||
spi_flash_guard_start();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
out:
|
|
||||||
spi_flash_guard_end();
|
|
||||||
COUNTER_STOP(read);
|
|
||||||
return spi_flash_translate_rc(rc);
|
|
||||||
}
|
|
||||||
#endif // !CONFIG_SPI_FLASH_USE_LEGACY_IMPL
|
|
||||||
|
|
||||||
esp_err_t IRAM_ATTR spi_flash_read_encrypted(size_t src, void *dstv, size_t size)
|
|
||||||
{
|
|
||||||
if (src + size > g_rom_flashchip.chip_size) {
|
|
||||||
return ESP_ERR_INVALID_SIZE;
|
|
||||||
}
|
|
||||||
if (size == 0) {
|
|
||||||
return ESP_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
esp_err_t err;
|
|
||||||
const uint8_t *map;
|
|
||||||
spi_flash_mmap_handle_t map_handle;
|
|
||||||
size_t map_src = src & ~(SPI_FLASH_MMU_PAGE_SIZE - 1);
|
|
||||||
size_t map_size = size + (src - map_src);
|
|
||||||
|
|
||||||
err = spi_flash_mmap(map_src, map_size, SPI_FLASH_MMAP_DATA, (const void **)&map, &map_handle);
|
|
||||||
if (err != ESP_OK) {
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
memcpy(dstv, map + (src - map_src), size);
|
|
||||||
spi_flash_munmap(map_handle);
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if CONFIG_SPI_FLASH_USE_LEGACY_IMPL
|
|
||||||
static esp_err_t IRAM_ATTR spi_flash_translate_rc(esp_rom_spiflash_result_t rc)
|
|
||||||
{
|
|
||||||
switch (rc) {
|
|
||||||
case ESP_ROM_SPIFLASH_RESULT_OK:
|
|
||||||
return ESP_OK;
|
|
||||||
case ESP_ROM_SPIFLASH_RESULT_TIMEOUT:
|
|
||||||
return ESP_ERR_FLASH_OP_TIMEOUT;
|
|
||||||
case ESP_ROM_SPIFLASH_RESULT_ERR:
|
|
||||||
default:
|
|
||||||
return ESP_ERR_FLASH_OP_FAIL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif //CONFIG_SPI_FLASH_USE_LEGACY_IMPL
|
|
||||||
|
|
||||||
#if CONFIG_SPI_FLASH_ENABLE_COUNTERS
|
#if CONFIG_SPI_FLASH_ENABLE_COUNTERS
|
||||||
|
|
||||||
static inline void dump_counter(spi_flash_counter_t *counter, const char *name)
|
static inline void dump_counter(spi_flash_counter_t *counter, const char *name)
|
||||||
@ -895,11 +196,6 @@ void spi_flash_dump_counters(void)
|
|||||||
|
|
||||||
#endif //CONFIG_SPI_FLASH_ENABLE_COUNTERS
|
#endif //CONFIG_SPI_FLASH_ENABLE_COUNTERS
|
||||||
|
|
||||||
#if CONFIG_SPI_FLASH_USE_LEGACY_IMPL && !CONFIG_IDF_TARGET_ESP32
|
|
||||||
// TODO esp32s2: Remove once ESP32-S2 & later chips has new SPI Flash API support
|
|
||||||
esp_flash_t *esp_flash_default_chip = NULL;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void IRAM_ATTR spi_flash_set_rom_required_regs(void)
|
void IRAM_ATTR spi_flash_set_rom_required_regs(void)
|
||||||
{
|
{
|
||||||
#if CONFIG_ESPTOOLPY_OCT_FLASH
|
#if CONFIG_ESPTOOLPY_OCT_FLASH
|
||||||
|
@ -180,7 +180,7 @@ esp_err_t esp_flash_erase_chip(esp_flash_t *chip);
|
|||||||
|
|
||||||
/** @brief Erase a region of the flash chip
|
/** @brief Erase a region of the flash chip
|
||||||
*
|
*
|
||||||
* @param chip Pointer to identify flash chip. Must have been successfully initialised via esp_flash_init()
|
* @param chip Pointer to identify flash chip. If NULL, esp_flash_default_chip is substituted. Must have been successfully initialised via esp_flash_init()
|
||||||
* @param start Address to start erasing flash. Must be sector aligned.
|
* @param start Address to start erasing flash. Must be sector aligned.
|
||||||
* @param len Length of region to erase. Must also be sector aligned.
|
* @param len Length of region to erase. Must also be sector aligned.
|
||||||
*
|
*
|
||||||
@ -200,7 +200,7 @@ esp_err_t esp_flash_erase_region(esp_flash_t *chip, uint32_t start, uint32_t len
|
|||||||
|
|
||||||
/** @brief Read if the entire chip is write protected
|
/** @brief Read if the entire chip is write protected
|
||||||
*
|
*
|
||||||
* @param chip Pointer to identify flash chip. Must have been successfully initialised via esp_flash_init()
|
* @param chip Pointer to identify flash chip. If NULL, esp_flash_default_chip is substituted. Must have been successfully initialised via esp_flash_init()
|
||||||
* @param[out] write_protected Pointer to boolean, set to the value of the write protect flag.
|
* @param[out] write_protected Pointer to boolean, set to the value of the write protect flag.
|
||||||
*
|
*
|
||||||
* @note A correct result for this flag depends on the SPI flash chip model and chip_drv in use (via the 'chip->drv'
|
* @note A correct result for this flag depends on the SPI flash chip model and chip_drv in use (via the 'chip->drv'
|
||||||
@ -212,7 +212,7 @@ esp_err_t esp_flash_get_chip_write_protect(esp_flash_t *chip, bool *write_protec
|
|||||||
|
|
||||||
/** @brief Set write protection for the SPI flash chip
|
/** @brief Set write protection for the SPI flash chip
|
||||||
*
|
*
|
||||||
* @param chip Pointer to identify flash chip. Must have been successfully initialised via esp_flash_init()
|
* @param chip Pointer to identify flash chip. If NULL, esp_flash_default_chip is substituted. Must have been successfully initialised via esp_flash_init()
|
||||||
* @param write_protect Boolean value for the write protect flag
|
* @param write_protect Boolean value for the write protect flag
|
||||||
*
|
*
|
||||||
* @note Correct behaviour of this function depends on the SPI flash chip model and chip_drv in use (via the 'chip->drv'
|
* @note Correct behaviour of this function depends on the SPI flash chip model and chip_drv in use (via the 'chip->drv'
|
||||||
@ -272,7 +272,7 @@ esp_err_t esp_flash_set_protected_region(esp_flash_t *chip, const esp_flash_regi
|
|||||||
|
|
||||||
/** @brief Read data from the SPI flash chip
|
/** @brief Read data from the SPI flash chip
|
||||||
*
|
*
|
||||||
* @param chip Pointer to identify flash chip. Must have been successfully initialised via esp_flash_init()
|
* @param chip Pointer to identify flash chip. If NULL, esp_flash_default_chip is substituted. Must have been successfully initialised via esp_flash_init()
|
||||||
* @param buffer Pointer to a buffer where the data will be read. To get better performance, this should be in the DRAM and word aligned.
|
* @param buffer Pointer to a buffer where the data will be read. To get better performance, this should be in the DRAM and word aligned.
|
||||||
* @param address Address on flash to read from. Must be less than chip->size field.
|
* @param address Address on flash to read from. Must be less than chip->size field.
|
||||||
* @param length Length (in bytes) of data to read.
|
* @param length Length (in bytes) of data to read.
|
||||||
@ -291,7 +291,7 @@ esp_err_t esp_flash_read(esp_flash_t *chip, void *buffer, uint32_t address, uint
|
|||||||
|
|
||||||
/** @brief Write data to the SPI flash chip
|
/** @brief Write data to the SPI flash chip
|
||||||
*
|
*
|
||||||
* @param chip Pointer to identify flash chip. Must have been successfully initialised via esp_flash_init()
|
* @param chip Pointer to identify flash chip. If NULL, esp_flash_default_chip is substituted. Must have been successfully initialised via esp_flash_init()
|
||||||
* @param address Address on flash to write to. Must be previously erased (SPI NOR flash can only write bits 1->0).
|
* @param address Address on flash to write to. Must be previously erased (SPI NOR flash can only write bits 1->0).
|
||||||
* @param buffer Pointer to a buffer with the data to write. To get better performance, this should be in the DRAM and word aligned.
|
* @param buffer Pointer to a buffer with the data to write. To get better performance, this should be in the DRAM and word aligned.
|
||||||
* @param length Length (in bytes) of data to write.
|
* @param length Length (in bytes) of data to write.
|
||||||
@ -318,7 +318,6 @@ esp_err_t esp_flash_write(esp_flash_t *chip, const void *buffer, uint32_t addres
|
|||||||
* - ESP_OK: on success
|
* - ESP_OK: on success
|
||||||
* - ESP_ERR_NOT_SUPPORTED: encrypted write not supported for this chip.
|
* - ESP_ERR_NOT_SUPPORTED: encrypted write not supported for this chip.
|
||||||
* - ESP_ERR_INVALID_ARG: Either the address, buffer or length is invalid.
|
* - ESP_ERR_INVALID_ARG: Either the address, buffer or length is invalid.
|
||||||
* - or other flash error code from spi_flash_write_encrypted().
|
|
||||||
*/
|
*/
|
||||||
esp_err_t esp_flash_write_encrypted(esp_flash_t *chip, uint32_t address, const void *buffer, uint32_t length);
|
esp_err_t esp_flash_write_encrypted(esp_flash_t *chip, uint32_t address, const void *buffer, uint32_t length);
|
||||||
|
|
||||||
@ -332,7 +331,6 @@ esp_err_t esp_flash_write_encrypted(esp_flash_t *chip, uint32_t address, const v
|
|||||||
* @return
|
* @return
|
||||||
* - ESP_OK: on success
|
* - ESP_OK: on success
|
||||||
* - ESP_ERR_NOT_SUPPORTED: encrypted read not supported for this chip.
|
* - ESP_ERR_NOT_SUPPORTED: encrypted read not supported for this chip.
|
||||||
* - or other flash error code from spi_flash_read_encrypted().
|
|
||||||
*/
|
*/
|
||||||
esp_err_t esp_flash_read_encrypted(esp_flash_t *chip, uint32_t address, void *out_buffer, uint32_t length);
|
esp_err_t esp_flash_read_encrypted(esp_flash_t *chip, uint32_t address, void *out_buffer, uint32_t length);
|
||||||
|
|
||||||
|
@ -24,11 +24,7 @@ extern "C" {
|
|||||||
*
|
*
|
||||||
* Called by OS startup code. You do not need to call this in your own applications.
|
* Called by OS startup code. You do not need to call this in your own applications.
|
||||||
*/
|
*/
|
||||||
#ifdef CONFIG_SPI_FLASH_USE_LEGACY_IMPL
|
|
||||||
#define esp_flash_init_default_chip(...) ({ESP_OK;})
|
|
||||||
#else
|
|
||||||
esp_err_t esp_flash_init_default_chip(void);
|
esp_err_t esp_flash_init_default_chip(void);
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Enable OS-level SPI flash protections in IDF
|
* Enable OS-level SPI flash protections in IDF
|
||||||
@ -37,11 +33,7 @@ esp_err_t esp_flash_init_default_chip(void);
|
|||||||
*
|
*
|
||||||
* @return ESP_OK if success, otherwise failed. See return value of ``esp_flash_init_os_functions``.
|
* @return ESP_OK if success, otherwise failed. See return value of ``esp_flash_init_os_functions``.
|
||||||
*/
|
*/
|
||||||
#ifdef CONFIG_SPI_FLASH_USE_LEGACY_IMPL
|
|
||||||
#define esp_flash_app_init(...) ({ESP_OK;})
|
|
||||||
#else
|
|
||||||
esp_err_t esp_flash_app_init(void);
|
esp_err_t esp_flash_app_init(void);
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Disable (or enable) OS-level SPI flash protections in IDF
|
* Disable (or enable) OS-level SPI flash protections in IDF
|
||||||
@ -50,11 +42,7 @@ esp_err_t esp_flash_app_init(void);
|
|||||||
*
|
*
|
||||||
* @return always ESP_OK.
|
* @return always ESP_OK.
|
||||||
*/
|
*/
|
||||||
#ifdef CONFIG_SPI_FLASH_USE_LEGACY_IMPL
|
|
||||||
#define esp_flash_app_disable_protect(...) ({ESP_OK;})
|
|
||||||
#else
|
|
||||||
esp_err_t esp_flash_app_disable_protect(bool disable);
|
esp_err_t esp_flash_app_disable_protect(bool disable);
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initialize OS-level functions for a specific chip.
|
* Initialize OS-level functions for a specific chip.
|
||||||
|
@ -12,7 +12,7 @@
|
|||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include "esp_err.h"
|
#include "esp_err.h"
|
||||||
#include "esp_flash.h"
|
#include "esp_flash.h"
|
||||||
#include "esp_spi_flash.h"
|
#include "spi_flash_mmap.h"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
@ -229,9 +229,9 @@ esp_err_t esp_partition_read(const esp_partition_t* partition,
|
|||||||
* This can be done using esp_partition_erase_range function.
|
* This can be done using esp_partition_erase_range function.
|
||||||
*
|
*
|
||||||
* Partitions marked with an encryption flag will automatically be
|
* Partitions marked with an encryption flag will automatically be
|
||||||
* written via the spi_flash_write_encrypted() function. If writing to
|
* written via the esp_flash_write_encrypted() function. If writing to
|
||||||
* an encrypted partition, all write offsets and lengths must be
|
* an encrypted partition, all write offsets and lengths must be
|
||||||
* multiples of 16 bytes. See the spi_flash_write_encrypted() function
|
* multiples of 16 bytes. See the esp_flash_write_encrypted() function
|
||||||
* for more details. Unencrypted partitions do not have this
|
* for more details. Unencrypted partitions do not have this
|
||||||
* restriction.
|
* restriction.
|
||||||
*
|
*
|
||||||
@ -403,7 +403,6 @@ bool esp_partition_check_identity(const esp_partition_t* partition_1, const esp_
|
|||||||
* @param[out] out_partition Output, if non-NULL, receives the pointer to the resulting esp_partition_t structure
|
* @param[out] out_partition Output, if non-NULL, receives the pointer to the resulting esp_partition_t structure
|
||||||
* @return
|
* @return
|
||||||
* - ESP_OK on success
|
* - ESP_OK on success
|
||||||
* - ESP_ERR_NOT_SUPPORTED if CONFIG_CONFIG_SPI_FLASH_USE_LEGACY_IMPL is enabled
|
|
||||||
* - ESP_ERR_NO_MEM if memory allocation has failed
|
* - ESP_ERR_NO_MEM if memory allocation has failed
|
||||||
* - ESP_ERR_INVALID_ARG if the new partition overlaps another partition on the same flash chip
|
* - ESP_ERR_INVALID_ARG if the new partition overlaps another partition on the same flash chip
|
||||||
* - ESP_ERR_INVALID_SIZE if the partition doesn't fit into the flash chip size
|
* - ESP_ERR_INVALID_SIZE if the partition doesn't fit into the flash chip size
|
||||||
|
@ -10,6 +10,7 @@
|
|||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include "esp_err.h"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
@ -139,6 +139,101 @@ esp_err_t spi_flash_enable_high_performance_mode(void);
|
|||||||
*/
|
*/
|
||||||
const spi_flash_hpm_dummy_conf_t *spi_flash_get_dummy(void);
|
const spi_flash_hpm_dummy_conf_t *spi_flash_get_dummy(void);
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
FLASH_WRAP_MODE_8B = 0,
|
||||||
|
FLASH_WRAP_MODE_16B = 2,
|
||||||
|
FLASH_WRAP_MODE_32B = 4,
|
||||||
|
FLASH_WRAP_MODE_64B = 6,
|
||||||
|
FLASH_WRAP_MODE_DISABLE = 1
|
||||||
|
} spi_flash_wrap_mode_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief set wrap mode of flash
|
||||||
|
*
|
||||||
|
* @param mode: wrap mode support disable, 16 32, 64 byte
|
||||||
|
*
|
||||||
|
* @return esp_err_t : ESP_OK for successful.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
esp_err_t spi_flash_wrap_set(spi_flash_wrap_mode_t mode);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief SPI flash critical section enter function.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
typedef void (*spi_flash_guard_start_func_t)(void);
|
||||||
|
/**
|
||||||
|
* @brief SPI flash critical section exit function.
|
||||||
|
*/
|
||||||
|
typedef void (*spi_flash_guard_end_func_t)(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Structure holding SPI flash access critical sections management functions.
|
||||||
|
*
|
||||||
|
* Flash API uses two types of flash access management functions:
|
||||||
|
* 1) Functions which prepare/restore flash cache and interrupts before calling
|
||||||
|
* appropriate ROM functions (SPIWrite, SPIRead and SPIEraseBlock):
|
||||||
|
* - 'start' function should disables flash cache and non-IRAM interrupts and
|
||||||
|
* is invoked before the call to one of ROM function above.
|
||||||
|
* - 'end' function should restore state of flash cache and non-IRAM interrupts and
|
||||||
|
* is invoked after the call to one of ROM function above.
|
||||||
|
* These two functions are not recursive.
|
||||||
|
*
|
||||||
|
* Different versions of the guarding functions should be used depending on the context of
|
||||||
|
* execution (with or without functional OS). In normal conditions when flash API is called
|
||||||
|
* from task the functions use OS primitives. When there is no OS at all or when
|
||||||
|
* it is not guaranteed that OS is functional (accessing flash from exception handler) these
|
||||||
|
* functions cannot use OS primitives or even does not need them (multithreaded access is not possible).
|
||||||
|
*
|
||||||
|
* @note Structure and corresponding guard functions should not reside in flash.
|
||||||
|
* For example structure can be placed in DRAM and functions in IRAM sections.
|
||||||
|
*/
|
||||||
|
typedef struct {
|
||||||
|
spi_flash_guard_start_func_t start; /**< critical section start function. */
|
||||||
|
spi_flash_guard_end_func_t end; /**< critical section end function. */
|
||||||
|
} spi_flash_guard_funcs_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Sets guard functions to access flash.
|
||||||
|
*
|
||||||
|
* @note Pointed structure and corresponding guard functions should not reside in flash.
|
||||||
|
* For example structure can be placed in DRAM and functions in IRAM sections.
|
||||||
|
*
|
||||||
|
* @param funcs pointer to structure holding flash access guard functions.
|
||||||
|
*/
|
||||||
|
void spi_flash_guard_set(const spi_flash_guard_funcs_t* funcs);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Get the guard functions used for flash access
|
||||||
|
*
|
||||||
|
* @return The guard functions that were set via spi_flash_guard_set(). These functions
|
||||||
|
* can be called if implementing custom low-level SPI flash operations.
|
||||||
|
*/
|
||||||
|
const spi_flash_guard_funcs_t *spi_flash_guard_get(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Default OS-aware flash access guard functions
|
||||||
|
*/
|
||||||
|
extern const spi_flash_guard_funcs_t g_flash_guard_default_ops;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Non-OS flash access guard functions
|
||||||
|
*
|
||||||
|
* @note This version of flash guard functions is to be used when no OS is present or from panic handler.
|
||||||
|
* It does not use any OS primitives and IPC and implies that only calling CPU is active.
|
||||||
|
*/
|
||||||
|
extern const spi_flash_guard_funcs_t g_flash_guard_no_os_ops;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function is used to re-initialize the flash mmap when using ROM flash
|
||||||
|
* implementations.
|
||||||
|
*
|
||||||
|
* @note Only called in startup. User should not call this function.
|
||||||
|
*/
|
||||||
|
void spi_flash_rom_impl_init(void);
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -1,421 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* SPDX-FileCopyrightText: 2015-2022 Espressif Systems (Shanghai) CO LTD
|
* SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
*/
|
*/
|
||||||
|
#warning esp_spi_flash.h is deprecated, please use spi_flash_mmap.h instead
|
||||||
#ifndef ESP_SPI_FLASH_H
|
#include "spi_flash_mmap.h"
|
||||||
#define ESP_SPI_FLASH_H
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stdbool.h>
|
|
||||||
#include <stddef.h>
|
|
||||||
#include "esp_err.h"
|
|
||||||
#include "sdkconfig.h"
|
|
||||||
#include "esp_spi_flash_counters.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "sdkconfig.h"
|
|
||||||
#define ESP_ERR_FLASH_OP_FAIL (ESP_ERR_FLASH_BASE + 1)
|
|
||||||
#define ESP_ERR_FLASH_OP_TIMEOUT (ESP_ERR_FLASH_BASE + 2)
|
|
||||||
|
|
||||||
#define SPI_FLASH_SEC_SIZE 4096 /**< SPI Flash sector size */
|
|
||||||
|
|
||||||
#define SPI_FLASH_MMU_PAGE_SIZE CONFIG_MMU_PAGE_SIZE /**< Flash cache MMU mapping page size */
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
FLASH_WRAP_MODE_8B = 0,
|
|
||||||
FLASH_WRAP_MODE_16B = 2,
|
|
||||||
FLASH_WRAP_MODE_32B = 4,
|
|
||||||
FLASH_WRAP_MODE_64B = 6,
|
|
||||||
FLASH_WRAP_MODE_DISABLE = 1
|
|
||||||
} spi_flash_wrap_mode_t;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief set wrap mode of flash
|
|
||||||
*
|
|
||||||
* @param mode: wrap mode support disable, 16 32, 64 byte
|
|
||||||
*
|
|
||||||
* @return esp_err_t : ESP_OK for successful.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
esp_err_t spi_flash_wrap_set(spi_flash_wrap_mode_t mode);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Initialize SPI flash access driver
|
|
||||||
*
|
|
||||||
* This function must be called exactly once, before any other
|
|
||||||
* spi_flash_* functions are called.
|
|
||||||
* Currently this function is called from startup code. There is
|
|
||||||
* no need to call it from application code.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
void spi_flash_init(void);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Get flash chip size, as set in binary image header
|
|
||||||
*
|
|
||||||
* @note This value does not necessarily match real flash size.
|
|
||||||
*
|
|
||||||
* @return size of flash chip, in bytes
|
|
||||||
*/
|
|
||||||
size_t spi_flash_get_chip_size(void);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Erase the Flash sector.
|
|
||||||
*
|
|
||||||
* @param sector: Sector number, the count starts at sector 0, 4KB per sector.
|
|
||||||
*
|
|
||||||
* @return esp_err_t
|
|
||||||
*/
|
|
||||||
esp_err_t spi_flash_erase_sector(size_t sector);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Erase a range of flash sectors
|
|
||||||
*
|
|
||||||
* @param start_address Address where erase operation has to start.
|
|
||||||
* Must be 4kB-aligned
|
|
||||||
* @param size Size of erased range, in bytes. Must be divisible by 4kB.
|
|
||||||
*
|
|
||||||
* @return esp_err_t
|
|
||||||
*/
|
|
||||||
esp_err_t spi_flash_erase_range(size_t start_address, size_t size);
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Write data to Flash.
|
|
||||||
*
|
|
||||||
* @note For fastest write performance, write a 4 byte aligned size at a
|
|
||||||
* 4 byte aligned offset in flash from a source buffer in DRAM. Varying any of
|
|
||||||
* these parameters will still work, but will be slower due to buffering.
|
|
||||||
*
|
|
||||||
* @note Writing more than 8KB at a time will be split into multiple
|
|
||||||
* write operations to avoid disrupting other tasks in the system.
|
|
||||||
*
|
|
||||||
* @param dest_addr Destination address in Flash.
|
|
||||||
* @param src Pointer to the source buffer.
|
|
||||||
* @param size Length of data, in bytes.
|
|
||||||
*
|
|
||||||
* @return esp_err_t
|
|
||||||
*/
|
|
||||||
esp_err_t spi_flash_write(size_t dest_addr, const void *src, size_t size);
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Write data encrypted to Flash.
|
|
||||||
*
|
|
||||||
* @note Flash encryption must be enabled for this function to work.
|
|
||||||
*
|
|
||||||
* @note Flash encryption must be enabled when calling this function.
|
|
||||||
* If flash encryption is disabled, the function returns
|
|
||||||
* ESP_ERR_INVALID_STATE. Use esp_flash_encryption_enabled()
|
|
||||||
* function to determine if flash encryption is enabled.
|
|
||||||
*
|
|
||||||
* @note Both dest_addr and size must be multiples of 16 bytes. For
|
|
||||||
* absolute best performance, both dest_addr and size arguments should
|
|
||||||
* be multiples of 32 bytes.
|
|
||||||
*
|
|
||||||
* @param dest_addr Destination address in Flash. Must be a multiple of 16 bytes.
|
|
||||||
* @param src Pointer to the source buffer.
|
|
||||||
* @param size Length of data, in bytes. Must be a multiple of 16 bytes.
|
|
||||||
*
|
|
||||||
* @return esp_err_t
|
|
||||||
*/
|
|
||||||
esp_err_t spi_flash_write_encrypted(size_t dest_addr, const void *src, size_t size);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Read data from Flash.
|
|
||||||
*
|
|
||||||
* @note For fastest read performance, all parameters should be
|
|
||||||
* 4 byte aligned. If source address and read size are not 4 byte
|
|
||||||
* aligned, read may be split into multiple flash operations. If
|
|
||||||
* destination buffer is not 4 byte aligned, a temporary buffer will
|
|
||||||
* be allocated on the stack.
|
|
||||||
*
|
|
||||||
* @note Reading more than 16KB of data at a time will be split
|
|
||||||
* into multiple reads to avoid disruption to other tasks in the
|
|
||||||
* system. Consider using spi_flash_mmap() to read large amounts
|
|
||||||
* of data.
|
|
||||||
*
|
|
||||||
* @param src_addr source address of the data in Flash.
|
|
||||||
* @param dest pointer to the destination buffer
|
|
||||||
* @param size length of data
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @return esp_err_t
|
|
||||||
*/
|
|
||||||
esp_err_t spi_flash_read(size_t src_addr, void *dest, size_t size);
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Read data from Encrypted Flash.
|
|
||||||
*
|
|
||||||
* If flash encryption is enabled, this function will transparently decrypt data as it is read.
|
|
||||||
* If flash encryption is not enabled, this function behaves the same as spi_flash_read().
|
|
||||||
*
|
|
||||||
* See esp_flash_encryption_enabled() for a function to check if flash encryption is enabled.
|
|
||||||
*
|
|
||||||
* @param src source address of the data in Flash.
|
|
||||||
* @param dest pointer to the destination buffer
|
|
||||||
* @param size length of data
|
|
||||||
*
|
|
||||||
* @return esp_err_t
|
|
||||||
*/
|
|
||||||
esp_err_t spi_flash_read_encrypted(size_t src, void *dest, size_t size);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Enumeration which specifies memory space requested in an mmap call
|
|
||||||
*/
|
|
||||||
typedef enum {
|
|
||||||
SPI_FLASH_MMAP_DATA, /**< map to data memory (Vaddr0), allows byte-aligned access, 4 MB total */
|
|
||||||
SPI_FLASH_MMAP_INST, /**< map to instruction memory (Vaddr1-3), allows only 4-byte-aligned access, 11 MB total */
|
|
||||||
} spi_flash_mmap_memory_t;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Opaque handle for memory region obtained from spi_flash_mmap.
|
|
||||||
*/
|
|
||||||
typedef uint32_t spi_flash_mmap_handle_t;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Map region of flash memory into data or instruction address space
|
|
||||||
*
|
|
||||||
* This function allocates sufficient number of 64kB MMU pages and configures
|
|
||||||
* them to map the requested region of flash memory into the address space.
|
|
||||||
* It may reuse MMU pages which already provide the required mapping.
|
|
||||||
*
|
|
||||||
* As with any allocator, if mmap/munmap are heavily used then the address space
|
|
||||||
* may become fragmented. To troubleshoot issues with page allocation, use
|
|
||||||
* spi_flash_mmap_dump() function.
|
|
||||||
*
|
|
||||||
* @param src_addr Physical address in flash where requested region starts.
|
|
||||||
* This address *must* be aligned to 64kB boundary
|
|
||||||
* (SPI_FLASH_MMU_PAGE_SIZE)
|
|
||||||
* @param size Size of region to be mapped. This size will be rounded
|
|
||||||
* up to a 64kB boundary
|
|
||||||
* @param memory Address space where the region should be mapped (data or instruction)
|
|
||||||
* @param[out] out_ptr Output, pointer to the mapped memory region
|
|
||||||
* @param[out] out_handle Output, handle which should be used for spi_flash_munmap call
|
|
||||||
*
|
|
||||||
* @return ESP_OK on success, ESP_ERR_NO_MEM if pages can not be allocated
|
|
||||||
*/
|
|
||||||
esp_err_t spi_flash_mmap(size_t src_addr, size_t size, spi_flash_mmap_memory_t memory,
|
|
||||||
const void** out_ptr, spi_flash_mmap_handle_t* out_handle);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Map sequences of pages of flash memory into data or instruction address space
|
|
||||||
*
|
|
||||||
* This function allocates sufficient number of 64kB MMU pages and configures
|
|
||||||
* them to map the indicated pages of flash memory contiguously into address space.
|
|
||||||
* In this respect, it works in a similar way as spi_flash_mmap() but it allows mapping
|
|
||||||
* a (maybe non-contiguous) set of pages into a contiguous region of memory.
|
|
||||||
*
|
|
||||||
* @param pages An array of numbers indicating the 64kB pages in flash to be mapped
|
|
||||||
* contiguously into memory. These indicate the indexes of the 64kB pages,
|
|
||||||
* not the byte-size addresses as used in other functions.
|
|
||||||
* Array must be located in internal memory.
|
|
||||||
* @param page_count Number of entries in the pages array
|
|
||||||
* @param memory Address space where the region should be mapped (instruction or data)
|
|
||||||
* @param[out] out_ptr Output, pointer to the mapped memory region
|
|
||||||
* @param[out] out_handle Output, handle which should be used for spi_flash_munmap call
|
|
||||||
*
|
|
||||||
* @return
|
|
||||||
* - ESP_OK on success
|
|
||||||
* - ESP_ERR_NO_MEM if pages can not be allocated
|
|
||||||
* - ESP_ERR_INVALID_ARG if pagecount is zero or pages array is not in
|
|
||||||
* internal memory
|
|
||||||
*/
|
|
||||||
esp_err_t spi_flash_mmap_pages(const int *pages, size_t page_count, spi_flash_mmap_memory_t memory,
|
|
||||||
const void** out_ptr, spi_flash_mmap_handle_t* out_handle);
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Release region previously obtained using spi_flash_mmap
|
|
||||||
*
|
|
||||||
* @note Calling this function will not necessarily unmap memory region.
|
|
||||||
* Region will only be unmapped when there are no other handles which
|
|
||||||
* reference this region. In case of partially overlapping regions
|
|
||||||
* it is possible that memory will be unmapped partially.
|
|
||||||
*
|
|
||||||
* @param handle Handle obtained from spi_flash_mmap
|
|
||||||
*/
|
|
||||||
void spi_flash_munmap(spi_flash_mmap_handle_t handle);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Display information about mapped regions
|
|
||||||
*
|
|
||||||
* This function lists handles obtained using spi_flash_mmap, along with range
|
|
||||||
* of pages allocated to each handle. It also lists all non-zero entries of
|
|
||||||
* MMU table and corresponding reference counts.
|
|
||||||
*/
|
|
||||||
void spi_flash_mmap_dump(void);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief get free pages number which can be mmap
|
|
||||||
*
|
|
||||||
* This function will return number of free pages available in mmu table. This could be useful
|
|
||||||
* before calling actual spi_flash_mmap (maps flash range to DCache or ICache memory) to check
|
|
||||||
* if there is sufficient space available for mapping.
|
|
||||||
*
|
|
||||||
* @param memory memory type of MMU table free page
|
|
||||||
*
|
|
||||||
* @return number of free pages which can be mmaped
|
|
||||||
*/
|
|
||||||
uint32_t spi_flash_mmap_get_free_pages(spi_flash_mmap_memory_t memory);
|
|
||||||
|
|
||||||
|
|
||||||
#define SPI_FLASH_CACHE2PHYS_FAIL UINT32_MAX /*<! Result from spi_flash_cache2phys() if flash cache address is invalid */
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Given a memory address where flash is mapped, return the corresponding physical flash offset.
|
|
||||||
*
|
|
||||||
* Cache address does not have have been assigned via spi_flash_mmap(), any address in memory mapped flash space can be looked up.
|
|
||||||
*
|
|
||||||
* @param cached Pointer to flashed cached memory.
|
|
||||||
*
|
|
||||||
* @return
|
|
||||||
* - SPI_FLASH_CACHE2PHYS_FAIL If cache address is outside flash cache region, or the address is not mapped.
|
|
||||||
* - Otherwise, returns physical offset in flash
|
|
||||||
*/
|
|
||||||
size_t spi_flash_cache2phys(const void *cached);
|
|
||||||
|
|
||||||
/** @brief Given a physical offset in flash, return the address where it is mapped in the memory space.
|
|
||||||
*
|
|
||||||
* Physical address does not have to have been assigned via spi_flash_mmap(), any address in flash can be looked up.
|
|
||||||
*
|
|
||||||
* @note Only the first matching cache address is returned. If MMU flash cache table is configured so multiple entries
|
|
||||||
* point to the same physical address, there may be more than one cache address corresponding to that physical
|
|
||||||
* address. It is also possible for a single physical address to be mapped to both the IROM and DROM regions.
|
|
||||||
*
|
|
||||||
* @note This function doesn't impose any alignment constraints, but if memory argument is SPI_FLASH_MMAP_INST and
|
|
||||||
* phys_offs is not 4-byte aligned, then reading from the returned pointer will result in a crash.
|
|
||||||
*
|
|
||||||
* @param phys_offs Physical offset in flash memory to look up.
|
|
||||||
* @param memory Address space type to look up a flash cache address mapping for (instruction or data)
|
|
||||||
*
|
|
||||||
* @return
|
|
||||||
* - NULL if the physical address is invalid or not mapped to flash cache of the specified memory type.
|
|
||||||
* - Cached memory address (in IROM or DROM space) corresponding to phys_offs.
|
|
||||||
*/
|
|
||||||
const void *spi_flash_phys2cache(size_t phys_offs, spi_flash_mmap_memory_t memory);
|
|
||||||
|
|
||||||
/** @brief Check at runtime if flash cache is enabled on both CPUs
|
|
||||||
*
|
|
||||||
* @return true if both CPUs have flash cache enabled, false otherwise.
|
|
||||||
*/
|
|
||||||
bool spi_flash_cache_enabled(void);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Re-enable cache for the core defined as cpuid parameter.
|
|
||||||
*
|
|
||||||
* @param cpuid the core number to enable instruction cache for
|
|
||||||
*/
|
|
||||||
void spi_flash_enable_cache(uint32_t cpuid);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief SPI flash critical section enter function.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
typedef void (*spi_flash_guard_start_func_t)(void);
|
|
||||||
/**
|
|
||||||
* @brief SPI flash critical section exit function.
|
|
||||||
*/
|
|
||||||
typedef void (*spi_flash_guard_end_func_t)(void);
|
|
||||||
/**
|
|
||||||
* @brief SPI flash operation lock function.
|
|
||||||
*/
|
|
||||||
typedef void (*spi_flash_op_lock_func_t)(void);
|
|
||||||
/**
|
|
||||||
* @brief SPI flash operation unlock function.
|
|
||||||
*/
|
|
||||||
typedef void (*spi_flash_op_unlock_func_t)(void);
|
|
||||||
/**
|
|
||||||
* @brief Function to protect SPI flash critical regions corruption.
|
|
||||||
*/
|
|
||||||
typedef bool (*spi_flash_is_safe_write_address_t)(size_t addr, size_t size);
|
|
||||||
/**
|
|
||||||
* @brief Function to yield to the OS during erase operation.
|
|
||||||
*/
|
|
||||||
typedef void (*spi_flash_os_yield_t)(void);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Structure holding SPI flash access critical sections management functions.
|
|
||||||
*
|
|
||||||
* Flash API uses two types of flash access management functions:
|
|
||||||
* 1) Functions which prepare/restore flash cache and interrupts before calling
|
|
||||||
* appropriate ROM functions (SPIWrite, SPIRead and SPIEraseBlock):
|
|
||||||
* - 'start' function should disables flash cache and non-IRAM interrupts and
|
|
||||||
* is invoked before the call to one of ROM function above.
|
|
||||||
* - 'end' function should restore state of flash cache and non-IRAM interrupts and
|
|
||||||
* is invoked after the call to one of ROM function above.
|
|
||||||
* These two functions are not recursive.
|
|
||||||
* 2) Functions which synchronizes access to internal data used by flash API.
|
|
||||||
* This functions are mostly intended to synchronize access to flash API internal data
|
|
||||||
* in multithreaded environment and use OS primitives:
|
|
||||||
* - 'op_lock' locks access to flash API internal data.
|
|
||||||
* - 'op_unlock' unlocks access to flash API internal data.
|
|
||||||
* These two functions are recursive and can be used around the outside of multiple calls to
|
|
||||||
* 'start' & 'end', in order to create atomic multi-part flash operations.
|
|
||||||
* 3) When CONFIG_SPI_FLASH_DANGEROUS_WRITE_ALLOWED is disabled, flash writing/erasing
|
|
||||||
* API checks for addresses provided by user to avoid corruption of critical flash regions
|
|
||||||
* (bootloader, partition table, running application etc.).
|
|
||||||
*
|
|
||||||
* Different versions of the guarding functions should be used depending on the context of
|
|
||||||
* execution (with or without functional OS). In normal conditions when flash API is called
|
|
||||||
* from task the functions use OS primitives. When there is no OS at all or when
|
|
||||||
* it is not guaranteed that OS is functional (accessing flash from exception handler) these
|
|
||||||
* functions cannot use OS primitives or even does not need them (multithreaded access is not possible).
|
|
||||||
*
|
|
||||||
* @note Structure and corresponding guard functions should not reside in flash.
|
|
||||||
* For example structure can be placed in DRAM and functions in IRAM sections.
|
|
||||||
*/
|
|
||||||
typedef struct {
|
|
||||||
spi_flash_guard_start_func_t start; /**< critical section start function. */
|
|
||||||
spi_flash_guard_end_func_t end; /**< critical section end function. */
|
|
||||||
spi_flash_op_lock_func_t op_lock; /**< flash access API lock function.*/
|
|
||||||
spi_flash_op_unlock_func_t op_unlock; /**< flash access API unlock function.*/
|
|
||||||
#if !CONFIG_SPI_FLASH_DANGEROUS_WRITE_ALLOWED
|
|
||||||
spi_flash_is_safe_write_address_t is_safe_write_address; /**< checks flash write addresses.*/
|
|
||||||
#endif
|
|
||||||
spi_flash_os_yield_t yield; /**< yield to the OS during flash erase */
|
|
||||||
} spi_flash_guard_funcs_t;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Sets guard functions to access flash.
|
|
||||||
*
|
|
||||||
* @note Pointed structure and corresponding guard functions should not reside in flash.
|
|
||||||
* For example structure can be placed in DRAM and functions in IRAM sections.
|
|
||||||
*
|
|
||||||
* @param funcs pointer to structure holding flash access guard functions.
|
|
||||||
*/
|
|
||||||
void spi_flash_guard_set(const spi_flash_guard_funcs_t* funcs);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Get the guard functions used for flash access
|
|
||||||
*
|
|
||||||
* @return The guard functions that were set via spi_flash_guard_set(). These functions
|
|
||||||
* can be called if implementing custom low-level SPI flash operations.
|
|
||||||
*/
|
|
||||||
const spi_flash_guard_funcs_t *spi_flash_guard_get(void);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Default OS-aware flash access guard functions
|
|
||||||
*/
|
|
||||||
extern const spi_flash_guard_funcs_t g_flash_guard_default_ops;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Non-OS flash access guard functions
|
|
||||||
*
|
|
||||||
* @note This version of flash guard functions is to be used when no OS is present or from panic handler.
|
|
||||||
* It does not use any OS primitives and IPC and implies that only calling CPU is active.
|
|
||||||
*/
|
|
||||||
extern const spi_flash_guard_funcs_t g_flash_guard_no_os_ops;
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* ESP_SPI_FLASH_H */
|
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* This file contains `spi_flash_mmap_xx` APIs, mainly for doing memory mapping
|
* This file contains `spi_flash_mmap_xx` APIs, mainly for doing memory mapping
|
||||||
* to an SPI-connected external Flash, as well as some helper functions to
|
* to an SPI0-connected external Flash, as well as some helper functions to
|
||||||
* convert between virtual and physical address
|
* convert between virtual and physical address
|
||||||
**/
|
**/
|
||||||
|
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
#include "memspi_host_driver.h"
|
#include "memspi_host_driver.h"
|
||||||
#include "string.h"
|
#include "string.h"
|
||||||
#include "esp_log.h"
|
#include "esp_log.h"
|
||||||
#include "cache_utils.h"
|
#include "esp_private/cache_utils.h"
|
||||||
#include "esp_flash_partitions.h"
|
#include "esp_flash_partitions.h"
|
||||||
#include "esp_memory_utils.h"
|
#include "esp_memory_utils.h"
|
||||||
|
|
||||||
|
@ -355,9 +355,6 @@ esp_err_t esp_partition_register_external(esp_flash_t *flash_chip, size_t offset
|
|||||||
if (out_partition != NULL) {
|
if (out_partition != NULL) {
|
||||||
*out_partition = NULL;
|
*out_partition = NULL;
|
||||||
}
|
}
|
||||||
#ifdef CONFIG_SPI_FLASH_USE_LEGACY_IMPL
|
|
||||||
return ESP_ERR_NOT_SUPPORTED;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (offset + size > flash_chip->size) {
|
if (offset + size > flash_chip->size) {
|
||||||
return ESP_ERR_INVALID_SIZE;
|
return ESP_ERR_INVALID_SIZE;
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
#include "esp_flash_encrypt.h"
|
#include "esp_flash_encrypt.h"
|
||||||
#include "esp_log.h"
|
#include "esp_log.h"
|
||||||
#include "esp_rom_md5.h"
|
#include "esp_rom_md5.h"
|
||||||
#include "esp_spi_flash.h"
|
#include "spi_flash_mmap.h"
|
||||||
#include "bootloader_common.h"
|
#include "bootloader_common.h"
|
||||||
#include "esp_ota_ops.h"
|
#include "esp_ota_ops.h"
|
||||||
|
|
||||||
@ -35,11 +35,7 @@ esp_err_t esp_partition_read(const esp_partition_t *partition,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!partition->encrypted) {
|
if (!partition->encrypted) {
|
||||||
#ifndef CONFIG_SPI_FLASH_USE_LEGACY_IMPL
|
|
||||||
return esp_flash_read(partition->flash_chip, dst, partition->address + src_offset, size);
|
return esp_flash_read(partition->flash_chip, dst, partition->address + src_offset, size);
|
||||||
#else
|
|
||||||
return spi_flash_read(partition->address + src_offset, dst, size);
|
|
||||||
#endif // CONFIG_SPI_FLASH_USE_LEGACY_IMPL
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#if CONFIG_SPI_FLASH_ENABLE_ENCRYPTED_READ_WRITE
|
#if CONFIG_SPI_FLASH_ENABLE_ENCRYPTED_READ_WRITE
|
||||||
@ -76,23 +72,14 @@ esp_err_t esp_partition_write(const esp_partition_t *partition,
|
|||||||
}
|
}
|
||||||
dst_offset = partition->address + dst_offset;
|
dst_offset = partition->address + dst_offset;
|
||||||
if (!partition->encrypted) {
|
if (!partition->encrypted) {
|
||||||
#ifndef CONFIG_SPI_FLASH_USE_LEGACY_IMPL
|
|
||||||
return esp_flash_write(partition->flash_chip, src, dst_offset, size);
|
return esp_flash_write(partition->flash_chip, src, dst_offset, size);
|
||||||
#else
|
|
||||||
return spi_flash_write(dst_offset, src, size);
|
|
||||||
#endif // CONFIG_SPI_FLASH_USE_LEGACY_IMPL
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#if CONFIG_SPI_FLASH_ENABLE_ENCRYPTED_READ_WRITE
|
#if CONFIG_SPI_FLASH_ENABLE_ENCRYPTED_READ_WRITE
|
||||||
if (partition->flash_chip != esp_flash_default_chip) {
|
if (partition->flash_chip != esp_flash_default_chip) {
|
||||||
return ESP_ERR_NOT_SUPPORTED;
|
return ESP_ERR_NOT_SUPPORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef CONFIG_SPI_FLASH_USE_LEGACY_IMPL
|
|
||||||
return esp_flash_write_encrypted(partition->flash_chip, dst_offset, src, size);
|
return esp_flash_write_encrypted(partition->flash_chip, dst_offset, src, size);
|
||||||
#else
|
|
||||||
return spi_flash_write_encrypted(dst_offset, src, size);
|
|
||||||
#endif // CONFIG_SPI_FLASH_USE_LEGACY_IMPL
|
|
||||||
#else
|
#else
|
||||||
return ESP_ERR_NOT_SUPPORTED;
|
return ESP_ERR_NOT_SUPPORTED;
|
||||||
#endif // CONFIG_SPI_FLASH_ENABLE_ENCRYPTED_READ_WRITE
|
#endif // CONFIG_SPI_FLASH_ENABLE_ENCRYPTED_READ_WRITE
|
||||||
@ -109,11 +96,7 @@ esp_err_t esp_partition_read_raw(const esp_partition_t *partition,
|
|||||||
return ESP_ERR_INVALID_SIZE;
|
return ESP_ERR_INVALID_SIZE;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef CONFIG_SPI_FLASH_USE_LEGACY_IMPL
|
|
||||||
return esp_flash_read(partition->flash_chip, dst, partition->address + src_offset, size);
|
return esp_flash_read(partition->flash_chip, dst, partition->address + src_offset, size);
|
||||||
#else
|
|
||||||
return spi_flash_read(partition->address + src_offset, dst, size);
|
|
||||||
#endif // CONFIG_SPI_FLASH_USE_LEGACY_IMPL
|
|
||||||
}
|
}
|
||||||
|
|
||||||
esp_err_t esp_partition_write_raw(const esp_partition_t *partition,
|
esp_err_t esp_partition_write_raw(const esp_partition_t *partition,
|
||||||
@ -128,11 +111,7 @@ esp_err_t esp_partition_write_raw(const esp_partition_t *partition,
|
|||||||
}
|
}
|
||||||
dst_offset = partition->address + dst_offset;
|
dst_offset = partition->address + dst_offset;
|
||||||
|
|
||||||
#ifndef CONFIG_SPI_FLASH_USE_LEGACY_IMPL
|
|
||||||
return esp_flash_write(partition->flash_chip, src, dst_offset, size);
|
return esp_flash_write(partition->flash_chip, src, dst_offset, size);
|
||||||
#else
|
|
||||||
return spi_flash_write(dst_offset, src, size);
|
|
||||||
#endif // CONFIG_SPI_FLASH_USE_LEGACY_IMPL
|
|
||||||
}
|
}
|
||||||
|
|
||||||
esp_err_t esp_partition_erase_range(const esp_partition_t *partition,
|
esp_err_t esp_partition_erase_range(const esp_partition_t *partition,
|
||||||
@ -151,11 +130,8 @@ esp_err_t esp_partition_erase_range(const esp_partition_t *partition,
|
|||||||
if (offset % SPI_FLASH_SEC_SIZE != 0) {
|
if (offset % SPI_FLASH_SEC_SIZE != 0) {
|
||||||
return ESP_ERR_INVALID_ARG;
|
return ESP_ERR_INVALID_ARG;
|
||||||
}
|
}
|
||||||
#ifndef CONFIG_SPI_FLASH_USE_LEGACY_IMPL
|
|
||||||
return esp_flash_erase_region(partition->flash_chip, partition->address + offset, size);
|
return esp_flash_erase_region(partition->flash_chip, partition->address + offset, size);
|
||||||
#else
|
|
||||||
return spi_flash_erase_range(partition->address + offset, size);
|
|
||||||
#endif // CONFIG_SPI_FLASH_USE_LEGACY_IMPL
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -6,7 +6,6 @@ SOURCE_FILES := \
|
|||||||
partition.c \
|
partition.c \
|
||||||
../spi_flash/partition_target.c \
|
../spi_flash/partition_target.c \
|
||||||
flash_ops.c \
|
flash_ops.c \
|
||||||
esp32/flash_ops_esp32.c \
|
|
||||||
) \
|
) \
|
||||||
|
|
||||||
INCLUDE_DIRS := \
|
INCLUDE_DIRS := \
|
||||||
@ -16,6 +15,7 @@ INCLUDE_DIRS := \
|
|||||||
../private_include \
|
../private_include \
|
||||||
$(addprefix stubs/, \
|
$(addprefix stubs/, \
|
||||||
app_update/include \
|
app_update/include \
|
||||||
|
bsd/include \
|
||||||
driver/include \
|
driver/include \
|
||||||
esp_timer/include \
|
esp_timer/include \
|
||||||
freertos/include \
|
freertos/include \
|
||||||
|
@ -3,11 +3,13 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
#include "esp_spi_flash.h"
|
#include "spi_flash_mmap.h"
|
||||||
#include "esp_partition.h"
|
#include "esp_partition.h"
|
||||||
|
|
||||||
#include "esp_err.h"
|
#include "esp_err.h"
|
||||||
#include "esp_rom_spiflash.h"
|
#include "esp_rom_spiflash.h"
|
||||||
|
#include "esp_flash.h"
|
||||||
|
#include "bsd_strings.h"
|
||||||
|
|
||||||
SpiFlash spiflash = SpiFlash();
|
SpiFlash spiflash = SpiFlash();
|
||||||
|
|
||||||
@ -85,6 +87,11 @@ esp_rom_spiflash_result_t esp_rom_spiflash_read(uint32_t target, uint32_t *dest,
|
|||||||
return spiflash.read(target, dest, len);
|
return spiflash.read(target, dest, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern "C" esp_err_t esp_flash_read(esp_flash_t *chip, void *buffer, uint32_t address, uint32_t length)
|
||||||
|
{
|
||||||
|
return spiflash.read(address, buffer, length);
|
||||||
|
}
|
||||||
|
|
||||||
esp_rom_spiflash_result_t esp_rom_spiflash_erase_block(uint32_t block)
|
esp_rom_spiflash_result_t esp_rom_spiflash_erase_block(uint32_t block)
|
||||||
{
|
{
|
||||||
return spiflash.erase_block(block);
|
return spiflash.erase_block(block);
|
||||||
@ -100,11 +107,29 @@ esp_rom_spiflash_result_t esp_rom_spiflash_erase_page(uint32_t page)
|
|||||||
return spiflash.erase_page(page);
|
return spiflash.erase_page(page);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern "C" esp_err_t esp_flash_erase_region(esp_flash_t *chip, uint32_t start_addr, uint32_t size)
|
||||||
|
{
|
||||||
|
size_t start = start_addr / SPI_FLASH_SEC_SIZE;
|
||||||
|
size_t end = start + size / SPI_FLASH_SEC_SIZE;
|
||||||
|
const size_t sectors_per_block = 65536 / SPI_FLASH_SEC_SIZE;
|
||||||
|
esp_rom_spiflash_result_t rc = ESP_ROM_SPIFLASH_RESULT_OK;
|
||||||
|
for (size_t sector = start; sector != end && rc == ESP_ROM_SPIFLASH_RESULT_OK; ) {
|
||||||
|
rc = spiflash.erase_sector(sector);
|
||||||
|
++sector;
|
||||||
|
}
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
esp_rom_spiflash_result_t esp_rom_spiflash_write(uint32_t target, const uint32_t *src, int32_t len)
|
esp_rom_spiflash_result_t esp_rom_spiflash_write(uint32_t target, const uint32_t *src, int32_t len)
|
||||||
{
|
{
|
||||||
return spiflash.write(target, src, len);
|
return spiflash.write(target, src, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern "C" esp_err_t esp_flash_write(esp_flash_t *chip, const void *buffer, uint32_t address, uint32_t length)
|
||||||
|
{
|
||||||
|
return spiflash.write(address, buffer, length);
|
||||||
|
}
|
||||||
|
|
||||||
esp_rom_spiflash_result_t esp_rom_spiflash_write_encrypted(uint32_t flash_addr, uint32_t *data, uint32_t len)
|
esp_rom_spiflash_result_t esp_rom_spiflash_write_encrypted(uint32_t flash_addr, uint32_t *data, uint32_t len)
|
||||||
{
|
{
|
||||||
return spiflash.write(flash_addr, data, len);
|
return spiflash.write(flash_addr, data, len);
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
#include "esp_spi_flash.h"
|
#include "spi_flash_mmap.h"
|
||||||
#include "esp_partition.h"
|
#include "esp_partition.h"
|
||||||
|
|
||||||
#include "esp_err.h"
|
#include "esp_err.h"
|
||||||
|
@ -5,12 +5,14 @@ SOURCE_FILES := \
|
|||||||
esp32/crc.cpp \
|
esp32/crc.cpp \
|
||||||
esp32/esp_random.c \
|
esp32/esp_random.c \
|
||||||
esp_timer/src/esp_timer.c \
|
esp_timer/src/esp_timer.c \
|
||||||
|
bsd/strlcpy.c\
|
||||||
bootloader_support/src/bootloader_common.c
|
bootloader_support/src/bootloader_common.c
|
||||||
|
|
||||||
INCLUDE_DIRS := \
|
INCLUDE_DIRS := \
|
||||||
../include \
|
../include \
|
||||||
../private_include \
|
../private_include \
|
||||||
app_update/include \
|
app_update/include \
|
||||||
|
bsd/include \
|
||||||
driver/include \
|
driver/include \
|
||||||
esp_timer/include \
|
esp_timer/include \
|
||||||
freertos/include \
|
freertos/include \
|
||||||
|
@ -8,7 +8,6 @@
|
|||||||
#include <sys/param.h> //For max/min
|
#include <sys/param.h> //For max/min
|
||||||
#include "esp_attr.h"
|
#include "esp_attr.h"
|
||||||
#include "esp_private/system_internal.h"
|
#include "esp_private/system_internal.h"
|
||||||
#include "esp_spi_flash.h" //for ``g_flash_guard_default_ops``
|
|
||||||
#include "esp_flash.h"
|
#include "esp_flash.h"
|
||||||
#include "esp_flash_partitions.h"
|
#include "esp_flash_partitions.h"
|
||||||
#include "freertos/FreeRTOS.h"
|
#include "freertos/FreeRTOS.h"
|
||||||
@ -19,6 +18,7 @@
|
|||||||
#include "esp_compiler.h"
|
#include "esp_compiler.h"
|
||||||
#include "esp_rom_sys.h"
|
#include "esp_rom_sys.h"
|
||||||
#include "esp_private/spi_flash_os.h"
|
#include "esp_private/spi_flash_os.h"
|
||||||
|
#include "esp_private/cache_utils.h"
|
||||||
|
|
||||||
#include "esp_private/spi_common_internal.h"
|
#include "esp_private/spi_common_internal.h"
|
||||||
|
|
||||||
@ -61,14 +61,14 @@ static inline bool on_spi1_check_yield(spi1_app_func_arg_t* ctx);
|
|||||||
IRAM_ATTR static void cache_enable(void* arg)
|
IRAM_ATTR static void cache_enable(void* arg)
|
||||||
{
|
{
|
||||||
#ifndef CONFIG_SPI_FLASH_AUTO_SUSPEND
|
#ifndef CONFIG_SPI_FLASH_AUTO_SUSPEND
|
||||||
g_flash_guard_default_ops.end();
|
spi_flash_enable_interrupts_caches_and_other_cpu();
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
IRAM_ATTR static void cache_disable(void* arg)
|
IRAM_ATTR static void cache_disable(void* arg)
|
||||||
{
|
{
|
||||||
#ifndef CONFIG_SPI_FLASH_AUTO_SUSPEND
|
#ifndef CONFIG_SPI_FLASH_AUTO_SUSPEND
|
||||||
g_flash_guard_default_ops.start();
|
spi_flash_disable_interrupts_caches_and_other_cpu();
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,9 +1,4 @@
|
|||||||
if(CONFIG_SPI_FLASH_USE_LEGACY_IMPL)
|
|
||||||
set(exclude_srcs "test_esp_flash.c" "test_partition_ext.c")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
idf_component_register(SRC_DIRS "."
|
idf_component_register(SRC_DIRS "."
|
||||||
EXCLUDE_SRCS "${exclude_srcs}"
|
|
||||||
PRIV_INCLUDE_DIRS "."
|
PRIV_INCLUDE_DIRS "."
|
||||||
PRIV_REQUIRES cmock test_utils spi_flash bootloader_support app_update
|
PRIV_REQUIRES cmock test_utils spi_flash bootloader_support app_update
|
||||||
driver esp_timer)
|
driver esp_timer)
|
||||||
|
@ -12,11 +12,11 @@
|
|||||||
#include <freertos/semphr.h>
|
#include <freertos/semphr.h>
|
||||||
|
|
||||||
#include <unity.h>
|
#include <unity.h>
|
||||||
#include <esp_spi_flash.h>
|
#include <spi_flash_mmap.h>
|
||||||
#include <esp_attr.h>
|
#include <esp_attr.h>
|
||||||
#include <esp_flash_encrypt.h>
|
#include <esp_flash_encrypt.h>
|
||||||
|
|
||||||
#include "../cache_utils.h"
|
#include "esp_private/cache_utils.h"
|
||||||
|
|
||||||
static QueueHandle_t result_queue;
|
static QueueHandle_t result_queue;
|
||||||
|
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
#include <unity.h>
|
#include <unity.h>
|
||||||
#include <test_utils.h>
|
#include <test_utils.h>
|
||||||
#include <esp_spi_flash.h>
|
#include <spi_flash_mmap.h>
|
||||||
#include <esp_attr.h>
|
#include <esp_attr.h>
|
||||||
#include <esp_flash_encrypt.h>
|
#include <esp_flash_encrypt.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@ -39,10 +39,9 @@ static void verify_erased_flash(size_t offset, size_t length)
|
|||||||
uint8_t *readback = (uint8_t *)heap_caps_malloc(SPI_FLASH_SEC_SIZE, MALLOC_CAP_32BIT | MALLOC_CAP_8BIT | MALLOC_CAP_INTERNAL);
|
uint8_t *readback = (uint8_t *)heap_caps_malloc(SPI_FLASH_SEC_SIZE, MALLOC_CAP_32BIT | MALLOC_CAP_8BIT | MALLOC_CAP_INTERNAL);
|
||||||
printf("verify erased 0x%x - 0x%x\n", offset, offset + length);
|
printf("verify erased 0x%x - 0x%x\n", offset, offset + length);
|
||||||
TEST_ASSERT_EQUAL_HEX(ESP_OK,
|
TEST_ASSERT_EQUAL_HEX(ESP_OK,
|
||||||
spi_flash_read(offset, readback, length));
|
esp_flash_read(NULL, readback, offset, length));
|
||||||
for (int i = 0; i < length; i++) {
|
for (int i = 0; i < length; i++) {
|
||||||
char message[32];
|
TEST_ASSERT_EQUAL_HEX8(0xFF, readback[i]);
|
||||||
TEST_ASSERT_EQUAL_HEX_MESSAGE(0xFF, readback[i], message);
|
|
||||||
}
|
}
|
||||||
free(readback);
|
free(readback);
|
||||||
}
|
}
|
||||||
@ -52,7 +51,7 @@ TEST_CASE("test 16 byte encrypted writes", "[flash_encryption][test_env=UT_T1_Fl
|
|||||||
setup_tests();
|
setup_tests();
|
||||||
|
|
||||||
TEST_ASSERT_EQUAL_HEX(ESP_OK,
|
TEST_ASSERT_EQUAL_HEX(ESP_OK,
|
||||||
spi_flash_erase_sector(start / SPI_FLASH_SEC_SIZE));
|
esp_flash_erase_region(NULL, start, SPI_FLASH_SEC_SIZE));
|
||||||
|
|
||||||
uint8_t fortyeight_bytes[0x30]; // 0, 1, 2, 3, 4... 47
|
uint8_t fortyeight_bytes[0x30]; // 0, 1, 2, 3, 4... 47
|
||||||
for(int i = 0; i < sizeof(fortyeight_bytes); i++) {
|
for(int i = 0; i < sizeof(fortyeight_bytes); i++) {
|
||||||
@ -61,10 +60,10 @@ TEST_CASE("test 16 byte encrypted writes", "[flash_encryption][test_env=UT_T1_Fl
|
|||||||
|
|
||||||
/* Verify unaligned start or length fails */
|
/* Verify unaligned start or length fails */
|
||||||
TEST_ASSERT_EQUAL_HEX(ESP_ERR_INVALID_ARG,
|
TEST_ASSERT_EQUAL_HEX(ESP_ERR_INVALID_ARG,
|
||||||
spi_flash_write_encrypted(start+1, fortyeight_bytes, 32));
|
esp_flash_write_encrypted(NULL, start + 1, fortyeight_bytes, 32));
|
||||||
|
|
||||||
TEST_ASSERT_EQUAL_HEX(ESP_ERR_INVALID_SIZE,
|
TEST_ASSERT_EQUAL_HEX(ESP_ERR_INVALID_SIZE,
|
||||||
spi_flash_write_encrypted(start, fortyeight_bytes, 15));
|
esp_flash_write_encrypted(NULL, start, fortyeight_bytes, 15));
|
||||||
|
|
||||||
/* ensure nothing happened to the flash yet */
|
/* ensure nothing happened to the flash yet */
|
||||||
verify_erased_flash(start, 0x20);
|
verify_erased_flash(start, 0x20);
|
||||||
@ -73,9 +72,9 @@ TEST_CASE("test 16 byte encrypted writes", "[flash_encryption][test_env=UT_T1_Fl
|
|||||||
test_encrypted_write(start, fortyeight_bytes, 0x20);
|
test_encrypted_write(start, fortyeight_bytes, 0x20);
|
||||||
verify_erased_flash(start + 0x20, 0x20);
|
verify_erased_flash(start + 0x20, 0x20);
|
||||||
|
|
||||||
/* Slip in an unaligned spi_flash_read_encrypted() test */
|
/* Slip in an unaligned esp_flash_read_encrypted() test */
|
||||||
uint8_t buf[0x10];
|
uint8_t buf[0x10];
|
||||||
spi_flash_read_encrypted(start+0x10, buf, 0x10);
|
esp_flash_read_encrypted(NULL, start+0x10, buf, 0x10);
|
||||||
TEST_ASSERT_EQUAL_HEX8_ARRAY(fortyeight_bytes+0x10, buf, 16);
|
TEST_ASSERT_EQUAL_HEX8_ARRAY(fortyeight_bytes+0x10, buf, 16);
|
||||||
|
|
||||||
/* Write 16 bytes unaligned */
|
/* Write 16 bytes unaligned */
|
||||||
@ -100,10 +99,10 @@ static void test_encrypted_write(size_t offset, const uint8_t *data, size_t leng
|
|||||||
uint8_t readback[length];
|
uint8_t readback[length];
|
||||||
printf("encrypt %d bytes at 0x%x\n", length, offset);
|
printf("encrypt %d bytes at 0x%x\n", length, offset);
|
||||||
TEST_ASSERT_EQUAL_HEX(ESP_OK,
|
TEST_ASSERT_EQUAL_HEX(ESP_OK,
|
||||||
spi_flash_write_encrypted(offset, data, length));
|
esp_flash_write_encrypted(NULL, offset, data, length));
|
||||||
|
|
||||||
TEST_ASSERT_EQUAL_HEX(ESP_OK,
|
TEST_ASSERT_EQUAL_HEX(ESP_OK,
|
||||||
spi_flash_read_encrypted(offset, readback, length));
|
esp_flash_read_encrypted(NULL, offset, readback, length));
|
||||||
|
|
||||||
TEST_ASSERT_EQUAL_HEX8_ARRAY(data, readback, length);
|
TEST_ASSERT_EQUAL_HEX8_ARRAY(data, readback, length);
|
||||||
}
|
}
|
||||||
@ -118,13 +117,13 @@ TEST_CASE("test read & write random encrypted data", "[flash_encryption][test_en
|
|||||||
|
|
||||||
setup_tests();
|
setup_tests();
|
||||||
|
|
||||||
esp_err_t err = spi_flash_erase_sector(start / SPI_FLASH_SEC_SIZE);
|
esp_err_t err = esp_flash_erase_region(NULL, start, SPI_FLASH_SEC_SIZE);
|
||||||
TEST_ESP_OK(err);
|
TEST_ESP_OK(err);
|
||||||
|
|
||||||
//initialize the buffer to compare
|
//initialize the buffer to compare
|
||||||
uint8_t *cmp_buf = heap_caps_malloc(SPI_FLASH_SEC_SIZE, MALLOC_CAP_32BIT | MALLOC_CAP_8BIT | MALLOC_CAP_INTERNAL);
|
uint8_t *cmp_buf = heap_caps_malloc(SPI_FLASH_SEC_SIZE, MALLOC_CAP_32BIT | MALLOC_CAP_8BIT | MALLOC_CAP_INTERNAL);
|
||||||
assert(((intptr_t)cmp_buf % 4) == 0);
|
assert(((intptr_t)cmp_buf % 4) == 0);
|
||||||
err = spi_flash_read_encrypted(start, cmp_buf, SPI_FLASH_SEC_SIZE);
|
err = esp_flash_read_encrypted(NULL, start, cmp_buf, SPI_FLASH_SEC_SIZE);
|
||||||
TEST_ESP_OK(err);
|
TEST_ESP_OK(err);
|
||||||
|
|
||||||
srand(789);
|
srand(789);
|
||||||
@ -148,7 +147,7 @@ TEST_CASE("test read & write random encrypted data", "[flash_encryption][test_en
|
|||||||
}
|
}
|
||||||
|
|
||||||
printf("write %d bytes to 0x%08x...\n", len, start + offset);
|
printf("write %d bytes to 0x%08x...\n", len, start + offset);
|
||||||
err = spi_flash_write_encrypted(start + offset, data_buf, len);
|
err = esp_flash_write_encrypted(NULL, start + offset, data_buf, len);
|
||||||
TEST_ESP_OK(err);
|
TEST_ESP_OK(err);
|
||||||
|
|
||||||
memcpy(cmp_buf + offset, data_buf, len);
|
memcpy(cmp_buf + offset, data_buf, len);
|
||||||
@ -162,7 +161,7 @@ TEST_CASE("test read & write random encrypted data", "[flash_encryption][test_en
|
|||||||
len = SPI_FLASH_SEC_SIZE - offset;
|
len = SPI_FLASH_SEC_SIZE - offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
err = spi_flash_read_encrypted(start + offset, data_buf, len);
|
err = esp_flash_read_encrypted(NULL, start + offset, data_buf, len);
|
||||||
TEST_ESP_OK(err);
|
TEST_ESP_OK(err);
|
||||||
|
|
||||||
printf("compare %d bytes at 0x%08x...\n", len, start + offset);
|
printf("compare %d bytes at 0x%08x...\n", len, start + offset);
|
||||||
@ -174,8 +173,6 @@ TEST_CASE("test read & write random encrypted data", "[flash_encryption][test_en
|
|||||||
free(cmp_buf);
|
free(cmp_buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef CONFIG_SPI_FLASH_USE_LEGACY_IMPL
|
|
||||||
|
|
||||||
static char TAG[] = "flash_encrypt_test";
|
static char TAG[] = "flash_encrypt_test";
|
||||||
static const char plainttext_data[] = "$$$$#### Welcome! This is flash encryption test, ..., ..., hello_world. &&&&***";
|
static const char plainttext_data[] = "$$$$#### Welcome! This is flash encryption test, ..., ..., hello_world. &&&&***";
|
||||||
|
|
||||||
@ -198,7 +195,7 @@ TEST_CASE("test 16 byte encrypted writes (esp_flash)", "[esp_flash_enc][flash_en
|
|||||||
setup_tests();
|
setup_tests();
|
||||||
|
|
||||||
TEST_ASSERT_EQUAL_HEX(ESP_OK,
|
TEST_ASSERT_EQUAL_HEX(ESP_OK,
|
||||||
spi_flash_erase_sector(start / SPI_FLASH_SEC_SIZE));
|
esp_flash_erase_region(NULL, start, SPI_FLASH_SEC_SIZE));
|
||||||
|
|
||||||
uint8_t fortyeight_bytes[0x30]; // 0, 1, 2, 3, 4... 47
|
uint8_t fortyeight_bytes[0x30]; // 0, 1, 2, 3, 4... 47
|
||||||
for(int i = 0; i < sizeof(fortyeight_bytes); i++) {
|
for(int i = 0; i < sizeof(fortyeight_bytes); i++) {
|
||||||
@ -245,7 +242,7 @@ TEST_CASE("test read & write encrypted data(32 bytes alianed address)", "[esp_fl
|
|||||||
{
|
{
|
||||||
setup_tests();
|
setup_tests();
|
||||||
|
|
||||||
TEST_ESP_OK(spi_flash_erase_sector(start / SPI_FLASH_SEC_SIZE));
|
TEST_ESP_OK(esp_flash_erase_region(NULL, start, SPI_FLASH_SEC_SIZE));
|
||||||
start = (start + 31) & (~31); // round up to 32 byte boundary
|
start = (start + 31) & (~31); // round up to 32 byte boundary
|
||||||
|
|
||||||
ESP_LOG_BUFFER_HEXDUMP(TAG, plainttext_data, sizeof(plainttext_data), ESP_LOG_INFO);
|
ESP_LOG_BUFFER_HEXDUMP(TAG, plainttext_data, sizeof(plainttext_data), ESP_LOG_INFO);
|
||||||
@ -270,7 +267,7 @@ TEST_CASE("test read & write encrypted data(32 bytes alianed address)", "[esp_fl
|
|||||||
TEST_CASE("test read & write encrypted data(16 bytes alianed but 32 bytes unaligned)", "[esp_flash_enc][flash_encryption][test_env=UT_T1_FlashEncryption]")
|
TEST_CASE("test read & write encrypted data(16 bytes alianed but 32 bytes unaligned)", "[esp_flash_enc][flash_encryption][test_env=UT_T1_FlashEncryption]")
|
||||||
{
|
{
|
||||||
setup_tests();
|
setup_tests();
|
||||||
TEST_ESP_OK(spi_flash_erase_sector(start/SPI_FLASH_SEC_SIZE));
|
TEST_ESP_OK(esp_flash_erase_region(NULL, start, SPI_FLASH_SEC_SIZE));
|
||||||
do {
|
do {
|
||||||
start++;
|
start++;
|
||||||
} while ((start % 16) != 0);
|
} while ((start % 16) != 0);
|
||||||
@ -327,5 +324,5 @@ TEST_CASE("test read & write encrypted data with large buffer(n*64+32+16)", "[es
|
|||||||
TEST_ASSERT_EQUAL_HEX8_ARRAY(buf, large_const_buffer, sizeof(large_const_buffer));
|
TEST_ASSERT_EQUAL_HEX8_ARRAY(buf, large_const_buffer, sizeof(large_const_buffer));
|
||||||
free(buf);
|
free(buf);
|
||||||
}
|
}
|
||||||
#endif // CONFIG_SPI_FLASH_USE_LEGACY_IMPL
|
|
||||||
#endif // CONFIG_SECURE_FLASH_ENC_ENABLED
|
#endif // CONFIG_SECURE_FLASH_ENC_ENABLED
|
||||||
|
@ -15,10 +15,10 @@
|
|||||||
|
|
||||||
#include <unity.h>
|
#include <unity.h>
|
||||||
#include <test_utils.h>
|
#include <test_utils.h>
|
||||||
#include <esp_spi_flash.h>
|
#include <spi_flash_mmap.h>
|
||||||
#include <esp_log.h>
|
#include <esp_log.h>
|
||||||
#include "esp_rom_spiflash.h"
|
#include "esp_rom_spiflash.h"
|
||||||
#include "../cache_utils.h"
|
#include "esp_private/cache_utils.h"
|
||||||
#include "soc/timer_periph.h"
|
#include "soc/timer_periph.h"
|
||||||
|
|
||||||
static const uint8_t large_const_buffer[16400] = {
|
static const uint8_t large_const_buffer[16400] = {
|
||||||
@ -34,13 +34,13 @@ static const uint8_t large_const_buffer[16400] = {
|
|||||||
|
|
||||||
static void test_write_large_buffer(const uint8_t *source, size_t length);
|
static void test_write_large_buffer(const uint8_t *source, size_t length);
|
||||||
|
|
||||||
TEST_CASE("Test spi_flash_write large const buffer", "[spi_flash][esp_flash]")
|
TEST_CASE("Test flash write large const buffer", "[spi_flash][esp_flash]")
|
||||||
{
|
{
|
||||||
// buffer in flash
|
// buffer in flash
|
||||||
test_write_large_buffer(large_const_buffer, sizeof(large_const_buffer));
|
test_write_large_buffer(large_const_buffer, sizeof(large_const_buffer));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("Test spi_flash_write large RAM buffer", "[spi_flash][esp_flash]")
|
TEST_CASE("Test flash write large RAM buffer", "[spi_flash][esp_flash]")
|
||||||
{
|
{
|
||||||
// buffer in RAM
|
// buffer in RAM
|
||||||
uint8_t *source_buf = malloc(sizeof(large_const_buffer));
|
uint8_t *source_buf = malloc(sizeof(large_const_buffer));
|
||||||
@ -60,12 +60,12 @@ static void test_write_large_buffer(const uint8_t *source, size_t length)
|
|||||||
uint8_t *buf = malloc(length);
|
uint8_t *buf = malloc(length);
|
||||||
TEST_ASSERT_NOT_NULL(buf);
|
TEST_ASSERT_NOT_NULL(buf);
|
||||||
|
|
||||||
ESP_ERROR_CHECK( spi_flash_erase_range(part->address, (length + SPI_FLASH_SEC_SIZE) & ~(SPI_FLASH_SEC_SIZE-1)) );
|
TEST_ESP_OK( esp_flash_erase_region(NULL, part->address, (length + SPI_FLASH_SEC_SIZE) & ~(SPI_FLASH_SEC_SIZE-1)) );
|
||||||
|
|
||||||
// note writing to unaligned address
|
// note writing to unaligned address
|
||||||
ESP_ERROR_CHECK( spi_flash_write(part->address + 1, source, length) );
|
TEST_ESP_OK( esp_flash_write(NULL, source, part->address + 1, length) );
|
||||||
|
|
||||||
ESP_ERROR_CHECK( spi_flash_read(part->address + 1, buf, length) );
|
TEST_ESP_OK( esp_flash_read(NULL, buf, part->address + 1, length) );
|
||||||
|
|
||||||
TEST_ASSERT_EQUAL_HEX8_ARRAY(source, buf, length);
|
TEST_ASSERT_EQUAL_HEX8_ARRAY(source, buf, length);
|
||||||
|
|
||||||
@ -74,12 +74,11 @@ static void test_write_large_buffer(const uint8_t *source, size_t length)
|
|||||||
// check nothing was written at beginning or end
|
// check nothing was written at beginning or end
|
||||||
uint8_t ends[8];
|
uint8_t ends[8];
|
||||||
|
|
||||||
ESP_ERROR_CHECK( spi_flash_read(part->address, ends, sizeof(ends)) );
|
TEST_ESP_OK( esp_flash_read(NULL, ends, part->address, sizeof(ends)) );
|
||||||
TEST_ASSERT_EQUAL_HEX8(0xFF, ends[0]);
|
TEST_ASSERT_EQUAL_HEX8(0xFF, ends[0]);
|
||||||
TEST_ASSERT_EQUAL_HEX8(source[0] , ends[1]);
|
TEST_ASSERT_EQUAL_HEX8(source[0] , ends[1]);
|
||||||
|
|
||||||
ESP_ERROR_CHECK( spi_flash_read(part->address + length, ends, sizeof(ends)) );
|
TEST_ESP_OK( esp_flash_read(NULL, ends, part->address + length, sizeof(ends)) );
|
||||||
|
|
||||||
TEST_ASSERT_EQUAL_HEX8(source[length-1], ends[0]);
|
TEST_ASSERT_EQUAL_HEX8(source[length-1], ends[0]);
|
||||||
TEST_ASSERT_EQUAL_HEX8(0xFF, ends[1]);
|
TEST_ASSERT_EQUAL_HEX8(0xFF, ends[1]);
|
||||||
TEST_ASSERT_EQUAL_HEX8(0xFF, ends[2]);
|
TEST_ASSERT_EQUAL_HEX8(0xFF, ends[2]);
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
#include <freertos/semphr.h>
|
#include <freertos/semphr.h>
|
||||||
|
|
||||||
#include <unity.h>
|
#include <unity.h>
|
||||||
#include <esp_spi_flash.h>
|
#include <spi_flash_mmap.h>
|
||||||
#include <esp_attr.h>
|
#include <esp_attr.h>
|
||||||
#include <esp_partition.h>
|
#include <esp_partition.h>
|
||||||
#include <esp_flash_encrypt.h>
|
#include <esp_flash_encrypt.h>
|
||||||
@ -28,9 +28,9 @@ static spi_flash_mmap_handle_t handle1, handle2, handle3;
|
|||||||
static esp_err_t spi_flash_read_maybe_encrypted(size_t src_addr, void *des_addr, size_t size)
|
static esp_err_t spi_flash_read_maybe_encrypted(size_t src_addr, void *des_addr, size_t size)
|
||||||
{
|
{
|
||||||
if (!esp_flash_encryption_enabled()) {
|
if (!esp_flash_encryption_enabled()) {
|
||||||
return spi_flash_read(src_addr, des_addr, size);
|
return esp_flash_read(NULL, des_addr, src_addr, size);
|
||||||
} else {
|
} else {
|
||||||
return spi_flash_read_encrypted(src_addr, des_addr, size);
|
return esp_flash_read_encrypted(NULL, src_addr, des_addr, size);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -39,9 +39,9 @@ static esp_err_t spi_flash_read_maybe_encrypted(size_t src_addr, void *des_addr,
|
|||||||
static esp_err_t spi_flash_write_maybe_encrypted(size_t des_addr, const void *src_addr, size_t size)
|
static esp_err_t spi_flash_write_maybe_encrypted(size_t des_addr, const void *src_addr, size_t size)
|
||||||
{
|
{
|
||||||
if (!esp_flash_encryption_enabled()) {
|
if (!esp_flash_encryption_enabled()) {
|
||||||
return spi_flash_write(des_addr, src_addr, size);
|
return esp_flash_write(NULL, src_addr, des_addr, size);
|
||||||
} else {
|
} else {
|
||||||
return spi_flash_write_encrypted(des_addr, src_addr, size);
|
return esp_flash_write_encrypted(NULL, des_addr, src_addr, size);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -78,7 +78,7 @@ static void setup_mmap_tests(void)
|
|||||||
uint32_t sector_offs = abs_sector * SPI_FLASH_SEC_SIZE;
|
uint32_t sector_offs = abs_sector * SPI_FLASH_SEC_SIZE;
|
||||||
bool sector_needs_write = false;
|
bool sector_needs_write = false;
|
||||||
|
|
||||||
ESP_ERROR_CHECK( spi_flash_read_maybe_encrypted(sector_offs, buffer, sizeof(buffer)) );
|
TEST_ESP_OK( spi_flash_read_maybe_encrypted(sector_offs, buffer, sizeof(buffer)) );
|
||||||
|
|
||||||
for (uint32_t word = 0; word < 1024; ++word) {
|
for (uint32_t word = 0; word < 1024; ++word) {
|
||||||
uint32_t val = rand();
|
uint32_t val = rand();
|
||||||
@ -92,8 +92,8 @@ static void setup_mmap_tests(void)
|
|||||||
}
|
}
|
||||||
/* Only rewrite the sector if it has changed */
|
/* Only rewrite the sector if it has changed */
|
||||||
if (sector_needs_write) {
|
if (sector_needs_write) {
|
||||||
ESP_ERROR_CHECK( spi_flash_erase_sector((uint16_t) abs_sector) );
|
TEST_ESP_OK( esp_flash_erase_region(NULL, (uint16_t) abs_sector * SPI_FLASH_SEC_SIZE, SPI_FLASH_SEC_SIZE) );
|
||||||
ESP_ERROR_CHECK( spi_flash_write_maybe_encrypted(sector_offs, (const uint8_t *) buffer, sizeof(buffer)) );
|
TEST_ESP_OK( spi_flash_write_maybe_encrypted(sector_offs, (const uint8_t *) buffer, sizeof(buffer)) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -105,7 +105,7 @@ TEST_CASE("Can mmap into data address space", "[spi_flash][mmap]")
|
|||||||
|
|
||||||
printf("Mapping %x (+%x)\n", start, end - start);
|
printf("Mapping %x (+%x)\n", start, end - start);
|
||||||
const void *ptr1;
|
const void *ptr1;
|
||||||
ESP_ERROR_CHECK( spi_flash_mmap(start, end - start, SPI_FLASH_MMAP_DATA, &ptr1, &handle1) );
|
TEST_ESP_OK( spi_flash_mmap(start, end - start, SPI_FLASH_MMAP_DATA, &ptr1, &handle1) );
|
||||||
printf("mmap_res: handle=%d ptr=%p\n", handle1, ptr1);
|
printf("mmap_res: handle=%d ptr=%p\n", handle1, ptr1);
|
||||||
|
|
||||||
spi_flash_mmap_dump();
|
spi_flash_mmap_dump();
|
||||||
@ -123,7 +123,7 @@ TEST_CASE("Can mmap into data address space", "[spi_flash][mmap]")
|
|||||||
}
|
}
|
||||||
printf("Mapping %x (+%x)\n", start - 0x10000, 0x20000);
|
printf("Mapping %x (+%x)\n", start - 0x10000, 0x20000);
|
||||||
const void *ptr2;
|
const void *ptr2;
|
||||||
ESP_ERROR_CHECK( spi_flash_mmap(start - 0x10000, 0x20000, SPI_FLASH_MMAP_DATA, &ptr2, &handle2) );
|
TEST_ESP_OK( spi_flash_mmap(start - 0x10000, 0x20000, SPI_FLASH_MMAP_DATA, &ptr2, &handle2) );
|
||||||
printf("mmap_res: handle=%d ptr=%p\n", handle2, ptr2);
|
printf("mmap_res: handle=%d ptr=%p\n", handle2, ptr2);
|
||||||
|
|
||||||
TEST_ASSERT_EQUAL_HEX32(start - 0x10000, spi_flash_cache2phys(ptr2));
|
TEST_ASSERT_EQUAL_HEX32(start - 0x10000, spi_flash_cache2phys(ptr2));
|
||||||
@ -133,7 +133,7 @@ TEST_CASE("Can mmap into data address space", "[spi_flash][mmap]")
|
|||||||
|
|
||||||
printf("Mapping %x (+%x)\n", start, 0x10000);
|
printf("Mapping %x (+%x)\n", start, 0x10000);
|
||||||
const void *ptr3;
|
const void *ptr3;
|
||||||
ESP_ERROR_CHECK( spi_flash_mmap(start, 0x10000, SPI_FLASH_MMAP_DATA, &ptr3, &handle3) );
|
TEST_ESP_OK( spi_flash_mmap(start, 0x10000, SPI_FLASH_MMAP_DATA, &ptr3, &handle3) );
|
||||||
printf("mmap_res: handle=%d ptr=%p\n", handle3, ptr3);
|
printf("mmap_res: handle=%d ptr=%p\n", handle3, ptr3);
|
||||||
|
|
||||||
TEST_ASSERT_EQUAL_HEX32(start, spi_flash_cache2phys(ptr3));
|
TEST_ASSERT_EQUAL_HEX32(start, spi_flash_cache2phys(ptr3));
|
||||||
@ -172,7 +172,7 @@ TEST_CASE("Can mmap into instruction address space", "[spi_flash][mmap]")
|
|||||||
printf("Mapping %x (+%x)\n", start, end - start);
|
printf("Mapping %x (+%x)\n", start, end - start);
|
||||||
spi_flash_mmap_handle_t handle1;
|
spi_flash_mmap_handle_t handle1;
|
||||||
const void *ptr1;
|
const void *ptr1;
|
||||||
ESP_ERROR_CHECK( spi_flash_mmap(start, end - start, SPI_FLASH_MMAP_INST, &ptr1, &handle1) );
|
TEST_ESP_OK( spi_flash_mmap(start, end - start, SPI_FLASH_MMAP_INST, &ptr1, &handle1) );
|
||||||
printf("mmap_res: handle=%d ptr=%p\n", handle1, ptr1);
|
printf("mmap_res: handle=%d ptr=%p\n", handle1, ptr1);
|
||||||
|
|
||||||
spi_flash_mmap_dump();
|
spi_flash_mmap_dump();
|
||||||
@ -189,7 +189,7 @@ TEST_CASE("Can mmap into instruction address space", "[spi_flash][mmap]")
|
|||||||
printf("Mapping %x (+%x)\n", start - 0x10000, 0x20000);
|
printf("Mapping %x (+%x)\n", start - 0x10000, 0x20000);
|
||||||
spi_flash_mmap_handle_t handle2;
|
spi_flash_mmap_handle_t handle2;
|
||||||
const void *ptr2;
|
const void *ptr2;
|
||||||
ESP_ERROR_CHECK( spi_flash_mmap(start - 0x10000, 0x20000, SPI_FLASH_MMAP_INST, &ptr2, &handle2) );
|
TEST_ESP_OK( spi_flash_mmap(start - 0x10000, 0x20000, SPI_FLASH_MMAP_INST, &ptr2, &handle2) );
|
||||||
printf("mmap_res: handle=%d ptr=%p\n", handle2, ptr2);
|
printf("mmap_res: handle=%d ptr=%p\n", handle2, ptr2);
|
||||||
|
|
||||||
TEST_ASSERT_EQUAL_HEX32(start - 0x10000, spi_flash_cache2phys(ptr2));
|
TEST_ASSERT_EQUAL_HEX32(start - 0x10000, spi_flash_cache2phys(ptr2));
|
||||||
@ -200,7 +200,7 @@ TEST_CASE("Can mmap into instruction address space", "[spi_flash][mmap]")
|
|||||||
printf("Mapping %x (+%x)\n", start, 0x10000);
|
printf("Mapping %x (+%x)\n", start, 0x10000);
|
||||||
spi_flash_mmap_handle_t handle3;
|
spi_flash_mmap_handle_t handle3;
|
||||||
const void *ptr3;
|
const void *ptr3;
|
||||||
ESP_ERROR_CHECK( spi_flash_mmap(start, 0x10000, SPI_FLASH_MMAP_INST, &ptr3, &handle3) );
|
TEST_ESP_OK( spi_flash_mmap(start, 0x10000, SPI_FLASH_MMAP_INST, &ptr3, &handle3) );
|
||||||
printf("mmap_res: handle=%d ptr=%p\n", handle3, ptr3);
|
printf("mmap_res: handle=%d ptr=%p\n", handle3, ptr3);
|
||||||
|
|
||||||
TEST_ASSERT_EQUAL_HEX32(start, spi_flash_cache2phys(ptr3));
|
TEST_ASSERT_EQUAL_HEX32(start, spi_flash_cache2phys(ptr3));
|
||||||
@ -246,7 +246,7 @@ TEST_CASE("Can mmap unordered pages into contiguous memory", "[spi_flash][mmap]"
|
|||||||
|
|
||||||
spi_flash_mmap_handle_t handle1;
|
spi_flash_mmap_handle_t handle1;
|
||||||
const void *ptr1;
|
const void *ptr1;
|
||||||
ESP_ERROR_CHECK( spi_flash_mmap_pages(pages, nopages, SPI_FLASH_MMAP_DATA, &ptr1, &handle1) );
|
TEST_ESP_OK( spi_flash_mmap_pages(pages, nopages, SPI_FLASH_MMAP_DATA, &ptr1, &handle1) );
|
||||||
printf("mmap_res: handle=%d ptr=%p\n", handle1, ptr1);
|
printf("mmap_res: handle=%d ptr=%p\n", handle1, ptr1);
|
||||||
|
|
||||||
spi_flash_mmap_dump();
|
spi_flash_mmap_dump();
|
||||||
@ -278,10 +278,10 @@ TEST_CASE("flash_mmap invalidates just-written data", "[spi_flash][mmap]")
|
|||||||
TEST_IGNORE_MESSAGE("flash encryption enabled, spi_flash_write_encrypted() test won't pass as-is");
|
TEST_IGNORE_MESSAGE("flash encryption enabled, spi_flash_write_encrypted() test won't pass as-is");
|
||||||
}
|
}
|
||||||
|
|
||||||
ESP_ERROR_CHECK( spi_flash_erase_sector(start / SPI_FLASH_SEC_SIZE) );
|
TEST_ESP_OK( esp_flash_erase_region(NULL, start, SPI_FLASH_SEC_SIZE) );
|
||||||
|
|
||||||
/* map erased test region to ptr1 */
|
/* map erased test region to ptr1 */
|
||||||
ESP_ERROR_CHECK( spi_flash_mmap(start, test_size, SPI_FLASH_MMAP_DATA, &ptr1, &handle1) );
|
TEST_ESP_OK( spi_flash_mmap(start, test_size, SPI_FLASH_MMAP_DATA, &ptr1, &handle1) );
|
||||||
printf("mmap_res ptr1: handle=%d ptr=%p\n", handle1, ptr1);
|
printf("mmap_res ptr1: handle=%d ptr=%p\n", handle1, ptr1);
|
||||||
|
|
||||||
/* verify it's all 0xFF */
|
/* verify it's all 0xFF */
|
||||||
@ -296,14 +296,14 @@ TEST_CASE("flash_mmap invalidates just-written data", "[spi_flash][mmap]")
|
|||||||
/* write flash region to 0xEE */
|
/* write flash region to 0xEE */
|
||||||
uint8_t buf[test_size];
|
uint8_t buf[test_size];
|
||||||
memset(buf, 0xEE, test_size);
|
memset(buf, 0xEE, test_size);
|
||||||
ESP_ERROR_CHECK( spi_flash_write(start, buf, test_size) );
|
TEST_ESP_OK( esp_flash_write(NULL, buf, start, test_size) );
|
||||||
|
|
||||||
/* re-map the test region at ptr1.
|
/* re-map the test region at ptr1.
|
||||||
|
|
||||||
this is a fresh mmap call so should trigger a cache flush,
|
this is a fresh mmap call so should trigger a cache flush,
|
||||||
ensuring we see the updated flash.
|
ensuring we see the updated flash.
|
||||||
*/
|
*/
|
||||||
ESP_ERROR_CHECK( spi_flash_mmap(start, test_size, SPI_FLASH_MMAP_DATA, &ptr1, &handle1) );
|
TEST_ESP_OK( spi_flash_mmap(start, test_size, SPI_FLASH_MMAP_DATA, &ptr1, &handle1) );
|
||||||
printf("mmap_res ptr1 #2: handle=%d ptr=%p\n", handle1, ptr1);
|
printf("mmap_res ptr1 #2: handle=%d ptr=%p\n", handle1, ptr1);
|
||||||
|
|
||||||
/* assert that ptr1 now maps to the new values on flash,
|
/* assert that ptr1 now maps to the new values on flash,
|
||||||
@ -322,7 +322,7 @@ TEST_CASE("flash_mmap can mmap after get enough free MMU pages", "[spi_flash][mm
|
|||||||
|
|
||||||
printf("Mapping %x (+%x)\n", start, end - start);
|
printf("Mapping %x (+%x)\n", start, end - start);
|
||||||
const void *ptr1;
|
const void *ptr1;
|
||||||
ESP_ERROR_CHECK( spi_flash_mmap(start, end - start, SPI_FLASH_MMAP_DATA, &ptr1, &handle1) );
|
TEST_ESP_OK( spi_flash_mmap(start, end - start, SPI_FLASH_MMAP_DATA, &ptr1, &handle1) );
|
||||||
printf("mmap_res: handle=%d ptr=%p\n", handle1, ptr1);
|
printf("mmap_res: handle=%d ptr=%p\n", handle1, ptr1);
|
||||||
|
|
||||||
spi_flash_mmap_dump();
|
spi_flash_mmap_dump();
|
||||||
@ -339,12 +339,14 @@ TEST_CASE("flash_mmap can mmap after get enough free MMU pages", "[spi_flash][mm
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
uint32_t free_pages = spi_flash_mmap_get_free_pages(SPI_FLASH_MMAP_DATA);
|
uint32_t free_pages = spi_flash_mmap_get_free_pages(SPI_FLASH_MMAP_DATA);
|
||||||
uint32_t flash_pages = spi_flash_get_chip_size() / SPI_FLASH_MMU_PAGE_SIZE;
|
uint32_t flash_size;
|
||||||
|
TEST_ESP_OK(esp_flash_get_size(NULL, &flash_size));
|
||||||
|
uint32_t flash_pages = flash_size / SPI_FLASH_MMU_PAGE_SIZE;
|
||||||
free_pages = (free_pages > flash_pages) ? flash_pages : free_pages;
|
free_pages = (free_pages > flash_pages) ? flash_pages : free_pages;
|
||||||
|
|
||||||
printf("Mapping %x (+%x)\n", 0, free_pages * SPI_FLASH_MMU_PAGE_SIZE);
|
printf("Mapping %x (+%x)\n", 0, free_pages * SPI_FLASH_MMU_PAGE_SIZE);
|
||||||
const void *ptr2;
|
const void *ptr2;
|
||||||
ESP_ERROR_CHECK( spi_flash_mmap(0, free_pages * SPI_FLASH_MMU_PAGE_SIZE, SPI_FLASH_MMAP_DATA, &ptr2, &handle2) );
|
TEST_ESP_OK( spi_flash_mmap(0, free_pages * SPI_FLASH_MMU_PAGE_SIZE, SPI_FLASH_MMAP_DATA, &ptr2, &handle2) );
|
||||||
printf("mmap_res: handle=%d ptr=%p\n", handle2, ptr2);
|
printf("mmap_res: handle=%d ptr=%p\n", handle2, ptr2);
|
||||||
|
|
||||||
spi_flash_mmap_dump();
|
spi_flash_mmap_dump();
|
||||||
@ -409,7 +411,7 @@ TEST_CASE("mmap consistent with phys2cache/cache2phys", "[spi_flash][mmap]")
|
|||||||
|
|
||||||
TEST_ASSERT_EQUAL_HEX(SPI_FLASH_CACHE2PHYS_FAIL, spi_flash_cache2phys(ptr));
|
TEST_ASSERT_EQUAL_HEX(SPI_FLASH_CACHE2PHYS_FAIL, spi_flash_cache2phys(ptr));
|
||||||
|
|
||||||
ESP_ERROR_CHECK( spi_flash_mmap(start, test_size, SPI_FLASH_MMAP_DATA, &ptr, &handle1) );
|
TEST_ESP_OK( spi_flash_mmap(start, test_size, SPI_FLASH_MMAP_DATA, &ptr, &handle1) );
|
||||||
TEST_ASSERT_NOT_NULL(ptr);
|
TEST_ASSERT_NOT_NULL(ptr);
|
||||||
TEST_ASSERT_NOT_EQUAL(0, handle1);
|
TEST_ASSERT_NOT_EQUAL(0, handle1);
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "unity.h"
|
#include "unity.h"
|
||||||
#include "esp_spi_flash.h"
|
#include "spi_flash_mmap.h"
|
||||||
#include "esp_ota_ops.h"
|
#include "esp_ota_ops.h"
|
||||||
|
|
||||||
#if CONFIG_SPI_FLASH_DANGEROUS_WRITE_ABORTS || CONFIG_SPI_FLASH_DANGEROUS_WRITE_FAILS
|
#if CONFIG_SPI_FLASH_DANGEROUS_WRITE_ABORTS || CONFIG_SPI_FLASH_DANGEROUS_WRITE_FAILS
|
||||||
@ -16,18 +16,18 @@ static const char *data = "blah blah blah";
|
|||||||
|
|
||||||
TEST_CASE("can't overwrite bootloader", TEST_TAGS)
|
TEST_CASE("can't overwrite bootloader", TEST_TAGS)
|
||||||
{
|
{
|
||||||
TEST_ESP_ERR(ESP_ERR_INVALID_ARG, spi_flash_write(0x1000, data, strlen(data)));
|
TEST_ESP_ERR(ESP_ERR_INVALID_ARG, esp_flash_write(NULL, data, 0x1000, strlen(data)));
|
||||||
TEST_ESP_ERR(ESP_ERR_INVALID_ARG, spi_flash_write(0x0FF8, data, strlen(data)));
|
TEST_ESP_ERR(ESP_ERR_INVALID_ARG, esp_flash_write(NULL, data, 0x0FF8, strlen(data)));
|
||||||
TEST_ESP_ERR(ESP_ERR_INVALID_ARG, spi_flash_write(0x1400, data, strlen(data)));
|
TEST_ESP_ERR(ESP_ERR_INVALID_ARG, esp_flash_write(NULL, data, 0x1400, strlen(data)));
|
||||||
TEST_ESP_ERR(ESP_ERR_INVALID_ARG, spi_flash_erase_range(0x8000, 0x2000));
|
TEST_ESP_ERR(ESP_ERR_INVALID_ARG, esp_flash_erase_region(NULL, 0x8000, 0x2000));
|
||||||
TEST_ESP_ERR(ESP_ERR_INVALID_ARG, spi_flash_erase_range(0x7000, 0x2000));
|
TEST_ESP_ERR(ESP_ERR_INVALID_ARG, esp_flash_erase_region(NULL, 0x7000, 0x2000));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("can't overwrite current running app", TEST_TAGS)
|
TEST_CASE("can't overwrite current running app", TEST_TAGS)
|
||||||
{
|
{
|
||||||
const esp_partition_t *p = esp_ota_get_running_partition();
|
const esp_partition_t *p = esp_ota_get_running_partition();
|
||||||
TEST_ESP_ERR(ESP_ERR_INVALID_ARG, spi_flash_write(p->address + 1024, data, strlen(data)));
|
TEST_ESP_ERR(ESP_ERR_INVALID_ARG, esp_flash_write(NULL, data, p->address + 1024, strlen(data)));
|
||||||
TEST_ESP_ERR(ESP_ERR_INVALID_ARG, spi_flash_erase_range(p->address + 4096, 8192));
|
TEST_ESP_ERR(ESP_ERR_INVALID_ARG, esp_flash_erase_region(NULL, p->address + 4096, 8192));
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // FAILS || ABORTS
|
#endif // FAILS || ABORTS
|
||||||
|
@ -123,7 +123,8 @@ TEST_CASE("Test esp_partition_get_sha256() that it can handle a big partition",
|
|||||||
spi_flash_mmap_handle_t handle;
|
spi_flash_mmap_handle_t handle;
|
||||||
|
|
||||||
uint8_t sha256[32] = { 0 };
|
uint8_t sha256[32] = { 0 };
|
||||||
size_t size_flash_chip = spi_flash_get_chip_size();
|
uint32_t size_flash_chip;
|
||||||
|
esp_flash_get_size(NULL, &size_flash_chip);
|
||||||
|
|
||||||
printf("size_flash_chip = %d bytes\n", size_flash_chip);
|
printf("size_flash_chip = %d bytes\n", size_flash_chip);
|
||||||
|
|
||||||
|
@ -14,8 +14,8 @@
|
|||||||
|
|
||||||
#include <unity.h>
|
#include <unity.h>
|
||||||
#include <test_utils.h>
|
#include <test_utils.h>
|
||||||
#include <esp_spi_flash.h>
|
#include <spi_flash_mmap.h>
|
||||||
#include "../cache_utils.h"
|
#include "esp_private/cache_utils.h"
|
||||||
#include "soc/timer_periph.h"
|
#include "soc/timer_periph.h"
|
||||||
#include "esp_attr.h"
|
#include "esp_attr.h"
|
||||||
#include "esp_heap_caps.h"
|
#include "esp_heap_caps.h"
|
||||||
@ -69,7 +69,6 @@ static int cmp_or_dump(const void *a, const void *b, size_t len)
|
|||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void IRAM_ATTR test_read(int src_off, int dst_off, int len)
|
static void IRAM_ATTR test_read(int src_off, int dst_off, int len)
|
||||||
{
|
{
|
||||||
uint32_t src_buf[16];
|
uint32_t src_buf[16];
|
||||||
@ -78,7 +77,7 @@ static void IRAM_ATTR test_read(int src_off, int dst_off, int len)
|
|||||||
fprintf(stderr, "src=%d dst=%d len=%d\n", src_off, dst_off, len);
|
fprintf(stderr, "src=%d dst=%d len=%d\n", src_off, dst_off, len);
|
||||||
memset(src_buf, 0xAA, sizeof(src_buf));
|
memset(src_buf, 0xAA, sizeof(src_buf));
|
||||||
fill(((char *) src_buf) + src_off, src_off, len);
|
fill(((char *) src_buf) + src_off, src_off, len);
|
||||||
ESP_ERROR_CHECK(spi_flash_erase_sector((start + src_off) / SPI_FLASH_SEC_SIZE));
|
ESP_ERROR_CHECK(esp_flash_erase_region(NULL, (start + src_off) & ~(0x10000 - 1), SPI_FLASH_SEC_SIZE));
|
||||||
spi_flash_disable_interrupts_caches_and_other_cpu();
|
spi_flash_disable_interrupts_caches_and_other_cpu();
|
||||||
esp_rom_spiflash_result_t rc = esp_rom_spiflash_write(start, src_buf, sizeof(src_buf));
|
esp_rom_spiflash_result_t rc = esp_rom_spiflash_write(start, src_buf, sizeof(src_buf));
|
||||||
spi_flash_enable_interrupts_caches_and_other_cpu();
|
spi_flash_enable_interrupts_caches_and_other_cpu();
|
||||||
@ -86,7 +85,7 @@ static void IRAM_ATTR test_read(int src_off, int dst_off, int len)
|
|||||||
memset(dst_buf, 0x55, sizeof(dst_buf));
|
memset(dst_buf, 0x55, sizeof(dst_buf));
|
||||||
memset(dst_gold, 0x55, sizeof(dst_gold));
|
memset(dst_gold, 0x55, sizeof(dst_gold));
|
||||||
fill(dst_gold + dst_off, src_off, len);
|
fill(dst_gold + dst_off, src_off, len);
|
||||||
ESP_ERROR_CHECK(spi_flash_read(start + src_off, dst_buf + dst_off, len));
|
ESP_ERROR_CHECK(esp_flash_read(NULL, dst_buf + dst_off, start + src_off, len));
|
||||||
TEST_ASSERT_EQUAL_INT(cmp_or_dump(dst_buf, dst_gold, sizeof(dst_buf)), 0);
|
TEST_ASSERT_EQUAL_INT(cmp_or_dump(dst_buf, dst_gold, sizeof(dst_buf)), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -209,7 +208,7 @@ static void IRAM_ATTR test_write(int dst_off, int src_off, int len)
|
|||||||
memset(src_buf, 0x55, sizeof(src_buf));
|
memset(src_buf, 0x55, sizeof(src_buf));
|
||||||
fill(src_buf + src_off, src_off, len);
|
fill(src_buf + src_off, src_off, len);
|
||||||
// Fills with 0xff
|
// Fills with 0xff
|
||||||
ESP_ERROR_CHECK(spi_flash_erase_sector((start + dst_off) / SPI_FLASH_SEC_SIZE));
|
ESP_ERROR_CHECK(esp_flash_erase_region(NULL, (start + src_off) & ~(0x10000 - 1), SPI_FLASH_SEC_SIZE));
|
||||||
memset(dst_gold, 0xff, sizeof(dst_gold));
|
memset(dst_gold, 0xff, sizeof(dst_gold));
|
||||||
if (len > 0) {
|
if (len > 0) {
|
||||||
int pad_left_off = (dst_off & ~3U);
|
int pad_left_off = (dst_off & ~3U);
|
||||||
@ -220,7 +219,7 @@ static void IRAM_ATTR test_write(int dst_off, int src_off, int len)
|
|||||||
}
|
}
|
||||||
fill(dst_gold + dst_off, src_off, len);
|
fill(dst_gold + dst_off, src_off, len);
|
||||||
}
|
}
|
||||||
ESP_ERROR_CHECK(spi_flash_write(start + dst_off, src_buf + src_off, len));
|
ESP_ERROR_CHECK(esp_flash_write(NULL, src_buf + src_off, start + dst_off, len));
|
||||||
|
|
||||||
fix_rom_func();
|
fix_rom_func();
|
||||||
|
|
||||||
@ -232,7 +231,7 @@ static void IRAM_ATTR test_write(int dst_off, int src_off, int len)
|
|||||||
TEST_ASSERT_EQUAL_INT(cmp_or_dump(dst_buf, dst_gold, sizeof(dst_buf)), 0);
|
TEST_ASSERT_EQUAL_INT(cmp_or_dump(dst_buf, dst_gold, sizeof(dst_buf)), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("Test spi_flash_write", "[spi_flash][esp_flash]")
|
TEST_CASE("Test esp_flash_write", "[spi_flash][esp_flash]")
|
||||||
{
|
{
|
||||||
setup_tests();
|
setup_tests();
|
||||||
#if CONFIG_SPI_FLASH_MINIMAL_TEST
|
#if CONFIG_SPI_FLASH_MINIMAL_TEST
|
||||||
@ -288,19 +287,19 @@ TEST_CASE("Test spi_flash_write", "[spi_flash][esp_flash]")
|
|||||||
#define TEST_SOC_IRAM_ADDR (SOC_IRAM_LOW + 0x8000)
|
#define TEST_SOC_IRAM_ADDR (SOC_IRAM_LOW + 0x8000)
|
||||||
#define TEST_SOC_RTC_IRAM_ADDR (SOC_RTC_IRAM_LOW)
|
#define TEST_SOC_RTC_IRAM_ADDR (SOC_RTC_IRAM_LOW)
|
||||||
#define TEST_SOC_RTC_DRAM_ADDR (SOC_RTC_DRAM_LOW)
|
#define TEST_SOC_RTC_DRAM_ADDR (SOC_RTC_DRAM_LOW)
|
||||||
ESP_ERROR_CHECK(spi_flash_write(start, (char *) TEST_SOC_IROM_ADDR, 16));
|
ESP_ERROR_CHECK(esp_flash_write(NULL, (char *) TEST_SOC_IROM_ADDR, start, 16));
|
||||||
ESP_ERROR_CHECK(spi_flash_write(start, (char *) TEST_SOC_IRAM_ADDR, 16));
|
ESP_ERROR_CHECK(esp_flash_write(NULL, (char *) TEST_SOC_IRAM_ADDR, start, 16));
|
||||||
ESP_ERROR_CHECK(spi_flash_write(start, (char *) TEST_SOC_CACHE_RAM_BANK0_ADDR, 16));
|
ESP_ERROR_CHECK(esp_flash_write(NULL, (char *) TEST_SOC_CACHE_RAM_BANK0_ADDR, start, 16));
|
||||||
ESP_ERROR_CHECK(spi_flash_write(start, (char *) TEST_SOC_CACHE_RAM_BANK1_ADDR, 16));
|
ESP_ERROR_CHECK(esp_flash_write(NULL, (char *) TEST_SOC_CACHE_RAM_BANK1_ADDR, start, 16));
|
||||||
ESP_ERROR_CHECK(spi_flash_write(start, (char *) TEST_SOC_CACHE_RAM_BANK2_ADDR, 16));
|
ESP_ERROR_CHECK(esp_flash_write(NULL, (char *) TEST_SOC_CACHE_RAM_BANK2_ADDR, start, 16));
|
||||||
ESP_ERROR_CHECK(spi_flash_write(start, (char *) TEST_SOC_CACHE_RAM_BANK3_ADDR, 16));
|
ESP_ERROR_CHECK(esp_flash_write(NULL, (char *) TEST_SOC_CACHE_RAM_BANK3_ADDR, start, 16));
|
||||||
ESP_ERROR_CHECK(spi_flash_write(start, (char *) TEST_SOC_RTC_IRAM_ADDR, 16));
|
ESP_ERROR_CHECK(esp_flash_write(NULL, (char *) TEST_SOC_RTC_IRAM_ADDR, start, 16));
|
||||||
ESP_ERROR_CHECK(spi_flash_write(start, (char *) TEST_SOC_RTC_DRAM_ADDR, 16));
|
ESP_ERROR_CHECK(esp_flash_write(NULL, (char *) TEST_SOC_RTC_DRAM_ADDR, start, 16));
|
||||||
#else
|
#else
|
||||||
ESP_ERROR_CHECK(spi_flash_write(start, (char *) 0x40000000, 16));
|
ESP_ERROR_CHECK(esp_flash_write(NULL, (char *) 0x40000000, start, 16));
|
||||||
ESP_ERROR_CHECK(spi_flash_write(start, (char *) 0x40070000, 16));
|
ESP_ERROR_CHECK(esp_flash_write(NULL, (char *) 0x40070000, start, 16));
|
||||||
ESP_ERROR_CHECK(spi_flash_write(start, (char *) 0x40078000, 16));
|
ESP_ERROR_CHECK(esp_flash_write(NULL, (char *) 0x40078000, start, 16));
|
||||||
ESP_ERROR_CHECK(spi_flash_write(start, (char *) 0x40080000, 16));
|
ESP_ERROR_CHECK(esp_flash_write(NULL, (char *) 0x40080000, start, 16));
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -314,15 +313,15 @@ TEST_CASE("spi_flash_read can read into buffer in external RAM", "[spi_flash]")
|
|||||||
uint8_t* buf_int = (uint8_t*) heap_caps_malloc(SPI_FLASH_SEC_SIZE, MALLOC_CAP_INTERNAL | MALLOC_CAP_8BIT);
|
uint8_t* buf_int = (uint8_t*) heap_caps_malloc(SPI_FLASH_SEC_SIZE, MALLOC_CAP_INTERNAL | MALLOC_CAP_8BIT);
|
||||||
TEST_ASSERT_NOT_NULL(buf_int);
|
TEST_ASSERT_NOT_NULL(buf_int);
|
||||||
|
|
||||||
TEST_ESP_OK(spi_flash_read(0x1000, buf_int, SPI_FLASH_SEC_SIZE));
|
TEST_ESP_OK(esp_flash_read(NULL, buf_int, 0x1000, SPI_FLASH_SEC_SIZE));
|
||||||
TEST_ESP_OK(spi_flash_read(0x1000, buf_ext, SPI_FLASH_SEC_SIZE));
|
TEST_ESP_OK(esp_flash_read(NULL, buf_ext, 0x1000, SPI_FLASH_SEC_SIZE));
|
||||||
|
|
||||||
TEST_ASSERT_EQUAL(0, memcmp(buf_ext, buf_int, SPI_FLASH_SEC_SIZE));
|
TEST_ASSERT_EQUAL(0, memcmp(buf_ext, buf_int, SPI_FLASH_SEC_SIZE));
|
||||||
free(buf_ext);
|
free(buf_ext);
|
||||||
free(buf_int);
|
free(buf_int);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("spi_flash_write can write from external RAM buffer", "[spi_flash]")
|
TEST_CASE("esp_flash_write can write from external RAM buffer", "[spi_flash]")
|
||||||
{
|
{
|
||||||
uint32_t* buf_ext = (uint32_t*) heap_caps_malloc(SPI_FLASH_SEC_SIZE, MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT);
|
uint32_t* buf_ext = (uint32_t*) heap_caps_malloc(SPI_FLASH_SEC_SIZE, MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT);
|
||||||
TEST_ASSERT_NOT_NULL(buf_ext);
|
TEST_ASSERT_NOT_NULL(buf_ext);
|
||||||
@ -339,11 +338,11 @@ TEST_CASE("spi_flash_write can write from external RAM buffer", "[spi_flash]")
|
|||||||
|
|
||||||
/* Write to flash from buf_ext */
|
/* Write to flash from buf_ext */
|
||||||
const esp_partition_t *part = get_test_data_partition();
|
const esp_partition_t *part = get_test_data_partition();
|
||||||
TEST_ESP_OK(spi_flash_erase_range(part->address, SPI_FLASH_SEC_SIZE));
|
TEST_ESP_OK(esp_flash_erase_region(NULL, part->address & ~(0x10000 - 1), SPI_FLASH_SEC_SIZE));
|
||||||
TEST_ESP_OK(spi_flash_write(part->address, buf_ext, SPI_FLASH_SEC_SIZE));
|
TEST_ESP_OK(esp_flash_write(NULL, buf_ext, part->address, SPI_FLASH_SEC_SIZE));
|
||||||
|
|
||||||
/* Read back to buf_int and compare */
|
/* Read back to buf_int and compare */
|
||||||
TEST_ESP_OK(spi_flash_read(part->address, buf_int, SPI_FLASH_SEC_SIZE));
|
TEST_ESP_OK(esp_flash_read(NULL, buf_int, part->address, SPI_FLASH_SEC_SIZE));
|
||||||
TEST_ASSERT_EQUAL(0, memcmp(buf_ext, buf_int, SPI_FLASH_SEC_SIZE));
|
TEST_ASSERT_EQUAL(0, memcmp(buf_ext, buf_int, SPI_FLASH_SEC_SIZE));
|
||||||
|
|
||||||
free(buf_ext);
|
free(buf_ext);
|
||||||
@ -364,10 +363,10 @@ TEST_CASE("spi_flash_read less than 16 bytes into buffer in external RAM", "[spi
|
|||||||
}
|
}
|
||||||
|
|
||||||
const esp_partition_t *part = get_test_data_partition();
|
const esp_partition_t *part = get_test_data_partition();
|
||||||
TEST_ESP_OK(spi_flash_erase_range(part->address, SPI_FLASH_SEC_SIZE));
|
TEST_ESP_OK(esp_flash_erase_region(NULL, part->address & ~(0x10000 - 1), SPI_FLASH_SEC_SIZE));
|
||||||
TEST_ESP_OK(spi_flash_write(part->address, data_8, MIN_BLOCK_SIZE));
|
TEST_ESP_OK(esp_flash_write(NULL, data_8, part->address, MIN_BLOCK_SIZE));
|
||||||
TEST_ESP_OK(spi_flash_read(part->address, buf_ext_8, MIN_BLOCK_SIZE));
|
TEST_ESP_OK(esp_flash_read(NULL, buf_ext_8, part->address, MIN_BLOCK_SIZE));
|
||||||
TEST_ESP_OK(spi_flash_read(part->address, buf_int_8, MIN_BLOCK_SIZE));
|
TEST_ESP_OK(esp_flash_read(NULL, buf_int_8, part->address, MIN_BLOCK_SIZE));
|
||||||
|
|
||||||
TEST_ASSERT_EQUAL(0, memcmp(buf_ext_8, data_8, MIN_BLOCK_SIZE));
|
TEST_ASSERT_EQUAL(0, memcmp(buf_ext_8, data_8, MIN_BLOCK_SIZE));
|
||||||
TEST_ASSERT_EQUAL(0, memcmp(buf_int_8, data_8, MIN_BLOCK_SIZE));
|
TEST_ASSERT_EQUAL(0, memcmp(buf_int_8, data_8, MIN_BLOCK_SIZE));
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
#include <freertos/semphr.h>
|
#include <freertos/semphr.h>
|
||||||
|
|
||||||
#include <unity.h>
|
#include <unity.h>
|
||||||
#include <esp_spi_flash.h>
|
#include <spi_flash_mmap.h>
|
||||||
#include <esp_attr.h>
|
#include <esp_attr.h>
|
||||||
#include "esp_intr_alloc.h"
|
#include "esp_intr_alloc.h"
|
||||||
#include "test_utils.h"
|
#include "test_utils.h"
|
||||||
@ -47,7 +47,7 @@ static void flash_test_task(void *arg)
|
|||||||
const uint32_t sector = start / SPI_FLASH_SEC_SIZE + ctx->offset;
|
const uint32_t sector = start / SPI_FLASH_SEC_SIZE + ctx->offset;
|
||||||
printf("t%d\n", sector);
|
printf("t%d\n", sector);
|
||||||
printf("es%d\n", sector);
|
printf("es%d\n", sector);
|
||||||
if (spi_flash_erase_sector(sector) != ESP_OK) {
|
if (esp_flash_erase_region(NULL, sector * SPI_FLASH_SEC_SIZE, SPI_FLASH_SEC_SIZE) != ESP_OK) {
|
||||||
ctx->fail = true;
|
ctx->fail = true;
|
||||||
printf("Erase failed\r\n");
|
printf("Erase failed\r\n");
|
||||||
xSemaphoreGive(ctx->done);
|
xSemaphoreGive(ctx->done);
|
||||||
@ -59,7 +59,7 @@ static void flash_test_task(void *arg)
|
|||||||
|
|
||||||
uint32_t val = 0xabcd1234;
|
uint32_t val = 0xabcd1234;
|
||||||
for (uint32_t offset = 0; offset < SPI_FLASH_SEC_SIZE; offset += 4) {
|
for (uint32_t offset = 0; offset < SPI_FLASH_SEC_SIZE; offset += 4) {
|
||||||
if (spi_flash_write(sector * SPI_FLASH_SEC_SIZE + offset, (const uint8_t *) &val, 4) != ESP_OK) {
|
if (esp_flash_write(NULL, (const uint8_t *) &val, sector * SPI_FLASH_SEC_SIZE + offset, 4) != ESP_OK) {
|
||||||
printf("Write failed at offset=%d\r\n", offset);
|
printf("Write failed at offset=%d\r\n", offset);
|
||||||
ctx->fail = true;
|
ctx->fail = true;
|
||||||
break;
|
break;
|
||||||
@ -71,7 +71,7 @@ static void flash_test_task(void *arg)
|
|||||||
|
|
||||||
uint32_t val_read;
|
uint32_t val_read;
|
||||||
for (uint32_t offset = 0; offset < SPI_FLASH_SEC_SIZE; offset += 4) {
|
for (uint32_t offset = 0; offset < SPI_FLASH_SEC_SIZE; offset += 4) {
|
||||||
if (spi_flash_read(sector * SPI_FLASH_SEC_SIZE + offset, (uint8_t *) &val_read, 4) != ESP_OK) {
|
if (esp_flash_read(NULL, (uint8_t *) &val_read, sector * SPI_FLASH_SEC_SIZE + offset, 4) != ESP_OK) {
|
||||||
printf("Read failed at offset=%d\r\n", offset);
|
printf("Read failed at offset=%d\r\n", offset);
|
||||||
ctx->fail = true;
|
ctx->fail = true;
|
||||||
break;
|
break;
|
||||||
@ -151,7 +151,7 @@ static uint32_t measure_erase(const esp_partition_t* part)
|
|||||||
time_meas_ctx_t time_ctx = {.name = "erase", .len = total_len};
|
time_meas_ctx_t time_ctx = {.name = "erase", .len = total_len};
|
||||||
|
|
||||||
time_measure_start(&time_ctx);
|
time_measure_start(&time_ctx);
|
||||||
esp_err_t err = spi_flash_erase_range(part->address, total_len);
|
esp_err_t err = esp_flash_erase_region(NULL, part->address, total_len);
|
||||||
TEST_ESP_OK(err);
|
TEST_ESP_OK(err);
|
||||||
return time_measure_end(&time_ctx);
|
return time_measure_end(&time_ctx);
|
||||||
}
|
}
|
||||||
@ -170,7 +170,7 @@ static uint32_t measure_write(const char* name, const esp_partition_t* part, con
|
|||||||
|
|
||||||
while (len) {
|
while (len) {
|
||||||
int len_write = MIN(seg_len, len);
|
int len_write = MIN(seg_len, len);
|
||||||
esp_err_t err = spi_flash_write(part->address + offset, data_to_write + offset, len_write);
|
esp_err_t err = esp_flash_write(NULL, data_to_write + offset, part->address + offset, len_write);
|
||||||
TEST_ESP_OK(err);
|
TEST_ESP_OK(err);
|
||||||
|
|
||||||
offset += len_write;
|
offset += len_write;
|
||||||
@ -192,7 +192,7 @@ static uint32_t measure_read(const char* name, const esp_partition_t* part, uint
|
|||||||
|
|
||||||
while (len) {
|
while (len) {
|
||||||
int len_read = MIN(seg_len, len);
|
int len_read = MIN(seg_len, len);
|
||||||
esp_err_t err = spi_flash_read(part->address + offset, data_read + offset, len_read);
|
esp_err_t err = esp_flash_read(NULL, data_read + offset, part->address + offset, len_read);
|
||||||
TEST_ESP_OK(err);
|
TEST_ESP_OK(err);
|
||||||
|
|
||||||
offset += len_read;
|
offset += len_read;
|
||||||
@ -294,7 +294,7 @@ TEST_CASE("spi_flash deadlock with high priority busy-waiting task", "[spi_flash
|
|||||||
|
|
||||||
for (int i = 0; i < 1000; i++) {
|
for (int i = 0; i < 1000; i++) {
|
||||||
uint32_t dummy;
|
uint32_t dummy;
|
||||||
TEST_ESP_OK(spi_flash_read(0, &dummy, sizeof(dummy)));
|
TEST_ESP_OK(esp_flash_read(NULL, &dummy, 0, sizeof(dummy)));
|
||||||
}
|
}
|
||||||
|
|
||||||
arg.done = true;
|
arg.done = true;
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
#include "spiffs_nucleus.h"
|
#include "spiffs_nucleus.h"
|
||||||
#include "esp_log.h"
|
#include "esp_log.h"
|
||||||
#include "esp_partition.h"
|
#include "esp_partition.h"
|
||||||
#include "esp_spi_flash.h"
|
#include "spi_flash_mmap.h"
|
||||||
#include "esp_image_format.h"
|
#include "esp_image_format.h"
|
||||||
#include "freertos/FreeRTOS.h"
|
#include "freertos/FreeRTOS.h"
|
||||||
#include "freertos/task.h"
|
#include "freertos/task.h"
|
||||||
|
@ -7,7 +7,8 @@
|
|||||||
#include "esp_log.h"
|
#include "esp_log.h"
|
||||||
#include "SPI_Flash.h"
|
#include "SPI_Flash.h"
|
||||||
#include "spi_flash_mmap.h"
|
#include "spi_flash_mmap.h"
|
||||||
#include "esp_rom_spiflash.h"
|
#include "esp_flash.h"
|
||||||
|
|
||||||
static const char *TAG = "spi_flash";
|
static const char *TAG = "spi_flash";
|
||||||
|
|
||||||
SPI_Flash::SPI_Flash()
|
SPI_Flash::SPI_Flash()
|
||||||
@ -16,12 +17,14 @@ SPI_Flash::SPI_Flash()
|
|||||||
|
|
||||||
size_t SPI_Flash::chip_size()
|
size_t SPI_Flash::chip_size()
|
||||||
{
|
{
|
||||||
return g_rom_flashchip.chip_size;
|
uint32_t chip_size;
|
||||||
|
esp_flash_get_size(NULL, &chip_size);
|
||||||
|
return chip_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
esp_err_t SPI_Flash::erase_sector(size_t sector)
|
esp_err_t SPI_Flash::erase_sector(size_t sector)
|
||||||
{
|
{
|
||||||
esp_err_t result = esp_rom_spiflash_erase_sector(sector);
|
esp_err_t result = esp_flash_erase_region(NULL, sector * SPI_FLASH_SEC_SIZE, SPI_FLASH_SEC_SIZE);;
|
||||||
if (result == ESP_OK) {
|
if (result == ESP_OK) {
|
||||||
ESP_LOGV(TAG, "erase_sector - sector=0x%08x, result=0x%08x", sector, result);
|
ESP_LOGV(TAG, "erase_sector - sector=0x%08x, result=0x%08x", sector, result);
|
||||||
} else {
|
} else {
|
||||||
@ -33,7 +36,7 @@ esp_err_t SPI_Flash::erase_range(size_t start_address, size_t size)
|
|||||||
{
|
{
|
||||||
size = (size + SPI_FLASH_SEC_SIZE - 1) / SPI_FLASH_SEC_SIZE;
|
size = (size + SPI_FLASH_SEC_SIZE - 1) / SPI_FLASH_SEC_SIZE;
|
||||||
size = size * SPI_FLASH_SEC_SIZE;
|
size = size * SPI_FLASH_SEC_SIZE;
|
||||||
esp_err_t result = esp_rom_spiflash_erase_area(start_address, size);
|
esp_err_t result = esp_flash_erase_region(NULL, start_address, size);
|
||||||
if (result == ESP_OK) {
|
if (result == ESP_OK) {
|
||||||
ESP_LOGV(TAG, "erase_range - start_address=0x%08x, size=0x%08x, result=0x%08x", start_address, size, result);
|
ESP_LOGV(TAG, "erase_range - start_address=0x%08x, size=0x%08x, result=0x%08x", start_address, size, result);
|
||||||
} else {
|
} else {
|
||||||
@ -44,7 +47,7 @@ esp_err_t SPI_Flash::erase_range(size_t start_address, size_t size)
|
|||||||
|
|
||||||
esp_err_t SPI_Flash::write(size_t dest_addr, const void *src, size_t size)
|
esp_err_t SPI_Flash::write(size_t dest_addr, const void *src, size_t size)
|
||||||
{
|
{
|
||||||
esp_err_t result = esp_rom_spiflash_write(dest_addr, (uint32_t*)src, size);
|
esp_err_t result = esp_flash_write(NULL, src, dest_addr, size);
|
||||||
if (result == ESP_OK) {
|
if (result == ESP_OK) {
|
||||||
ESP_LOGV(TAG, "write - dest_addr=0x%08x, size=0x%08x, result=0x%08x", dest_addr, size, result);
|
ESP_LOGV(TAG, "write - dest_addr=0x%08x, size=0x%08x, result=0x%08x", dest_addr, size, result);
|
||||||
} else {
|
} else {
|
||||||
@ -55,7 +58,7 @@ esp_err_t SPI_Flash::write(size_t dest_addr, const void *src, size_t size)
|
|||||||
|
|
||||||
esp_err_t SPI_Flash::read(size_t src_addr, void *dest, size_t size)
|
esp_err_t SPI_Flash::read(size_t src_addr, void *dest, size_t size)
|
||||||
{
|
{
|
||||||
esp_err_t result = esp_rom_spiflash_read(src_addr, (uint32_t*)dest, size);
|
esp_err_t result = esp_flash_read(NULL, dest, src_addr, size);
|
||||||
if (result == ESP_OK) {
|
if (result == ESP_OK) {
|
||||||
ESP_LOGV(TAG, "read - src_addr=0x%08x, size=0x%08x, result=0x%08x", src_addr, size, result);
|
ESP_LOGV(TAG, "read - src_addr=0x%08x, size=0x%08x, result=0x%08x", src_addr, size, result);
|
||||||
} else {
|
} else {
|
||||||
|
@ -35,14 +35,27 @@ ENUM type ``esp_flash_speed_t`` has been deprecated. From now on, you can direct
|
|||||||
Breaking changes in legacy APIs
|
Breaking changes in legacy APIs
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
In order to make spi_flash driver more stable, legacy spi_flash driver is removed on v5.0. Legacy spi_flash driver refers to default spi_flash driver since v3.0 and spi_flash driver with configuration option ``CONFIG_SPI_FLASH_USE_LEGACY_IMPL`` switched on on v4.0 series. The major breaking change is we don't support legacy spi_flash driver on v5.0 anymore. Therefore, the configuration option ``CONFIG_SPI_FLASH_USE_LEGACY_IMPL`` is removed. After that, following functions will no longer exist. But meanwhile, you can use our new APIs instead.
|
In order to make spi_flash driver more stable, legacy spi_flash driver is removed on v5.0. Legacy spi_flash driver refers to default spi_flash driver since v3.0 and spi_flash driver with configuration option ``CONFIG_SPI_FLASH_USE_LEGACY_IMPL`` switched on on v4.0 series. The major breaking change is legacy spi_flash driver is not supported on new version anymore. Therefore, the configuration option ``CONFIG_SPI_FLASH_USE_LEGACY_IMPL`` is removed. After that, following functions will no longer exist. But meanwhile, you can use our new APIs instead.
|
||||||
|
|
||||||
- ``spi_flash_erase_sector`` is replaced by ``esp_flash_erase_region``.
|
+---------------------------------+-------------------------------+
|
||||||
- ``spi_flash_erase_range`` is replaced by ``esp_flash_erase_region``.
|
| Removed items | Replacement |
|
||||||
- ``spi_flash_write`` is replaced by ``esp_flash_write``.
|
+=================================+===============================+
|
||||||
- ``spi_flash_read`` is replaced by ``esp_flash_read``.
|
| ``spi_flash_erase_sector()`` | ``esp_flash_erase_region`` |
|
||||||
- ``spi_flash_write_encrypted`` is replaced by ``esp_flash_write_encrypted``
|
+---------------------------------+-------------------------------+
|
||||||
- ``spi_flash_read_encrypted`` is replaced by ``esp_flash_read_encrypted``
|
| ``spi_flash_erase_range()`` | ``esp_flash_erase_region`` |
|
||||||
|
+---------------------------------+-------------------------------+
|
||||||
|
| ``spi_flash_write`` | ``esp_flash_write`` |
|
||||||
|
+---------------------------------+-------------------------------+
|
||||||
|
| ``spi_flash_read()`` | ``esp_flash_read`` |
|
||||||
|
+---------------------------------+-------------------------------+
|
||||||
|
| ``spi_flash_write_encrypted()`` | ``esp_flash_write_encrypted`` |
|
||||||
|
+---------------------------------+-------------------------------+
|
||||||
|
| ``spi_flash_read_encrypted`` | ``esp_flash_read_encrypted`` |
|
||||||
|
+---------------------------------+-------------------------------+
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
|
||||||
|
New functions with prefix ``esp_flash`` accept an additional ``esp_flash_t*`` parameter. You can simply set it to NULL means that the function will operate the main flash(``esp_flash_default_chip``)
|
||||||
|
|
||||||
Header ``esp_spi_flash.h`` has been deprecated, system functions are no longer public. To make use of flash memory mapping APIs, you should include ``spi_flash_mmap.h`` instead.
|
Header ``esp_spi_flash.h`` has been deprecated, system functions are no longer public. To make use of flash memory mapping APIs, you should include ``spi_flash_mmap.h`` instead.
|
||||||
|
|
||||||
|
@ -977,7 +977,6 @@ CONFIG_SPI_FLASH_ROM_DRIVER_PATCH=y
|
|||||||
CONFIG_SPI_FLASH_DANGEROUS_WRITE_ABORTS=y
|
CONFIG_SPI_FLASH_DANGEROUS_WRITE_ABORTS=y
|
||||||
# CONFIG_SPI_FLASH_DANGEROUS_WRITE_FAILS is not set
|
# CONFIG_SPI_FLASH_DANGEROUS_WRITE_FAILS is not set
|
||||||
# CONFIG_SPI_FLASH_DANGEROUS_WRITE_ALLOWED is not set
|
# CONFIG_SPI_FLASH_DANGEROUS_WRITE_ALLOWED is not set
|
||||||
# CONFIG_SPI_FLASH_USE_LEGACY_IMPL is not set
|
|
||||||
# CONFIG_SPI_FLASH_SHARE_SPI1_BUS is not set
|
# CONFIG_SPI_FLASH_SHARE_SPI1_BUS is not set
|
||||||
# CONFIG_SPI_FLASH_BYPASS_BLOCK_ERASE is not set
|
# CONFIG_SPI_FLASH_BYPASS_BLOCK_ERASE is not set
|
||||||
CONFIG_SPI_FLASH_YIELD_DURING_ERASE=y
|
CONFIG_SPI_FLASH_YIELD_DURING_ERASE=y
|
||||||
|
@ -968,7 +968,6 @@ CONFIG_SPI_FLASH_ROM_DRIVER_PATCH=y
|
|||||||
CONFIG_SPI_FLASH_DANGEROUS_WRITE_ABORTS=y
|
CONFIG_SPI_FLASH_DANGEROUS_WRITE_ABORTS=y
|
||||||
# CONFIG_SPI_FLASH_DANGEROUS_WRITE_FAILS is not set
|
# CONFIG_SPI_FLASH_DANGEROUS_WRITE_FAILS is not set
|
||||||
# CONFIG_SPI_FLASH_DANGEROUS_WRITE_ALLOWED is not set
|
# CONFIG_SPI_FLASH_DANGEROUS_WRITE_ALLOWED is not set
|
||||||
# CONFIG_SPI_FLASH_USE_LEGACY_IMPL is not set
|
|
||||||
# CONFIG_SPI_FLASH_SHARE_SPI1_BUS is not set
|
# CONFIG_SPI_FLASH_SHARE_SPI1_BUS is not set
|
||||||
# CONFIG_SPI_FLASH_BYPASS_BLOCK_ERASE is not set
|
# CONFIG_SPI_FLASH_BYPASS_BLOCK_ERASE is not set
|
||||||
CONFIG_SPI_FLASH_YIELD_DURING_ERASE=y
|
CONFIG_SPI_FLASH_YIELD_DURING_ERASE=y
|
||||||
|
@ -1113,7 +1113,6 @@ CONFIG_SPI_FLASH_ROM_DRIVER_PATCH=y
|
|||||||
CONFIG_SPI_FLASH_DANGEROUS_WRITE_ABORTS=y
|
CONFIG_SPI_FLASH_DANGEROUS_WRITE_ABORTS=y
|
||||||
# CONFIG_SPI_FLASH_DANGEROUS_WRITE_FAILS is not set
|
# CONFIG_SPI_FLASH_DANGEROUS_WRITE_FAILS is not set
|
||||||
# CONFIG_SPI_FLASH_DANGEROUS_WRITE_ALLOWED is not set
|
# CONFIG_SPI_FLASH_DANGEROUS_WRITE_ALLOWED is not set
|
||||||
# CONFIG_SPI_FLASH_USE_LEGACY_IMPL is not set
|
|
||||||
# CONFIG_SPI_FLASH_SHARE_SPI1_BUS is not set
|
# CONFIG_SPI_FLASH_SHARE_SPI1_BUS is not set
|
||||||
# CONFIG_SPI_FLASH_BYPASS_BLOCK_ERASE is not set
|
# CONFIG_SPI_FLASH_BYPASS_BLOCK_ERASE is not set
|
||||||
CONFIG_SPI_FLASH_YIELD_DURING_ERASE=y
|
CONFIG_SPI_FLASH_YIELD_DURING_ERASE=y
|
||||||
|
@ -981,7 +981,6 @@ CONFIG_SPI_FLASH_ROM_DRIVER_PATCH=y
|
|||||||
CONFIG_SPI_FLASH_DANGEROUS_WRITE_ABORTS=y
|
CONFIG_SPI_FLASH_DANGEROUS_WRITE_ABORTS=y
|
||||||
# CONFIG_SPI_FLASH_DANGEROUS_WRITE_FAILS is not set
|
# CONFIG_SPI_FLASH_DANGEROUS_WRITE_FAILS is not set
|
||||||
# CONFIG_SPI_FLASH_DANGEROUS_WRITE_ALLOWED is not set
|
# CONFIG_SPI_FLASH_DANGEROUS_WRITE_ALLOWED is not set
|
||||||
# CONFIG_SPI_FLASH_USE_LEGACY_IMPL is not set
|
|
||||||
# CONFIG_SPI_FLASH_SHARE_SPI1_BUS is not set
|
# CONFIG_SPI_FLASH_SHARE_SPI1_BUS is not set
|
||||||
# CONFIG_SPI_FLASH_BYPASS_BLOCK_ERASE is not set
|
# CONFIG_SPI_FLASH_BYPASS_BLOCK_ERASE is not set
|
||||||
CONFIG_SPI_FLASH_YIELD_DURING_ERASE=y
|
CONFIG_SPI_FLASH_YIELD_DURING_ERASE=y
|
||||||
|
@ -968,7 +968,6 @@ CONFIG_SPI_FLASH_ROM_DRIVER_PATCH=y
|
|||||||
CONFIG_SPI_FLASH_DANGEROUS_WRITE_ABORTS=y
|
CONFIG_SPI_FLASH_DANGEROUS_WRITE_ABORTS=y
|
||||||
# CONFIG_SPI_FLASH_DANGEROUS_WRITE_FAILS is not set
|
# CONFIG_SPI_FLASH_DANGEROUS_WRITE_FAILS is not set
|
||||||
# CONFIG_SPI_FLASH_DANGEROUS_WRITE_ALLOWED is not set
|
# CONFIG_SPI_FLASH_DANGEROUS_WRITE_ALLOWED is not set
|
||||||
# CONFIG_SPI_FLASH_USE_LEGACY_IMPL is not set
|
|
||||||
# CONFIG_SPI_FLASH_SHARE_SPI1_BUS is not set
|
# CONFIG_SPI_FLASH_SHARE_SPI1_BUS is not set
|
||||||
# CONFIG_SPI_FLASH_BYPASS_BLOCK_ERASE is not set
|
# CONFIG_SPI_FLASH_BYPASS_BLOCK_ERASE is not set
|
||||||
CONFIG_SPI_FLASH_YIELD_DURING_ERASE=y
|
CONFIG_SPI_FLASH_YIELD_DURING_ERASE=y
|
||||||
|
@ -1113,7 +1113,6 @@ CONFIG_SPI_FLASH_ROM_DRIVER_PATCH=y
|
|||||||
CONFIG_SPI_FLASH_DANGEROUS_WRITE_ABORTS=y
|
CONFIG_SPI_FLASH_DANGEROUS_WRITE_ABORTS=y
|
||||||
# CONFIG_SPI_FLASH_DANGEROUS_WRITE_FAILS is not set
|
# CONFIG_SPI_FLASH_DANGEROUS_WRITE_FAILS is not set
|
||||||
# CONFIG_SPI_FLASH_DANGEROUS_WRITE_ALLOWED is not set
|
# CONFIG_SPI_FLASH_DANGEROUS_WRITE_ALLOWED is not set
|
||||||
# CONFIG_SPI_FLASH_USE_LEGACY_IMPL is not set
|
|
||||||
# CONFIG_SPI_FLASH_SHARE_SPI1_BUS is not set
|
# CONFIG_SPI_FLASH_SHARE_SPI1_BUS is not set
|
||||||
# CONFIG_SPI_FLASH_BYPASS_BLOCK_ERASE is not set
|
# CONFIG_SPI_FLASH_BYPASS_BLOCK_ERASE is not set
|
||||||
CONFIG_SPI_FLASH_YIELD_DURING_ERASE=y
|
CONFIG_SPI_FLASH_YIELD_DURING_ERASE=y
|
||||||
|
@ -967,7 +967,6 @@ CONFIG_SPI_FLASH_ROM_DRIVER_PATCH=y
|
|||||||
CONFIG_SPI_FLASH_DANGEROUS_WRITE_ABORTS=y
|
CONFIG_SPI_FLASH_DANGEROUS_WRITE_ABORTS=y
|
||||||
# CONFIG_SPI_FLASH_DANGEROUS_WRITE_FAILS is not set
|
# CONFIG_SPI_FLASH_DANGEROUS_WRITE_FAILS is not set
|
||||||
# CONFIG_SPI_FLASH_DANGEROUS_WRITE_ALLOWED is not set
|
# CONFIG_SPI_FLASH_DANGEROUS_WRITE_ALLOWED is not set
|
||||||
# CONFIG_SPI_FLASH_USE_LEGACY_IMPL is not set
|
|
||||||
# CONFIG_SPI_FLASH_SHARE_SPI1_BUS is not set
|
# CONFIG_SPI_FLASH_SHARE_SPI1_BUS is not set
|
||||||
# CONFIG_SPI_FLASH_BYPASS_BLOCK_ERASE is not set
|
# CONFIG_SPI_FLASH_BYPASS_BLOCK_ERASE is not set
|
||||||
CONFIG_SPI_FLASH_YIELD_DURING_ERASE=y
|
CONFIG_SPI_FLASH_YIELD_DURING_ERASE=y
|
||||||
|
@ -1113,7 +1113,6 @@ CONFIG_SPI_FLASH_ROM_DRIVER_PATCH=y
|
|||||||
CONFIG_SPI_FLASH_DANGEROUS_WRITE_ABORTS=y
|
CONFIG_SPI_FLASH_DANGEROUS_WRITE_ABORTS=y
|
||||||
# CONFIG_SPI_FLASH_DANGEROUS_WRITE_FAILS is not set
|
# CONFIG_SPI_FLASH_DANGEROUS_WRITE_FAILS is not set
|
||||||
# CONFIG_SPI_FLASH_DANGEROUS_WRITE_ALLOWED is not set
|
# CONFIG_SPI_FLASH_DANGEROUS_WRITE_ALLOWED is not set
|
||||||
# CONFIG_SPI_FLASH_USE_LEGACY_IMPL is not set
|
|
||||||
# CONFIG_SPI_FLASH_SHARE_SPI1_BUS is not set
|
# CONFIG_SPI_FLASH_SHARE_SPI1_BUS is not set
|
||||||
# CONFIG_SPI_FLASH_BYPASS_BLOCK_ERASE is not set
|
# CONFIG_SPI_FLASH_BYPASS_BLOCK_ERASE is not set
|
||||||
CONFIG_SPI_FLASH_YIELD_DURING_ERASE=y
|
CONFIG_SPI_FLASH_YIELD_DURING_ERASE=y
|
||||||
|
@ -981,7 +981,6 @@ CONFIG_SPI_FLASH_ROM_DRIVER_PATCH=y
|
|||||||
CONFIG_SPI_FLASH_DANGEROUS_WRITE_ABORTS=y
|
CONFIG_SPI_FLASH_DANGEROUS_WRITE_ABORTS=y
|
||||||
# CONFIG_SPI_FLASH_DANGEROUS_WRITE_FAILS is not set
|
# CONFIG_SPI_FLASH_DANGEROUS_WRITE_FAILS is not set
|
||||||
# CONFIG_SPI_FLASH_DANGEROUS_WRITE_ALLOWED is not set
|
# CONFIG_SPI_FLASH_DANGEROUS_WRITE_ALLOWED is not set
|
||||||
# CONFIG_SPI_FLASH_USE_LEGACY_IMPL is not set
|
|
||||||
# CONFIG_SPI_FLASH_SHARE_SPI1_BUS is not set
|
# CONFIG_SPI_FLASH_SHARE_SPI1_BUS is not set
|
||||||
# CONFIG_SPI_FLASH_BYPASS_BLOCK_ERASE is not set
|
# CONFIG_SPI_FLASH_BYPASS_BLOCK_ERASE is not set
|
||||||
CONFIG_SPI_FLASH_YIELD_DURING_ERASE=y
|
CONFIG_SPI_FLASH_YIELD_DURING_ERASE=y
|
||||||
|
@ -967,7 +967,6 @@ CONFIG_SPI_FLASH_ROM_DRIVER_PATCH=y
|
|||||||
CONFIG_SPI_FLASH_DANGEROUS_WRITE_ABORTS=y
|
CONFIG_SPI_FLASH_DANGEROUS_WRITE_ABORTS=y
|
||||||
# CONFIG_SPI_FLASH_DANGEROUS_WRITE_FAILS is not set
|
# CONFIG_SPI_FLASH_DANGEROUS_WRITE_FAILS is not set
|
||||||
# CONFIG_SPI_FLASH_DANGEROUS_WRITE_ALLOWED is not set
|
# CONFIG_SPI_FLASH_DANGEROUS_WRITE_ALLOWED is not set
|
||||||
# CONFIG_SPI_FLASH_USE_LEGACY_IMPL is not set
|
|
||||||
# CONFIG_SPI_FLASH_SHARE_SPI1_BUS is not set
|
# CONFIG_SPI_FLASH_SHARE_SPI1_BUS is not set
|
||||||
# CONFIG_SPI_FLASH_BYPASS_BLOCK_ERASE is not set
|
# CONFIG_SPI_FLASH_BYPASS_BLOCK_ERASE is not set
|
||||||
CONFIG_SPI_FLASH_YIELD_DURING_ERASE=y
|
CONFIG_SPI_FLASH_YIELD_DURING_ERASE=y
|
||||||
|
@ -1113,7 +1113,6 @@ CONFIG_SPI_FLASH_ROM_DRIVER_PATCH=y
|
|||||||
CONFIG_SPI_FLASH_DANGEROUS_WRITE_ABORTS=y
|
CONFIG_SPI_FLASH_DANGEROUS_WRITE_ABORTS=y
|
||||||
# CONFIG_SPI_FLASH_DANGEROUS_WRITE_FAILS is not set
|
# CONFIG_SPI_FLASH_DANGEROUS_WRITE_FAILS is not set
|
||||||
# CONFIG_SPI_FLASH_DANGEROUS_WRITE_ALLOWED is not set
|
# CONFIG_SPI_FLASH_DANGEROUS_WRITE_ALLOWED is not set
|
||||||
# CONFIG_SPI_FLASH_USE_LEGACY_IMPL is not set
|
|
||||||
# CONFIG_SPI_FLASH_SHARE_SPI1_BUS is not set
|
# CONFIG_SPI_FLASH_SHARE_SPI1_BUS is not set
|
||||||
# CONFIG_SPI_FLASH_BYPASS_BLOCK_ERASE is not set
|
# CONFIG_SPI_FLASH_BYPASS_BLOCK_ERASE is not set
|
||||||
CONFIG_SPI_FLASH_YIELD_DURING_ERASE=y
|
CONFIG_SPI_FLASH_YIELD_DURING_ERASE=y
|
||||||
|
@ -978,7 +978,6 @@ CONFIG_SPI_FLASH_ROM_DRIVER_PATCH=y
|
|||||||
CONFIG_SPI_FLASH_DANGEROUS_WRITE_ABORTS=y
|
CONFIG_SPI_FLASH_DANGEROUS_WRITE_ABORTS=y
|
||||||
# CONFIG_SPI_FLASH_DANGEROUS_WRITE_FAILS is not set
|
# CONFIG_SPI_FLASH_DANGEROUS_WRITE_FAILS is not set
|
||||||
# CONFIG_SPI_FLASH_DANGEROUS_WRITE_ALLOWED is not set
|
# CONFIG_SPI_FLASH_DANGEROUS_WRITE_ALLOWED is not set
|
||||||
# CONFIG_SPI_FLASH_USE_LEGACY_IMPL is not set
|
|
||||||
# CONFIG_SPI_FLASH_SHARE_SPI1_BUS is not set
|
# CONFIG_SPI_FLASH_SHARE_SPI1_BUS is not set
|
||||||
# CONFIG_SPI_FLASH_BYPASS_BLOCK_ERASE is not set
|
# CONFIG_SPI_FLASH_BYPASS_BLOCK_ERASE is not set
|
||||||
CONFIG_SPI_FLASH_YIELD_DURING_ERASE=y
|
CONFIG_SPI_FLASH_YIELD_DURING_ERASE=y
|
||||||
|
@ -967,7 +967,6 @@ CONFIG_SPI_FLASH_ROM_DRIVER_PATCH=y
|
|||||||
CONFIG_SPI_FLASH_DANGEROUS_WRITE_ABORTS=y
|
CONFIG_SPI_FLASH_DANGEROUS_WRITE_ABORTS=y
|
||||||
# CONFIG_SPI_FLASH_DANGEROUS_WRITE_FAILS is not set
|
# CONFIG_SPI_FLASH_DANGEROUS_WRITE_FAILS is not set
|
||||||
# CONFIG_SPI_FLASH_DANGEROUS_WRITE_ALLOWED is not set
|
# CONFIG_SPI_FLASH_DANGEROUS_WRITE_ALLOWED is not set
|
||||||
# CONFIG_SPI_FLASH_USE_LEGACY_IMPL is not set
|
|
||||||
# CONFIG_SPI_FLASH_SHARE_SPI1_BUS is not set
|
# CONFIG_SPI_FLASH_SHARE_SPI1_BUS is not set
|
||||||
# CONFIG_SPI_FLASH_BYPASS_BLOCK_ERASE is not set
|
# CONFIG_SPI_FLASH_BYPASS_BLOCK_ERASE is not set
|
||||||
CONFIG_SPI_FLASH_YIELD_DURING_ERASE=y
|
CONFIG_SPI_FLASH_YIELD_DURING_ERASE=y
|
||||||
|
@ -1113,7 +1113,6 @@ CONFIG_SPI_FLASH_ROM_DRIVER_PATCH=y
|
|||||||
CONFIG_SPI_FLASH_DANGEROUS_WRITE_ABORTS=y
|
CONFIG_SPI_FLASH_DANGEROUS_WRITE_ABORTS=y
|
||||||
# CONFIG_SPI_FLASH_DANGEROUS_WRITE_FAILS is not set
|
# CONFIG_SPI_FLASH_DANGEROUS_WRITE_FAILS is not set
|
||||||
# CONFIG_SPI_FLASH_DANGEROUS_WRITE_ALLOWED is not set
|
# CONFIG_SPI_FLASH_DANGEROUS_WRITE_ALLOWED is not set
|
||||||
# CONFIG_SPI_FLASH_USE_LEGACY_IMPL is not set
|
|
||||||
# CONFIG_SPI_FLASH_SHARE_SPI1_BUS is not set
|
# CONFIG_SPI_FLASH_SHARE_SPI1_BUS is not set
|
||||||
# CONFIG_SPI_FLASH_BYPASS_BLOCK_ERASE is not set
|
# CONFIG_SPI_FLASH_BYPASS_BLOCK_ERASE is not set
|
||||||
CONFIG_SPI_FLASH_YIELD_DURING_ERASE=y
|
CONFIG_SPI_FLASH_YIELD_DURING_ERASE=y
|
||||||
|
@ -980,7 +980,6 @@ CONFIG_SPI_FLASH_ROM_DRIVER_PATCH=y
|
|||||||
CONFIG_SPI_FLASH_DANGEROUS_WRITE_ABORTS=y
|
CONFIG_SPI_FLASH_DANGEROUS_WRITE_ABORTS=y
|
||||||
# CONFIG_SPI_FLASH_DANGEROUS_WRITE_FAILS is not set
|
# CONFIG_SPI_FLASH_DANGEROUS_WRITE_FAILS is not set
|
||||||
# CONFIG_SPI_FLASH_DANGEROUS_WRITE_ALLOWED is not set
|
# CONFIG_SPI_FLASH_DANGEROUS_WRITE_ALLOWED is not set
|
||||||
# CONFIG_SPI_FLASH_USE_LEGACY_IMPL is not set
|
|
||||||
# CONFIG_SPI_FLASH_SHARE_SPI1_BUS is not set
|
# CONFIG_SPI_FLASH_SHARE_SPI1_BUS is not set
|
||||||
# CONFIG_SPI_FLASH_BYPASS_BLOCK_ERASE is not set
|
# CONFIG_SPI_FLASH_BYPASS_BLOCK_ERASE is not set
|
||||||
CONFIG_SPI_FLASH_YIELD_DURING_ERASE=y
|
CONFIG_SPI_FLASH_YIELD_DURING_ERASE=y
|
||||||
|
@ -967,7 +967,6 @@ CONFIG_SPI_FLASH_ROM_DRIVER_PATCH=y
|
|||||||
CONFIG_SPI_FLASH_DANGEROUS_WRITE_ABORTS=y
|
CONFIG_SPI_FLASH_DANGEROUS_WRITE_ABORTS=y
|
||||||
# CONFIG_SPI_FLASH_DANGEROUS_WRITE_FAILS is not set
|
# CONFIG_SPI_FLASH_DANGEROUS_WRITE_FAILS is not set
|
||||||
# CONFIG_SPI_FLASH_DANGEROUS_WRITE_ALLOWED is not set
|
# CONFIG_SPI_FLASH_DANGEROUS_WRITE_ALLOWED is not set
|
||||||
# CONFIG_SPI_FLASH_USE_LEGACY_IMPL is not set
|
|
||||||
# CONFIG_SPI_FLASH_SHARE_SPI1_BUS is not set
|
# CONFIG_SPI_FLASH_SHARE_SPI1_BUS is not set
|
||||||
# CONFIG_SPI_FLASH_BYPASS_BLOCK_ERASE is not set
|
# CONFIG_SPI_FLASH_BYPASS_BLOCK_ERASE is not set
|
||||||
CONFIG_SPI_FLASH_YIELD_DURING_ERASE=y
|
CONFIG_SPI_FLASH_YIELD_DURING_ERASE=y
|
||||||
|
@ -1113,7 +1113,6 @@ CONFIG_SPI_FLASH_ROM_DRIVER_PATCH=y
|
|||||||
CONFIG_SPI_FLASH_DANGEROUS_WRITE_ABORTS=y
|
CONFIG_SPI_FLASH_DANGEROUS_WRITE_ABORTS=y
|
||||||
# CONFIG_SPI_FLASH_DANGEROUS_WRITE_FAILS is not set
|
# CONFIG_SPI_FLASH_DANGEROUS_WRITE_FAILS is not set
|
||||||
# CONFIG_SPI_FLASH_DANGEROUS_WRITE_ALLOWED is not set
|
# CONFIG_SPI_FLASH_DANGEROUS_WRITE_ALLOWED is not set
|
||||||
# CONFIG_SPI_FLASH_USE_LEGACY_IMPL is not set
|
|
||||||
# CONFIG_SPI_FLASH_SHARE_SPI1_BUS is not set
|
# CONFIG_SPI_FLASH_SHARE_SPI1_BUS is not set
|
||||||
# CONFIG_SPI_FLASH_BYPASS_BLOCK_ERASE is not set
|
# CONFIG_SPI_FLASH_BYPASS_BLOCK_ERASE is not set
|
||||||
CONFIG_SPI_FLASH_YIELD_DURING_ERASE=y
|
CONFIG_SPI_FLASH_YIELD_DURING_ERASE=y
|
||||||
|
@ -978,7 +978,6 @@ CONFIG_SPI_FLASH_ROM_DRIVER_PATCH=y
|
|||||||
CONFIG_SPI_FLASH_DANGEROUS_WRITE_ABORTS=y
|
CONFIG_SPI_FLASH_DANGEROUS_WRITE_ABORTS=y
|
||||||
# CONFIG_SPI_FLASH_DANGEROUS_WRITE_FAILS is not set
|
# CONFIG_SPI_FLASH_DANGEROUS_WRITE_FAILS is not set
|
||||||
# CONFIG_SPI_FLASH_DANGEROUS_WRITE_ALLOWED is not set
|
# CONFIG_SPI_FLASH_DANGEROUS_WRITE_ALLOWED is not set
|
||||||
# CONFIG_SPI_FLASH_USE_LEGACY_IMPL is not set
|
|
||||||
# CONFIG_SPI_FLASH_SHARE_SPI1_BUS is not set
|
# CONFIG_SPI_FLASH_SHARE_SPI1_BUS is not set
|
||||||
# CONFIG_SPI_FLASH_BYPASS_BLOCK_ERASE is not set
|
# CONFIG_SPI_FLASH_BYPASS_BLOCK_ERASE is not set
|
||||||
CONFIG_SPI_FLASH_YIELD_DURING_ERASE=y
|
CONFIG_SPI_FLASH_YIELD_DURING_ERASE=y
|
||||||
|
@ -967,7 +967,6 @@ CONFIG_SPI_FLASH_ROM_DRIVER_PATCH=y
|
|||||||
CONFIG_SPI_FLASH_DANGEROUS_WRITE_ABORTS=y
|
CONFIG_SPI_FLASH_DANGEROUS_WRITE_ABORTS=y
|
||||||
# CONFIG_SPI_FLASH_DANGEROUS_WRITE_FAILS is not set
|
# CONFIG_SPI_FLASH_DANGEROUS_WRITE_FAILS is not set
|
||||||
# CONFIG_SPI_FLASH_DANGEROUS_WRITE_ALLOWED is not set
|
# CONFIG_SPI_FLASH_DANGEROUS_WRITE_ALLOWED is not set
|
||||||
# CONFIG_SPI_FLASH_USE_LEGACY_IMPL is not set
|
|
||||||
# CONFIG_SPI_FLASH_SHARE_SPI1_BUS is not set
|
# CONFIG_SPI_FLASH_SHARE_SPI1_BUS is not set
|
||||||
# CONFIG_SPI_FLASH_BYPASS_BLOCK_ERASE is not set
|
# CONFIG_SPI_FLASH_BYPASS_BLOCK_ERASE is not set
|
||||||
CONFIG_SPI_FLASH_YIELD_DURING_ERASE=y
|
CONFIG_SPI_FLASH_YIELD_DURING_ERASE=y
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user