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-03-21 09:07:53 +01:00
parent fe75355314
commit 95bd653ec1
14 changed files with 108 additions and 32 deletions

View File

@@ -1,15 +1,22 @@
# 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_host_msc_example(dut: Dut) -> None:
# Check whether the USB-DWC DMA capable memory is allocated in PSRAM
usb_dwc_in_psram = bool(dut.app.sdkconfig.get('USB_HOST_DWC_DMA_CAP_MEMORY_IN_PSRAM'))
# Get wMaxPacketSize to get USB device speed
max_packet_size = int(dut.expect(r'wMaxPacketSize (\d{2,3})')[1].decode())
@@ -21,14 +28,14 @@ def test_usb_host_msc_example(dut: Dut) -> None:
read_throughput = float(dut.expect(r'example: Read speed ([0-9]*[.]?[0-9]+) MiB')[1].decode())
# Set write and read throughput limits
if (max_packet_size == 512): # wMaxPacketSize = 512 for HS
write_throughput_limit = 4.9
read_throughput_limit = 11.5
else: # wMaxPacketSize = 64 for FS
if max_packet_size == 512: # wMaxPacketSize = 512 for HS
write_throughput_limit = 3.5 if usb_dwc_in_psram else 4.9
read_throughput_limit = 9.9 if usb_dwc_in_psram else 11.5
else: # wMaxPacketSize = 64 for FS
write_throughput_limit = 0.9
read_throughput_limit = 1.0
# These values should be updated for HS targets
# Evaluate the speed measurements
if write_throughput > write_throughput_limit:
print('Write throughput put OK')
else: