From 4e0d5c923d70d16833b291b4add2e2fb6c22d3e9 Mon Sep 17 00:00:00 2001 From: "Michael (XIAO Xufeng)" Date: Sat, 29 Jun 2024 02:26:14 +0800 Subject: [PATCH] fix(sdmmc_io): fixed fixed_addr mode will still increase addr when splitting --- components/sdmmc/sdmmc_io.c | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/components/sdmmc/sdmmc_io.c b/components/sdmmc/sdmmc_io.c index 376cebc9e5..74ab6dd735 100644 --- a/components/sdmmc/sdmmc_io.c +++ b/components/sdmmc/sdmmc_io.c @@ -336,11 +336,15 @@ esp_err_t sdmmc_io_rw_extended(sdmmc_card_t* card, int func, esp_err_t sdmmc_io_read_bytes(sdmmc_card_t* card, uint32_t function, uint32_t addr, void* dst, size_t size) { - uint32_t arg = SD_ARG_CMD53_READ | SD_ARG_CMD53_INCREMENT; - //Extract and unset the bit used to indicate the OP Code (inverted logic) + uint32_t arg = SD_ARG_CMD53_READ; + bool incr_addr = true; + //Extract and unset the bit used to indicate the OP Code if (addr & SDMMC_IO_FIXED_ADDR) { - arg &= ~SD_ARG_CMD53_INCREMENT; addr &= ~SDMMC_IO_FIXED_ADDR; + incr_addr = false; + } + if (incr_addr) { + arg |= SD_ARG_CMD53_INCREMENT; } /* host quirk: SDIO transfer with length not divisible by 4 bytes @@ -360,7 +364,9 @@ esp_err_t sdmmc_io_read_bytes(sdmmc_card_t* card, uint32_t function, } pc_dst += will_transfer; size -= will_transfer; - addr += will_transfer; + if (incr_addr) { + addr += will_transfer; + } } return ESP_OK; } @@ -368,11 +374,15 @@ esp_err_t sdmmc_io_read_bytes(sdmmc_card_t* card, uint32_t function, esp_err_t sdmmc_io_write_bytes(sdmmc_card_t* card, uint32_t function, uint32_t addr, const void* src, size_t size) { - uint32_t arg = SD_ARG_CMD53_WRITE | SD_ARG_CMD53_INCREMENT; - //Extract and unset the bit used to indicate the OP Code (inverted logic) + uint32_t arg = SD_ARG_CMD53_WRITE; + bool incr_addr = true; + //Extract and unset the bit used to indicate the OP Code if (addr & SDMMC_IO_FIXED_ADDR) { - arg &= ~SD_ARG_CMD53_INCREMENT; addr &= ~SDMMC_IO_FIXED_ADDR; + incr_addr = false; + } + if (incr_addr) { + arg |= SD_ARG_CMD53_INCREMENT; } /* same host quirk as in sdmmc_io_read_bytes */ @@ -389,7 +399,9 @@ esp_err_t sdmmc_io_write_bytes(sdmmc_card_t* card, uint32_t function, } pc_src += will_transfer; size -= will_transfer; - addr += will_transfer; + if (incr_addr) { + addr += will_transfer; + } } return ESP_OK; }