Merge branch 'contrib/github_pr_17642_v6.0' into 'release/v6.0'

feat(sdmmc): support multi-block read/writes (GitHub PR) (v6.0)

See merge request espressif/esp-idf!46776
This commit is contained in:
Martin Vychodil
2026-03-24 19:10:58 +08:00
16 changed files with 328 additions and 40 deletions

View File

@@ -56,6 +56,19 @@ SD/SDIO/MMC 驱动支持 SD 存储器、SDIO 卡和 eMMC 芯片。这是一个
- 如果不再使用该卡,请调用主机驱动函数,例如 ``sdmmc_host_deinit````sdspi_host_deinit``以禁用SDMMC 主机外设或 SDSPI 主机外设,并释放驱动程序分配的资源。
未对齐 buffer 性能
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
当传递给 :cpp:func:`sdmmc_read_sectors`:cpp:func:`sdmmc_write_sectors` 的 buffer 不支持 DMA例如分配在 PSRAM 中)时,驱动会通过一个临时的支持 DMA 的 buffer 来复制数据。默认情况下,该操作会使用单块传输命令一次传输一个块。
若要在此场景下提升吞吐量,可将 :cpp:member:`sdmmc_host_t::unaligned_multi_block_rw_max_chunk_size` 字段设置为大于 1 的值。驱动将启用多块传输命令 (CMD18/CMD25)从而显著降低传输开销但堆内存占用会相应增加buffer 大小 = N × 块大小,其中 N 为配置值,块大小通常为 512 字节)。当该字段为 0默认值驱动回退至单块传输模式等效于 1。建议将大于 1 的配置值设置为块大小的整数倍(如 2、4、8、16 或 32以获得最佳性能。
.. note::
如果你的 SD 卡或配置不支持多块读写命令CMD18 和 CMD25请将该选项值保持为 0 或 1。
或者,可以通过 :cpp:member:`sdmmc_host_t::dma_aligned_buffer` 字段提供一个预先分配的、支持 DMA 的 buffer。这样可以避免每次传输时都分配堆内存驱动也能在多次传输间复用该 buffer。该 buffer 的大小必须至少为一个扇区(通常为 512 字节),理想情况下应为扇区大小的整数倍。
.. only:: not SOC_SDMMC_HOST_SUPPORTED
eMMC 芯片支持