ESP32 S3でUSB VID/PID書き換え実装

ESP32コアを変更するとか、なんかいろいろ実験してみたけど、結論は、普通にArudino側から制御できるみたい。なーんだ。時間の無駄。

#include "USB.h"

 // 新しいVIDとPIDを定義

#define CUSTOM_VID 0x303A
#define CUSTOM_PID 0x4002

void setup() {

 // USBデバイスのVIDとPIDを設定

USB.VID(CUSTOM_VID);
USB.PID(CUSTOM_PID);

 // その他の設定(オプション)

USB.productName("AtomS3 Lite Custom");
USB.manufacturerName("kinneko no usui honya");
USB.serialNumber("123456");

 // USB CDC(シリアル通信)を開始

USB.begin();

 }

void loop() {

 // メインループ

 }

 結構苦労してたのに、結論は簡単じゃん...

 何をやりかったかというと、セルフでPIDを変更して起動できるようにすること。

 こんな感じね。

 #include <Arduino.h> // ESP32の基本機能

#include "USB.h"
#include <Preferences.h>

 #include <FastLED.h> // LED制御のためにFastLEDライブラリを使用

 // --- ハードウェア定義 ---

 #define BUTTON_PIN 41 // ATOMS3 LITEのボタンのGPIOピン

 #define LED_PIN 35 // ATOMS3 LITEのLEDのGPIOピン

 #define NUM_LEDS 1 // LEDの数

 CRGB leds[NUM_LEDS]; // FastLED用のLEDオブジェクト

Preferences preferences;

 // --- USBプロファイル定義 ---

#define DEVICE_VID 0x303A
#define DEVICE_MANUFACTURER "My Company"

struct USBProfile {
uint16_t pid;
const char* productName;

 CRGB ledColor; // プロファイルごとのLEDの色

 };

const USBProfile profiles[] = {
{0x4001, "AtomS3 Lite - Mode A", CRGB::Blue},
{0x4002, "AtomS3 Lite - Mode B", CRGB::Green},
{0x4003, "AtomS3 Lite - Mode C", CRGB::Red}

 };

const int num_profiles = sizeof(profiles) / sizeof(profiles[0]);

 // --- ボタンの状態管理 ---

 // チャタリング(短時間のON/OFFの繰り返し)を防ぐための変数

unsigned long last_debounce_time = 0;

 unsigned long debounce_delay = 50; // 50ミリ秒

void setup() {
Serial.begin(115200);

 // ボタンピンを入力モードに設定(プルアップ抵抗を有効化)

pinMode(BUTTON_PIN, INPUT_PULLUP);

 // LEDの初期化 (FastLEDを使用)

FastLED.addLeds<NEOPIXEL, LED_PIN>(leds, NUM_LEDS);

 FastLED.setBrightness(20); // 明るさを設定 (0-255)

 // 1. NVSから現在のプロファイル番号を読み出す

preferences.begin("usb-profile", true);
int profile_index = preferences.getUInt("profile_idx", 0);
preferences.end();

 // 2. 読み出したプロファイル番号に対応する情報を取得

const USBProfile& current_profile = profiles[profile_index];

 // 3. 取得した情報でUSBデバイスを設定

USB.VID(DEVICE_VID);
USB.PID(current_profile.pid);
USB.manufacturerName(DEVICE_MANUFACTURER);
USB.productName(current_profile.productName);
USB.begin();

 Serial.printf("プロファイル %d (%s) で起動しました。\n", profile_index, current_profile.productName);

Serial.printf("VID: 0x%04X, PID: 0x%04X\n", DEVICE_VID, current_profile.pid);

 Serial.println("ボタンを押すと次のプロファイルに切り替わります。");

 // LEDで現在のプロファイルを視覚的に示す

leds[0] = current_profile.ledColor;
FastLED.show();

 }

void loop() {

 // ボタンの状態を読み取る

 // INPUT_PULLUPなので、押されていない時はHIGH(1)、押されている時はLOW(0)

int reading = digitalRead(BUTTON_PIN);

 // ボタンが押された瞬間を検出(チャタリング防止処理を含む)

if (reading == LOW) {
if ((millis() - last_debounce_time) > debounce_delay) {

 // --- ボタンが押された時の処理 ---

 Serial.println("ボタンが押されました。プロファイルを切り替えます...");

 // LEDを白く光らせてフィードバック

leds[0] = CRGB::White;
FastLED.show();

 // NVSから現在のインデックスを読み出し、次のインデックスを計算・保存

preferences.begin("usb-profile", false);
int current_index = preferences.getUInt("profile_idx", 0);
int next_index = (current_index + 1) % num_profiles;
preferences.putUInt("profile_idx", next_index);
preferences.end();

 Serial.printf("次のプロファイル %d に設定しました。再起動します。\n", next_index);

delay(1000);

ESP.restart();

 }

 // last_debounce_timeを更新しないことで、長押し中の連続実行を防ぐ

} else {

 // ボタンが離されたら、次の押下を検出できるように時間をリセット

last_debounce_time = millis();

 }

 }

 ボタンを押すとPIDを書き換えて再起動する感じ。選んでいるPIDが変わったことを目で確認できるように、多色LEDの色を変える。再起動中は白。NVSに状態を保管しているので、起動してきたときにはそれを読んで再現する。

 普通にできてつまらん... CORE見たりしてた苦労を返して...

 もっと、小さくて安いマイコンでできないのもなと思ったのだけど、PIDの書き換えは、STM32系とESP32系しかサポートしていない感じ。うーん。しかも、NanoC6ではできない感じ。小さくていいのに。

 100円投げ銭  https://kinneko.booth.pm/items/1963720


オリジナル投稿:
ESP32 S3でUSB VID/PID書き換え実装|kinneko|pixivFANBOX
https://kinneko.fanbox.cc/posts/10516869