Code: Select all
/* Sys Library */
#include <sys/unistd.h>
#include <sys/stat.h>
/* Standard Library */
#include <stdio.h>
#include <inttypes.h>
#include <string.h>
/* Defined Library in ESP-IDF */
#include "ff.h"
#include "esp_vfs_fat.h"
#include "sdmmc_cmd.h"
#include "vfs_fat_internal.h"
#include "sdkconfig.h"
#include "esp_chip_info.h"
#include "esp_flash.h"
#include "esp_log.h"
#include "diskio_impl.h"
static const char *TAG = "sdFormat";
#define MOUNT_POINT "/sdcard"
// Pin assignments can be set in menuconfig, see "SD SPI Example Configuration" menu.
// You can also change the pin assignments here by changing the following 4 lines.
#define PIN_NUM_MISO 0
#define PIN_NUM_MOSI 4
#define PIN_NUM_CLK 3
#define PIN_NUM_CS 8
esp_err_t formatSD() {
FRESULT res = FR_OK;
esp_err_t err = ESP_OK;
const size_t workbuf_size = 4096;
void* workbuf = NULL;
ESP_LOGI(TAG, "partitioning card");
workbuf = ff_memalloc(workbuf_size);
ESP_LOGI(TAG, "memalloc completed");
if (workbuf == NULL)
{
ESP_LOGI(TAG, "work buffer null");
return ESP_ERR_NO_MEM;
}
// PARTITION VolToPart[FF_VOLUMES] = {
// {0, 1},
// {0, 2}
// };
DWORD plist[] = {100 , 0, 0};
ESP_LOGI(TAG, "Ready to fdisk");
res = f_fdisk(0, plist, workbuf);
ESP_LOGI(TAG, "fdisk completed");
if (res != FR_OK)
{
err = ESP_FAIL;
ESP_LOGE(TAG, "f_fdisk failed (%d)", res);
}
else
{
ESP_LOGI(TAG, "Ready to mkfs");
res = f_mkfs("0:", 0, workbuf, workbuf_size);
if (res != FR_OK)
{
err = ESP_FAIL;
ESP_LOGE(TAG, "f_mkfs failed (%d)", res);
}
//res = f_mkfs("1:", 0, workbuf, workbuf_size);
if (res != FR_OK)
{
err = ESP_FAIL;
ESP_LOGE(TAG, "f_mkfs failed (%d)", res);
}
}
ESP_LOGI(TAG, "partitioning card finished");
free(workbuf);
FATFS fs;
f_mount(&fs, "0:", 0);
f_mount(&fs, "1:", 0);
ESP_LOGI(TAG, "mounting drive finished");
return err;
}
void app_main(void)
{
esp_err_t ret;
// Options for mounting the filesystem.
// If format_if_mount_failed is set to true, SD card will be partitioned and
// formatted in case when mounting fails.
esp_vfs_fat_sdmmc_mount_config_t mount_config = {
#ifdef CONFIG_EXAMPLE_FORMAT_IF_MOUNT_FAILED
.format_if_mount_failed = true,
#else
.format_if_mount_failed = false,
#endif // EXAMPLE_FORMAT_IF_MOUNT_FAILED
.max_files = 5,
.allocation_unit_size = 16 * 1024
};
sdmmc_card_t *card;
const char mount_point[] = MOUNT_POINT;
ESP_LOGI(TAG, "Initializing SD card");
// Use settings defined above to initialize SD card and mount FAT filesystem.
// Note: esp_vfs_fat_sdmmc/sdspi_mount is all-in-one convenience functions.
// Please check its source code and implement error recovery when developing
// production applications.
ESP_LOGI(TAG, "Using SPI peripheral");
sdmmc_host_t host = SDSPI_HOST_DEFAULT();
host.max_freq_khz = 10000;
spi_bus_config_t bus_cfg = {
.mosi_io_num = PIN_NUM_MOSI,
.miso_io_num = PIN_NUM_MISO,
.sclk_io_num = PIN_NUM_CLK,
.quadwp_io_num = -1,
.quadhd_io_num = -1,
.max_transfer_sz = 4000,
};
ret = spi_bus_initialize(host.slot, &bus_cfg, SDSPI_DEFAULT_DMA);
if (ret != ESP_OK) {
ESP_LOGE(TAG, "Failed to initialize bus.");
return;
}
// This initializes the slot without card detect (CD) and write protect (WP) signals.
// Modify slot_config.gpio_cd and slot_config.gpio_wp if your board has these signals.
sdspi_device_config_t slot_config = SDSPI_DEVICE_CONFIG_DEFAULT();
slot_config.gpio_cs = PIN_NUM_CS;
slot_config.host_id = host.slot;
ESP_LOGI(TAG, "Mounting filesystem");
ret = esp_vfs_fat_sdspi_mount(mount_point, &host, &slot_config, &mount_config, &card);
// ret = initialize_card(mount_point, &host, &slot_config, &card);
if (ret != ESP_OK) {
if (ret == ESP_FAIL) {
ESP_LOGE(TAG, "Failed to mount filesystem. "
"If you want the card to be formatted, set the CONFIG_EXAMPLE_FORMAT_IF_MOUNT_FAILED menuconfig option.");
} else {
ESP_LOGE(TAG, "Failed to initialize the card (%s). "
"Make sure SD card lines have pull-up resistors in place.", esp_err_to_name(ret));
}
return;
}
ESP_LOGI(TAG, "Filesystem mounted");
formatSD();
// All done, unmount partition and disable SPI peripheral
// esp_vfs_fat_sdcard_unmount(mount_point, card);
// ESP_LOGI(TAG, "Card unmounted");
//deinitialize the bus after all devices are removed
spi_bus_free(host.slot);
}