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
相关产品推荐
相关产品推荐

