fix(sdmmc_io): fixed fixed_addr mode will still increase addr when splitting

This commit is contained in:
Michael (XIAO Xufeng)
2024-06-29 02:26:14 +08:00
committed by Xiao Xufeng
parent b1c8757b9f
commit fded5b0ce3

View File

@@ -381,11 +381,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, esp_err_t sdmmc_io_read_bytes(sdmmc_card_t* card, uint32_t function,
uint32_t addr, void* dst, size_t size) uint32_t addr, void* dst, size_t size)
{ {
uint32_t arg = SD_ARG_CMD53_READ | SD_ARG_CMD53_INCREMENT; uint32_t arg = SD_ARG_CMD53_READ;
//Extract and unset the bit used to indicate the OP Code (inverted logic) bool incr_addr = true;
//Extract and unset the bit used to indicate the OP Code
if (addr & SDMMC_IO_FIXED_ADDR) { if (addr & SDMMC_IO_FIXED_ADDR) {
arg &= ~SD_ARG_CMD53_INCREMENT;
addr &= ~SDMMC_IO_FIXED_ADDR; 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 /* host quirk: SDIO transfer with length not divisible by 4 bytes
@@ -405,19 +409,25 @@ esp_err_t sdmmc_io_read_bytes(sdmmc_card_t* card, uint32_t function,
} }
pc_dst += will_transfer; pc_dst += will_transfer;
size -= will_transfer; size -= will_transfer;
if (incr_addr) {
addr += will_transfer; addr += will_transfer;
} }
}
return ESP_OK; return ESP_OK;
} }
esp_err_t sdmmc_io_write_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 addr, const void* src, size_t size)
{ {
uint32_t arg = SD_ARG_CMD53_WRITE | SD_ARG_CMD53_INCREMENT; uint32_t arg = SD_ARG_CMD53_WRITE;
//Extract and unset the bit used to indicate the OP Code (inverted logic) bool incr_addr = true;
//Extract and unset the bit used to indicate the OP Code
if (addr & SDMMC_IO_FIXED_ADDR) { if (addr & SDMMC_IO_FIXED_ADDR) {
arg &= ~SD_ARG_CMD53_INCREMENT;
addr &= ~SDMMC_IO_FIXED_ADDR; 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 */ /* same host quirk as in sdmmc_io_read_bytes */
@@ -434,8 +444,10 @@ esp_err_t sdmmc_io_write_bytes(sdmmc_card_t* card, uint32_t function,
} }
pc_src += will_transfer; pc_src += will_transfer;
size -= will_transfer; size -= will_transfer;
if (incr_addr) {
addr += will_transfer; addr += will_transfer;
} }
}
return ESP_OK; return ESP_OK;
} }