Merge branch 'fix/check_usj_status_before_access_v5.4' into 'release/v5.4'

fix(esp_driver_usb_serial_jtag): check USJ accessibility before read/write (v5.4)

See merge request espressif/esp-idf!43394
This commit is contained in:
Jiang Jiang Jian
2025-12-03 10:30:11 +08:00
3 changed files with 38 additions and 2 deletions
@@ -182,6 +182,10 @@ static int usb_serial_jtag_rx_char_no_driver(int fd)
static ssize_t usb_serial_jtag_write(int fd, const void * data, size_t size)
{
if (!usb_serial_jtag_is_connected()) {
// TODO: IDF-14303
return -1;
}
const char *data_c = (const char *)data;
/* Even though newlib does stream locking on each individual stream, we need
* a dedicated lock if two streams (stdout and stderr) point to the
@@ -226,6 +230,10 @@ static void usb_serial_jtag_return_char(int fd, int c)
static ssize_t usb_serial_jtag_read(int fd, void* data, size_t size)
{
if (!usb_serial_jtag_is_connected()) {
// TODO: IDF-14303
return -1;
}
assert(fd == USJ_LOCAL_FD);
char *data_c = (char *) data;
size_t received = 0;
@@ -349,6 +357,10 @@ static int usb_serial_jtag_wait_tx_done_no_driver(int fd)
static int usb_serial_jtag_fsync(int fd)
{
if (!usb_serial_jtag_is_connected()) {
// TODO: IDF-14303
return -1;
}
_lock_acquire_recursive(&s_ctx.write_lock);
int r = s_ctx.fsync_func(fd);
_lock_release_recursive(&s_ctx.write_lock);
@@ -5,5 +5,5 @@ set(sources "test_app_main.c"
# the component must be registered as a WHOLE_ARCHIVE
idf_component_register(SRCS ${sources}
INCLUDE_DIRS "."
PRIV_REQUIRES unity esp_pm ulp driver esp_timer esp_psram
PRIV_REQUIRES unity esp_pm ulp driver esp_timer esp_psram esp_vfs_console
WHOLE_ARCHIVE)
@@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD
* SPDX-FileCopyrightText: 2022-2025 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Unlicense OR CC0-1.0
*/
@@ -7,6 +7,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <unistd.h>
#include <time.h>
#include <sys/time.h>
#include <sys/param.h>
@@ -400,6 +401,29 @@ TEST_CASE("esp_timer with SKIP_UNHANDLED_EVENTS does not wake up CPU from sleep"
TEST_ESP_OK(esp_timer_delete(periodic_timer));
}
TEST_CASE("Test USJ printing doesn't block CPU on chip wake-up", "[pm]")
{
light_sleep_enable();
fflush(stdout);
fsync(fileno(stdout));
int64_t printing_time_cost_us = 0, time_end, time_start;
for (int i = 0; i < 20; ++i)
{
time_start = esp_timer_get_time();
printf("Dummy print %02d\n", i);
fflush(stdout);
fsync(fileno(stdout));
time_end = esp_timer_get_time();
printing_time_cost_us += time_end - time_start;
vTaskDelay(10);
}
int32_t avg_cost = (int32_t)(printing_time_cost_us / 20);
printf("Average cost per print %ld\n", avg_cost);
TEST_ASSERT_LESS_THAN(5000, avg_cost);
light_sleep_disable();
}
#endif // CONFIG_FREERTOS_USE_TICKLESS_IDLE
#endif // CONFIG_PM_ENABLE