forked from espressif/esp-idf
fix(sdmmc_io): fixed fixed_addr mode will still increase addr when splitting
This commit is contained in:
committed by
Xiao Xufeng
parent
b1c8757b9f
commit
fded5b0ce3
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user