Skip to content

Commit 83c0999

Browse files
committed
refactor(driver_spi): test apps merge duplicat cases using soft spi
1 parent 51873d4 commit 83c0999

File tree

8 files changed

+178
-450
lines changed

8 files changed

+178
-450
lines changed

components/driver/test_apps/components/test_driver_utils/include/test_spi_utils.h

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -282,11 +282,18 @@ void spitest_gpio_input_sel(uint32_t gpio_num, int func, uint32_t signal_idx);
282282

283283
//Note this cs_num is the ID of the connected devices' ID, e.g. if 2 devices are connected to the bus,
284284
//then the cs_num of the 1st and 2nd devices are 0 and 1 respectively.
285-
void same_pin_func_sel(spi_bus_config_t bus, spi_device_interface_config_t dev, uint8_t cs_num);
285+
//Enable `soft_master` to connect to soft spi master instead of hardware master.
286+
void same_pin_func_sel(spi_bus_config_t bus, uint8_t cs_pin, uint8_t cs_dev_id, bool soft_master);
286287

287288
// Soft simulated spi master host for slave testing
288-
// TODO: `speed_hz` is not implemented yet, temp to max 500Hz
289+
// `speed_hz` max 500kHz
289290
// TODO: mode 0 only
290-
void spi_master_trans_impl_gpio(spi_bus_config_t bus, uint8_t cs_pin, uint8_t speed_hz, void *tx, void *rx, uint32_t len);
291+
void spi_master_trans_impl_gpio(spi_bus_config_t bus, uint8_t cs_pin, uint32_t speed_hz, uint8_t *tx, uint8_t *rx, uint32_t len, bool hold_cs);
292+
293+
// Send/Receive long buffer by soft spi master in segments to the slave_hd through its DMA, refer to `essl_spi_wrdma/essl_spi_rddma`
294+
void essl_sspi_hd_dma_trans_seg(spi_bus_config_t bus, uint8_t cs_pin, uint32_t speed_hz, bool is_rx, void *buffer, int len, int seg_len);
295+
296+
// Write/Read the shared buffer of the slave_hd by soft spi master, refer to `essl_spi_wrbuf/essl_spi_rdbuf`
297+
void essl_sspi_hd_buffer_trans(spi_bus_config_t bus, uint8_t cs_pin, uint32_t speed_hz, spi_command_t cmd, uint8_t addr, void *buffer, uint32_t len);
291298

292299
#endif //_TEST_COMMON_SPI_H_

components/driver/test_apps/components/test_driver_utils/test_spi_utils.c

Lines changed: 59 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#include "driver/gpio.h"
1010
#include "esp_private/gpio.h"
1111
#include "hal/gpio_hal.h"
12+
#include "hal/spi_ll.h"
1213
#include "esp_rom_gpio.h"
1314

1415
int test_freq_default[] = TEST_FREQ_DEFAULT();
@@ -232,49 +233,81 @@ void spitest_gpio_input_sel(uint32_t gpio_num, int func, uint32_t signal_idx)
232233
esp_rom_gpio_connect_in_signal(gpio_num, signal_idx, 0);
233234
}
234235

235-
//Note this cs_dev_id is the ID of the connected devices' ID, e.g. if 2 devices are connected to the bus,
236-
//then the cs_dev_id of the 1st and 2nd devices are 0 and 1 respectively.
237-
void same_pin_func_sel(spi_bus_config_t bus, spi_device_interface_config_t dev, uint8_t cs_dev_id)
236+
void same_pin_func_sel(spi_bus_config_t bus, uint8_t cs_pin, uint8_t cs_dev_id, bool soft_master)
238237
{
239-
spitest_gpio_output_sel(bus.mosi_io_num, FUNC_GPIO, spi_periph_signal[TEST_SPI_HOST].spid_out);
238+
spitest_gpio_output_sel(bus.mosi_io_num, FUNC_GPIO, soft_master ? SIG_GPIO_OUT_IDX : spi_periph_signal[TEST_SPI_HOST].spid_out);
240239
spitest_gpio_input_sel(bus.mosi_io_num, FUNC_GPIO, spi_periph_signal[TEST_SLAVE_HOST].spid_in);
241240

242241
spitest_gpio_output_sel(bus.miso_io_num, FUNC_GPIO, spi_periph_signal[TEST_SLAVE_HOST].spiq_out);
243-
spitest_gpio_input_sel(bus.miso_io_num, FUNC_GPIO, spi_periph_signal[TEST_SPI_HOST].spiq_in);
242+
spitest_gpio_input_sel(bus.miso_io_num, FUNC_GPIO, soft_master ? SIG_GPIO_OUT_IDX : spi_periph_signal[TEST_SPI_HOST].spiq_in);
244243

245-
spitest_gpio_output_sel(dev.spics_io_num, FUNC_GPIO, spi_periph_signal[TEST_SPI_HOST].spics_out[cs_dev_id]);
246-
spitest_gpio_input_sel(dev.spics_io_num, FUNC_GPIO, spi_periph_signal[TEST_SLAVE_HOST].spics_in);
244+
gpio_set_level(cs_pin, 1); //ensure CS is inactive when select to soft_master and before transaction start
245+
spitest_gpio_output_sel(cs_pin, FUNC_GPIO, soft_master ? SIG_GPIO_OUT_IDX : spi_periph_signal[TEST_SPI_HOST].spics_out[cs_dev_id]);
246+
spitest_gpio_input_sel(cs_pin, FUNC_GPIO, spi_periph_signal[TEST_SLAVE_HOST].spics_in);
247247

248-
spitest_gpio_output_sel(bus.sclk_io_num, FUNC_GPIO, spi_periph_signal[TEST_SPI_HOST].spiclk_out);
248+
spitest_gpio_output_sel(bus.sclk_io_num, FUNC_GPIO, soft_master ? SIG_GPIO_OUT_IDX : spi_periph_signal[TEST_SPI_HOST].spiclk_out);
249249
spitest_gpio_input_sel(bus.sclk_io_num, FUNC_GPIO, spi_periph_signal[TEST_SLAVE_HOST].spiclk_in);
250250
}
251251

252-
void spi_master_trans_impl_gpio(spi_bus_config_t bus, uint8_t cs_pin, uint8_t speed_hz, void *tx, void *rx, uint32_t len)
252+
#define GPIO_MAX_FREQ 500*1000 //max of soft spi clock at delay(0)
253+
void spi_master_trans_impl_gpio(spi_bus_config_t bus, uint8_t cs_pin, uint32_t speed_hz, uint8_t *tx, uint8_t *rx, uint32_t len, bool hold_cs)
253254
{
254-
uint8_t *u8_tx = tx, *u8_rx = rx;
255-
gpio_set_level(cs_pin, 1); //ensure CS is inactive before transaction start
256-
esp_rom_gpio_connect_out_signal(cs_pin, SIG_GPIO_OUT_IDX, 0, 0);
257-
esp_rom_gpio_connect_out_signal(bus.sclk_io_num, SIG_GPIO_OUT_IDX, 0, 0);
258-
esp_rom_gpio_connect_out_signal(bus.mosi_io_num, SIG_GPIO_OUT_IDX, 0, 0);
259-
esp_rom_gpio_connect_in_signal(bus.miso_io_num, SIG_GPIO_OUT_IDX, 0);
260-
261-
gpio_set_level(cs_pin, 0);
262-
vTaskDelay(1); // cs_ena_pre_trans
255+
gpio_dev_t *hw = GPIO_LL_GET_HW(0);
256+
uint32_t half_duty_us = speed_hz ? ((GPIO_MAX_FREQ + speed_hz / 2) / speed_hz / 2) : 0;
257+
258+
gpio_ll_set_level(hw, cs_pin, 0);
263259
for (uint32_t index = 0; index < len; index ++) {
264260
uint8_t rx_data = 0;
265261
for (uint8_t bit = 0x80; bit > 0; bit >>= 1) {
266262
// mode 0, output data first
267-
gpio_set_level(bus.mosi_io_num, (u8_tx) ? (u8_tx[index] & bit) : 0);
268-
vTaskDelay(1);
269-
gpio_set_level(bus.sclk_io_num, 1);
263+
gpio_ll_set_level(hw, bus.mosi_io_num, (tx) ? (tx[index] & bit) : 0);
264+
esp_rom_delay_us(half_duty_us);
270265
rx_data <<= 1;
271266
rx_data |= gpio_get_level(bus.miso_io_num);
272-
vTaskDelay(1);
273-
gpio_set_level(bus.sclk_io_num, 0);
267+
gpio_ll_set_level(hw, bus.sclk_io_num, 1);
268+
esp_rom_delay_us(half_duty_us);
269+
gpio_ll_set_level(hw, bus.sclk_io_num, 0);
274270
}
275-
if (u8_rx) {
276-
u8_rx[index] = rx_data;
271+
if (rx) {
272+
rx[index] = rx_data;
277273
}
278274
}
279-
gpio_set_level(cs_pin, 1);
275+
if (!hold_cs) {
276+
gpio_ll_set_level(hw, cs_pin, 1);
277+
}
278+
}
279+
280+
#if SOC_SPI_SUPPORT_SLAVE_HD_VER2
281+
void essl_sspi_hd_dma_trans_seg(spi_bus_config_t bus, uint8_t cs_pin, uint32_t speed_hz, bool is_rx, void *buffer, int len, int seg_len)
282+
{
283+
uint8_t cmd_addr_dummy[3] = {0, 0, 0};
284+
uint8_t *tx = is_rx ? NULL : buffer;
285+
uint8_t *rx = is_rx ? buffer : NULL;
286+
287+
seg_len = (seg_len > 0) ? seg_len : len;
288+
cmd_addr_dummy[0] = spi_ll_get_slave_hd_base_command(is_rx ? SPI_CMD_HD_RDDMA : SPI_CMD_HD_WRDMA);
289+
while (len > 0) {
290+
spi_master_trans_impl_gpio(bus, cs_pin, speed_hz, cmd_addr_dummy, NULL, sizeof(cmd_addr_dummy), true);
291+
292+
int send_len = (seg_len <= len) ? seg_len : len;
293+
spi_master_trans_impl_gpio(bus, cs_pin, speed_hz, tx, rx, send_len, false);
294+
len -= send_len;
295+
tx += tx ? send_len : 0;
296+
rx += rx ? send_len : 0;
297+
}
298+
299+
cmd_addr_dummy[0] = spi_ll_get_slave_hd_base_command(is_rx ? SPI_CMD_HD_INT0 : SPI_CMD_HD_WR_END);
300+
spi_master_trans_impl_gpio(bus, cs_pin, speed_hz, cmd_addr_dummy, NULL, sizeof(cmd_addr_dummy), false);
301+
}
302+
303+
void essl_sspi_hd_buffer_trans(spi_bus_config_t bus, uint8_t cs_pin, uint32_t speed_hz, spi_command_t cmd, uint8_t addr, void *buffer, uint32_t len)
304+
{
305+
uint8_t cmd_addr_dummy[3] = {0, addr, 0};
306+
cmd_addr_dummy[0] = spi_ll_get_slave_hd_base_command(cmd);
307+
uint8_t *tx = (cmd == SPI_CMD_HD_RDBUF) ? NULL : buffer;
308+
uint8_t *rx = (cmd == SPI_CMD_HD_RDBUF) ? buffer : NULL;
309+
310+
spi_master_trans_impl_gpio(bus, cs_pin, speed_hz, cmd_addr_dummy, NULL, sizeof(cmd_addr_dummy), true);
311+
spi_master_trans_impl_gpio(bus, cs_pin, speed_hz, tx, rx, len, false);
280312
}
313+
#endif //SOC_SPI_SUPPORT_SLAVE_HD_VER2

components/driver/test_apps/touch_sensor_v1/pytest_touch_sensor_v1.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,4 @@
1515
)
1616
@idf_parametrize('target', ['esp32'], indirect=['target'])
1717
def test_touch_sensor_v1(dut: Dut) -> None:
18-
dut.run_all_single_board_cases(timeout=60)
18+
dut.run_all_single_board_cases(timeout=60, reset=True)

components/esp_driver_spi/test_apps/master/main/test_spi_master.c

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -901,10 +901,7 @@ void test_cmd_addr(spi_slave_task_context_t *slave_context, bool lsb_first)
901901
TEST_ESP_OK(spi_bus_add_device(TEST_SPI_HOST, &devcfg, &spi));
902902

903903
//connecting pins to two peripherals breaks the output, fix it.
904-
spitest_gpio_output_sel(buscfg.mosi_io_num, FUNC_GPIO, spi_periph_signal[TEST_SPI_HOST].spid_out);
905-
spitest_gpio_output_sel(buscfg.miso_io_num, FUNC_GPIO, spi_periph_signal[TEST_SLAVE_HOST].spiq_out);
906-
spitest_gpio_output_sel(devcfg.spics_io_num, FUNC_GPIO, spi_periph_signal[TEST_SPI_HOST].spics_out[0]);
907-
spitest_gpio_output_sel(buscfg.sclk_io_num, FUNC_GPIO, spi_periph_signal[TEST_SPI_HOST].spiclk_out);
904+
same_pin_func_sel(buscfg, devcfg.spics_io_num, 0, false);
908905

909906
for (int i = 0; i < 8; i++) {
910907
//prepare slave tx data
@@ -1089,10 +1086,7 @@ TEST_CASE("SPI master variable dummy test", "[spi]")
10891086
spi_slave_interface_config_t slave_cfg = SPI_SLAVE_TEST_DEFAULT_CONFIG();
10901087
TEST_ESP_OK(spi_slave_initialize(TEST_SLAVE_HOST, &bus_cfg, &slave_cfg, SPI_DMA_DISABLED));
10911088

1092-
spitest_gpio_output_sel(bus_cfg.mosi_io_num, FUNC_GPIO, spi_periph_signal[TEST_SPI_HOST].spid_out);
1093-
spitest_gpio_output_sel(bus_cfg.miso_io_num, FUNC_GPIO, spi_periph_signal[TEST_SLAVE_HOST].spiq_out);
1094-
spitest_gpio_output_sel(dev_cfg.spics_io_num, FUNC_GPIO, spi_periph_signal[TEST_SPI_HOST].spics_out[0]);
1095-
spitest_gpio_output_sel(bus_cfg.sclk_io_num, FUNC_GPIO, spi_periph_signal[TEST_SPI_HOST].spiclk_out);
1089+
same_pin_func_sel(bus_cfg, dev_cfg.spics_io_num, 0, false);
10961090

10971091
uint8_t data_to_send[] = {0x12, 0x34, 0x56, 0x78};
10981092

@@ -1135,7 +1129,7 @@ TEST_CASE("SPI master hd dma TX without RX test", "[spi]")
11351129
spi_slave_interface_config_t slave_cfg = SPI_SLAVE_TEST_DEFAULT_CONFIG();
11361130
TEST_ESP_OK(spi_slave_initialize(TEST_SLAVE_HOST, &bus_cfg, &slave_cfg, SPI_DMA_CH_AUTO));
11371131

1138-
same_pin_func_sel(bus_cfg, dev_cfg, 0);
1132+
same_pin_func_sel(bus_cfg, dev_cfg.spics_io_num, 0, false);
11391133

11401134
uint32_t buf_size = 32;
11411135
uint8_t *mst_send_buf = spi_bus_dma_memory_alloc(TEST_SPI_HOST, buf_size, 0);

components/esp_driver_spi/test_apps/master/main/test_spi_sio.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ TEST_CASE("SPI Single Board Test SIO", "[spi]")
7575
spi_slave_interface_config_t slv_cfg = SPI_SLAVE_TEST_DEFAULT_CONFIG();
7676
TEST_ESP_OK(spi_slave_initialize(TEST_SLAVE_HOST, &bus_cfg, &slv_cfg, SPI_DMA_DISABLED));
7777

78-
same_pin_func_sel(bus_cfg, dev_cfg, 0);
78+
same_pin_func_sel(bus_cfg, dev_cfg.spics_io_num, 0, false);
7979
inner_connect(bus_cfg);
8080

8181
WORD_ALIGNED_ATTR uint8_t master_rx_buffer[320];
@@ -178,7 +178,7 @@ void test_sio_master_trans(bool sio_master_in)
178178
uint8_t *master_tx_max = heap_caps_calloc(TRANS_LEN * 2, 1, MALLOC_CAP_DMA);
179179
TEST_ASSERT_NOT_NULL_MESSAGE(master_tx_max, "malloc failed, exit.\n");
180180

181-
// write somethin to a long buffer for test long transmission
181+
// write something to a long buffer for test long transmission
182182
for (uint16_t i = 0; i < TRANS_LEN; i++) {
183183
master_tx_max[i] = i;
184184
master_tx_max[TRANS_LEN * 2 - i - 1] = i;
@@ -252,7 +252,7 @@ void test_sio_slave_emulate(bool sio_master_in)
252252
uint8_t *slave_tx_max = heap_caps_calloc(TRANS_LEN * 2, 1, MALLOC_CAP_DMA);
253253
TEST_ASSERT_NOT_NULL_MESSAGE(slave_tx_max, "malloc failed, exit.\n");
254254

255-
// write somethin to a long buffer for test long transmission
255+
// write something to a long buffer for test long transmission
256256
for (uint16_t i = 0; i < TRANS_LEN; i++) {
257257
slave_tx_max[i] = i;
258258
slave_tx_max[TRANS_LEN * 2 - i - 1] = i;

0 commit comments

Comments
 (0)