feat(usb_host): Move DMA capable memory to external ram on P4

- DWC-OTG internal DMA can access psram on esp32p4
    - Move DMA memory buffs to psram, to save internal ram
    - HCD tests and MSC example runs in CI with psram enabled
This commit is contained in:
peter.marcisovsky
2025-05-13 13:31:17 +02:00
parent fe75355314
commit 95bd653ec1
14 changed files with 108 additions and 32 deletions
+3 -2
View File
@@ -3,8 +3,9 @@
# USB: Host test application
There are two sets of tests in this application:
There are three sets of tests in this application:
1. Low-speed: Expects low-speed USB mouse with interrupt endpoint to be connected
2. Full-speed: Expects full-speed USB flash disk with 2 bulk endpoints to be connected
3. High-speed: Expects high-speed USB flash disk with 2 bulk endpoints to be connected
For running these tests locally, you will have to update device definitions (VID, PID, ...) in [test_usb_mock_classes.h](../common/test_usb_mock_classes.h).
For running these tests locally, you will have to update device definitions (VID, PID, ...) in [dev_msc.c](../common/dev_msc.c), [dev_hid.c](../common/dev_hid.c) and [dev_isoc.c](../common/dev_isoc.c).
@@ -22,6 +22,10 @@
#include "mock_msc.h"
#include "unity.h"
// ----------------------------------------------------- Macros --------------------------------------------------------
// --------------------- Constants -------------------------
#define PORT_NUM 1
#define EVENT_QUEUE_LEN 5
#define ENUM_ADDR 1 // Device address to use for tests that enumerate the device
@@ -279,9 +283,15 @@ void test_hcd_pipe_free(hcd_pipe_handle_t pipe_hdl)
}
#include "esp_private/esp_cache_private.h"
#define DATA_BUFFER_CAPS (MALLOC_CAP_DMA | MALLOC_CAP_CACHE_ALIGNED)
#define ALIGN_UP(num, align) ((align) == 0 ? (num) : (((num) + ((align) - 1)) & ~((align) - 1)))
#ifdef CONFIG_USB_HOST_DWC_DMA_CAP_MEMORY_IN_PSRAM // In esp32p4, the USB-DWC internal DMA can access external RAM
#define DATA_BUFFER_CAPS (MALLOC_CAP_DMA | MALLOC_CAP_CACHE_ALIGNED | MALLOC_CAP_SPIRAM)
#else
#define DATA_BUFFER_CAPS (MALLOC_CAP_DMA | MALLOC_CAP_CACHE_ALIGNED | MALLOC_CAP_INTERNAL)
#endif
urb_t *test_hcd_alloc_urb(int num_isoc_packets, size_t data_buffer_size)
{
// Allocate a URB and data buffer
+12 -8
View File
@@ -1,16 +1,20 @@
# SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD
# SPDX-FileCopyrightText: 2022-2025 Espressif Systems (Shanghai) CO LTD
# SPDX-License-Identifier: CC0-1.0
import pytest
from pytest_embedded import Dut
@pytest.mark.esp32s2
@pytest.mark.esp32s3
@pytest.mark.esp32p4
@pytest.mark.temp_skip_ci(targets=['esp32s2'], reason='lack of runners with usb_host_flash_disk tag')
CONFIGS = [
pytest.param('default', marks=[pytest.mark.esp32s2, pytest.mark.esp32s3, pytest.mark.esp32p4]),
pytest.param('esp32p4_psram', marks=[pytest.mark.esp32p4])
]
@pytest.mark.usb_host_flash_disk
@pytest.mark.temp_skip_ci(targets=['esp32s2'], reason='lack of runners with usb_host_flash_disk tag')
@pytest.mark.parametrize('config', CONFIGS, indirect=True)
def test_usb_hcd(dut: Dut) -> None:
if (dut.target == 'esp32s3'):
dut.run_all_single_board_cases(group='full_speed')
if dut.target == 'esp32p4':
dut.run_all_single_board_cases(group='high_speed', reset=True)
else:
dut.run_all_single_board_cases(group='high_speed')
dut.run_all_single_board_cases(group='full_speed', reset=True)
@@ -0,0 +1,12 @@
CONFIG_IDF_TARGET="esp32p4"
# Enable experimental features, to set PSRAM frequency to 200 MHz
CONFIG_IDF_EXPERIMENTAL_FEATURES=y
# Enable PSRAM and set PSRAM frequency
CONFIG_SPIRAM=y
CONFIG_SPIRAM_SPEED_200M=y
# CONFIG_SPIRAM_MEMTEST is not set
# Allocate USB_DWC DMA capable memory in PSRAM
CONFIG_USB_HOST_DWC_DMA_CAP_MEMORY_IN_PSRAM=y
+3 -2
View File
@@ -3,9 +3,10 @@
# USB: Host test application
There are two sets of tests in this application:
There are three sets of tests in this application:
1. Low-speed: Expects low-speed USB mouse with interrupt endpoint to be connected
2. Full-speed: Expects full-speed USB flash disk with 2 bulk endpoints to be connected
3. High-speed: Expects high-speed USB flash disk with 2 bulk endpoints to be connected
For running these tests locally, you will have to update device definitions (VID, PID, ...) in [mock_msc.h](../common/mock_msc.h) and [mock_hid.h](../common/mock_hid.h).
For running these tests locally, you will have to update device definitions (VID, PID, ...) in [dev_msc.c](../common/dev_msc.c) and [dev_hid.c](../common/dev_hid.c).
@@ -1,4 +1,4 @@
# SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD
# SPDX-FileCopyrightText: 2022-2025 Espressif Systems (Shanghai) CO LTD
# SPDX-License-Identifier: CC0-1.0
import pytest
from pytest_embedded import Dut
@@ -10,7 +10,7 @@ from pytest_embedded import Dut
@pytest.mark.temp_skip_ci(targets=['esp32s2'], reason='lack of runners with usb_host_flash_disk tag')
@pytest.mark.usb_host_flash_disk
def test_usb_host(dut: Dut) -> None:
if (dut.target == 'esp32s3'):
dut.run_all_single_board_cases(group='full_speed')
if dut.target == 'esp32p4':
dut.run_all_single_board_cases(group='high_speed', reset=True)
else:
dut.run_all_single_board_cases(group='high_speed')
dut.run_all_single_board_cases(group='full_speed', reset=True)