Files
pi-dashboard/components/port_bsp/sdcard_bsp.cpp

144 lines
3.9 KiB
C++
Raw Permalink Normal View History

2026-02-15 02:48:59 +09:00
#include <stdio.h>
#include <freertos/FreeRTOS.h>
#include "sdcard_bsp.h"
CustomSDPort::CustomSDPort(const char *SdName,int clk,int cmd,int d0,int width) :
SdName_(SdName)
{
esp_vfs_fat_sdmmc_mount_config_t mount_config = {};
mount_config.format_if_mount_failed = false;
mount_config.max_files = 5;
mount_config.allocation_unit_size = 16 * 1024 * 3;
sdmmc_host_t host = SDMMC_HOST_DEFAULT();
sdmmc_slot_config_t slot_config = SDMMC_SLOT_CONFIG_DEFAULT();
slot_config.width = width;
slot_config.clk = (gpio_num_t)clk;
slot_config.cmd = (gpio_num_t)cmd;
slot_config.d0 = (gpio_num_t)d0;
ESP_ERROR_CHECK_WITHOUT_ABORT(esp_vfs_fat_sdmmc_mount(SdName_, &host, &slot_config, &mount_config, &sdcard_host));
if (sdcard_host != NULL) {
sdmmc_card_print_info(stdout, sdcard_host);
is_SdcardInitOK = 1;
} else {
is_SdcardInitOK = 0;
}
}
CustomSDPort::~CustomSDPort() {
}
int CustomSDPort::SDPort_WriteFile(const char *path, const void *data, size_t data_len) {
if (sdcard_host == NULL) {
ESP_LOGE(TAG, "SD card not initialized");
return ESP_ERR_INVALID_STATE;
}
if (sdmmc_get_status(sdcard_host) != ESP_OK) {
ESP_LOGE(TAG, "SD card not ready");
return ESP_FAIL;
}
FILE *f = fopen(path, "wb");
if (f == NULL) {
ESP_LOGE(TAG, "Failed to open file for writing: %s", path);
return ESP_ERR_NOT_FOUND;
}
size_t written = fwrite(data, 1, data_len, f);
fclose(f);
if (written != data_len) {
ESP_LOGE(TAG, "Write failed (%zu/%zu bytes)", written, data_len);
return ESP_FAIL;
}
return ESP_OK;
}
int CustomSDPort::SDPort_ReadFile(const char *path, uint8_t *buffer, size_t *outLen) {
if (sdcard_host == NULL) {
ESP_LOGE(TAG, "SD card not initialized");
return ESP_ERR_INVALID_STATE;
}
if (sdmmc_get_status(sdcard_host) != ESP_OK) {
ESP_LOGE(TAG, "SD card not ready");
return ESP_FAIL;
}
FILE *f = fopen(path, "rb");
if (f == NULL) {
ESP_LOGE(TAG, "Failed to open file: %s", path);
return ESP_ERR_NOT_FOUND;
}
fseek(f, 0, SEEK_END);
long file_size = ftell(f);
if (file_size <= 0) {
ESP_LOGE(TAG, "Invalid file size");
fclose(f);
return ESP_FAIL;
}
fseek(f, 0, SEEK_SET);
size_t bytes_read = fread(buffer, 1, file_size, f);
fclose(f);
if (outLen) *outLen = bytes_read;
return (bytes_read > 0) ? ESP_OK : ESP_FAIL;
}
int CustomSDPort::SDPort_ReadOffset(const char *path, void *buffer, size_t len, size_t offset) {
if (sdcard_host == NULL) {
ESP_LOGE(TAG, "SD card not initialized");
return ESP_ERR_INVALID_STATE;
}
if (sdmmc_get_status(sdcard_host) != ESP_OK) {
ESP_LOGE(TAG, "SD card not ready");
return ESP_FAIL;
}
FILE *f = fopen(path, "rb");
if (f == NULL) {
ESP_LOGE(TAG, "Failed to open file: %s", path);
return ESP_ERR_NOT_FOUND;
}
fseek(f, offset, SEEK_SET);
size_t bytes_read = fread(buffer, 1, len, f);
fclose(f);
return bytes_read;
}
int CustomSDPort::SDPort_WriteOffset(const char *path, const void *data, size_t len, bool append) {
if (sdcard_host == NULL) {
ESP_LOGE(TAG, "SD card not initialized");
return ESP_ERR_INVALID_STATE;
}
if (sdmmc_get_status(sdcard_host) != ESP_OK) {
ESP_LOGE(TAG, "SD card not ready");
return ESP_FAIL;
}
const char *mode = append ? "ab" : "wb";
FILE *f = fopen(path, mode);
if (f == NULL) {
ESP_LOGE(TAG, "Failed to open file: %s", path);
return ESP_ERR_NOT_FOUND;
}
size_t bytes_written = fwrite(data, 1, len, f);
fclose(f);
if (!append && len == 0) {
ESP_LOGI(TAG, "File cleared: %s", path);
return ESP_OK;
}
return bytes_written;
}