You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ESP32开启安全启动+闪存加密后SD卡fopen报errno22的疑问

ESP32安全启动+闪存加密下SD卡fopen报errno 22(无效参数)问题

问题描述

在ESP32-WROOM开发板上尝试向SD卡写入数据,使用以下文件创建函数:

bool create_file(const char *file_path, const char *data)
{
    if (!file_path || !data) {
        printf("Error: Invalid parameters for file creation\n");
        return false;
    }
    
    char full_path[256];
    int ret = snprintf(full_path, sizeof(full_path), "%s/%s", MOUNT_POINT, file_path);
    if (ret >= sizeof(full_path)) {
        printf("Error: File path too long: %s/%s\n", MOUNT_POINT, file_path);
        return false;
    }

    FILE *file = fopen(full_path, "w");
    if (!file) {
        printf("Failed to create file: %s (errno: %d, %s)\n", 
               full_path, errno, strerror(errno));
        return false;
    }
    
    size_t data_len = strlen(data);
    size_t written = fwrite(data, 1, data_len, file);
    fclose(file);
    
    if (written != data_len) {
        printf("Error: Failed to write complete data to file: %s\n", full_path);
        return false;
    }
    
    printf("File created successfully: %s (%zu bytes)\n", full_path, written);
    return true;
}

报错信息

Failed to create file: /sdcard/tel_13092025114100.json (errno: 22, Invalid argument)

观察结果

  • 完整路径长度不足100字符,排除路径过长问题;
  • 同一张SD卡在其他项目中可正常使用,SD卡无故障;
  • 同一ESP32设备硬件卡槽无问题;
  • 仅开启外部闪存加密的项目中代码正常运行,新增安全启动配置后出现错误。

环境信息

  • 开发板:ESP32-WROOM
  • SD卡:SanDisk 16GB
  • SDK:ESP-IDF
  • 配置对比:单独开启外部闪存加密(正常);开启安全启动+闪存加密(失败)

疑问

为何仅在安全启动+闪存加密配置下SD卡文件创建会报errno 22?该配置下使用SD卡是否需要额外ESP-IDF配置?


问题分析与解决方案

核心原因是安全启动策略对ESP32外设访问、引脚权限的额外限制——单独开启闪存加密时无此限制,因此可正常工作。以下是具体排查和解决步骤:

1. 配置SD卡引脚的安全访问权限

安全启动启用后,ESP32会默认限制外部SPI设备的GPIO引脚使用,需手动添加SD卡引脚到允许列表:

  • 打开项目menuconfig,进入Component config -> Security features -> Secure boot
  • 找到Allow GPIO pins to be used for external SPI devices选项,将SD卡使用的SPI引脚(如CS、CLK、MISO、MOSI,对应你的硬件引脚编号)添加到该列表
  • 保存配置后重新编译烧录

2. 验证SD卡挂载参数

确保挂载逻辑参数正确,避免安全启动下的权限限制:

  • 检查SD卡挂载代码,确认未使用只读挂载参数(MS_RDONLY),写操作需使用MS_RDWR或MS_WRONLY权限
  • 确认MOUNT_POINT(如/sdcard)已被正确创建,且无文件系统权限限制

3. 排查ESP-IDF版本兼容性

部分旧版本ESP-IDF在安全启动+闪存加密组合下存在SD卡驱动bug:

  • 升级ESP-IDF到v4.4及以上的稳定版本,修复已知的兼容性问题

4. 简化测试排除变量

  • 尝试创建极简文件名(如test.txt),排除特殊字符或文件名格式在安全模式下的限制
  • 挂载SD卡后,调用stat或ls命令确认挂载点存在且可访问

5. 检查SD卡驱动配置

进入menuconfig的Component config -> SD/MMC Card Support:

  • 确认SD卡通信模式(SPI/SDIO)与硬件匹配,对应驱动选项已启用
  • 若使用SPI模式,确保CONFIG_SPI_MASTER已启用,且SPI总线配置未与安全启动冲突

内容的提问来源于stack exchange,提问作者mauli02k

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 09:23:16