2

USB経由でさまざまなビデオゲームコントローラーをPCに接続するためのアダプターを作成しています。その心臓部は、Cortex-M4 プロセッサを使用する Teensy 3.1 マイクロコントローラです。

M4 は生の USB パケットを処理できるため、あらゆるタイプの USB デバイスをシミュレートできます。複合 USB デバイスを表示するようにプログラムすることに成功しました。

  • インターフェイス 1、エンドポイント 1: USB シリアル ポート (デバッグ用) - ステータス インターフェイス
  • インターフェイス 1、エンドポイント 2: USB シリアル TX/RX インターフェイス
  • インターフェイス 2、エンドポイント 3: HID ジョイスティック

ここでの問題は、複数の異なるタイプのゲーム コントローラ (任天堂とスーパー ファミコンなど) を同時に接続できるようにしたいということです。私のアダプターには 15 個を超えるポートがあります。つまり、USB では合計 16 個のエンドポイントしか許可されないため、各ポートに 1 つのエンドポイントを割り当てることはできません。

HID レポート記述子の仕様を読むと、同じインターフェイスで複数の独立したデバイスを定義できるという印象を受けます。しかし、私の最善の努力にもかかわらず、私はこれをやってのけることができないようです. アプリケーション ( などjstest-gtk) は、単一の巨大なジョイスティックしか認識しません。

現在、このレポート記述子を使用しています。

static uint8_t joystick_report_desc[] = {
    0x05, 0x01,                     // Usage Page (Generic Desktop)
    0x09, 0x04,                     // Usage (Joystick)
    0xA1, 0x01,                     // Collection (Application)
        0x85, 0x01,                     // Report ID (1)
        0x15, 0x00,                     // Logical Minimum (0)
        0x25, 0x01,                     // Logical Maximum (1)
        0x75, 0x01,                     // Report Size (1)
        0x95, 0x08,                     // Report Count (8)
        0x05, 0x09,                     // Usage Page (Button)
        0x19, 0x01,                     // Usage Minimum (Button #1)
        0x29, 0x08,                     // Usage Maximum (Button #8)
        0x81, 0x02,                     // Input (variable,absolute)
    0xC0,                           // End Collection

    0x05, 0x01,                     // Usage Page (Generic Desktop)
    0x09, 0x04,                     // Usage (Joystick)
    0xA1, 0x01,                     // Collection (Application)
        0x85, 0x02,                     // Report ID (2)
        0x15, 0x00,                     // Logical Minimum (0)
        0x25, 0x01,                     // Logical Maximum (1)
        0x75, 0x01,                     // Report Size (1)
        0x95, 0x10,                     // Report Count (16)
        0x05, 0x09,                     // Usage Page (Button)
        0x19, 0x01,                     // Usage Minimum (Button #1)
        0x29, 0x10,                     // Usage Maximum (Button #16)
        0x81, 0x02,                     // Input (variable,absolute)
    0xC0,                           // End Collection
};

8 つのボタンを持つ 1 つのジョイスティックと 16 個のボタンを持つ 1 つのジョイスティックが表示されることを期待していましたが、アプリケーションでは 24 個のボタンを持つ 1 つのジョイスティックが表示されます。

この方法で複数の独立したジョイスティックを定義することは実際に可能ですか?

4

1 に答える 1