mirror of
https://github.com/espressif/esp-idf.git
synced 2025-08-04 21:24:32 +02:00
Merge branch 'bugfix/sdmmc_io_fixed_addr_splitting' into 'master'
fix(sdmmc_io): fixed fixed_addr mode will still increase addr when splitting See merge request espressif/esp-idf!31806
This commit is contained in:
@@ -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,7 +409,9 @@ 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;
|
||||||
addr += will_transfer;
|
if (incr_addr) {
|
||||||
|
addr += will_transfer;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return ESP_OK;
|
return ESP_OK;
|
||||||
}
|
}
|
||||||
@@ -413,11 +419,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,
|
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,7 +444,9 @@ 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;
|
||||||
addr += will_transfer;
|
if (incr_addr) {
|
||||||
|
addr += will_transfer;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return ESP_OK;
|
return ESP_OK;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user