mirror of
https://github.com/espressif/esp-idf.git
synced 2025-08-09 20:41:14 +00:00
sdio: allow reads/writes with lengths not divisible by 4
CMD53 in byte mode supports transfers of any number of bytes between 1 and 512. This change removes limitation that the number of bytes must be divisible by 4. Host quirk, that such transfers must be split into two commands (one for the aligned part and the other one for unaligned) is taken into account.
This commit is contained in:

committed by
Angus Gratton

parent
97a228e6ab
commit
cf81db40a2
@@ -309,35 +309,33 @@ static void test_cmd52_read_write_single_byte(sdmmc_card_t* card)
|
||||
TEST_ASSERT_EQUAL_UINT8(test_byte_2, val);
|
||||
}
|
||||
|
||||
static void test_cmd53_read_write_multiple_bytes(sdmmc_card_t* card)
|
||||
static void test_cmd53_read_write_multiple_bytes(sdmmc_card_t* card, size_t n_bytes)
|
||||
{
|
||||
printf("Write multiple bytes using CMD53\n");
|
||||
const size_t scratch_area_reg = SLCHOST_CONF_W0 - DR_REG_SLCHOST_BASE;
|
||||
|
||||
uint8_t* src = heap_caps_malloc(512, MALLOC_CAP_DMA);
|
||||
uint32_t* src_32 = (uint32_t*) src;
|
||||
const size_t n_words = 6;
|
||||
srand(0);
|
||||
for (size_t i = 0; i < n_words; ++i) {
|
||||
|
||||
for (size_t i = 0; i < (n_bytes + 3) / 4; ++i) {
|
||||
src_32[i] = rand();
|
||||
}
|
||||
size_t len = n_words * sizeof(uint32_t);
|
||||
|
||||
TEST_ESP_OK(sdmmc_io_write_bytes(card, 1, scratch_area_reg, src, len));
|
||||
ESP_LOG_BUFFER_HEX(TAG, src, len);
|
||||
TEST_ESP_OK(sdmmc_io_write_bytes(card, 1, scratch_area_reg, src, n_bytes));
|
||||
ESP_LOG_BUFFER_HEX(TAG, src, n_bytes);
|
||||
|
||||
printf("Read back using CMD52\n");
|
||||
uint8_t* dst = heap_caps_malloc(512, MALLOC_CAP_DMA);
|
||||
for (size_t i = 0; i < len; ++i) {
|
||||
for (size_t i = 0; i < n_bytes; ++i) {
|
||||
TEST_ESP_OK(sdmmc_io_read_byte(card, 1, scratch_area_reg + i, &dst[i]));
|
||||
}
|
||||
ESP_LOG_BUFFER_HEX(TAG, dst, len);
|
||||
TEST_ASSERT_EQUAL_UINT8_ARRAY(src, dst, len);
|
||||
ESP_LOG_BUFFER_HEX(TAG, dst, n_bytes);
|
||||
TEST_ASSERT_EQUAL_UINT8_ARRAY(src, dst, n_bytes);
|
||||
|
||||
printf("Read back using CMD53\n");
|
||||
TEST_ESP_OK(sdmmc_io_read_bytes(card, 1, scratch_area_reg, dst, len));
|
||||
ESP_LOG_BUFFER_HEX(TAG, dst, len);
|
||||
TEST_ASSERT_EQUAL_UINT8_ARRAY(src, dst, len);
|
||||
TEST_ESP_OK(sdmmc_io_read_bytes(card, 1, scratch_area_reg, dst, n_bytes));
|
||||
ESP_LOG_BUFFER_HEX(TAG, dst, n_bytes);
|
||||
TEST_ASSERT_EQUAL_UINT8_ARRAY(src, dst, n_bytes);
|
||||
|
||||
free(src);
|
||||
free(dst);
|
||||
@@ -364,9 +362,16 @@ TEST_CASE("can probe and talk to ESP32 SDIO slave", "[sdio][ignore]")
|
||||
/* Set up standard SDIO registers */
|
||||
sdio_slave_common_init(card);
|
||||
|
||||
for (int repeat = 0; repeat < 10; ++repeat) {
|
||||
srand(0);
|
||||
for (int repeat = 0; repeat < 4; ++repeat) {
|
||||
test_cmd52_read_write_single_byte(card);
|
||||
test_cmd53_read_write_multiple_bytes(card);
|
||||
test_cmd53_read_write_multiple_bytes(card, 1);
|
||||
test_cmd53_read_write_multiple_bytes(card, 2);
|
||||
test_cmd53_read_write_multiple_bytes(card, 3);
|
||||
test_cmd53_read_write_multiple_bytes(card, 4);
|
||||
test_cmd53_read_write_multiple_bytes(card, 5);
|
||||
test_cmd53_read_write_multiple_bytes(card, 23);
|
||||
test_cmd53_read_write_multiple_bytes(card, 24);
|
||||
}
|
||||
|
||||
sdio_slave_set_blocksize(card, 0, 512);
|
||||
|
Reference in New Issue
Block a user