Hello,
I'm currently writing a program for the ESP32-S3 with esp-idf, in which the ESP32-S3 will switch between different USB modes such as USB CDC and USB HID through a display. After the program completes, the ESP32-S3's USB interface needs to return to its default JTAG/serial mode, just like when it's powered on, so that users can reprogram it as needed. I don't want to press the boot and reset buttons to enter bootloader mode because the ESP32-S3 automatically enters bootloader mode if USB is not initialized in the code.
So, how can I revert the USB interface to the default JTAG/serial mode without having to reset the device? Thank you all very much.
How to reinit ESP32S3 USB Serial/JTAG Controller
-
- Posts: 1
- Joined: Tue Sep 12, 2023 9:22 am
-
- Posts: 10
- Joined: Tue May 16, 2023 7:02 pm
Re: How to reinit ESP32S3 USB Serial/JTAG Controller
On the S3 the USB PHY can be routed to the USB Serial/JTAG controller (factory default) or the CPU (in which case implement whatever you want using TinyUSB or such).
If you switched away from the built-in CDC/JTAG controller, just hit the HW registers to switch it back (look in the example projects that switch it away to figure this out or look in the datasheet).
BTW, you don't have to use the BOOT/RESET buttons at all when connected to the built-in controller after your first programming; you can use the "--before usb_reset" command to cycle through boot mode for you:
By the way, these APIs I made are handy for dealing with the CDC/JTAG device. Using them you can tell if you are: plugged into a host PC, you can turn-off the data connection to the PC (PC sees the USB go away), or give it back to the PC again:
If you switched away from the built-in CDC/JTAG controller, just hit the HW registers to switch it back (look in the example projects that switch it away to figure this out or look in the datasheet).
BTW, you don't have to use the BOOT/RESET buttons at all when connected to the built-in controller after your first programming; you can use the "--before usb_reset" command to cycle through boot mode for you:
Code: Select all
esptool.py --before usb_reset --chip esp32c3 write_flash 0x0000 bootloader.bin
By the way, these APIs I made are handy for dealing with the CDC/JTAG device. Using them you can tell if you are: plugged into a host PC, you can turn-off the data connection to the PC (PC sees the USB go away), or give it back to the PC again:
Code: Select all
#include "hal/usb_serial_jtag_ll.h"
#include "hal/usb_phy_ll.h"
bool is_host_usb_device_connected(void)
{
return *((volatile uint32_t *)USB_SERIAL_JTAG_OUT_EP0_ST_REG) != 0;
}
void disconnect_cdc_port(void)
{
*((volatile uint32_t *)USB_SERIAL_JTAG_CONF0_REG) &= ~(1<<9);
}
void connect_cdc_port(void)
{
*((volatile uint32_t *)USB_SERIAL_JTAG_CONF0_REG) |= (1<<9);
}
Who is online
Users browsing this forum: No registered users and 165 guests