ci: disable unavailable tests for esp32s2beta
This commit is contained in:
parent
e44df658d5
commit
76a3a5fb48
30 changed files with 707 additions and 748 deletions
|
@ -1,3 +1,5 @@
|
||||||
idf_component_register(SRC_DIRS "."
|
if(IDF_TARGET STREQUAL "esp32")
|
||||||
INCLUDE_DIRS "."
|
idf_component_register(SRC_DIRS "."
|
||||||
REQUIRES unity test_utils app_update bootloader_support nvs_flash)
|
INCLUDE_DIRS "."
|
||||||
|
REQUIRES unity test_utils app_update bootloader_support nvs_flash)
|
||||||
|
endif()
|
||||||
|
|
|
@ -33,7 +33,7 @@ TEST_CASE("Verify bootloader image in flash", "[bootloader_support]")
|
||||||
TEST_ASSERT_EQUAL(data.image_len, bootloader_length);
|
TEST_ASSERT_EQUAL(data.image_len, bootloader_length);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("Verify unit test app image", "[bootloader_support]")
|
TEST_CASE_ESP32("Verify unit test app image", "[bootloader_support]")
|
||||||
{
|
{
|
||||||
esp_image_metadata_t data = { 0 };
|
esp_image_metadata_t data = { 0 };
|
||||||
const esp_partition_t *running = esp_ota_get_running_partition();
|
const esp_partition_t *running = esp_ota_get_running_partition();
|
||||||
|
|
|
@ -276,14 +276,14 @@ TEST_CASE("c++ exceptions emergency pool", "[cxx] [ignore]")
|
||||||
|
|
||||||
#else // !CONFIG_COMPILER_CXX_EXCEPTIONS
|
#else // !CONFIG_COMPILER_CXX_EXCEPTIONS
|
||||||
|
|
||||||
TEST_CASE("std::out_of_range exception when -fno-exceptions", "[cxx][reset=abort,SW_CPU_RESET]")
|
TEST_CASE_ESP32("std::out_of_range exception when -fno-exceptions", "[cxx][reset=abort,SW_CPU_RESET]")
|
||||||
{
|
{
|
||||||
std::vector<int> v(10);
|
std::vector<int> v(10);
|
||||||
v.at(20) = 42;
|
v.at(20) = 42;
|
||||||
TEST_FAIL_MESSAGE("Unreachable because we are aborted on the line above");
|
TEST_FAIL_MESSAGE("Unreachable because we are aborted on the line above");
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("std::bad_alloc exception when -fno-exceptions", "[cxx][reset=abort,SW_CPU_RESET]")
|
TEST_CASE_ESP32("std::bad_alloc exception when -fno-exceptions", "[cxx][reset=abort,SW_CPU_RESET]")
|
||||||
{
|
{
|
||||||
std::string s = std::string(2000000000, 'a');
|
std::string s = std::string(2000000000, 'a');
|
||||||
(void)s;
|
(void)s;
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
#include "freertos/task.h"
|
#include "freertos/task.h"
|
||||||
#include "driver/i2s.h"
|
#include "driver/i2s.h"
|
||||||
#include "unity.h"
|
#include "unity.h"
|
||||||
|
#include "math.h"
|
||||||
|
|
||||||
#define SAMPLE_RATE (36000)
|
#define SAMPLE_RATE (36000)
|
||||||
#define SAMPLE_BITS (16)
|
#define SAMPLE_BITS (16)
|
||||||
|
@ -18,7 +19,55 @@
|
||||||
#define SLAVE_WS_IO 26
|
#define SLAVE_WS_IO 26
|
||||||
#define DATA_IN_IO 21
|
#define DATA_IN_IO 21
|
||||||
#define DATA_OUT_IO 22
|
#define DATA_OUT_IO 22
|
||||||
|
#define PERCENT_DIFF 0.0001
|
||||||
|
|
||||||
|
/**
|
||||||
|
* i2s initialize test
|
||||||
|
* 1. i2s_driver_install
|
||||||
|
* 2. i2s_set_pin
|
||||||
|
*/
|
||||||
|
TEST_CASE("I2S basic driver install, uninstall, set pin test", "[i2s]")
|
||||||
|
{
|
||||||
|
// dac, adc i2s
|
||||||
|
i2s_config_t i2s_config = {
|
||||||
|
.mode = I2S_MODE_MASTER | I2S_MODE_TX,
|
||||||
|
.sample_rate = SAMPLE_RATE,
|
||||||
|
.bits_per_sample = SAMPLE_BITS,
|
||||||
|
.channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT,
|
||||||
|
.communication_format = I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB,
|
||||||
|
.dma_buf_count = 6,
|
||||||
|
.dma_buf_len = 60,
|
||||||
|
.use_apll = 0,
|
||||||
|
.intr_alloc_flags = ESP_INTR_FLAG_LEVEL1 ,
|
||||||
|
};
|
||||||
|
|
||||||
|
//install and start i2s driver
|
||||||
|
TEST_ESP_OK(i2s_driver_install(I2S_NUM_0, &i2s_config, 0, NULL));
|
||||||
|
//for internal DAC, this will enable both of the internal channels
|
||||||
|
TEST_ESP_OK(i2s_set_pin(I2S_NUM_0, NULL));
|
||||||
|
//stop & destroy i2s driver
|
||||||
|
TEST_ESP_OK(i2s_driver_uninstall(I2S_NUM_0));
|
||||||
|
|
||||||
|
// normal i2s
|
||||||
|
i2s_pin_config_t pin_config = {
|
||||||
|
.bck_io_num = MASTER_BCK_IO,
|
||||||
|
.ws_io_num = MASTER_WS_IO,
|
||||||
|
.data_out_num = DATA_OUT_IO,
|
||||||
|
.data_in_num = -1
|
||||||
|
};
|
||||||
|
TEST_ESP_OK(i2s_driver_install(I2S_NUM_0, &i2s_config, 0, NULL));
|
||||||
|
TEST_ESP_OK(i2s_set_pin(I2S_NUM_0, &pin_config));
|
||||||
|
TEST_ESP_OK(i2s_driver_uninstall(I2S_NUM_0));
|
||||||
|
|
||||||
|
//error param test
|
||||||
|
TEST_ASSERT(i2s_driver_install(I2S_NUM_MAX, &i2s_config, 0, NULL) == ESP_ERR_INVALID_ARG);
|
||||||
|
TEST_ASSERT(i2s_driver_install(I2S_NUM_0, NULL, 0, NULL) == ESP_ERR_INVALID_ARG);
|
||||||
|
i2s_config.dma_buf_count = 1;
|
||||||
|
TEST_ASSERT(i2s_driver_install(I2S_NUM_0, &i2s_config, 0, NULL) == ESP_ERR_INVALID_ARG);
|
||||||
|
i2s_config.dma_buf_count = 129;
|
||||||
|
TEST_ASSERT(i2s_driver_install(I2S_NUM_0, &i2s_config, 0, NULL) == ESP_ERR_INVALID_ARG);
|
||||||
|
TEST_ESP_OK(i2s_driver_uninstall(I2S_NUM_0));
|
||||||
|
}
|
||||||
|
|
||||||
TEST_CASE("I2S write and read test(master tx and slave rx)", "[i2s][test_env=UT_T1_I2S]")
|
TEST_CASE("I2S write and read test(master tx and slave rx)", "[i2s][test_env=UT_T1_I2S]")
|
||||||
{
|
{
|
||||||
|
@ -185,3 +234,89 @@ TEST_CASE("I2S write and read test(master rx and slave tx)", "[i2s][test_env=UT_
|
||||||
i2s_driver_uninstall(I2S_NUM_0);
|
i2s_driver_uninstall(I2S_NUM_0);
|
||||||
i2s_driver_uninstall(I2S_NUM_1);
|
i2s_driver_uninstall(I2S_NUM_1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_CASE("I2S memory leaking test", "[i2s]")
|
||||||
|
{
|
||||||
|
i2s_config_t master_i2s_config = {
|
||||||
|
.mode = I2S_MODE_MASTER | I2S_MODE_RX,
|
||||||
|
.sample_rate = SAMPLE_RATE,
|
||||||
|
.bits_per_sample = SAMPLE_BITS,
|
||||||
|
.channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT,
|
||||||
|
.communication_format = I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB,
|
||||||
|
.dma_buf_count = 6,
|
||||||
|
.dma_buf_len = 100,
|
||||||
|
.use_apll = 0,
|
||||||
|
.intr_alloc_flags = ESP_INTR_FLAG_LEVEL1 ,
|
||||||
|
};
|
||||||
|
i2s_pin_config_t master_pin_config = {
|
||||||
|
.bck_io_num = MASTER_BCK_IO,
|
||||||
|
.ws_io_num = MASTER_WS_IO,
|
||||||
|
.data_out_num = -1,
|
||||||
|
.data_in_num = DATA_IN_IO
|
||||||
|
};
|
||||||
|
|
||||||
|
TEST_ESP_OK(i2s_driver_install(I2S_NUM_0, &master_i2s_config, 0, NULL));
|
||||||
|
TEST_ESP_OK(i2s_set_pin(I2S_NUM_0, &master_pin_config));
|
||||||
|
i2s_driver_uninstall(I2S_NUM_0);
|
||||||
|
int initial_size = esp_get_free_heap_size();
|
||||||
|
|
||||||
|
for(int i=0; i<100; i++) {
|
||||||
|
TEST_ESP_OK(i2s_driver_install(I2S_NUM_0, &master_i2s_config, 0, NULL));
|
||||||
|
TEST_ESP_OK(i2s_set_pin(I2S_NUM_0, &master_pin_config));
|
||||||
|
i2s_driver_uninstall(I2S_NUM_0);
|
||||||
|
TEST_ASSERT(initial_size == esp_get_free_heap_size());
|
||||||
|
}
|
||||||
|
vTaskDelay(100 / portTICK_PERIOD_MS);
|
||||||
|
TEST_ASSERT(initial_size == esp_get_free_heap_size());
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The I2S APLL clock variation test used to test the difference between the different sample rates, different bits per sample
|
||||||
|
* and the APLL clock generate for it. The TEST_CASE passes PERCENT_DIFF variation from the provided sample rate in APLL generated clock
|
||||||
|
* The percentage difference calculated as (mod((obtained clock rate - desired clock rate)/(desired clock rate))) * 100.
|
||||||
|
*/
|
||||||
|
TEST_CASE("I2S APLL clock variation test", "[i2s]")
|
||||||
|
{
|
||||||
|
i2s_pin_config_t pin_config = {
|
||||||
|
.bck_io_num = MASTER_BCK_IO,
|
||||||
|
.ws_io_num = MASTER_WS_IO,
|
||||||
|
.data_out_num = DATA_OUT_IO,
|
||||||
|
.data_in_num = -1
|
||||||
|
};
|
||||||
|
|
||||||
|
i2s_config_t i2s_config = {
|
||||||
|
.mode = I2S_MODE_MASTER | I2S_MODE_TX,
|
||||||
|
.sample_rate = SAMPLE_RATE,
|
||||||
|
.bits_per_sample = SAMPLE_BITS,
|
||||||
|
.channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT,
|
||||||
|
.communication_format = I2S_COMM_FORMAT_I2S,
|
||||||
|
.dma_buf_count = 6,
|
||||||
|
.dma_buf_len = 60,
|
||||||
|
.use_apll = true,
|
||||||
|
.intr_alloc_flags = 0,
|
||||||
|
};
|
||||||
|
|
||||||
|
TEST_ESP_OK(i2s_driver_install(I2S_NUM_0, &i2s_config, 0, NULL));
|
||||||
|
TEST_ESP_OK(i2s_set_pin(I2S_NUM_0, &pin_config));
|
||||||
|
TEST_ESP_OK(i2s_driver_uninstall(I2S_NUM_0));
|
||||||
|
int initial_size = esp_get_free_heap_size();
|
||||||
|
|
||||||
|
uint32_t sample_rate_arr[8] = { 10675, 11025, 16000, 22050, 32000, 44100, 48000, 96000 };
|
||||||
|
int bits_per_sample_arr[3] = { 16, 24, 32 };
|
||||||
|
|
||||||
|
for (int i = 0; i < (sizeof(sample_rate_arr)/sizeof(sample_rate_arr[0])); i++) {
|
||||||
|
for (int j = 0; j < (sizeof(bits_per_sample_arr)/sizeof(bits_per_sample_arr[0])); j++) {
|
||||||
|
i2s_config.sample_rate = sample_rate_arr[i];
|
||||||
|
i2s_config.bits_per_sample = bits_per_sample_arr[j];
|
||||||
|
|
||||||
|
TEST_ESP_OK(i2s_driver_install(I2S_NUM_0, &i2s_config, 0, NULL));
|
||||||
|
TEST_ESP_OK(i2s_set_pin(I2S_NUM_0, &pin_config));
|
||||||
|
TEST_ASSERT((fabs((i2s_get_clk(I2S_NUM_0) - sample_rate_arr[i]))/(sample_rate_arr[i]))*100 < PERCENT_DIFF);
|
||||||
|
TEST_ESP_OK(i2s_driver_uninstall(I2S_NUM_0));
|
||||||
|
TEST_ASSERT(initial_size == esp_get_free_heap_size());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
vTaskDelay(100 / portTICK_PERIOD_MS);
|
||||||
|
TEST_ASSERT(initial_size == esp_get_free_heap_size());
|
||||||
|
}
|
||||||
|
|
|
@ -5,6 +5,430 @@
|
||||||
#include "soc/spi_periph.h"
|
#include "soc/spi_periph.h"
|
||||||
#include "test/test_common_spi.h"
|
#include "test/test_common_spi.h"
|
||||||
|
|
||||||
|
/********************************************************************************
|
||||||
|
* Test By Internal Connections
|
||||||
|
********************************************************************************/
|
||||||
|
static void local_test_init(void** context);
|
||||||
|
static void local_test_deinit(void* context);
|
||||||
|
static void local_test_loop(const void *test_param, void* context);
|
||||||
|
|
||||||
|
static const ptest_func_t local_test_func = {
|
||||||
|
.pre_test = local_test_init,
|
||||||
|
.post_test = local_test_deinit,
|
||||||
|
.loop = local_test_loop,
|
||||||
|
.def_param = spitest_def_param,
|
||||||
|
};
|
||||||
|
|
||||||
|
#define TEST_SPI_LOCAL(name, param_set) \
|
||||||
|
PARAM_GROUP_DECLARE(name, param_set) \
|
||||||
|
TEST_LOCAL(name, param_set, "[spi][timeout=120]", &local_test_func)
|
||||||
|
|
||||||
|
static void local_test_init(void** arg)
|
||||||
|
{
|
||||||
|
TEST_ASSERT(*arg==NULL);
|
||||||
|
*arg = malloc(sizeof(spitest_context_t));
|
||||||
|
spitest_context_t* context = (spitest_context_t*)*arg;
|
||||||
|
TEST_ASSERT(context!=NULL);
|
||||||
|
context->slave_context = (spi_slave_task_context_t){};
|
||||||
|
esp_err_t err = init_slave_context( &context->slave_context);
|
||||||
|
TEST_ASSERT(err == ESP_OK);
|
||||||
|
|
||||||
|
xTaskCreate(spitest_slave_task, "spi_slave", 4096, &context->slave_context, 0, &context->handle_slave);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void local_test_deinit(void* arg)
|
||||||
|
{
|
||||||
|
spitest_context_t* context = arg;
|
||||||
|
vTaskDelete(context->handle_slave);
|
||||||
|
context->handle_slave = 0;
|
||||||
|
deinit_slave_context(&context->slave_context);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void local_test_start(spi_device_handle_t *spi, int freq, const spitest_param_set_t* pset, spitest_context_t* context)
|
||||||
|
{
|
||||||
|
//master config
|
||||||
|
spi_bus_config_t buscfg = SPI_BUS_TEST_DEFAULT_CONFIG();
|
||||||
|
spi_device_interface_config_t devcfg = SPI_DEVICE_TEST_DEFAULT_CONFIG();
|
||||||
|
spi_slave_interface_config_t slvcfg = SPI_SLAVE_TEST_DEFAULT_CONFIG();
|
||||||
|
//pin config & initialize
|
||||||
|
//we can't have two sets of iomux pins on the same pins
|
||||||
|
assert(!pset->master_iomux || !pset->slave_iomux);
|
||||||
|
if (pset->slave_iomux) {
|
||||||
|
//only in this case, use VSPI iomux pins
|
||||||
|
buscfg.miso_io_num = VSPI_IOMUX_PIN_NUM_MISO;
|
||||||
|
buscfg.mosi_io_num = VSPI_IOMUX_PIN_NUM_MOSI;
|
||||||
|
buscfg.sclk_io_num = VSPI_IOMUX_PIN_NUM_CLK;
|
||||||
|
devcfg.spics_io_num = VSPI_IOMUX_PIN_NUM_CS;
|
||||||
|
slvcfg.spics_io_num = VSPI_IOMUX_PIN_NUM_CS;
|
||||||
|
} else {
|
||||||
|
buscfg.miso_io_num = HSPI_IOMUX_PIN_NUM_MISO;
|
||||||
|
buscfg.mosi_io_num = HSPI_IOMUX_PIN_NUM_MOSI;
|
||||||
|
buscfg.sclk_io_num = HSPI_IOMUX_PIN_NUM_CLK;
|
||||||
|
devcfg.spics_io_num = HSPI_IOMUX_PIN_NUM_CS;
|
||||||
|
slvcfg.spics_io_num = HSPI_IOMUX_PIN_NUM_CS;
|
||||||
|
}
|
||||||
|
//this does nothing, but avoid the driver from using iomux pins if required
|
||||||
|
buscfg.quadhd_io_num = (!pset->master_iomux && !pset->slave_iomux ? VSPI_IOMUX_PIN_NUM_MISO : -1);
|
||||||
|
devcfg.mode = pset->mode;
|
||||||
|
const int cs_pretrans_max = 15;
|
||||||
|
if (pset->dup == HALF_DUPLEX_MISO) {
|
||||||
|
devcfg.cs_ena_pretrans = cs_pretrans_max;
|
||||||
|
devcfg.flags |= SPI_DEVICE_HALFDUPLEX;
|
||||||
|
} else if (pset->dup == HALF_DUPLEX_MOSI) {
|
||||||
|
devcfg.cs_ena_pretrans = cs_pretrans_max;
|
||||||
|
devcfg.flags |= SPI_DEVICE_NO_DUMMY;
|
||||||
|
} else {
|
||||||
|
devcfg.cs_ena_pretrans = cs_pretrans_max;
|
||||||
|
}
|
||||||
|
const int cs_posttrans_max = 15;
|
||||||
|
devcfg.cs_ena_posttrans = cs_posttrans_max;
|
||||||
|
devcfg.input_delay_ns = pset->slave_tv_ns;
|
||||||
|
devcfg.clock_speed_hz = freq;
|
||||||
|
if (pset->master_limit != 0 && freq > pset->master_limit) devcfg.flags |= SPI_DEVICE_NO_DUMMY;
|
||||||
|
|
||||||
|
//slave config
|
||||||
|
slvcfg.mode = pset->mode;
|
||||||
|
|
||||||
|
slave_pull_up(&buscfg, slvcfg.spics_io_num);
|
||||||
|
|
||||||
|
TEST_ESP_OK(spi_bus_initialize(TEST_SPI_HOST, &buscfg, pset->master_dma_chan));
|
||||||
|
TEST_ESP_OK(spi_bus_add_device(TEST_SPI_HOST, &devcfg, spi));
|
||||||
|
|
||||||
|
//slave automatically use iomux pins if pins are on VSPI_* pins
|
||||||
|
buscfg.quadhd_io_num = -1;
|
||||||
|
TEST_ESP_OK(spi_slave_initialize(TEST_SLAVE_HOST, &buscfg, &slvcfg, pset->slave_dma_chan));
|
||||||
|
|
||||||
|
//initialize master and slave on the same pins break some of the output configs, fix them
|
||||||
|
if (pset->master_iomux) {
|
||||||
|
spitest_gpio_output_sel(buscfg.mosi_io_num, FUNC_SPI, HSPID_OUT_IDX);
|
||||||
|
spitest_gpio_output_sel(buscfg.miso_io_num, FUNC_GPIO, VSPIQ_OUT_IDX);
|
||||||
|
spitest_gpio_output_sel(devcfg.spics_io_num, FUNC_SPI, HSPICS0_OUT_IDX);
|
||||||
|
spitest_gpio_output_sel(buscfg.sclk_io_num, FUNC_SPI, HSPICLK_OUT_IDX);
|
||||||
|
} else if (pset->slave_iomux) {
|
||||||
|
spitest_gpio_output_sel(buscfg.mosi_io_num, FUNC_GPIO, HSPID_OUT_IDX);
|
||||||
|
spitest_gpio_output_sel(buscfg.miso_io_num, FUNC_SPI, VSPIQ_OUT_IDX);
|
||||||
|
spitest_gpio_output_sel(devcfg.spics_io_num, FUNC_GPIO, HSPICS0_OUT_IDX);
|
||||||
|
spitest_gpio_output_sel(buscfg.sclk_io_num, FUNC_GPIO, HSPICLK_OUT_IDX);
|
||||||
|
} else {
|
||||||
|
spitest_gpio_output_sel(buscfg.mosi_io_num, FUNC_GPIO, HSPID_OUT_IDX);
|
||||||
|
spitest_gpio_output_sel(buscfg.miso_io_num, FUNC_GPIO, VSPIQ_OUT_IDX);
|
||||||
|
spitest_gpio_output_sel(devcfg.spics_io_num, FUNC_GPIO, HSPICS0_OUT_IDX);
|
||||||
|
spitest_gpio_output_sel(buscfg.sclk_io_num, FUNC_GPIO, HSPICLK_OUT_IDX);
|
||||||
|
}
|
||||||
|
|
||||||
|
//prepare slave tx data
|
||||||
|
for (int k = 0; k < pset->test_size; k++)
|
||||||
|
xQueueSend(context->slave_context.data_to_send, &context->slave_trans[k], portMAX_DELAY);
|
||||||
|
|
||||||
|
//clear master receive buffer
|
||||||
|
memset(context->master_rxbuf, 0x66, sizeof(context->master_rxbuf));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static void local_test_loop(const void* arg1, void* arg2)
|
||||||
|
{
|
||||||
|
const spitest_param_set_t *pset = arg1;
|
||||||
|
spitest_context_t *context = arg2;
|
||||||
|
spi_device_handle_t spi;
|
||||||
|
spitest_init_transactions(pset, context);
|
||||||
|
const int *timing_speed_array = pset->freq_list;
|
||||||
|
|
||||||
|
ESP_LOGI(MASTER_TAG, "****************** %s ***************", pset->pset_name);
|
||||||
|
for (int i = 0; ; i++) {
|
||||||
|
const int freq = timing_speed_array[i];
|
||||||
|
if (freq==0) break;
|
||||||
|
if (pset->freq_limit && freq > pset->freq_limit) break;
|
||||||
|
|
||||||
|
ESP_LOGI(MASTER_TAG, "======> %dk", freq / 1000);
|
||||||
|
local_test_start(&spi, freq, pset, context);
|
||||||
|
|
||||||
|
for (int k = 0; k < pset->test_size; k++) {
|
||||||
|
//wait for both master and slave end
|
||||||
|
ESP_LOGI(MASTER_TAG, "=> test%d", k);
|
||||||
|
//send master tx data
|
||||||
|
vTaskDelay(9);
|
||||||
|
|
||||||
|
spi_transaction_t *t = &context->master_trans[k];
|
||||||
|
TEST_ESP_OK(spi_device_transmit(spi, t));
|
||||||
|
int len = get_trans_len(pset->dup, t);
|
||||||
|
spitest_master_print_data(t, len);
|
||||||
|
|
||||||
|
size_t rcv_len;
|
||||||
|
slave_rxdata_t *rcv_data = xRingbufferReceive(context->slave_context.data_received, &rcv_len, portMAX_DELAY);
|
||||||
|
spitest_slave_print_data(rcv_data, true);
|
||||||
|
|
||||||
|
//check result
|
||||||
|
bool check_master_data = (pset->dup!=HALF_DUPLEX_MOSI &&
|
||||||
|
(pset->master_limit==0 || freq <= pset->master_limit));
|
||||||
|
bool check_slave_data = (pset->dup!=HALF_DUPLEX_MISO);
|
||||||
|
const bool check_len = true;
|
||||||
|
if (!check_master_data) ESP_LOGI(MASTER_TAG, "skip master data check");
|
||||||
|
if (!check_slave_data) ESP_LOGI(SLAVE_TAG, "skip slave data check");
|
||||||
|
|
||||||
|
TEST_ESP_OK(spitest_check_data(len, t, rcv_data, check_master_data, check_len, check_slave_data));
|
||||||
|
//clean
|
||||||
|
vRingbufferReturnItem(context->slave_context.data_received, rcv_data);
|
||||||
|
}
|
||||||
|
master_free_device_bus(spi);
|
||||||
|
TEST_ASSERT(spi_slave_free(TEST_SLAVE_HOST) == ESP_OK);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/************ Timing Test ***********************************************/
|
||||||
|
static spitest_param_set_t timing_pgroup[] = {
|
||||||
|
{ .pset_name = "FULL_DUP, MASTER IOMUX",
|
||||||
|
.freq_limit = ESP_SPI_SLAVE_MAX_FREQ_SYNC,
|
||||||
|
.master_limit = SPI_MASTER_FREQ_13M,
|
||||||
|
.dup = FULL_DUPLEX,
|
||||||
|
.master_iomux = true,
|
||||||
|
.slave_iomux = false,
|
||||||
|
.slave_tv_ns = TV_INT_CONNECT_GPIO,
|
||||||
|
},
|
||||||
|
{ .pset_name = "FULL_DUP, SLAVE IOMUX",
|
||||||
|
.freq_limit = ESP_SPI_SLAVE_MAX_FREQ_SYNC,
|
||||||
|
.master_limit = SPI_MASTER_FREQ_13M,
|
||||||
|
.dup = FULL_DUPLEX,
|
||||||
|
.master_iomux = false,
|
||||||
|
.slave_iomux = true,
|
||||||
|
.slave_tv_ns = TV_INT_CONNECT,
|
||||||
|
},
|
||||||
|
{ .pset_name = "FULL_DUP, BOTH GPIO",
|
||||||
|
.freq_limit = ESP_SPI_SLAVE_MAX_FREQ_SYNC,
|
||||||
|
.master_limit = SPI_MASTER_FREQ_10M,
|
||||||
|
.dup = FULL_DUPLEX,
|
||||||
|
.master_iomux = false,
|
||||||
|
.slave_iomux = false,
|
||||||
|
.slave_tv_ns = TV_INT_CONNECT_GPIO,
|
||||||
|
},
|
||||||
|
{ .pset_name = "MISO_DUP, MASTER IOMUX",
|
||||||
|
.freq_limit = ESP_SPI_SLAVE_MAX_FREQ_SYNC,
|
||||||
|
.master_limit = ESP_SPI_SLAVE_MAX_FREQ_SYNC,
|
||||||
|
.dup = HALF_DUPLEX_MISO,
|
||||||
|
.master_iomux = true,
|
||||||
|
.slave_iomux = false,
|
||||||
|
.slave_tv_ns = TV_INT_CONNECT_GPIO+12.5,
|
||||||
|
//for freq lower than 20M, the delay is 60(62.5)ns, however, the delay becomes 75ns over 26M
|
||||||
|
},
|
||||||
|
{ .pset_name = "MISO_DUP, SLAVE IOMUX",
|
||||||
|
.freq_limit = ESP_SPI_SLAVE_MAX_FREQ_SYNC,
|
||||||
|
//.freq_limit = ESP_SPI_SLAVE_MAX_FREQ_SYNC,
|
||||||
|
.dup = HALF_DUPLEX_MISO,
|
||||||
|
.master_iomux = false,
|
||||||
|
.slave_iomux = true,
|
||||||
|
.slave_tv_ns = TV_INT_CONNECT+12.5,
|
||||||
|
//for freq lower than 20M, the delay is 60(62.5)ns, however, the delay becomes 75ns over 26M
|
||||||
|
|
||||||
|
},
|
||||||
|
{ .pset_name = "MISO_DUP, BOTH GPIO",
|
||||||
|
.freq_limit = ESP_SPI_SLAVE_MAX_FREQ_SYNC,
|
||||||
|
//.freq_limit = ESP_SPI_SLAVE_MAX_FREQ_SYNC,
|
||||||
|
.dup = HALF_DUPLEX_MISO,
|
||||||
|
.master_iomux = false,
|
||||||
|
.slave_iomux = false,
|
||||||
|
.slave_tv_ns = TV_INT_CONNECT_GPIO+12.5,
|
||||||
|
//for freq lower than 20M, the delay is 60(62.5)ns, however, the delay becomes 75ns over 26M
|
||||||
|
|
||||||
|
},
|
||||||
|
{ .pset_name = "MOSI_DUP, MASTER IOMUX",
|
||||||
|
.freq_limit = ESP_SPI_SLAVE_MAX_FREQ_SYNC,
|
||||||
|
//.freq_limit = ESP_SPI_SLAVE_MAX_READ_FREQ, //ESP_SPI_SLAVE_MAX_FREQ_SYNC,
|
||||||
|
.dup = HALF_DUPLEX_MOSI,
|
||||||
|
.master_iomux = true,
|
||||||
|
.slave_iomux = false,
|
||||||
|
.slave_tv_ns = TV_INT_CONNECT_GPIO,
|
||||||
|
},
|
||||||
|
{ .pset_name = "MOSI_DUP, SLAVE IOMUX",
|
||||||
|
.freq_limit = ESP_SPI_SLAVE_MAX_FREQ_SYNC,
|
||||||
|
//.freq_limit = ESP_SPI_SLAVE_MAX_READ_FREQ, //ESP_SPI_SLAVE_MAX_FREQ_SYNC,
|
||||||
|
.dup = HALF_DUPLEX_MOSI,
|
||||||
|
.master_iomux = false,
|
||||||
|
.slave_iomux = true,
|
||||||
|
.slave_tv_ns = TV_INT_CONNECT,
|
||||||
|
},
|
||||||
|
{ .pset_name = "MOSI_DUP, BOTH GPIO",
|
||||||
|
.freq_limit = ESP_SPI_SLAVE_MAX_FREQ_SYNC,
|
||||||
|
//.freq_limit = ESP_SPI_SLAVE_MAX_READ_FREQ, //ESP_SPI_SLAVE_MAX_FREQ_SYNC,
|
||||||
|
.dup = HALF_DUPLEX_MOSI,
|
||||||
|
.master_iomux = false,
|
||||||
|
.slave_iomux = false,
|
||||||
|
.slave_tv_ns = TV_INT_CONNECT_GPIO,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
TEST_SPI_LOCAL(TIMING, timing_pgroup)
|
||||||
|
|
||||||
|
/************ Mode Test ***********************************************/
|
||||||
|
#define FREQ_LIMIT_MODE SPI_MASTER_FREQ_16M
|
||||||
|
static int test_freq_mode_local[]={
|
||||||
|
1*1000*1000,
|
||||||
|
SPI_MASTER_FREQ_9M, //maximum freq MISO stable before next latch edge
|
||||||
|
SPI_MASTER_FREQ_13M,
|
||||||
|
SPI_MASTER_FREQ_16M,
|
||||||
|
SPI_MASTER_FREQ_20M,
|
||||||
|
SPI_MASTER_FREQ_26M,
|
||||||
|
SPI_MASTER_FREQ_40M,
|
||||||
|
0,
|
||||||
|
};
|
||||||
|
|
||||||
|
static spitest_param_set_t mode_pgroup[] = {
|
||||||
|
{ .pset_name = "Mode 0",
|
||||||
|
.freq_list = test_freq_mode_local,
|
||||||
|
.master_limit = SPI_MASTER_FREQ_13M,
|
||||||
|
.dup = FULL_DUPLEX,
|
||||||
|
.mode = 0,
|
||||||
|
.master_iomux = false,
|
||||||
|
.slave_iomux = true,
|
||||||
|
.slave_tv_ns = TV_INT_CONNECT,
|
||||||
|
},
|
||||||
|
{ .pset_name = "Mode 1",
|
||||||
|
.freq_list = test_freq_mode_local,
|
||||||
|
.freq_limit = SPI_MASTER_FREQ_26M,
|
||||||
|
.master_limit = SPI_MASTER_FREQ_13M,
|
||||||
|
.dup = FULL_DUPLEX,
|
||||||
|
.mode = 1,
|
||||||
|
.master_iomux = false,
|
||||||
|
.slave_iomux = true,
|
||||||
|
.slave_tv_ns = TV_INT_CONNECT,
|
||||||
|
},
|
||||||
|
{ .pset_name = "Mode 2",
|
||||||
|
.freq_list = test_freq_mode_local,
|
||||||
|
.master_limit = SPI_MASTER_FREQ_13M,
|
||||||
|
.dup = FULL_DUPLEX,
|
||||||
|
.mode = 2,
|
||||||
|
.master_iomux = false,
|
||||||
|
.slave_iomux = true,
|
||||||
|
.slave_tv_ns = TV_INT_CONNECT,
|
||||||
|
},
|
||||||
|
{ .pset_name = "Mode 3",
|
||||||
|
.freq_list = test_freq_mode_local,
|
||||||
|
.freq_limit = SPI_MASTER_FREQ_26M,
|
||||||
|
.master_limit = SPI_MASTER_FREQ_13M,
|
||||||
|
.dup = FULL_DUPLEX,
|
||||||
|
.mode = 3,
|
||||||
|
.master_iomux = false,
|
||||||
|
.slave_iomux = true,
|
||||||
|
.slave_tv_ns = TV_INT_CONNECT,
|
||||||
|
},
|
||||||
|
{ .pset_name = "Mode 0, DMA",
|
||||||
|
.freq_list = test_freq_mode_local,
|
||||||
|
.master_limit = SPI_MASTER_FREQ_13M,
|
||||||
|
.dup = FULL_DUPLEX,
|
||||||
|
.mode = 0,
|
||||||
|
.slave_dma_chan = 2,
|
||||||
|
.master_iomux = false,
|
||||||
|
.slave_iomux = true,
|
||||||
|
.slave_tv_ns = TV_INT_CONNECT, //at 16M, the MISO delay (-0.5T+(3+2)apb) equals to non-DMA mode delay (3apb).
|
||||||
|
.length_aligned = true,
|
||||||
|
},
|
||||||
|
{ .pset_name = "Mode 1, DMA",
|
||||||
|
.freq_list = test_freq_mode_local,
|
||||||
|
.freq_limit = SPI_MASTER_FREQ_26M,
|
||||||
|
.master_limit = SPI_MASTER_FREQ_13M,
|
||||||
|
.dup = FULL_DUPLEX,
|
||||||
|
.mode = 1,
|
||||||
|
.slave_dma_chan = 2,
|
||||||
|
.master_iomux = false,
|
||||||
|
.slave_iomux = true,
|
||||||
|
.slave_tv_ns = TV_INT_CONNECT,
|
||||||
|
.length_aligned = true,
|
||||||
|
},
|
||||||
|
{ .pset_name = "Mode 2, DMA",
|
||||||
|
.freq_list = test_freq_mode_local,
|
||||||
|
.master_limit = SPI_MASTER_FREQ_13M,
|
||||||
|
.dup = FULL_DUPLEX,
|
||||||
|
.mode = 2,
|
||||||
|
.slave_dma_chan = 2,
|
||||||
|
.master_iomux = false,
|
||||||
|
.slave_iomux = true,
|
||||||
|
.slave_tv_ns = TV_INT_CONNECT, //at 16M, the MISO delay (-0.5T+(3+2)apb) equals to non-DMA mode delay (3apb).
|
||||||
|
.length_aligned = true,
|
||||||
|
},
|
||||||
|
{ .pset_name = "Mode 3, DMA",
|
||||||
|
.freq_list = test_freq_mode_local,
|
||||||
|
.freq_limit = SPI_MASTER_FREQ_26M,
|
||||||
|
.master_limit = SPI_MASTER_FREQ_13M,
|
||||||
|
.dup = FULL_DUPLEX,
|
||||||
|
.mode = 3,
|
||||||
|
.slave_dma_chan = 2,
|
||||||
|
.master_iomux = false,
|
||||||
|
.slave_iomux = true,
|
||||||
|
.slave_tv_ns = TV_INT_CONNECT,
|
||||||
|
.length_aligned = true,
|
||||||
|
},
|
||||||
|
// MISO ////////////////////////////////////
|
||||||
|
{ .pset_name = "MISO, Mode 0",
|
||||||
|
.freq_list = test_freq_mode_local,
|
||||||
|
.dup = HALF_DUPLEX_MISO,
|
||||||
|
.mode = 0,
|
||||||
|
.master_iomux = false,
|
||||||
|
.slave_iomux = true,
|
||||||
|
.slave_tv_ns = TV_INT_CONNECT,
|
||||||
|
},
|
||||||
|
{ .pset_name = "MISO, Mode 1",
|
||||||
|
.freq_list = test_freq_mode_local,
|
||||||
|
.dup = HALF_DUPLEX_MISO,
|
||||||
|
.mode = 1,
|
||||||
|
.master_iomux = false,
|
||||||
|
.slave_iomux = true,
|
||||||
|
.slave_tv_ns = TV_INT_CONNECT,
|
||||||
|
},
|
||||||
|
{ .pset_name = "MISO, Mode 2",
|
||||||
|
.freq_list = test_freq_mode_local,
|
||||||
|
.dup = HALF_DUPLEX_MISO,
|
||||||
|
.mode = 2,
|
||||||
|
.master_iomux = false,
|
||||||
|
.slave_iomux = true,
|
||||||
|
.slave_tv_ns = TV_INT_CONNECT,
|
||||||
|
},
|
||||||
|
{ .pset_name = "MISO, Mode 3",
|
||||||
|
.freq_list = test_freq_mode_local,
|
||||||
|
.dup = HALF_DUPLEX_MISO,
|
||||||
|
.mode = 3,
|
||||||
|
.master_iomux = false,
|
||||||
|
.slave_iomux = true,
|
||||||
|
.slave_tv_ns = TV_INT_CONNECT,
|
||||||
|
},
|
||||||
|
{ .pset_name = "MISO, Mode 0, DMA",
|
||||||
|
.freq_list = test_freq_mode_local,
|
||||||
|
.dup = HALF_DUPLEX_MISO,
|
||||||
|
.mode = 0,
|
||||||
|
.slave_dma_chan = 2,
|
||||||
|
.master_iomux = false,
|
||||||
|
.slave_iomux = true,
|
||||||
|
.slave_tv_ns = TV_INT_CONNECT+12.5, //at 16M, the MISO delay (-0.5T+(3+2)apb) equals to non-DMA mode delay (3apb).
|
||||||
|
.length_aligned = true,
|
||||||
|
},
|
||||||
|
{ .pset_name = "MISO, Mode 1, DMA",
|
||||||
|
.freq_list = test_freq_mode_local,
|
||||||
|
.dup = HALF_DUPLEX_MISO,
|
||||||
|
.mode = 1,
|
||||||
|
.slave_dma_chan = 2,
|
||||||
|
.master_iomux = false,
|
||||||
|
.slave_iomux = true,
|
||||||
|
.slave_tv_ns = TV_INT_CONNECT,
|
||||||
|
.length_aligned = true,
|
||||||
|
},
|
||||||
|
{ .pset_name = "MISO, Mode 2, DMA",
|
||||||
|
.freq_list = test_freq_mode_local,
|
||||||
|
.dup = HALF_DUPLEX_MISO,
|
||||||
|
.mode = 2,
|
||||||
|
.slave_dma_chan = 2,
|
||||||
|
.master_iomux = false,
|
||||||
|
.slave_iomux = true,
|
||||||
|
.slave_tv_ns = TV_INT_CONNECT+12.5, //at 16M, the MISO delay (-0.5T+(3+2)apb) equals to non-DMA mode delay (3apb).
|
||||||
|
.length_aligned = true,
|
||||||
|
},
|
||||||
|
{ .pset_name = "MISO, Mode 3, DMA",
|
||||||
|
.freq_list = test_freq_mode_local,
|
||||||
|
.dup = HALF_DUPLEX_MISO,
|
||||||
|
.mode = 3,
|
||||||
|
.slave_dma_chan = 2,
|
||||||
|
.master_iomux = false,
|
||||||
|
.slave_iomux = true,
|
||||||
|
.slave_tv_ns = TV_INT_CONNECT,
|
||||||
|
.length_aligned = true,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
TEST_SPI_LOCAL(MODE, mode_pgroup)
|
||||||
|
|
||||||
/********************************************************************************
|
/********************************************************************************
|
||||||
* Test By Master & Slave (2 boards)
|
* Test By Master & Slave (2 boards)
|
||||||
|
@ -67,13 +491,13 @@ static void test_master_start(spi_device_handle_t *spi, int freq, const spitest_
|
||||||
{
|
{
|
||||||
//master config
|
//master config
|
||||||
spi_bus_config_t buspset=SPI_BUS_TEST_DEFAULT_CONFIG();
|
spi_bus_config_t buspset=SPI_BUS_TEST_DEFAULT_CONFIG();
|
||||||
buspset.miso_io_num = spi_periph_signal[HSPI_HOST].spiq_iomux_pin;
|
buspset.miso_io_num = HSPI_IOMUX_PIN_NUM_MISO;
|
||||||
buspset.mosi_io_num = spi_periph_signal[HSPI_HOST].spid_iomux_pin;
|
buspset.mosi_io_num = HSPI_IOMUX_PIN_NUM_MOSI;
|
||||||
buspset.sclk_io_num = spi_periph_signal[HSPI_HOST].spiclk_iomux_pin;
|
buspset.sclk_io_num = HSPI_IOMUX_PIN_NUM_CLK;
|
||||||
//this does nothing, but avoid the driver from using native pins
|
//this does nothing, but avoid the driver from using native pins
|
||||||
if (!pset->master_iomux) buspset.quadhd_io_num = spi_periph_signal[VSPI_HOST].spiq_iomux_pin;
|
if (!pset->master_iomux) buspset.quadhd_io_num = VSPI_IOMUX_PIN_NUM_MISO;
|
||||||
spi_device_interface_config_t devpset=SPI_DEVICE_TEST_DEFAULT_CONFIG();
|
spi_device_interface_config_t devpset=SPI_DEVICE_TEST_DEFAULT_CONFIG();
|
||||||
devpset.spics_io_num = spi_periph_signal[HSPI_HOST].spics0_iomux_pin;
|
devpset.spics_io_num = HSPI_IOMUX_PIN_NUM_CS;
|
||||||
devpset.mode = pset->mode;
|
devpset.mode = pset->mode;
|
||||||
const int cs_pretrans_max = 15;
|
const int cs_pretrans_max = 15;
|
||||||
if (pset->dup==HALF_DUPLEX_MISO) {
|
if (pset->dup==HALF_DUPLEX_MISO) {
|
||||||
|
@ -199,13 +623,13 @@ static void timing_slave_start(int speed, const spitest_param_set_t* pset, spite
|
||||||
{
|
{
|
||||||
//slave config
|
//slave config
|
||||||
spi_bus_config_t slv_buscfg=SPI_BUS_TEST_DEFAULT_CONFIG();
|
spi_bus_config_t slv_buscfg=SPI_BUS_TEST_DEFAULT_CONFIG();
|
||||||
slv_buscfg.miso_io_num = spi_periph_signal[VSPI_HOST].spiq_iomux_pin;
|
slv_buscfg.miso_io_num = VSPI_IOMUX_PIN_NUM_MISO;
|
||||||
slv_buscfg.mosi_io_num = spi_periph_signal[VSPI_HOST].spid_iomux_pin;
|
slv_buscfg.mosi_io_num = VSPI_IOMUX_PIN_NUM_MOSI;
|
||||||
slv_buscfg.sclk_io_num = spi_periph_signal[VSPI_HOST].spiclk_iomux_pin;
|
slv_buscfg.sclk_io_num = VSPI_IOMUX_PIN_NUM_CLK;
|
||||||
//this does nothing, but avoid the driver from using native pins
|
//this does nothing, but avoid the driver from using native pins
|
||||||
if (!pset->slave_iomux) slv_buscfg.quadhd_io_num = spi_periph_signal[HSPI_HOST].spiclk_iomux_pin;
|
if (!pset->slave_iomux) slv_buscfg.quadhd_io_num = HSPI_IOMUX_PIN_NUM_CLK;
|
||||||
spi_slave_interface_config_t slvcfg=SPI_SLAVE_TEST_DEFAULT_CONFIG();
|
spi_slave_interface_config_t slvcfg=SPI_SLAVE_TEST_DEFAULT_CONFIG();
|
||||||
slvcfg.spics_io_num = spi_periph_signal[VSPI_HOST].spics0_iomux_pin;
|
slvcfg.spics_io_num = VSPI_IOMUX_PIN_NUM_CS;
|
||||||
slvcfg.mode = pset->mode;
|
slvcfg.mode = pset->mode;
|
||||||
//Enable pull-ups on SPI lines so we don't detect rogue pulses when no master is connected.
|
//Enable pull-ups on SPI lines so we don't detect rogue pulses when no master is connected.
|
||||||
slave_pull_up(&slv_buscfg, slvcfg.spics_io_num);
|
slave_pull_up(&slv_buscfg, slvcfg.spics_io_num);
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <malloc.h>
|
#include <malloc.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include "esp32/rom/ets_sys.h"
|
||||||
#include "freertos/FreeRTOS.h"
|
#include "freertos/FreeRTOS.h"
|
||||||
#include "freertos/task.h"
|
#include "freertos/task.h"
|
||||||
#include "freertos/semphr.h"
|
#include "freertos/semphr.h"
|
||||||
|
@ -22,14 +23,90 @@
|
||||||
#include "test/test_common_spi.h"
|
#include "test/test_common_spi.h"
|
||||||
#include "soc/gpio_periph.h"
|
#include "soc/gpio_periph.h"
|
||||||
#include "sdkconfig.h"
|
#include "sdkconfig.h"
|
||||||
#include "hal/spi_ll.h"
|
|
||||||
|
|
||||||
|
|
||||||
|
/********************************************************************************
|
||||||
|
* Test SIO
|
||||||
|
********************************************************************************/
|
||||||
|
TEST_CASE("local test sio", "[spi]")
|
||||||
|
{
|
||||||
|
spi_device_handle_t spi;
|
||||||
|
WORD_ALIGNED_ATTR uint8_t master_rx_buffer[320];
|
||||||
|
WORD_ALIGNED_ATTR uint8_t slave_rx_buffer[320];
|
||||||
|
|
||||||
|
for (int i = 0; i < 16; i++) {
|
||||||
|
SPI1.data_buf[0] = 0xcccccccc;
|
||||||
|
SPI2.data_buf[0] = 0xcccccccc;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* This test use a strange connection to test the SIO mode:
|
||||||
|
* master spid -> slave spid
|
||||||
|
* slave spiq -> master spid
|
||||||
|
*/
|
||||||
|
spi_bus_config_t bus_cfg = SPI_BUS_TEST_DEFAULT_CONFIG();
|
||||||
|
spi_device_interface_config_t dev_cfg = SPI_DEVICE_TEST_DEFAULT_CONFIG();
|
||||||
|
spi_slave_interface_config_t slv_cfg = SPI_SLAVE_TEST_DEFAULT_CONFIG();
|
||||||
|
slv_cfg.spics_io_num = dev_cfg.spics_io_num;
|
||||||
|
TEST_ESP_OK(spi_slave_initialize(TEST_SLAVE_HOST, &bus_cfg, &slv_cfg, 0));
|
||||||
|
|
||||||
|
int miso_io_num = bus_cfg.miso_io_num;
|
||||||
|
int mosi_io_num = bus_cfg.mosi_io_num;
|
||||||
|
bus_cfg.mosi_io_num = bus_cfg.miso_io_num;
|
||||||
|
bus_cfg.miso_io_num = -1;
|
||||||
|
TEST_ESP_OK(spi_bus_initialize(TEST_SPI_HOST, &bus_cfg, 0));
|
||||||
|
|
||||||
|
dev_cfg.flags = SPI_DEVICE_HALFDUPLEX | SPI_DEVICE_3WIRE;
|
||||||
|
TEST_ESP_OK(spi_bus_add_device(TEST_SPI_HOST, &dev_cfg, &spi));
|
||||||
|
|
||||||
|
spitest_gpio_output_sel(mosi_io_num, FUNC_GPIO, spi_periph_signal[TEST_SPI_HOST].spid_out);
|
||||||
|
spitest_gpio_output_sel(miso_io_num, FUNC_GPIO, spi_periph_signal[TEST_SLAVE_HOST].spiq_out);
|
||||||
|
spitest_gpio_output_sel(dev_cfg.spics_io_num, FUNC_GPIO, spi_periph_signal[TEST_SPI_HOST].spics_out[0]);
|
||||||
|
spitest_gpio_output_sel(bus_cfg.sclk_io_num, FUNC_GPIO, spi_periph_signal[TEST_SPI_HOST].spiclk_out);
|
||||||
|
|
||||||
|
for (int i = 0; i < 8; i ++) {
|
||||||
|
int tlen = i*2+1;
|
||||||
|
int rlen = 9-i;
|
||||||
|
|
||||||
|
ESP_LOGI(MASTER_TAG, "=========== TEST%d ==========", i);
|
||||||
|
|
||||||
|
spi_transaction_t master_t = {
|
||||||
|
.length = tlen*8,
|
||||||
|
.tx_buffer = spitest_master_send+i,
|
||||||
|
.rxlength = rlen*8,
|
||||||
|
.rx_buffer = master_rx_buffer+i,
|
||||||
|
};
|
||||||
|
spi_slave_transaction_t slave_t = {
|
||||||
|
.length = (tlen+rlen)*8,
|
||||||
|
.tx_buffer = spitest_slave_send+i,
|
||||||
|
.rx_buffer = slave_rx_buffer,
|
||||||
|
};
|
||||||
|
memset(master_rx_buffer, 0x66, sizeof(master_rx_buffer));
|
||||||
|
memset(slave_rx_buffer, 0x66, sizeof(slave_rx_buffer));
|
||||||
|
TEST_ESP_OK(spi_slave_queue_trans(TEST_SLAVE_HOST, &slave_t, portMAX_DELAY));
|
||||||
|
|
||||||
|
TEST_ESP_OK(spi_device_transmit(spi, &master_t));
|
||||||
|
spi_slave_transaction_t* ret_t;
|
||||||
|
TEST_ESP_OK(spi_slave_get_trans_result(TEST_SLAVE_HOST, &ret_t, portMAX_DELAY));
|
||||||
|
TEST_ASSERT(ret_t == &slave_t);
|
||||||
|
|
||||||
|
ESP_LOG_BUFFER_HEXDUMP("master tx", master_t.tx_buffer, tlen, ESP_LOG_INFO);
|
||||||
|
ESP_LOG_BUFFER_HEXDUMP("slave rx", slave_t.rx_buffer, tlen+rlen, ESP_LOG_INFO);
|
||||||
|
ESP_LOG_BUFFER_HEXDUMP("slave tx", slave_t.tx_buffer, tlen+rlen, ESP_LOG_INFO);
|
||||||
|
ESP_LOG_BUFFER_HEXDUMP("master rx", master_t.rx_buffer, rlen, ESP_LOG_INFO);
|
||||||
|
|
||||||
|
TEST_ASSERT_EQUAL_HEX8_ARRAY(master_t.tx_buffer, slave_t.rx_buffer, tlen);
|
||||||
|
TEST_ASSERT_EQUAL_HEX8_ARRAY(slave_t.tx_buffer + tlen, master_t.rx_buffer, rlen);
|
||||||
|
}
|
||||||
|
|
||||||
|
spi_slave_free(TEST_SLAVE_HOST);
|
||||||
|
master_free_device_bus(spi);
|
||||||
|
}
|
||||||
|
|
||||||
/********************************************************************************
|
/********************************************************************************
|
||||||
* Test SIO Master & Slave
|
* Test SIO Master & Slave
|
||||||
********************************************************************************/
|
********************************************************************************/
|
||||||
//if test_mosi is false, test on miso of slave, otherwise test on mosi of slave
|
//if test_mosi is false, test on miso of slave, otherwise test on mosi of slave
|
||||||
static void test_sio_master_round(bool test_mosi)
|
void test_sio_master_round(bool test_mosi)
|
||||||
{
|
{
|
||||||
spi_device_handle_t spi;
|
spi_device_handle_t spi;
|
||||||
WORD_ALIGNED_ATTR uint8_t rx_buffer[320];
|
WORD_ALIGNED_ATTR uint8_t rx_buffer[320];
|
||||||
|
@ -77,14 +154,14 @@ static void test_sio_master_round(bool test_mosi)
|
||||||
master_free_device_bus(spi);
|
master_free_device_bus(spi);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_sio_master(void)
|
void test_sio_master(void)
|
||||||
{
|
{
|
||||||
test_sio_master_round(true);
|
test_sio_master_round(true);
|
||||||
unity_send_signal("master ready");
|
unity_send_signal("master ready");
|
||||||
test_sio_master_round(false);
|
test_sio_master_round(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_sio_slave_round(bool test_mosi)
|
void test_sio_slave_round(bool test_mosi)
|
||||||
{
|
{
|
||||||
WORD_ALIGNED_ATTR uint8_t rx_buffer[320];
|
WORD_ALIGNED_ATTR uint8_t rx_buffer[320];
|
||||||
|
|
||||||
|
@ -133,7 +210,7 @@ static void test_sio_slave_round(bool test_mosi)
|
||||||
spi_slave_free(TEST_SLAVE_HOST);
|
spi_slave_free(TEST_SLAVE_HOST);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_sio_slave(void)
|
void test_sio_slave(void)
|
||||||
{
|
{
|
||||||
test_sio_slave_round(true);
|
test_sio_slave_round(true);
|
||||||
unity_wait_for_signal("master ready");
|
unity_wait_for_signal("master ready");
|
||||||
|
|
|
@ -1,156 +0,0 @@
|
||||||
/**
|
|
||||||
* I2S test environment UT_T1_I2S:
|
|
||||||
* connect GPIO18 and GPIO19, GPIO25 and GPIO26, GPIO21 and GPIO22
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include "freertos/FreeRTOS.h"
|
|
||||||
#include "freertos/task.h"
|
|
||||||
#include "driver/i2s.h"
|
|
||||||
#include "unity.h"
|
|
||||||
#include "math.h"
|
|
||||||
|
|
||||||
#define SAMPLE_RATE (36000)
|
|
||||||
#define SAMPLE_BITS (16)
|
|
||||||
#define MASTER_BCK_IO 18
|
|
||||||
#define MASTER_WS_IO 25
|
|
||||||
#define SLAVE_BCK_IO 19
|
|
||||||
#define SLAVE_WS_IO 26
|
|
||||||
#define DATA_IN_IO 21
|
|
||||||
#define DATA_OUT_IO 22
|
|
||||||
#define PERCENT_DIFF 0.0001
|
|
||||||
|
|
||||||
/**
|
|
||||||
* i2s initialize test
|
|
||||||
* 1. i2s_driver_install
|
|
||||||
* 2. i2s_set_pin
|
|
||||||
*/
|
|
||||||
TEST_CASE("I2S basic driver install, uninstall, set pin test", "[i2s]")
|
|
||||||
{
|
|
||||||
// dac, adc i2s
|
|
||||||
i2s_config_t i2s_config = {
|
|
||||||
.mode = I2S_MODE_MASTER | I2S_MODE_TX,
|
|
||||||
.sample_rate = SAMPLE_RATE,
|
|
||||||
.bits_per_sample = SAMPLE_BITS,
|
|
||||||
.channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT,
|
|
||||||
.communication_format = I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB,
|
|
||||||
.dma_buf_count = 6,
|
|
||||||
.dma_buf_len = 60,
|
|
||||||
.use_apll = 0,
|
|
||||||
.intr_alloc_flags = ESP_INTR_FLAG_LEVEL1 ,
|
|
||||||
};
|
|
||||||
|
|
||||||
//install and start i2s driver
|
|
||||||
TEST_ESP_OK(i2s_driver_install(I2S_NUM_0, &i2s_config, 0, NULL));
|
|
||||||
//for internal DAC, this will enable both of the internal channels
|
|
||||||
TEST_ESP_OK(i2s_set_pin(I2S_NUM_0, NULL));
|
|
||||||
//stop & destroy i2s driver
|
|
||||||
TEST_ESP_OK(i2s_driver_uninstall(I2S_NUM_0));
|
|
||||||
|
|
||||||
// normal i2s
|
|
||||||
i2s_pin_config_t pin_config = {
|
|
||||||
.bck_io_num = MASTER_BCK_IO,
|
|
||||||
.ws_io_num = MASTER_WS_IO,
|
|
||||||
.data_out_num = DATA_OUT_IO,
|
|
||||||
.data_in_num = -1
|
|
||||||
};
|
|
||||||
TEST_ESP_OK(i2s_driver_install(I2S_NUM_0, &i2s_config, 0, NULL));
|
|
||||||
TEST_ESP_OK(i2s_set_pin(I2S_NUM_0, &pin_config));
|
|
||||||
TEST_ESP_OK(i2s_driver_uninstall(I2S_NUM_0));
|
|
||||||
|
|
||||||
//error param test
|
|
||||||
TEST_ASSERT(i2s_driver_install(I2S_NUM_MAX, &i2s_config, 0, NULL) == ESP_ERR_INVALID_ARG);
|
|
||||||
TEST_ASSERT(i2s_driver_install(I2S_NUM_0, NULL, 0, NULL) == ESP_ERR_INVALID_ARG);
|
|
||||||
i2s_config.dma_buf_count = 1;
|
|
||||||
TEST_ASSERT(i2s_driver_install(I2S_NUM_0, &i2s_config, 0, NULL) == ESP_ERR_INVALID_ARG);
|
|
||||||
i2s_config.dma_buf_count = 129;
|
|
||||||
TEST_ASSERT(i2s_driver_install(I2S_NUM_0, &i2s_config, 0, NULL) == ESP_ERR_INVALID_ARG);
|
|
||||||
TEST_ESP_OK(i2s_driver_uninstall(I2S_NUM_0));
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_CASE("I2S memory leaking test", "[i2s]")
|
|
||||||
{
|
|
||||||
i2s_config_t master_i2s_config = {
|
|
||||||
.mode = I2S_MODE_MASTER | I2S_MODE_RX,
|
|
||||||
.sample_rate = SAMPLE_RATE,
|
|
||||||
.bits_per_sample = SAMPLE_BITS,
|
|
||||||
.channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT,
|
|
||||||
.communication_format = I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB,
|
|
||||||
.dma_buf_count = 6,
|
|
||||||
.dma_buf_len = 100,
|
|
||||||
.use_apll = 0,
|
|
||||||
.intr_alloc_flags = ESP_INTR_FLAG_LEVEL1 ,
|
|
||||||
};
|
|
||||||
i2s_pin_config_t master_pin_config = {
|
|
||||||
.bck_io_num = MASTER_BCK_IO,
|
|
||||||
.ws_io_num = MASTER_WS_IO,
|
|
||||||
.data_out_num = -1,
|
|
||||||
.data_in_num = DATA_IN_IO
|
|
||||||
};
|
|
||||||
|
|
||||||
TEST_ESP_OK(i2s_driver_install(I2S_NUM_0, &master_i2s_config, 0, NULL));
|
|
||||||
TEST_ESP_OK(i2s_set_pin(I2S_NUM_0, &master_pin_config));
|
|
||||||
i2s_driver_uninstall(I2S_NUM_0);
|
|
||||||
int initial_size = esp_get_free_heap_size();
|
|
||||||
|
|
||||||
for(int i=0; i<100; i++) {
|
|
||||||
TEST_ESP_OK(i2s_driver_install(I2S_NUM_0, &master_i2s_config, 0, NULL));
|
|
||||||
TEST_ESP_OK(i2s_set_pin(I2S_NUM_0, &master_pin_config));
|
|
||||||
i2s_driver_uninstall(I2S_NUM_0);
|
|
||||||
TEST_ASSERT(initial_size == esp_get_free_heap_size());
|
|
||||||
}
|
|
||||||
vTaskDelay(100 / portTICK_PERIOD_MS);
|
|
||||||
TEST_ASSERT(initial_size == esp_get_free_heap_size());
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The I2S APLL clock variation test used to test the difference between the different sample rates, different bits per sample
|
|
||||||
* and the APLL clock generate for it. The TEST_CASE passes PERCENT_DIFF variation from the provided sample rate in APLL generated clock
|
|
||||||
* The percentage difference calculated as (mod((obtained clock rate - desired clock rate)/(desired clock rate))) * 100.
|
|
||||||
*/
|
|
||||||
TEST_CASE("I2S APLL clock variation test", "[i2s]")
|
|
||||||
{
|
|
||||||
i2s_pin_config_t pin_config = {
|
|
||||||
.bck_io_num = MASTER_BCK_IO,
|
|
||||||
.ws_io_num = MASTER_WS_IO,
|
|
||||||
.data_out_num = DATA_OUT_IO,
|
|
||||||
.data_in_num = -1
|
|
||||||
};
|
|
||||||
|
|
||||||
i2s_config_t i2s_config = {
|
|
||||||
.mode = I2S_MODE_MASTER | I2S_MODE_TX,
|
|
||||||
.sample_rate = SAMPLE_RATE,
|
|
||||||
.bits_per_sample = SAMPLE_BITS,
|
|
||||||
.channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT,
|
|
||||||
.communication_format = I2S_COMM_FORMAT_I2S,
|
|
||||||
.dma_buf_count = 6,
|
|
||||||
.dma_buf_len = 60,
|
|
||||||
.use_apll = true,
|
|
||||||
.intr_alloc_flags = 0,
|
|
||||||
};
|
|
||||||
|
|
||||||
TEST_ESP_OK(i2s_driver_install(I2S_NUM_0, &i2s_config, 0, NULL));
|
|
||||||
TEST_ESP_OK(i2s_set_pin(I2S_NUM_0, &pin_config));
|
|
||||||
TEST_ESP_OK(i2s_driver_uninstall(I2S_NUM_0));
|
|
||||||
int initial_size = esp_get_free_heap_size();
|
|
||||||
|
|
||||||
uint32_t sample_rate_arr[8] = { 10675, 11025, 16000, 22050, 32000, 44100, 48000, 96000 };
|
|
||||||
int bits_per_sample_arr[3] = { 16, 24, 32 };
|
|
||||||
|
|
||||||
for (int i = 0; i < (sizeof(sample_rate_arr)/sizeof(sample_rate_arr[0])); i++) {
|
|
||||||
for (int j = 0; j < (sizeof(bits_per_sample_arr)/sizeof(bits_per_sample_arr[0])); j++) {
|
|
||||||
i2s_config.sample_rate = sample_rate_arr[i];
|
|
||||||
i2s_config.bits_per_sample = bits_per_sample_arr[j];
|
|
||||||
|
|
||||||
TEST_ESP_OK(i2s_driver_install(I2S_NUM_0, &i2s_config, 0, NULL));
|
|
||||||
TEST_ESP_OK(i2s_set_pin(I2S_NUM_0, &pin_config));
|
|
||||||
TEST_ASSERT((fabs((i2s_get_clk(I2S_NUM_0) - sample_rate_arr[i]))/(sample_rate_arr[i]))*100 < PERCENT_DIFF);
|
|
||||||
TEST_ESP_OK(i2s_driver_uninstall(I2S_NUM_0));
|
|
||||||
TEST_ASSERT(initial_size == esp_get_free_heap_size());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
vTaskDelay(100 / portTICK_PERIOD_MS);
|
|
||||||
TEST_ASSERT(initial_size == esp_get_free_heap_size());
|
|
||||||
}
|
|
|
@ -1,431 +0,0 @@
|
||||||
#include "test/test_common_spi.h"
|
|
||||||
#include "driver/spi_master.h"
|
|
||||||
#include "driver/spi_slave.h"
|
|
||||||
#include "esp_log.h"
|
|
||||||
#include "soc/spi_periph.h"
|
|
||||||
#include "test/test_common_spi.h"
|
|
||||||
|
|
||||||
/********************************************************************************
|
|
||||||
* Test By Internal Connections
|
|
||||||
********************************************************************************/
|
|
||||||
static void local_test_init(void** context);
|
|
||||||
static void local_test_deinit(void* context);
|
|
||||||
static void local_test_loop(const void *test_param, void* context);
|
|
||||||
|
|
||||||
static const ptest_func_t local_test_func = {
|
|
||||||
.pre_test = local_test_init,
|
|
||||||
.post_test = local_test_deinit,
|
|
||||||
.loop = local_test_loop,
|
|
||||||
.def_param = spitest_def_param,
|
|
||||||
};
|
|
||||||
|
|
||||||
#define TEST_SPI_LOCAL(name, param_set) \
|
|
||||||
PARAM_GROUP_DECLARE(name, param_set) \
|
|
||||||
TEST_LOCAL(name, param_set, "[spi][timeout=120]", &local_test_func)
|
|
||||||
|
|
||||||
static void local_test_init(void** arg)
|
|
||||||
{
|
|
||||||
TEST_ASSERT(*arg==NULL);
|
|
||||||
*arg = malloc(sizeof(spitest_context_t));
|
|
||||||
spitest_context_t* context = (spitest_context_t*)*arg;
|
|
||||||
TEST_ASSERT(context!=NULL);
|
|
||||||
context->slave_context = (spi_slave_task_context_t){};
|
|
||||||
esp_err_t err = init_slave_context( &context->slave_context);
|
|
||||||
TEST_ASSERT(err == ESP_OK);
|
|
||||||
|
|
||||||
xTaskCreate(spitest_slave_task, "spi_slave", 4096, &context->slave_context, 0, &context->handle_slave);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void local_test_deinit(void* arg)
|
|
||||||
{
|
|
||||||
spitest_context_t* context = arg;
|
|
||||||
vTaskDelete(context->handle_slave);
|
|
||||||
context->handle_slave = 0;
|
|
||||||
deinit_slave_context(&context->slave_context);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void local_test_start(spi_device_handle_t *spi, int freq, const spitest_param_set_t* pset, spitest_context_t* context)
|
|
||||||
{
|
|
||||||
//master config
|
|
||||||
spi_bus_config_t buscfg = SPI_BUS_TEST_DEFAULT_CONFIG();
|
|
||||||
spi_device_interface_config_t devcfg = SPI_DEVICE_TEST_DEFAULT_CONFIG();
|
|
||||||
spi_slave_interface_config_t slvcfg = SPI_SLAVE_TEST_DEFAULT_CONFIG();
|
|
||||||
//pin config & initialize
|
|
||||||
//we can't have two sets of iomux pins on the same pins
|
|
||||||
assert(!pset->master_iomux || !pset->slave_iomux);
|
|
||||||
if (pset->slave_iomux) {
|
|
||||||
//only in this case, use VSPI iomux pins
|
|
||||||
buscfg.miso_io_num = spi_periph_signal[VSPI_HOST].spiq_iomux_pin;
|
|
||||||
buscfg.mosi_io_num = spi_periph_signal[VSPI_HOST].spid_iomux_pin;
|
|
||||||
buscfg.sclk_io_num = spi_periph_signal[VSPI_HOST].spiclk_iomux_pin;
|
|
||||||
devcfg.spics_io_num = spi_periph_signal[VSPI_HOST].spics0_iomux_pin;
|
|
||||||
slvcfg.spics_io_num = spi_periph_signal[VSPI_HOST].spics0_iomux_pin;
|
|
||||||
} else {
|
|
||||||
buscfg.miso_io_num = spi_periph_signal[HSPI_HOST].spiq_iomux_pin;
|
|
||||||
buscfg.mosi_io_num = spi_periph_signal[HSPI_HOST].spid_iomux_pin;
|
|
||||||
buscfg.sclk_io_num = spi_periph_signal[HSPI_HOST].spiclk_iomux_pin;
|
|
||||||
devcfg.spics_io_num = spi_periph_signal[HSPI_HOST].spics0_iomux_pin;
|
|
||||||
slvcfg.spics_io_num = spi_periph_signal[HSPI_HOST].spics0_iomux_pin;
|
|
||||||
}
|
|
||||||
//this does nothing, but avoid the driver from using iomux pins if required
|
|
||||||
buscfg.quadhd_io_num = (!pset->master_iomux && !pset->slave_iomux ? spi_periph_signal[VSPI_HOST].spiq_iomux_pin : -1);
|
|
||||||
devcfg.mode = pset->mode;
|
|
||||||
const int cs_pretrans_max = 15;
|
|
||||||
if (pset->dup == HALF_DUPLEX_MISO) {
|
|
||||||
devcfg.cs_ena_pretrans = cs_pretrans_max;
|
|
||||||
devcfg.flags |= SPI_DEVICE_HALFDUPLEX;
|
|
||||||
} else if (pset->dup == HALF_DUPLEX_MOSI) {
|
|
||||||
devcfg.cs_ena_pretrans = cs_pretrans_max;
|
|
||||||
devcfg.flags |= SPI_DEVICE_NO_DUMMY;
|
|
||||||
} else {
|
|
||||||
devcfg.cs_ena_pretrans = cs_pretrans_max;
|
|
||||||
}
|
|
||||||
const int cs_posttrans_max = 15;
|
|
||||||
devcfg.cs_ena_posttrans = cs_posttrans_max;
|
|
||||||
devcfg.input_delay_ns = pset->slave_tv_ns;
|
|
||||||
devcfg.clock_speed_hz = freq;
|
|
||||||
if (pset->master_limit != 0 && freq > pset->master_limit) devcfg.flags |= SPI_DEVICE_NO_DUMMY;
|
|
||||||
|
|
||||||
//slave config
|
|
||||||
slvcfg.mode = pset->mode;
|
|
||||||
|
|
||||||
slave_pull_up(&buscfg, slvcfg.spics_io_num);
|
|
||||||
|
|
||||||
TEST_ESP_OK(spi_bus_initialize(TEST_SPI_HOST, &buscfg, pset->master_dma_chan));
|
|
||||||
TEST_ESP_OK(spi_bus_add_device(TEST_SPI_HOST, &devcfg, spi));
|
|
||||||
|
|
||||||
//slave automatically use iomux pins if pins are on VSPI_* pins
|
|
||||||
buscfg.quadhd_io_num = -1;
|
|
||||||
TEST_ESP_OK(spi_slave_initialize(TEST_SLAVE_HOST, &buscfg, &slvcfg, pset->slave_dma_chan));
|
|
||||||
|
|
||||||
//initialize master and slave on the same pins break some of the output configs, fix them
|
|
||||||
if (pset->master_iomux) {
|
|
||||||
spitest_gpio_output_sel(buscfg.mosi_io_num, FUNC_SPI, spi_periph_signal[HSPI_HOST].spid_out);
|
|
||||||
spitest_gpio_output_sel(buscfg.miso_io_num, FUNC_GPIO, spi_periph_signal[VSPI_HOST].spiq_out);
|
|
||||||
spitest_gpio_output_sel(devcfg.spics_io_num, FUNC_SPI, spi_periph_signal[HSPI_HOST].spics_out[0]);
|
|
||||||
spitest_gpio_output_sel(buscfg.sclk_io_num, FUNC_SPI, spi_periph_signal[HSPI_HOST].spiclk_out);
|
|
||||||
} else if (pset->slave_iomux) {
|
|
||||||
spitest_gpio_output_sel(buscfg.mosi_io_num, FUNC_GPIO, spi_periph_signal[HSPI_HOST].spid_out);
|
|
||||||
spitest_gpio_output_sel(buscfg.miso_io_num, FUNC_SPI, spi_periph_signal[VSPI_HOST].spiq_out);
|
|
||||||
spitest_gpio_output_sel(devcfg.spics_io_num, FUNC_GPIO, spi_periph_signal[HSPI_HOST].spics_out[0]);
|
|
||||||
spitest_gpio_output_sel(buscfg.sclk_io_num, FUNC_GPIO, spi_periph_signal[HSPI_HOST].spiclk_out);
|
|
||||||
} else {
|
|
||||||
spitest_gpio_output_sel(buscfg.mosi_io_num, FUNC_GPIO, spi_periph_signal[HSPI_HOST].spid_out);
|
|
||||||
spitest_gpio_output_sel(buscfg.miso_io_num, FUNC_GPIO, spi_periph_signal[VSPI_HOST].spiq_out);
|
|
||||||
spitest_gpio_output_sel(devcfg.spics_io_num, FUNC_GPIO, spi_periph_signal[HSPI_HOST].spics_out[0]);
|
|
||||||
spitest_gpio_output_sel(buscfg.sclk_io_num, FUNC_GPIO, spi_periph_signal[HSPI_HOST].spiclk_out);
|
|
||||||
}
|
|
||||||
|
|
||||||
//prepare slave tx data
|
|
||||||
for (int k = 0; k < pset->test_size; k++)
|
|
||||||
xQueueSend(context->slave_context.data_to_send, &context->slave_trans[k], portMAX_DELAY);
|
|
||||||
|
|
||||||
//clear master receive buffer
|
|
||||||
memset(context->master_rxbuf, 0x66, sizeof(context->master_rxbuf));
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
static void local_test_loop(const void* arg1, void* arg2)
|
|
||||||
{
|
|
||||||
const spitest_param_set_t *pset = arg1;
|
|
||||||
spitest_context_t *context = arg2;
|
|
||||||
spi_device_handle_t spi;
|
|
||||||
spitest_init_transactions(pset, context);
|
|
||||||
const int *timing_speed_array = pset->freq_list;
|
|
||||||
|
|
||||||
ESP_LOGI(MASTER_TAG, "****************** %s ***************", pset->pset_name);
|
|
||||||
for (int i = 0; ; i++) {
|
|
||||||
const int freq = timing_speed_array[i];
|
|
||||||
if (freq==0) break;
|
|
||||||
if (pset->freq_limit && freq > pset->freq_limit) break;
|
|
||||||
|
|
||||||
ESP_LOGI(MASTER_TAG, "======> %dk", freq / 1000);
|
|
||||||
local_test_start(&spi, freq, pset, context);
|
|
||||||
|
|
||||||
for (int k = 0; k < pset->test_size; k++) {
|
|
||||||
//wait for both master and slave end
|
|
||||||
ESP_LOGI(MASTER_TAG, "=> test%d", k);
|
|
||||||
//send master tx data
|
|
||||||
vTaskDelay(9);
|
|
||||||
|
|
||||||
spi_transaction_t *t = &context->master_trans[k];
|
|
||||||
TEST_ESP_OK(spi_device_transmit(spi, t));
|
|
||||||
int len = get_trans_len(pset->dup, t);
|
|
||||||
spitest_master_print_data(t, len);
|
|
||||||
|
|
||||||
size_t rcv_len;
|
|
||||||
slave_rxdata_t *rcv_data = xRingbufferReceive(context->slave_context.data_received, &rcv_len, portMAX_DELAY);
|
|
||||||
spitest_slave_print_data(rcv_data, true);
|
|
||||||
|
|
||||||
//check result
|
|
||||||
bool check_master_data = (pset->dup!=HALF_DUPLEX_MOSI &&
|
|
||||||
(pset->master_limit==0 || freq <= pset->master_limit));
|
|
||||||
bool check_slave_data = (pset->dup!=HALF_DUPLEX_MISO);
|
|
||||||
const bool check_len = true;
|
|
||||||
if (!check_master_data) ESP_LOGI(MASTER_TAG, "skip master data check");
|
|
||||||
if (!check_slave_data) ESP_LOGI(SLAVE_TAG, "skip slave data check");
|
|
||||||
|
|
||||||
TEST_ESP_OK(spitest_check_data(len, t, rcv_data, check_master_data, check_len, check_slave_data));
|
|
||||||
//clean
|
|
||||||
vRingbufferReturnItem(context->slave_context.data_received, rcv_data);
|
|
||||||
}
|
|
||||||
master_free_device_bus(spi);
|
|
||||||
TEST_ASSERT(spi_slave_free(TEST_SLAVE_HOST) == ESP_OK);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/************ Timing Test ***********************************************/
|
|
||||||
static spitest_param_set_t timing_pgroup[] = {
|
|
||||||
{ .pset_name = "FULL_DUP, MASTER IOMUX",
|
|
||||||
.freq_limit = ESP_SPI_SLAVE_MAX_FREQ_SYNC,
|
|
||||||
.master_limit = SPI_MASTER_FREQ_13M,
|
|
||||||
.dup = FULL_DUPLEX,
|
|
||||||
.master_iomux = true,
|
|
||||||
.slave_iomux = false,
|
|
||||||
.slave_tv_ns = TV_INT_CONNECT_GPIO,
|
|
||||||
},
|
|
||||||
{ .pset_name = "FULL_DUP, SLAVE IOMUX",
|
|
||||||
.freq_limit = ESP_SPI_SLAVE_MAX_FREQ_SYNC,
|
|
||||||
.master_limit = SPI_MASTER_FREQ_13M,
|
|
||||||
.dup = FULL_DUPLEX,
|
|
||||||
.master_iomux = false,
|
|
||||||
.slave_iomux = true,
|
|
||||||
.slave_tv_ns = TV_INT_CONNECT,
|
|
||||||
},
|
|
||||||
{ .pset_name = "FULL_DUP, BOTH GPIO",
|
|
||||||
.freq_limit = ESP_SPI_SLAVE_MAX_FREQ_SYNC,
|
|
||||||
.master_limit = SPI_MASTER_FREQ_10M,
|
|
||||||
.dup = FULL_DUPLEX,
|
|
||||||
.master_iomux = false,
|
|
||||||
.slave_iomux = false,
|
|
||||||
.slave_tv_ns = TV_INT_CONNECT_GPIO,
|
|
||||||
},
|
|
||||||
{ .pset_name = "MISO_DUP, MASTER IOMUX",
|
|
||||||
.freq_limit = ESP_SPI_SLAVE_MAX_FREQ_SYNC,
|
|
||||||
.master_limit = ESP_SPI_SLAVE_MAX_FREQ_SYNC,
|
|
||||||
.dup = HALF_DUPLEX_MISO,
|
|
||||||
.master_iomux = true,
|
|
||||||
.slave_iomux = false,
|
|
||||||
.slave_tv_ns = TV_INT_CONNECT_GPIO+12.5,
|
|
||||||
//for freq lower than 20M, the delay is 60(62.5)ns, however, the delay becomes 75ns over 26M
|
|
||||||
},
|
|
||||||
{ .pset_name = "MISO_DUP, SLAVE IOMUX",
|
|
||||||
.freq_limit = ESP_SPI_SLAVE_MAX_FREQ_SYNC,
|
|
||||||
//.freq_limit = ESP_SPI_SLAVE_MAX_FREQ_SYNC,
|
|
||||||
.dup = HALF_DUPLEX_MISO,
|
|
||||||
.master_iomux = false,
|
|
||||||
.slave_iomux = true,
|
|
||||||
.slave_tv_ns = TV_INT_CONNECT+12.5,
|
|
||||||
//for freq lower than 20M, the delay is 60(62.5)ns, however, the delay becomes 75ns over 26M
|
|
||||||
|
|
||||||
},
|
|
||||||
{ .pset_name = "MISO_DUP, BOTH GPIO",
|
|
||||||
.freq_limit = ESP_SPI_SLAVE_MAX_FREQ_SYNC,
|
|
||||||
//.freq_limit = ESP_SPI_SLAVE_MAX_FREQ_SYNC,
|
|
||||||
.dup = HALF_DUPLEX_MISO,
|
|
||||||
.master_iomux = false,
|
|
||||||
.slave_iomux = false,
|
|
||||||
.slave_tv_ns = TV_INT_CONNECT_GPIO+12.5,
|
|
||||||
//for freq lower than 20M, the delay is 60(62.5)ns, however, the delay becomes 75ns over 26M
|
|
||||||
|
|
||||||
},
|
|
||||||
{ .pset_name = "MOSI_DUP, MASTER IOMUX",
|
|
||||||
.freq_limit = ESP_SPI_SLAVE_MAX_FREQ_SYNC,
|
|
||||||
//.freq_limit = ESP_SPI_SLAVE_MAX_READ_FREQ, //ESP_SPI_SLAVE_MAX_FREQ_SYNC,
|
|
||||||
.dup = HALF_DUPLEX_MOSI,
|
|
||||||
.master_iomux = true,
|
|
||||||
.slave_iomux = false,
|
|
||||||
.slave_tv_ns = TV_INT_CONNECT_GPIO,
|
|
||||||
},
|
|
||||||
{ .pset_name = "MOSI_DUP, SLAVE IOMUX",
|
|
||||||
.freq_limit = ESP_SPI_SLAVE_MAX_FREQ_SYNC,
|
|
||||||
//.freq_limit = ESP_SPI_SLAVE_MAX_READ_FREQ, //ESP_SPI_SLAVE_MAX_FREQ_SYNC,
|
|
||||||
.dup = HALF_DUPLEX_MOSI,
|
|
||||||
.master_iomux = false,
|
|
||||||
.slave_iomux = true,
|
|
||||||
.slave_tv_ns = TV_INT_CONNECT,
|
|
||||||
},
|
|
||||||
{ .pset_name = "MOSI_DUP, BOTH GPIO",
|
|
||||||
.freq_limit = ESP_SPI_SLAVE_MAX_FREQ_SYNC,
|
|
||||||
//.freq_limit = ESP_SPI_SLAVE_MAX_READ_FREQ, //ESP_SPI_SLAVE_MAX_FREQ_SYNC,
|
|
||||||
.dup = HALF_DUPLEX_MOSI,
|
|
||||||
.master_iomux = false,
|
|
||||||
.slave_iomux = false,
|
|
||||||
.slave_tv_ns = TV_INT_CONNECT_GPIO,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
TEST_SPI_LOCAL(TIMING, timing_pgroup)
|
|
||||||
|
|
||||||
/************ Mode Test ***********************************************/
|
|
||||||
#define FREQ_LIMIT_MODE SPI_MASTER_FREQ_16M
|
|
||||||
static int test_freq_mode_local[]={
|
|
||||||
1*1000*1000,
|
|
||||||
SPI_MASTER_FREQ_9M, //maximum freq MISO stable before next latch edge
|
|
||||||
SPI_MASTER_FREQ_13M,
|
|
||||||
SPI_MASTER_FREQ_16M,
|
|
||||||
SPI_MASTER_FREQ_20M,
|
|
||||||
SPI_MASTER_FREQ_26M,
|
|
||||||
SPI_MASTER_FREQ_40M,
|
|
||||||
0,
|
|
||||||
};
|
|
||||||
|
|
||||||
static spitest_param_set_t mode_pgroup[] = {
|
|
||||||
{ .pset_name = "Mode 0",
|
|
||||||
.freq_list = test_freq_mode_local,
|
|
||||||
.master_limit = SPI_MASTER_FREQ_13M,
|
|
||||||
.dup = FULL_DUPLEX,
|
|
||||||
.mode = 0,
|
|
||||||
.master_iomux = false,
|
|
||||||
.slave_iomux = true,
|
|
||||||
.slave_tv_ns = TV_INT_CONNECT,
|
|
||||||
},
|
|
||||||
{ .pset_name = "Mode 1",
|
|
||||||
.freq_list = test_freq_mode_local,
|
|
||||||
.freq_limit = SPI_MASTER_FREQ_26M,
|
|
||||||
.master_limit = SPI_MASTER_FREQ_13M,
|
|
||||||
.dup = FULL_DUPLEX,
|
|
||||||
.mode = 1,
|
|
||||||
.master_iomux = false,
|
|
||||||
.slave_iomux = true,
|
|
||||||
.slave_tv_ns = TV_INT_CONNECT,
|
|
||||||
},
|
|
||||||
{ .pset_name = "Mode 2",
|
|
||||||
.freq_list = test_freq_mode_local,
|
|
||||||
.master_limit = SPI_MASTER_FREQ_13M,
|
|
||||||
.dup = FULL_DUPLEX,
|
|
||||||
.mode = 2,
|
|
||||||
.master_iomux = false,
|
|
||||||
.slave_iomux = true,
|
|
||||||
.slave_tv_ns = TV_INT_CONNECT,
|
|
||||||
},
|
|
||||||
{ .pset_name = "Mode 3",
|
|
||||||
.freq_list = test_freq_mode_local,
|
|
||||||
.freq_limit = SPI_MASTER_FREQ_26M,
|
|
||||||
.master_limit = SPI_MASTER_FREQ_13M,
|
|
||||||
.dup = FULL_DUPLEX,
|
|
||||||
.mode = 3,
|
|
||||||
.master_iomux = false,
|
|
||||||
.slave_iomux = true,
|
|
||||||
.slave_tv_ns = TV_INT_CONNECT,
|
|
||||||
},
|
|
||||||
{ .pset_name = "Mode 0, DMA",
|
|
||||||
.freq_list = test_freq_mode_local,
|
|
||||||
.master_limit = SPI_MASTER_FREQ_13M,
|
|
||||||
.dup = FULL_DUPLEX,
|
|
||||||
.mode = 0,
|
|
||||||
.slave_dma_chan = 2,
|
|
||||||
.master_iomux = false,
|
|
||||||
.slave_iomux = true,
|
|
||||||
.slave_tv_ns = TV_INT_CONNECT, //at 16M, the MISO delay (-0.5T+(3+2)apb) equals to non-DMA mode delay (3apb).
|
|
||||||
.length_aligned = true,
|
|
||||||
},
|
|
||||||
{ .pset_name = "Mode 1, DMA",
|
|
||||||
.freq_list = test_freq_mode_local,
|
|
||||||
.freq_limit = SPI_MASTER_FREQ_26M,
|
|
||||||
.master_limit = SPI_MASTER_FREQ_13M,
|
|
||||||
.dup = FULL_DUPLEX,
|
|
||||||
.mode = 1,
|
|
||||||
.slave_dma_chan = 2,
|
|
||||||
.master_iomux = false,
|
|
||||||
.slave_iomux = true,
|
|
||||||
.slave_tv_ns = TV_INT_CONNECT,
|
|
||||||
.length_aligned = true,
|
|
||||||
},
|
|
||||||
{ .pset_name = "Mode 2, DMA",
|
|
||||||
.freq_list = test_freq_mode_local,
|
|
||||||
.master_limit = SPI_MASTER_FREQ_13M,
|
|
||||||
.dup = FULL_DUPLEX,
|
|
||||||
.mode = 2,
|
|
||||||
.slave_dma_chan = 2,
|
|
||||||
.master_iomux = false,
|
|
||||||
.slave_iomux = true,
|
|
||||||
.slave_tv_ns = TV_INT_CONNECT, //at 16M, the MISO delay (-0.5T+(3+2)apb) equals to non-DMA mode delay (3apb).
|
|
||||||
.length_aligned = true,
|
|
||||||
},
|
|
||||||
{ .pset_name = "Mode 3, DMA",
|
|
||||||
.freq_list = test_freq_mode_local,
|
|
||||||
.freq_limit = SPI_MASTER_FREQ_26M,
|
|
||||||
.master_limit = SPI_MASTER_FREQ_13M,
|
|
||||||
.dup = FULL_DUPLEX,
|
|
||||||
.mode = 3,
|
|
||||||
.slave_dma_chan = 2,
|
|
||||||
.master_iomux = false,
|
|
||||||
.slave_iomux = true,
|
|
||||||
.slave_tv_ns = TV_INT_CONNECT,
|
|
||||||
.length_aligned = true,
|
|
||||||
},
|
|
||||||
// MISO ////////////////////////////////////
|
|
||||||
{ .pset_name = "MISO, Mode 0",
|
|
||||||
.freq_list = test_freq_mode_local,
|
|
||||||
.dup = HALF_DUPLEX_MISO,
|
|
||||||
.mode = 0,
|
|
||||||
.master_iomux = false,
|
|
||||||
.slave_iomux = true,
|
|
||||||
.slave_tv_ns = TV_INT_CONNECT,
|
|
||||||
},
|
|
||||||
{ .pset_name = "MISO, Mode 1",
|
|
||||||
.freq_list = test_freq_mode_local,
|
|
||||||
.dup = HALF_DUPLEX_MISO,
|
|
||||||
.mode = 1,
|
|
||||||
.master_iomux = false,
|
|
||||||
.slave_iomux = true,
|
|
||||||
.slave_tv_ns = TV_INT_CONNECT,
|
|
||||||
},
|
|
||||||
{ .pset_name = "MISO, Mode 2",
|
|
||||||
.freq_list = test_freq_mode_local,
|
|
||||||
.dup = HALF_DUPLEX_MISO,
|
|
||||||
.mode = 2,
|
|
||||||
.master_iomux = false,
|
|
||||||
.slave_iomux = true,
|
|
||||||
.slave_tv_ns = TV_INT_CONNECT,
|
|
||||||
},
|
|
||||||
{ .pset_name = "MISO, Mode 3",
|
|
||||||
.freq_list = test_freq_mode_local,
|
|
||||||
.dup = HALF_DUPLEX_MISO,
|
|
||||||
.mode = 3,
|
|
||||||
.master_iomux = false,
|
|
||||||
.slave_iomux = true,
|
|
||||||
.slave_tv_ns = TV_INT_CONNECT,
|
|
||||||
},
|
|
||||||
{ .pset_name = "MISO, Mode 0, DMA",
|
|
||||||
.freq_list = test_freq_mode_local,
|
|
||||||
.dup = HALF_DUPLEX_MISO,
|
|
||||||
.mode = 0,
|
|
||||||
.slave_dma_chan = 2,
|
|
||||||
.master_iomux = false,
|
|
||||||
.slave_iomux = true,
|
|
||||||
.slave_tv_ns = TV_INT_CONNECT+12.5, //at 16M, the MISO delay (-0.5T+(3+2)apb) equals to non-DMA mode delay (3apb).
|
|
||||||
.length_aligned = true,
|
|
||||||
},
|
|
||||||
{ .pset_name = "MISO, Mode 1, DMA",
|
|
||||||
.freq_list = test_freq_mode_local,
|
|
||||||
.dup = HALF_DUPLEX_MISO,
|
|
||||||
.mode = 1,
|
|
||||||
.slave_dma_chan = 2,
|
|
||||||
.master_iomux = false,
|
|
||||||
.slave_iomux = true,
|
|
||||||
.slave_tv_ns = TV_INT_CONNECT,
|
|
||||||
.length_aligned = true,
|
|
||||||
},
|
|
||||||
{ .pset_name = "MISO, Mode 2, DMA",
|
|
||||||
.freq_list = test_freq_mode_local,
|
|
||||||
.dup = HALF_DUPLEX_MISO,
|
|
||||||
.mode = 2,
|
|
||||||
.slave_dma_chan = 2,
|
|
||||||
.master_iomux = false,
|
|
||||||
.slave_iomux = true,
|
|
||||||
.slave_tv_ns = TV_INT_CONNECT+12.5, //at 16M, the MISO delay (-0.5T+(3+2)apb) equals to non-DMA mode delay (3apb).
|
|
||||||
.length_aligned = true,
|
|
||||||
},
|
|
||||||
{ .pset_name = "MISO, Mode 3, DMA",
|
|
||||||
.freq_list = test_freq_mode_local,
|
|
||||||
.dup = HALF_DUPLEX_MISO,
|
|
||||||
.mode = 3,
|
|
||||||
.slave_dma_chan = 2,
|
|
||||||
.master_iomux = false,
|
|
||||||
.slave_iomux = true,
|
|
||||||
.slave_tv_ns = TV_INT_CONNECT,
|
|
||||||
.length_aligned = true,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
TEST_SPI_LOCAL(MODE, mode_pgroup)
|
|
|
@ -1,105 +0,0 @@
|
||||||
/*
|
|
||||||
Tests for the spi sio mode
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <esp_types.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <malloc.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include "freertos/FreeRTOS.h"
|
|
||||||
#include "freertos/task.h"
|
|
||||||
#include "freertos/semphr.h"
|
|
||||||
#include "freertos/queue.h"
|
|
||||||
#include "freertos/xtensa_api.h"
|
|
||||||
#include "unity.h"
|
|
||||||
#include "driver/spi_master.h"
|
|
||||||
#include "driver/spi_slave.h"
|
|
||||||
#include "esp_heap_caps.h"
|
|
||||||
#include "esp_log.h"
|
|
||||||
#include "soc/spi_periph.h"
|
|
||||||
#include "test_utils.h"
|
|
||||||
#include "test/test_common_spi.h"
|
|
||||||
#include "soc/gpio_periph.h"
|
|
||||||
#include "sdkconfig.h"
|
|
||||||
#include "hal/spi_ll.h"
|
|
||||||
|
|
||||||
|
|
||||||
/********************************************************************************
|
|
||||||
* Test SIO
|
|
||||||
********************************************************************************/
|
|
||||||
TEST_CASE("local test sio", "[spi]")
|
|
||||||
{
|
|
||||||
spi_device_handle_t spi;
|
|
||||||
WORD_ALIGNED_ATTR uint8_t master_rx_buffer[320];
|
|
||||||
WORD_ALIGNED_ATTR uint8_t slave_rx_buffer[320];
|
|
||||||
|
|
||||||
uint32_t padding[16];
|
|
||||||
for (int i = 0; i < 16; i++)
|
|
||||||
padding[i] = 0xcccccccc;;
|
|
||||||
|
|
||||||
spi_ll_write_buffer(SPI_LL_GET_HW(TEST_SPI_HOST), (uint8_t*)&padding, 8*64);
|
|
||||||
spi_ll_write_buffer(SPI_LL_GET_HW(TEST_SLAVE_HOST), (uint8_t*)&padding, 8*64);
|
|
||||||
|
|
||||||
/* This test use a strange connection to test the SIO mode:
|
|
||||||
* master spid -> slave spid
|
|
||||||
* slave spiq -> master spid
|
|
||||||
*/
|
|
||||||
spi_bus_config_t bus_cfg = SPI_BUS_TEST_DEFAULT_CONFIG();
|
|
||||||
spi_device_interface_config_t dev_cfg = SPI_DEVICE_TEST_DEFAULT_CONFIG();
|
|
||||||
spi_slave_interface_config_t slv_cfg = SPI_SLAVE_TEST_DEFAULT_CONFIG();
|
|
||||||
slv_cfg.spics_io_num = dev_cfg.spics_io_num;
|
|
||||||
TEST_ESP_OK(spi_slave_initialize(TEST_SLAVE_HOST, &bus_cfg, &slv_cfg, 0));
|
|
||||||
|
|
||||||
int miso_io_num = bus_cfg.miso_io_num;
|
|
||||||
int mosi_io_num = bus_cfg.mosi_io_num;
|
|
||||||
bus_cfg.mosi_io_num = bus_cfg.miso_io_num;
|
|
||||||
bus_cfg.miso_io_num = -1;
|
|
||||||
TEST_ESP_OK(spi_bus_initialize(TEST_SPI_HOST, &bus_cfg, 0));
|
|
||||||
|
|
||||||
dev_cfg.flags = SPI_DEVICE_HALFDUPLEX | SPI_DEVICE_3WIRE;
|
|
||||||
TEST_ESP_OK(spi_bus_add_device(TEST_SPI_HOST, &dev_cfg, &spi));
|
|
||||||
|
|
||||||
spitest_gpio_output_sel(mosi_io_num, FUNC_GPIO, spi_periph_signal[TEST_SPI_HOST].spid_out);
|
|
||||||
spitest_gpio_output_sel(miso_io_num, FUNC_GPIO, spi_periph_signal[TEST_SLAVE_HOST].spiq_out);
|
|
||||||
spitest_gpio_output_sel(dev_cfg.spics_io_num, FUNC_GPIO, spi_periph_signal[TEST_SPI_HOST].spics_out[0]);
|
|
||||||
spitest_gpio_output_sel(bus_cfg.sclk_io_num, FUNC_GPIO, spi_periph_signal[TEST_SPI_HOST].spiclk_out);
|
|
||||||
|
|
||||||
for (int i = 0; i < 8; i ++) {
|
|
||||||
int tlen = i*2+1;
|
|
||||||
int rlen = 9-i;
|
|
||||||
|
|
||||||
ESP_LOGI(MASTER_TAG, "=========== TEST%d ==========", i);
|
|
||||||
|
|
||||||
spi_transaction_t master_t = {
|
|
||||||
.length = tlen*8,
|
|
||||||
.tx_buffer = spitest_master_send+i,
|
|
||||||
.rxlength = rlen*8,
|
|
||||||
.rx_buffer = master_rx_buffer+i,
|
|
||||||
};
|
|
||||||
spi_slave_transaction_t slave_t = {
|
|
||||||
.length = (tlen+rlen)*8,
|
|
||||||
.tx_buffer = spitest_slave_send+i,
|
|
||||||
.rx_buffer = slave_rx_buffer,
|
|
||||||
};
|
|
||||||
memset(master_rx_buffer, 0x66, sizeof(master_rx_buffer));
|
|
||||||
memset(slave_rx_buffer, 0x66, sizeof(slave_rx_buffer));
|
|
||||||
TEST_ESP_OK(spi_slave_queue_trans(TEST_SLAVE_HOST, &slave_t, portMAX_DELAY));
|
|
||||||
|
|
||||||
TEST_ESP_OK(spi_device_transmit(spi, &master_t));
|
|
||||||
spi_slave_transaction_t* ret_t;
|
|
||||||
TEST_ESP_OK(spi_slave_get_trans_result(TEST_SLAVE_HOST, &ret_t, portMAX_DELAY));
|
|
||||||
TEST_ASSERT(ret_t == &slave_t);
|
|
||||||
|
|
||||||
ESP_LOG_BUFFER_HEXDUMP("master tx", master_t.tx_buffer, tlen, ESP_LOG_INFO);
|
|
||||||
ESP_LOG_BUFFER_HEXDUMP("slave rx", slave_t.rx_buffer, tlen+rlen, ESP_LOG_INFO);
|
|
||||||
ESP_LOG_BUFFER_HEXDUMP("slave tx", slave_t.tx_buffer, tlen+rlen, ESP_LOG_INFO);
|
|
||||||
ESP_LOG_BUFFER_HEXDUMP("master rx", master_t.rx_buffer, rlen, ESP_LOG_INFO);
|
|
||||||
|
|
||||||
TEST_ASSERT_EQUAL_HEX8_ARRAY(master_t.tx_buffer, slave_t.rx_buffer, tlen);
|
|
||||||
TEST_ASSERT_EQUAL_HEX8_ARRAY(slave_t.tx_buffer + tlen, master_t.rx_buffer, rlen);
|
|
||||||
}
|
|
||||||
|
|
||||||
spi_slave_free(TEST_SLAVE_HOST);
|
|
||||||
master_free_device_bus(spi);
|
|
||||||
}
|
|
|
@ -838,7 +838,7 @@ TEST_CASE("performance test - dedicated task", "[event]")
|
||||||
performance_test(true);
|
performance_test(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("performance test - no dedicated task", "[event]")
|
TEST_CASE_ESP32("performance test - no dedicated task", "[event]")
|
||||||
{
|
{
|
||||||
performance_test(false);
|
performance_test(false);
|
||||||
}
|
}
|
||||||
|
|
|
@ -57,4 +57,4 @@ static void test_fn3(void)
|
||||||
check_calloc(7000);
|
check_calloc(7000);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE_MULTIPLE_STAGES("Check for leaks in MULTIPLE_STAGES mode (manual reset)", "[heap][leaks][reset=SW_CPU_RESET, SW_CPU_RESET]", test_fn2, test_fn2, test_fn3);
|
TEST_CASE_MULTIPLE_STAGES_ESP32("Check for leaks in MULTIPLE_STAGES mode (manual reset)", "[heap][leaks][reset=SW_CPU_RESET, SW_CPU_RESET]", test_fn2, test_fn2, test_fn3);
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
|
|
||||||
TEST_CASE("Capabilities allocator test", "[heap]")
|
TEST_CASE_ESP32("Capabilities allocator test", "[heap]")
|
||||||
{
|
{
|
||||||
char *m1, *m2[10];
|
char *m1, *m2[10];
|
||||||
int x;
|
int x;
|
||||||
|
|
|
@ -22,7 +22,7 @@ TEST_CASE("realloc shrink buffer in place", "[heap]")
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
TEST_CASE("realloc move data to a new heap type", "[heap]")
|
TEST_CASE_ESP32("realloc move data to a new heap type", "[heap]")
|
||||||
{
|
{
|
||||||
const char *test = "I am some test content to put in the heap";
|
const char *test = "I am some test content to put in the heap";
|
||||||
char buf[64];
|
char buf[64];
|
||||||
|
|
|
@ -39,7 +39,7 @@ TEST_CASE("box tests", "[libsodium]")
|
||||||
|
|
||||||
extern int ed25519_convert_xmain(void);
|
extern int ed25519_convert_xmain(void);
|
||||||
|
|
||||||
TEST_CASE("ed25519_convert tests", "[libsodium][timeout=60]")
|
TEST_CASE_ESP32("ed25519_convert tests", "[libsodium][timeout=60]")
|
||||||
{
|
{
|
||||||
printf("Running ed25519_convert\n");
|
printf("Running ed25519_convert\n");
|
||||||
TEST_ASSERT_EQUAL(0, ed25519_convert_xmain() );
|
TEST_ASSERT_EQUAL(0, ed25519_convert_xmain() );
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
error hex value (mbedTLS uses -N for error codes) */
|
error hex value (mbedTLS uses -N for error codes) */
|
||||||
#define TEST_ASSERT_MBEDTLS_OK(X) TEST_ASSERT_EQUAL_HEX32(0, -(X))
|
#define TEST_ASSERT_MBEDTLS_OK(X) TEST_ASSERT_EQUAL_HEX32(0, -(X))
|
||||||
|
|
||||||
TEST_CASE("mbedtls ECDH Generate Key", "[mbedtls]")
|
TEST_CASE_ESP32("mbedtls ECDH Generate Key", "[mbedtls]")
|
||||||
{
|
{
|
||||||
mbedtls_ecdh_context ctx;
|
mbedtls_ecdh_context ctx;
|
||||||
mbedtls_entropy_context entropy;
|
mbedtls_entropy_context entropy;
|
||||||
|
@ -48,7 +48,7 @@ TEST_CASE("mbedtls ECP self-tests", "[mbedtls]")
|
||||||
TEST_ASSERT_EQUAL(0, mbedtls_ecp_self_test(1));
|
TEST_ASSERT_EQUAL(0, mbedtls_ecp_self_test(1));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("mbedtls ECP mul w/ koblitz", "[mbedtls]")
|
TEST_CASE_ESP32("mbedtls ECP mul w/ koblitz", "[mbedtls]")
|
||||||
{
|
{
|
||||||
/* Test case code via https://github.com/espressif/esp-idf/issues/1556 */
|
/* Test case code via https://github.com/espressif/esp-idf/issues/1556 */
|
||||||
mbedtls_entropy_context ctxEntropy;
|
mbedtls_entropy_context ctxEntropy;
|
||||||
|
|
|
@ -165,7 +165,7 @@ static bool test_bignum_modexp(const char *z_str, const char *x_str, const char
|
||||||
return fail;
|
return fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("test MPI modexp", "[bignum]")
|
TEST_CASE_ESP32("test MPI modexp", "[bignum]")
|
||||||
{
|
{
|
||||||
bool test_error = false;
|
bool test_error = false;
|
||||||
printf("Z = (X ^ Y) mod M \n");
|
printf("Z = (X ^ Y) mod M \n");
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
#include "sdkconfig.h"
|
#include "sdkconfig.h"
|
||||||
#include "test_apb_dport_access.h"
|
#include "test_apb_dport_access.h"
|
||||||
|
|
||||||
TEST_CASE("mbedtls SHA self-tests", "[mbedtls]")
|
TEST_CASE_ESP32("mbedtls SHA self-tests", "[mbedtls]")
|
||||||
{
|
{
|
||||||
start_apb_access_loop();
|
start_apb_access_loop();
|
||||||
TEST_ASSERT_FALSE_MESSAGE(mbedtls_sha1_self_test(1), "SHA1 self-tests should pass.");
|
TEST_ASSERT_FALSE_MESSAGE(mbedtls_sha1_self_test(1), "SHA1 self-tests should pass.");
|
||||||
|
@ -121,7 +121,7 @@ static void tskRunSHA256Test(void *pvParameters)
|
||||||
|
|
||||||
#define SHA_TASK_STACK_SIZE (10*1024)
|
#define SHA_TASK_STACK_SIZE (10*1024)
|
||||||
|
|
||||||
TEST_CASE("mbedtls SHA multithreading", "[mbedtls]")
|
TEST_CASE_ESP32("mbedtls SHA multithreading", "[mbedtls]")
|
||||||
{
|
{
|
||||||
done_sem = xSemaphoreCreateCounting(4, 0);
|
done_sem = xSemaphoreCreateCounting(4, 0);
|
||||||
xTaskCreate(tskRunSHA1Test, "SHA1Task1", SHA_TASK_STACK_SIZE, NULL, 3, NULL);
|
xTaskCreate(tskRunSHA1Test, "SHA1Task1", SHA_TASK_STACK_SIZE, NULL, 3, NULL);
|
||||||
|
@ -164,7 +164,7 @@ void tskRunSHASelftests(void *param)
|
||||||
vTaskDelete(NULL);
|
vTaskDelete(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("mbedtls SHA self-tests multithreaded", "[mbedtls]")
|
TEST_CASE_ESP32("mbedtls SHA self-tests multithreaded", "[mbedtls]")
|
||||||
{
|
{
|
||||||
done_sem = xSemaphoreCreateCounting(2, 0);
|
done_sem = xSemaphoreCreateCounting(2, 0);
|
||||||
xTaskCreate(tskRunSHASelftests, "SHASelftests1", SHA_TASK_STACK_SIZE, NULL, 3, NULL);
|
xTaskCreate(tskRunSHASelftests, "SHASelftests1", SHA_TASK_STACK_SIZE, NULL, 3, NULL);
|
||||||
|
@ -180,7 +180,7 @@ TEST_CASE("mbedtls SHA self-tests multithreaded", "[mbedtls]")
|
||||||
vSemaphoreDelete(done_sem);
|
vSemaphoreDelete(done_sem);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("mbedtls SHA512 clone", "[mbedtls]")
|
TEST_CASE_ESP32("mbedtls SHA512 clone", "[mbedtls]")
|
||||||
{
|
{
|
||||||
mbedtls_sha512_context ctx;
|
mbedtls_sha512_context ctx;
|
||||||
mbedtls_sha512_context clone;
|
mbedtls_sha512_context clone;
|
||||||
|
@ -205,7 +205,7 @@ TEST_CASE("mbedtls SHA512 clone", "[mbedtls]")
|
||||||
TEST_ASSERT_EQUAL_MEMORY_MESSAGE(sha512_thousand_bs, sha512, 64, "SHA512 cloned calculation");
|
TEST_ASSERT_EQUAL_MEMORY_MESSAGE(sha512_thousand_bs, sha512, 64, "SHA512 cloned calculation");
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("mbedtls SHA384 clone", "[mbedtls]")
|
TEST_CASE_ESP32("mbedtls SHA384 clone", "[mbedtls]")
|
||||||
{
|
{
|
||||||
mbedtls_sha512_context ctx;
|
mbedtls_sha512_context ctx;
|
||||||
mbedtls_sha512_context clone;
|
mbedtls_sha512_context clone;
|
||||||
|
@ -231,7 +231,7 @@ TEST_CASE("mbedtls SHA384 clone", "[mbedtls]")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
TEST_CASE("mbedtls SHA256 clone", "[mbedtls]")
|
TEST_CASE_ESP32("mbedtls SHA256 clone", "[mbedtls]")
|
||||||
{
|
{
|
||||||
mbedtls_sha256_context ctx;
|
mbedtls_sha256_context ctx;
|
||||||
mbedtls_sha256_context clone;
|
mbedtls_sha256_context clone;
|
||||||
|
@ -276,7 +276,7 @@ static void tskFinaliseSha(void *v_param)
|
||||||
vTaskDelete(NULL);
|
vTaskDelete(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("mbedtls SHA session passed between tasks" , "[mbedtls]")
|
TEST_CASE_ESP32("mbedtls SHA session passed between tasks" , "[mbedtls]")
|
||||||
{
|
{
|
||||||
finalise_sha_param_t param = { 0 };
|
finalise_sha_param_t param = { 0 };
|
||||||
|
|
||||||
|
|
|
@ -423,7 +423,7 @@ void test_posix_timers_clock (void)
|
||||||
#endif // defined( WITH_FRC ) || defined( WITH_RTC )
|
#endif // defined( WITH_FRC ) || defined( WITH_RTC )
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("test posix_timers clock_... functions", "[newlib]")
|
TEST_CASE_ESP32("test posix_timers clock_... functions", "[newlib]")
|
||||||
{
|
{
|
||||||
test_posix_timers_clock();
|
test_posix_timers_clock();
|
||||||
}
|
}
|
||||||
|
|
|
@ -1098,7 +1098,7 @@ static esp_err_t test_security0 (void)
|
||||||
return ESP_OK;
|
return ESP_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("leak test", "[PROTOCOMM]")
|
TEST_CASE_ESP32("leak test", "[PROTOCOMM]")
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_HEAP_TRACING
|
#ifdef CONFIG_HEAP_TRACING
|
||||||
heap_trace_init_standalone(trace_record, NUM_RECORDS);
|
heap_trace_init_standalone(trace_record, NUM_RECORDS);
|
||||||
|
@ -1144,17 +1144,17 @@ TEST_CASE("security 0 basic test", "[PROTOCOMM]")
|
||||||
TEST_ASSERT(test_security0() == ESP_OK);
|
TEST_ASSERT(test_security0() == ESP_OK);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("security 1 basic test", "[PROTOCOMM]")
|
TEST_CASE_ESP32("security 1 basic test", "[PROTOCOMM]")
|
||||||
{
|
{
|
||||||
TEST_ASSERT(test_security1() == ESP_OK);
|
TEST_ASSERT(test_security1() == ESP_OK);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("security 1 no encryption test", "[PROTOCOMM]")
|
TEST_CASE_ESP32("security 1 no encryption test", "[PROTOCOMM]")
|
||||||
{
|
{
|
||||||
TEST_ASSERT(test_security1_no_encryption() == ESP_OK);
|
TEST_ASSERT(test_security1_no_encryption() == ESP_OK);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("security 1 session overflow test", "[PROTOCOMM]")
|
TEST_CASE_ESP32("security 1 session overflow test", "[PROTOCOMM]")
|
||||||
{
|
{
|
||||||
TEST_ASSERT(test_security1_session_overflow() == ESP_OK);
|
TEST_ASSERT(test_security1_session_overflow() == ESP_OK);
|
||||||
}
|
}
|
||||||
|
@ -1164,12 +1164,12 @@ TEST_CASE("security 1 wrong pop test", "[PROTOCOMM]")
|
||||||
TEST_ASSERT(test_security1_wrong_pop() == ESP_OK);
|
TEST_ASSERT(test_security1_wrong_pop() == ESP_OK);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("security 1 insecure client test", "[PROTOCOMM]")
|
TEST_CASE_ESP32("security 1 insecure client test", "[PROTOCOMM]")
|
||||||
{
|
{
|
||||||
TEST_ASSERT(test_security1_insecure_client() == ESP_OK);
|
TEST_ASSERT(test_security1_insecure_client() == ESP_OK);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("security 1 weak session test", "[PROTOCOMM]")
|
TEST_CASE_ESP32("security 1 weak session test", "[PROTOCOMM]")
|
||||||
{
|
{
|
||||||
TEST_ASSERT(test_security1_weak_session() == ESP_OK);
|
TEST_ASSERT(test_security1_weak_session() == ESP_OK);
|
||||||
}
|
}
|
||||||
|
|
|
@ -75,7 +75,7 @@ static void setup_mmap_tests(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("Can mmap into data address space", "[spi_flash]")
|
TEST_CASE_ESP32("Can mmap into data address space", "[spi_flash]")
|
||||||
{
|
{
|
||||||
setup_mmap_tests();
|
setup_mmap_tests();
|
||||||
|
|
||||||
|
@ -135,7 +135,7 @@ TEST_CASE("Can mmap into data address space", "[spi_flash]")
|
||||||
TEST_ASSERT_EQUAL_PTR(NULL, spi_flash_phys2cache(start, SPI_FLASH_MMAP_DATA));
|
TEST_ASSERT_EQUAL_PTR(NULL, spi_flash_phys2cache(start, SPI_FLASH_MMAP_DATA));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("Can mmap into instruction address space", "[mmap]")
|
TEST_CASE_ESP32("Can mmap into instruction address space", "[mmap]")
|
||||||
{
|
{
|
||||||
setup_mmap_tests();
|
setup_mmap_tests();
|
||||||
|
|
||||||
|
@ -183,7 +183,7 @@ TEST_CASE("Can mmap into instruction address space", "[mmap]")
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("Can mmap unordered pages into contiguous memory", "[spi_flash]")
|
TEST_CASE_ESP32("Can mmap unordered pages into contiguous memory", "[spi_flash]")
|
||||||
{
|
{
|
||||||
int nopages;
|
int nopages;
|
||||||
int *pages;
|
int *pages;
|
||||||
|
@ -324,7 +324,7 @@ TEST_CASE("flash_mmap can mmap after get enough free MMU pages", "[spi_flash]")
|
||||||
TEST_ASSERT_EQUAL_PTR(NULL, spi_flash_phys2cache(start, SPI_FLASH_MMAP_DATA));
|
TEST_ASSERT_EQUAL_PTR(NULL, spi_flash_phys2cache(start, SPI_FLASH_MMAP_DATA));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("phys2cache/cache2phys basic checks", "[spi_flash]")
|
TEST_CASE_ESP32("phys2cache/cache2phys basic checks", "[spi_flash]")
|
||||||
{
|
{
|
||||||
uint8_t buf[64];
|
uint8_t buf[64];
|
||||||
|
|
||||||
|
@ -401,7 +401,7 @@ TEST_CASE("munmap followed by mmap flushes cache", "[spi_flash]")
|
||||||
TEST_ASSERT_NOT_EQUAL(0, memcmp(buf, data, sizeof(buf)));
|
TEST_ASSERT_NOT_EQUAL(0, memcmp(buf, data, sizeof(buf)));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("no stale data read post mmap and write partition", "[spi_flash]")
|
TEST_CASE_ESP32("no stale data read post mmap and write partition", "[spi_flash]")
|
||||||
{
|
{
|
||||||
const char buf[] = "Test buffer data for partition";
|
const char buf[] = "Test buffer data for partition";
|
||||||
char read_data[sizeof(buf)];
|
char read_data[sizeof(buf)];
|
||||||
|
|
|
@ -167,7 +167,7 @@ static void IRAM_ATTR test_write(int dst_off, int src_off, int len)
|
||||||
TEST_ASSERT_EQUAL_INT(cmp_or_dump(dst_buf, dst_gold, sizeof(dst_buf)), 0);
|
TEST_ASSERT_EQUAL_INT(cmp_or_dump(dst_buf, dst_gold, sizeof(dst_buf)), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("Test spi_flash_write", "[spi_flash][esp_flash]")
|
TEST_CASE_ESP32("Test spi_flash_write", "[spi_flash][esp_flash]")
|
||||||
{
|
{
|
||||||
setup_tests();
|
setup_tests();
|
||||||
#if CONFIG_SPI_FLASH_MINIMAL_TEST
|
#if CONFIG_SPI_FLASH_MINIMAL_TEST
|
||||||
|
|
|
@ -130,6 +130,8 @@ void unity_testcase_register(test_desc_t* desc);
|
||||||
unity_testcase_register( & UNITY_TEST_UID(test_desc_) ); \
|
unity_testcase_register( & UNITY_TEST_UID(test_desc_) ); \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* First argument is a free-form description,
|
* First argument is a free-form description,
|
||||||
* second argument is (by convention) a list of identifiers, each one in square brackets.
|
* second argument is (by convention) a list of identifiers, each one in square brackets.
|
||||||
|
@ -172,3 +174,14 @@ void unity_run_all_tests(void);
|
||||||
|
|
||||||
void unity_run_menu(void);
|
void unity_run_menu(void);
|
||||||
|
|
||||||
|
#include "sdkconfig.h"
|
||||||
|
#if CONFIG_IDF_TARGET_ESP32
|
||||||
|
#define TEST_CASE_ESP32(...) TEST_CASE(__VA_ARGS__)
|
||||||
|
#define TEST_CASE_MULTIPLE_STAGES_ESP32(...) TEST_CASE_MULTIPLE_STAGES(__VA_ARGS__)
|
||||||
|
#define TEST_CASE_MULTIPLE_DEVICES_ESP32(...) TEST_CASE_MULTIPLE_DEVICES(__VA_ARGS__)
|
||||||
|
#else
|
||||||
|
#define TEST_CASE_ESP32(...) __attribute__((unused)) static void UNITY_TEST_UID(test_func_) (void)
|
||||||
|
#define TEST_CASE_MULTIPLE_STAGES_ESP32(_, __, ...) __attribute__((unused)) static test_func UNITY_TEST_UID(test_functions)[] = {__VA_ARGS__};
|
||||||
|
#define TEST_CASE_MULTIPLE_DEVICES_ESP32(_, __, ...) __attribute__((unused)) static test_func UNITY_TEST_UID(test_functions)[] = {__VA_ARGS__};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
|
@ -232,7 +232,7 @@ static int time_test_vfs_write(int fd, const void *data, size_t size)
|
||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("Open & write & close through VFS passes performance test", "[vfs]")
|
TEST_CASE_ESP32("Open & write & close through VFS passes performance test", "[vfs]")
|
||||||
{
|
{
|
||||||
esp_vfs_t desc = {
|
esp_vfs_t desc = {
|
||||||
.flags = ESP_VFS_FLAG_DEFAULT,
|
.flags = ESP_VFS_FLAG_DEFAULT,
|
||||||
|
|
|
@ -23,7 +23,7 @@
|
||||||
#include "mbedtls/ecp.h"
|
#include "mbedtls/ecp.h"
|
||||||
typedef struct crypto_bignum crypto_bignum;
|
typedef struct crypto_bignum crypto_bignum;
|
||||||
|
|
||||||
TEST_CASE("Test crypto lib bignum apis", "[wpa_crypto]")
|
TEST_CASE_ESP32("Test crypto lib bignum apis", "[wpa_crypto]")
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
|
@ -414,7 +414,7 @@ UT_030:
|
||||||
|
|
||||||
UT_031:
|
UT_031:
|
||||||
extends: .unit_test_template
|
extends: .unit_test_template
|
||||||
parallel: 34
|
parallel: 28
|
||||||
tags:
|
tags:
|
||||||
- 7.2.2
|
- 7.2.2
|
||||||
- UT_T1_1
|
- UT_T1_1
|
||||||
|
|
Loading…
Reference in a new issue