Merge branch 'feature/ext_flash_fatfs_update' into 'master'

fatfs: add new ESP32 targets to external flash example

Closes IDF-3621

See merge request espressif/esp-idf!17371
This commit is contained in:
Martin Vychodil
2022-05-18 16:43:52 +08:00
2 changed files with 53 additions and 44 deletions

View File

@@ -1,6 +1,3 @@
| Supported Targets | ESP32 |
| ----------------- | ----- |
# FAT FS on External Flash example # FAT FS on External Flash example
(See the README.md file in the upper level 'examples' directory for more information about examples.) (See the README.md file in the upper level 'examples' directory for more information about examples.)
@@ -25,16 +22,24 @@ This example needs an SPI NOR Flash chip connected to the ESP32. The SPI Flash c
Use the following pin assignments: Use the following pin assignments:
ESP32 pin | SPI bus signal | SPI Flash pin #### Pin assigments
--------------|----------------|----------------
GPIO23 | MOSI | DI The GPIO pin numbers used to connect an external SPI flash chip can be customized.
GPIO19 | MISO | DO
GPIO18 | SCLK | CLK In this example it can be done in source code by changing C defines under `Pin mapping` comment at the top of the file.
GPIO5 | CS | CMD
GPIO22 | WP | WP The table below shows the default pin assignments.
GPIO21 | HD | HOLD
GND | | GND SPI bus signal | SPI Flash pin | ESP32 pin | ESP32S2 pin | ESP32S3 pin | ESP32C3 pin
VCC | | VCC ---------------|---------------|-----------|-------------|-------------|-------------
MOSI | DI | GPIO23 | GPIO11 | GPIO11 | GPIO7
MISO | DO | GPIO19 | GPIO13 | GPIO13 | GPIO2
SCLK | CLK | GPIO18 | GPIO12 | GPIO12 | GPIO6
CS | CMD | GPIO5 | GPIO10 | GPIO10 | GPIO10
WP | WP | GPIO22 | GPIO14 | GPIO14 | GPIO5
HD | HOLD | GPIO21 | GPIO9 | GPIO9 | GPIO4
| | GND | GND | GND | GND | GND
| | VCC | VCC | VCC | VCC | VCC
### Build and flash ### Build and flash
@@ -52,7 +57,7 @@ See the Getting Started Guide for full steps to configure and use ESP-IDF to bui
## Example output ## Example output
Here is a typical example console output. Here is a typical example console output.
``` ```
I (328) example: Initializing external SPI Flash I (328) example: Initializing external SPI Flash

View File

@@ -26,6 +26,28 @@
static const char *TAG = "example"; static const char *TAG = "example";
// Pin mapping
// ESP32 (VSPI)
#ifdef CONFIG_IDF_TARGET_ESP32
#define HOST_ID SPI3_HOST
#define PIN_MOSI SPI3_IOMUX_PIN_NUM_MOSI
#define PIN_MISO SPI3_IOMUX_PIN_NUM_MISO
#define PIN_CLK SPI3_IOMUX_PIN_NUM_CLK
#define PIN_CS SPI3_IOMUX_PIN_NUM_CS
#define PIN_WP SPI3_IOMUX_PIN_NUM_WP
#define PIN_HD SPI3_IOMUX_PIN_NUM_HD
#define SPI_DMA_CHAN SPI_DMA_CH_AUTO
#else // Other chips (SPI2/HSPI)
#define HOST_ID SPI2_HOST
#define PIN_MOSI SPI2_IOMUX_PIN_NUM_MOSI
#define PIN_MISO SPI2_IOMUX_PIN_NUM_MISO
#define PIN_CLK SPI2_IOMUX_PIN_NUM_CLK
#define PIN_CS SPI2_IOMUX_PIN_NUM_CS
#define PIN_WP SPI2_IOMUX_PIN_NUM_WP
#define PIN_HD SPI2_IOMUX_PIN_NUM_HD
#define SPI_DMA_CHAN SPI_DMA_CH_AUTO
#endif
// Handle of the wear levelling library instance // Handle of the wear levelling library instance
static wl_handle_t s_wl_handle = WL_INVALID_HANDLE; static wl_handle_t s_wl_handle = WL_INVALID_HANDLE;
@@ -36,7 +58,6 @@ static esp_flash_t* example_init_ext_flash(void);
static const esp_partition_t* example_add_partition(esp_flash_t* ext_flash, const char* partition_label); static const esp_partition_t* example_add_partition(esp_flash_t* ext_flash, const char* partition_label);
static void example_list_data_partitions(void); static void example_list_data_partitions(void);
static bool example_mount_fatfs(const char* partition_label); static bool example_mount_fatfs(const char* partition_label);
static void example_get_fatfs_usage(size_t* out_total_bytes, size_t* out_free_bytes);
void app_main(void) void app_main(void)
{ {
@@ -59,9 +80,9 @@ void app_main(void)
} }
// Print FAT FS size information // Print FAT FS size information
size_t bytes_total, bytes_free; uint64_t bytes_total, bytes_free;
example_get_fatfs_usage(&bytes_total, &bytes_free); esp_vfs_fat_info(base_path, &bytes_total, &bytes_free);
ESP_LOGI(TAG, "FAT FS: %d kB total, %d kB free", bytes_total / 1024, bytes_free / 1024); ESP_LOGI(TAG, "FAT FS: %lld kB total, %lld kB free", bytes_total / 1024, bytes_free / 1024);
// Create a file in FAT FS // Create a file in FAT FS
ESP_LOGI(TAG, "Opening file"); ESP_LOGI(TAG, "Opening file");
@@ -95,17 +116,17 @@ void app_main(void)
static esp_flash_t* example_init_ext_flash(void) static esp_flash_t* example_init_ext_flash(void)
{ {
const spi_bus_config_t bus_config = { const spi_bus_config_t bus_config = {
.mosi_io_num = VSPI_IOMUX_PIN_NUM_MOSI, .mosi_io_num = PIN_MOSI,
.miso_io_num = VSPI_IOMUX_PIN_NUM_MISO, .miso_io_num = PIN_MISO,
.sclk_io_num = VSPI_IOMUX_PIN_NUM_CLK, .sclk_io_num = PIN_CLK,
.quadhd_io_num = VSPI_IOMUX_PIN_NUM_HD, .quadhd_io_num = PIN_HD,
.quadwp_io_num = VSPI_IOMUX_PIN_NUM_WP, .quadwp_io_num = PIN_WP,
}; };
const esp_flash_spi_device_config_t device_config = { const esp_flash_spi_device_config_t device_config = {
.host_id = VSPI_HOST, .host_id = HOST_ID,
.cs_id = 0, .cs_id = 0,
.cs_io_num = VSPI_IOMUX_PIN_NUM_CS, .cs_io_num = PIN_CS,
.io_mode = SPI_FLASH_DIO, .io_mode = SPI_FLASH_DIO,
.freq_mhz = EXAMPLE_FLASH_FREQ_MHZ, .freq_mhz = EXAMPLE_FLASH_FREQ_MHZ,
}; };
@@ -118,7 +139,8 @@ static esp_flash_t* example_init_ext_flash(void)
); );
// Initialize the SPI bus // Initialize the SPI bus
ESP_ERROR_CHECK(spi_bus_initialize(VSPI_HOST, &bus_config, 1)); ESP_LOGI(TAG, "DMA CHANNEL: %d", SPI_DMA_CHAN);
ESP_ERROR_CHECK(spi_bus_initialize(HOST_ID, &bus_config, SPI_DMA_CHAN));
// Add device to the SPI bus // Add device to the SPI bus
esp_flash_t* ext_flash; esp_flash_t* ext_flash;
@@ -176,21 +198,3 @@ static bool example_mount_fatfs(const char* partition_label)
} }
return true; return true;
} }
static void example_get_fatfs_usage(size_t* out_total_bytes, size_t* out_free_bytes)
{
FATFS *fs;
size_t free_clusters;
int res = f_getfree("0:", &free_clusters, &fs);
assert(res == FR_OK);
size_t total_sectors = (fs->n_fatent - 2) * fs->csize;
size_t free_sectors = free_clusters * fs->csize;
// assuming the total size is < 4GiB, should be true for SPI Flash
if (out_total_bytes != NULL) {
*out_total_bytes = total_sectors * fs->ssize;
}
if (out_free_bytes != NULL) {
*out_free_bytes = free_sectors * fs->ssize;
}
}