How to use USB-OTG as a COM device again after making it a msc host?

User avatar
Itagaki
Posts: 11
Joined: Thu Mar 14, 2024 12:11 am

How to use USB-OTG as a COM device again after making it a msc host?

Postby Itagaki » Thu Mar 14, 2024 12:17 am

Hi,

I am using an ESP32-S3.
I have written the code using examples\peripherals\usb\host\msc and am able to access the USB mass storage with USB-OTG.

However, once I do this, I can no longer load or monitor via USB-OTG from the PC, the COM port is gone from the PC.
Calling usb_host_uninstall(), resetting the ESP32, unplugging and plugging the USB cable does not change this situation.
The only solution I have found is to reset and go into download mode while shorting GPIO0 to GND. However, I don't want to do this every time, and this would not allow me to do any monitoring after usb_host_uninstall().

It would be nice if our device also had a USB UART, but unfortunately it does not.

Please let me know your solution.

chegewara
Posts: 2306
Joined: Wed Jun 14, 2017 9:00 pm

Re: How to use USB-OTG as a COM device again after making it a msc host?

Postby chegewara » Thu Mar 14, 2024 2:06 am

You can manually enter bootloader mode with EN and GPIO0 pins.

User avatar
Itagaki
Posts: 11
Joined: Thu Mar 14, 2024 12:11 am

Re: How to use USB-OTG as a COM device again after making it a msc host?

Postby Itagaki » Thu Mar 14, 2024 3:04 am

Thanks for the reply. But as I wrote in the beginning, I do not want to do that.

> to reset and go into download mode while shorting GPIO0 to GND. However, I don't want to do this every time, and this would not allow me to do any monitoring after usb_host_uninstall().

This method does not solve the problem of not being able to continue monitoring. Also, we don't put a button switch on the GPIO0 in our product.

chegewara
Posts: 2306
Joined: Wed Jun 14, 2017 9:00 pm

Re: How to use USB-OTG as a COM device again after making it a msc host?

Postby chegewara » Thu Mar 14, 2024 5:59 am

Here is your situation:
- you can monitor device over USB or over UART, those are most basic options
- you dont have UART, so that option is not available
- you want to uninstall USB, so that option is also unavailable

more advanced options are (you can also send message to enter bootloader mode):
- monitor over mqtt, ws or tcp/ip - or other related to wifi
- monitor over BLE

Not having option to connect usb to uart module is unfortunate during development.

PS MSC host and MSC device can be used for OTA

User avatar
Itagaki
Posts: 11
Joined: Thu Mar 14, 2024 12:11 am

Re: How to use USB-OTG as a COM device again after making it a msc host?

Postby Itagaki » Thu Mar 14, 2024 6:34 am

I can now monitor the log output again. But there is still a problem.

When I reset with GPIO0 Lo, it appears as COM7 to a PC connected to USB-OTG.

I run
idf.py -p COM7 flash monitor

The write to the flash is successful and the log output appears in the terminal.

The program then calls usb_host_install() and msc_host_install() once. At this point, the USB flash drive connected to USB-OTG can be accessed. And when it is done, the program calls usb_host_uninstall().

After that I call tinyusb_driver_install() and then esp_tusb_init_console(TINYUSB_CDC_ACM_0) just to be sure. This worked fine.
(I tried the same thing when I wrote the first question, but I think the reason it didn't work then was that I called tinyusb_driver_install() before usb_host_uninstall(), which was running in a separate task, had finished.)

Now, I said it worked, but there is still a problem: it was COM9, not COM7, that appeared on the PC by calling tinyusb_driver_install(). So I have to exit the command and run "idf.py -p COM9 monitor". Is it possible to leave it at COM7?

More problematic is that "idf.py -p COM9 flash" fails for the new COM9.
> A serial exception error occurred: Write timeout

In the end I have to short IO0 and GND manually with a jumper wire. Then it comes back as COM7...

User avatar
Itagaki
Posts: 11
Joined: Thu Mar 14, 2024 12:11 am

Re: How to use USB-OTG as a COM device again after making it a msc host?

Postby Itagaki » Thu Mar 14, 2024 8:05 am

Okay. I succeed to get COM7 back. I had to set Custom vendor ID, Custom product ID, bcdDevice, Manufacturer name, Product name and Serial string of Component config -> TinyUSB Stack -> Descriptor configuration as same as download mode. This resumes the monitor.

But still cannot flash against it. I guess I also need to start up WinUSB as a CDC service.

User avatar
Itagaki
Posts: 11
Joined: Thu Mar 14, 2024 12:11 am

Re: How to use USB-OTG as a COM device again after making it a msc host?

Postby Itagaki » Fri Mar 15, 2024 12:11 am

To be able to do "idf.py flash" or "esptool.py write_flash" towards USB-OTG again, "CDC Channel count" should be set to 2, maybe. But this might still not be enough. I still get the error "A serial exception error occurred: Write timeout". Do I have to wake up (or activate) the handler in ROM? Please let me know if you know.

User avatar
Itagaki
Posts: 11
Joined: Thu Mar 14, 2024 12:11 am

Re: How to use USB-OTG as a COM device again after making it a msc host?

Postby Itagaki » Fri Mar 15, 2024 5:43 am

By calling tinyusb_driver_install() and other functions, I can now get the log output flow to the PC as it did before. But that doesn't mean I could revert back to the original state. The new driver is simply working.

Before doing usb_host_install(), I need to save all information such as device descriptors and callback addresses. Then, after usb_host_uninstall() is done, I need to restore them back to their original state. Then perhaps I can get back the ability to write flash from the PC via USB-OTG.

But how? I can't find any such API.
I'm still looking for information.

User avatar
Itagaki
Posts: 11
Joined: Thu Mar 14, 2024 12:11 am

Re: How to use USB-OTG as a COM device again after making it a msc host?

Postby Itagaki » Thu Mar 21, 2024 11:37 am

Solved with short code below.
  1.     usb_serial_jtag_driver_config_t usb_serial_jtag_config = USB_SERIAL_JTAG_DRIVER_CONFIG_DEFAULT();
  2.     usb_serial_jtag_driver_install(&usb_serial_jtag_config);

Who is online

Users browsing this forum: Google [Bot] and 338 guests