mirror of
https://github.com/espressif/esp-idf.git
synced 2026-04-27 19:13:21 +00:00
95 lines
2.8 KiB
C
95 lines
2.8 KiB
C
/*
|
|
* SPDX-FileCopyrightText: 2025 Espressif Systems (Shanghai) CO LTD
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <inttypes.h>
|
|
#include "unity.h"
|
|
#include "unity_fixture.h"
|
|
#include "sd_protocol_defs.h"
|
|
#include "sdmmc_cmd.h"
|
|
#include "sdmmc_test_begin_end_sd.h"
|
|
#include "sdmmc_test_rw_common.h"
|
|
#include "esp_blockdev.h"
|
|
|
|
TEST_GROUP(sdmmc);
|
|
|
|
TEST_SETUP(sdmmc)
|
|
{
|
|
}
|
|
|
|
TEST_TEAR_DOWN(sdmmc)
|
|
{
|
|
}
|
|
|
|
TEST(sdmmc, test_bdl_interface)
|
|
{
|
|
sdmmc_card_t card;
|
|
int slot = 1;
|
|
int width = 1;
|
|
int freq_khz = SDMMC_FREQ_DEFAULT;
|
|
sdmmc_test_sd_skip_if_board_incompatible(slot, width, freq_khz, 0, 0);
|
|
sdmmc_test_sd_begin(slot, width, freq_khz, 0, &card);
|
|
|
|
uint8_t erased_val = card.scr.erase_mem_state == 0 ? 0 : 255; // SD card marks erased space either 0 or as 0xFF (255)
|
|
|
|
//get the block-device interface instance
|
|
esp_blockdev_handle_t sdmmc_blockdev = NULL;
|
|
TEST_ESP_OK(sdmmc_get_blockdev(&card, &sdmmc_blockdev));
|
|
TEST_ASSERT_NOT_NULL(sdmmc_blockdev);
|
|
|
|
const uint64_t target_addr = 512 * 10;// a multiple of 512 (sector size)
|
|
const size_t data_size = 1024; // a multiple of 512 (sector size)
|
|
|
|
//write to the blockdev
|
|
uint8_t* test_data = malloc(data_size);
|
|
memset((void*)test_data, 'A', data_size);
|
|
TEST_ESP_OK(sdmmc_blockdev->ops->write(sdmmc_blockdev, test_data, target_addr, data_size));
|
|
|
|
//read from the blockdev the data written before
|
|
uint8_t* data_buffer = malloc(data_size);
|
|
memset((void*)data_buffer, 'X', data_size);
|
|
TEST_ESP_OK(sdmmc_blockdev->ops->read(sdmmc_blockdev, data_buffer, data_size, target_addr, data_size));
|
|
TEST_ASSERT_EQUAL(0, memcmp(test_data, data_buffer, data_size));
|
|
|
|
//erase the data from the blockdev and check it's really wiped
|
|
TEST_ESP_OK(sdmmc_blockdev->ops->erase(sdmmc_blockdev, target_addr, data_size));
|
|
TEST_ESP_OK(sdmmc_blockdev->ops->read(sdmmc_blockdev, data_buffer, data_size, target_addr, data_size));
|
|
{
|
|
uint8_t ten_erased[10] = {[0 ... 9] = erased_val};
|
|
TEST_ASSERT_EQUAL(0, memcmp(ten_erased, data_buffer, 10));
|
|
}
|
|
free(data_buffer);
|
|
free(test_data);
|
|
|
|
//release the BDL object
|
|
TEST_ESP_OK(sdmmc_blockdev->ops->release(sdmmc_blockdev));
|
|
sdmmc_test_sd_end(&card);
|
|
}
|
|
|
|
TEST(sdmmc, test_multiblock_unaligned_rw)
|
|
{
|
|
sdmmc_card_t card;
|
|
int slot = 1;
|
|
int width = 1;
|
|
int freq_khz = SDMMC_FREQ_DEFAULT;
|
|
sdmmc_test_sd_skip_if_board_incompatible(slot, width, freq_khz, 0, 0);
|
|
sdmmc_test_sd_begin(slot, width, freq_khz, 0, &card);
|
|
sdmmc_test_rw_unaligned_buffer_multiblock(&card, 4);
|
|
sdmmc_test_sd_end(&card);
|
|
}
|
|
|
|
TEST_GROUP_RUNNER(sdmmc)
|
|
{
|
|
RUN_TEST_CASE(sdmmc, test_bdl_interface)
|
|
RUN_TEST_CASE(sdmmc, test_multiblock_unaligned_rw)
|
|
}
|
|
|
|
void app_main(void)
|
|
{
|
|
UNITY_MAIN(sdmmc);
|
|
}
|