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

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

See merge request espressif/esp-idf!43395
This commit is contained in:
Jiang Jiang Jian
2025-12-03 10:29:59 +08:00
3 changed files with 38 additions and 2 deletions

View File

@@ -176,6 +176,10 @@ static int usb_serial_jtag_rx_char(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
@@ -220,6 +224,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;
}
char *data_c = (char *) data;
size_t received = 0;
size_t available_size = 0;
@@ -323,6 +331,10 @@ static int usb_serial_jtag_fcntl(int fd, int cmd, int arg)
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);
usb_serial_jtag_ll_txfifo_flush();
//Wait for the host to have picked up the buffer, but honour the timeout in

View File

@@ -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)

View File

@@ -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>
@@ -397,6 +398,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