itagagaki
@itagagaki (板垣 史彦)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

ESP32のUSB-OTGをホストにした後、元に戻すには?

ESP-IDFを使用してESP32-S3のプログラム開発をしています。
PCとはUSB-OTGでつないでいます。USB-UARTはありません。
ESP-IDFでUSB-OTGを使用してプログラムをロードしたりログを出力したりはできています。

問題は、USB-OTGでUSBマスストレージにアクセスするため、次のようにUSBホストをインストールすると、その後アンインストールしても、PCから見えるCOMポートが消えたままとなり、USB-OTGとPCとの間の通信ができなくなってしまうことです。

const usb_host_config_t host_config = {
        .intr_flags = ESP_INTR_FLAG_LEVEL1
    };
ESP_ERROR_CHECK(usb_host_install(&host_config));

リセット(リブート)してもダメ、USBケーブルを挿抜してもダメ。

復旧するには、GPIO0をGNDに落としてリセットすることでESP32をダウンロードモードに遷移させるしか今のところ方法がありません。
(USB-UARTもある場合はそこを使えば良いのですが)

元の状態(COMポートでPCと通信できる状態)に戻す方法をご存じでしたら教えてください。

なお、USBマスストレージ(要はUSBメモリ)へのアクセスはC:\Espressif\frameworks\esp-idf-v5.2\examples\peripherals\usb\host\msc を参考にしていて、それは問題なくできています。

0

1Answer

usb_host_install()msc_host_install() をコールしてUSBストレージにアクセスし、用が済んだら usb_host_uninstall() をコールし、その後、tinyusb_driver_install(), tusb_cdc_acm_init(), esp_tusb_init_console() をコール。これで再びCOMポートからログ出力を取り込めるようになりました。

ただし、COMポートの番号を同じにするには、menuconfigで Component config -> TinyUSB Stack -> Descriptor configuration の Custom vendor ID, Custom product ID, bcdDevice, Manufacturer name, Product name, Serial string をダウンロードモードのときと同一にする必要がありました。

そのCOMポートへのPCからのフラッシュ書き込みはまだできていません。WinUSBサービスを追加で立ち上げる必要がありそうです。引き続き調査中です。

0Like

Comments

  1. @itagagaki

    Questioner

    tinyusb_driver_install()などを呼び出すことで、以前と同じようにPCにログ出力が流れるようにはなりましたが、だからといって元の状態に戻せたわけではありません。単純に新しいドライバが動いているだけです。

    usb_host_install()を実行する前に、デバイス・ディスクリプタやコールバック・アドレスなどの情報をすべて保存しておく必要があります。そしてusb_host_uninstall()を実行した後に、それらを元の状態に戻す必要があります。そうすれば、おそらくPCからUSB-OTG経由でフラッシュを書き込む機能も取り戻せるんじゃないかと思っています。

    しかし、そのようなAPIは見つかりません。
    引き続き情報を求めます。

  2. @itagagaki

    Questioner

    下記のコードであっさり解決しました。

    usb_serial_jtag_driver_config_t usb_serial_jtag_config = USB_SERIAL_JTAG_DRIVER_CONFIG_DEFAULT();
    usb_serial_jtag_driver_install(&usb_serial_jtag_config);
    

Your answer might help someone💌