diff --git a/device/esp_tinyusb/CHANGELOG.md b/device/esp_tinyusb/CHANGELOG.md index 8138f07e..d1ae7cae 100644 --- a/device/esp_tinyusb/CHANGELOG.md +++ b/device/esp_tinyusb/CHANGELOG.md @@ -3,6 +3,7 @@ - CDC-ACM: Remove MIN() definition if already defined - MSC: Set EP size in configuration descriptor based on speed + ## 1.4.3 - esp_tinyusb: ESP32P4 HS only support diff --git a/device/esp_tinyusb/idf_component.yml b/device/esp_tinyusb/idf_component.yml index 24229aaa..13a37f48 100644 --- a/device/esp_tinyusb/idf_component.yml +++ b/device/esp_tinyusb/idf_component.yml @@ -1,7 +1,7 @@ ## IDF Component Manager Manifest File description: Espressif's additions to TinyUSB documentation: "https://docs.espressif.com/projects/esp-idf/en/latest/esp32s2/api-reference/peripherals/usb_device.html" -version: "1.4.3" +version: "1.4.4" url: https://github.com/espressif/esp-usb/tree/master/device/esp_tinyusb dependencies: idf: '>=5.0' # IDF 4.x contains TinyUSB as submodule diff --git a/device/esp_tinyusb/test/CMakeLists.txt b/device/esp_tinyusb/test/CMakeLists.txt index fc89d7e0..00435e85 100644 --- a/device/esp_tinyusb/test/CMakeLists.txt +++ b/device/esp_tinyusb/test/CMakeLists.txt @@ -1,4 +1,4 @@ -idf_component_register(SRCS "test_esp_tinyusb.c" +idf_component_register(SRCS "test_esp_tinyusb.c" "test_bvalid_sig.c" INCLUDE_DIRS "." REQUIRES unity esp_tinyusb ) diff --git a/device/esp_tinyusb/test/test_bvalid_sig.c b/device/esp_tinyusb/test/test_bvalid_sig.c new file mode 100644 index 00000000..ecd19b66 --- /dev/null +++ b/device/esp_tinyusb/test/test_bvalid_sig.c @@ -0,0 +1,96 @@ +/* + * SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: CC0-1.0 + */ + +#include "soc/soc_caps.h" + +#if SOC_USB_OTG_SUPPORTED + +#include +#include +#include "esp_system.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "esp_log.h" +#include "esp_err.h" +#include "driver/gpio.h" +#include "esp_rom_gpio.h" +#include "soc/gpio_sig_map.h" +#include "unity.h" +#include "tinyusb.h" +#include "class/msc/msc_device.h" + +#define DEVICE_DETACH_TEST_ROUNDS 10 +#define DEVICE_DETACH_ROUND_DELAY_MS 1000 + +/* TinyUSB descriptors + ********************************************************************* */ +#define TUSB_DESC_TOTAL_LEN (TUD_CONFIG_DESC_LEN) + +static unsigned int dev_mounted = 0; +static unsigned int dev_umounted = 0; + +static uint8_t const test_configuration_descriptor[] = { + // Config number, interface count, string index, total length, attribute, power in mA + TUD_CONFIG_DESCRIPTOR(1, 0, 0, TUSB_DESC_TOTAL_LEN, TUSB_DESC_CONFIG_ATT_SELF_POWERED | TUSB_DESC_CONFIG_ATT_REMOTE_WAKEUP, 100), +}; + +static tusb_desc_device_t test_device_descriptor = { + .bLength = sizeof(test_device_descriptor), + .bDescriptorType = TUSB_DESC_DEVICE, + .bcdUSB = 0x0200, + .bDeviceClass = TUSB_CLASS_MISC, + .bDeviceSubClass = MISC_SUBCLASS_COMMON, + .bDeviceProtocol = MISC_PROTOCOL_IAD, + .bMaxPacketSize0 = CFG_TUD_ENDPOINT0_SIZE, + .idVendor = 0x303A, // This is Espressif VID. This needs to be changed according to Users / Customers + .idProduct = 0x4002, + .bcdDevice = 0x100, + .iManufacturer = 0x01, + .iProduct = 0x02, + .iSerialNumber = 0x03, + .bNumConfigurations = 0x01 +}; + +// Invoked when device is mounted +void tud_mount_cb(void) +{ + dev_mounted++; +} + +// Invoked when device is unmounted +void tud_umount_cb(void) +{ + dev_umounted++; +} + +TEST_CASE("bvalid_signal", "[esp_tinyusb]") +{ + unsigned int rounds = DEVICE_DETACH_TEST_ROUNDS; + + // Install TinyUSB driver + const tinyusb_config_t tusb_cfg = { + .external_phy = false, + .device_descriptor = &test_device_descriptor, + .configuration_descriptor = test_configuration_descriptor, + }; + TEST_ASSERT_EQUAL(ESP_OK, tinyusb_driver_install(&tusb_cfg)); + + while (rounds--) { + // LOW to emulate disconnect USB device + esp_rom_gpio_connect_in_signal(GPIO_MATRIX_CONST_ZERO_INPUT, USB_SRP_BVALID_IN_IDX, false); + vTaskDelay(pdMS_TO_TICKS(DEVICE_DETACH_ROUND_DELAY_MS)); + // HIGH to emulate connect USB device + esp_rom_gpio_connect_in_signal(GPIO_MATRIX_CONST_ONE_INPUT, USB_SRP_BVALID_IN_IDX, false); + vTaskDelay(pdMS_TO_TICKS(DEVICE_DETACH_ROUND_DELAY_MS)); + } + + // Verify + TEST_ASSERT_EQUAL(dev_mounted, dev_umounted); + TEST_ASSERT_EQUAL(dev_mounted, DEVICE_DETACH_TEST_ROUNDS); + + tinyusb_driver_uninstall(); +} +#endif // SOC_USB_OTG_SUPPORTED