ESP32-S3モジュールは相当魅力的ですが、情報量が少ないので、少しづつ自分なりに確認していきます。開発環境はVScode+PlatformIO ESP-IDF版です。
今回は、ESP32-S3-1-N16R8で、JTAG用のUSBをCDCデバイスとして設定してみた覚書です(windows限定です)。
2022/11/28追加 sdkconfig.xxxの更新方法
ESP-IDFでTinyUSBスタックが提供されている
私の開発環境であるPlatformIOのESP-IDFモードで確認します。Arduinoモードでも同名のライブラリが存在するようです。
sdkconfigでUSB許可しておく
PlatformIOでsdkconfig.esp23s3を編集して2行を”y”に変更しておきます(2行連続しているとは限りません)。
CONFIG_TINYUSB=y
CONFIG_TINYUSB_CDC_ENABLED=y
Espressif-ESP-IDF/USBサンプルをDL
GitHubから「tusb_serial_device」をDLします。簡単なループバックテストです。TeraTermでキー入力のバックを見るために「キーコード+1」を追加しました。
/*
* SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Unlicense OR CC0-1.0
*/
#include <stdint.h>
#include "esp_log.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "tinyusb.h"
#include "tusb_cdc_acm.h"
#include "sdkconfig.h"
static const char *TAG = "example";
static uint8_t buf[CONFIG_TINYUSB_CDC_RX_BUFSIZE + 1];
void tinyusb_cdc_rx_callback(int itf, cdcacm_event_t *event)
{
/* initialization */
size_t rx_size = 0;
/* read */
esp_err_t ret = tinyusb_cdcacm_read(itf, buf, CONFIG_TINYUSB_CDC_RX_BUFSIZE, &rx_size);
if (ret == ESP_OK) {
buf[0] += 1; // 追加コード
tinyusb_cdcacm_write_queue(itf,buf,rx_size);
tinyusb_cdcacm_write_flush(itf, 0);
ESP_LOGI(TAG, "Data from channel %d:", itf);
ESP_LOG_BUFFER_HEXDUMP(TAG, buf, rx_size, ESP_LOG_INFO);
} else {
ESP_LOGE(TAG, "Read error");
}
/* write back */
// tinyusb_cdcacm_write_queue(itf, buf, rx_size);
}
void tinyusb_cdc_line_state_changed_callback(int itf, cdcacm_event_t *event)
{
int dtr = event->line_state_changed_data.dtr;
int rts = event->line_state_changed_data.rts;
ESP_LOGI(TAG, "Line state changed on channel %d: DTR:%d, RTS:%d", itf, dtr, rts);
}
void app_main(void)
{
ESP_LOGI(TAG, "USB initialization");
tinyusb_config_t tusb_cfg;
tusb_cfg.descriptor = NULL;
tusb_cfg.string_descriptor = NULL;
tusb_cfg.external_phy = false;
ESP_ERROR_CHECK(tinyusb_driver_install(&tusb_cfg));
tinyusb_config_cdcacm_t acm_cfg;
acm_cfg.usb_dev = TINYUSB_USBDEV_0;
acm_cfg.cdc_port = TINYUSB_CDC_ACM_0;
acm_cfg.rx_unread_buf_sz = 64;
acm_cfg.callback_rx = &tinyusb_cdc_rx_callback; // the first way to register a callback
acm_cfg.callback_rx_wanted_char = NULL;
acm_cfg.callback_line_state_changed = NULL;
acm_cfg.callback_line_coding_changed = NULL;
ESP_ERROR_CHECK(tusb_cdc_acm_init(&acm_cfg));
/* the second way to register a callback */
ESP_ERROR_CHECK(tinyusb_cdcacm_register_callback(
TINYUSB_CDC_ACM_0,
CDC_EVENT_LINE_STATE_CHANGED,
&tinyusb_cdc_line_state_changed_callback));
#if (CONFIG_TINYUSB_CDC_COUNT > 1)
acm_cfg.cdc_port = TINYUSB_CDC_ACM_1;
ESP_ERROR_CHECK(tusb_cdc_acm_init(&acm_cfg));
ESP_ERROR_CHECK(tinyusb_cdcacm_register_callback(
TINYUSB_CDC_ACM_1,
CDC_EVENT_LINE_STATE_CHANGED,
&tinyusb_cdc_line_state_changed_callback));
#endif
ESP_LOGI(TAG, "USB initialization DONE");
}
windows10、11ではそのままつながる
UMによるとTinyUSBはUSB-CDC-ACMクラスに準拠しています。Windows10、11では外部ドライバーのインストール無しに使えます。
ローカルエコーONにして”abcdefg”と打った画面です。コードに+1して帰ってきます。
Windows8、8.1マシンは持っていないので未確認ですが、「8以降」と記載されていたのでおそらく大丈夫。できない場合は下記の方法でインストールします。
Windows7ではドライバインストール必要
ESP-IDFのUMに従って汎用CDCドライバをインストールします
Zadig.exeで汎用CDCドライバインストール
zadigはJTAGデバッガでも使う汎用USBドライバです。今回DLしたのは「zadig-2.7.exe」。USB-Serial(CDC)を選択してインストールします。
2022/11/28追加 sdkconfig.xxxの変更
sdkconfig.defaultに記述する
ESP-IDF V5以降では、sdkconfig.xxxを変更しても元に戻ってしまうようです。
今回のTiny-USBの追加作業では、sdkconfig.defaultに記述することで変更できました。
CONFIG_TINYUSB=y
CONFIG_TINYUSB_CDC_ENABLED=y