Community Translation - How to Implement Multiple HID Class Functionalities with a Single HID interface – KBA228479

Tip / Sign in to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
Kenshow
Level 8
Level 8
Distributor - Marubun (Japan)
50 solutions authored 25 solutions authored 10 solutions authored

Hi,

I would like to translate KBA228479into Japanese.

Please confirm to my work.

Thanks,

Kenshow

0 Likes
2 Replies
JennaJo
Moderator
Moderator
Moderator
1000 replies posted 750 replies posted 500 replies posted

Hello, Kenshow-san

Confirm to work this KBA

Thanks

Jenna

Jenna Jo
0 Likes
Kenshow
Level 8
Level 8
Distributor - Marubun (Japan)
50 solutions authored 25 solutions authored 10 solutions authored

Hi Jenna-san,

Japanese translation was over.
Please check below.

Original KBA:

How to Implement Multiple HID Class Functionalities with a Single HID interface – KBA228479

Thanks.

Kenshow

==============================

タイトル: 単独のHIDインターフェイスで複数のHIDクラス機能を実装する方法 – KBA228479

バージョン:**

一般に、HIDインターフェイスは、マウス、キーボード、ジョイスティックなどの単独のHID機能に使用されます。2つの機能、たとえばマウスとキーボードを組み合わせる場合、2つのHIDインターフェイスを作成する必要があります(つまり、2つのエンドポイント、2つのレポートディスクリプタ、2つのHIDディスクリプタ、2つのDMAチャネル)。2つのインターフェイスの代わりに、1つのインターフェイス(1つのエンドポイント、1つのレポートディスクリプタ、1つのHIDディスクリプタ、1つのDMAチャネル)で実行できます。

このKBAでは、1つのHIDインターフェイスを使用したマウスとキーボード機能の実装について説明します。

  1. レポートディスクリプタには、マウス用とキーボード用の2つの コレクションアプリケーションが必要です。各コレクションアプリケーションに、各アプリケーションのレポートIDアイテムを配置します。
  2. レポートでは、最初のバイトはレポートIDで、残りのバイトはレポート情報でなければなりません。

たとえば、最初のコレクション(N = 1)にマウスを使用し、2番目(N = 2)にキーボードを使用する場合、マウスの状態を報告するには、0x01に続いてボタンフラグと軸データを送信する必要があります。キーボードの状態を報告するには、0x02を送信し、続いて代替キーバイト、次にキーコードを送信する必要があります。

レポートディスクリプタとレポートフォーマットを以下に説明します。

レポートディスクリプタ:

0x05,  0x01, /*  使用法ページ(汎用デスクトップ)  */

0x09,  0x02, /*  使用法(マウス)  */

0xA1,  0x01, /*  コレクション(アプリケーション)  */

0x09,  0x01, /*  使い方(ポインタ)*/

0xA1,  0x00, /*  コレクション(物理)  */

0x85, 0x01,  /*  レポートID   */

0x05,  0x09, /*  使用法ページ(ボタン)  */

0x19,  0x01, /*  最小使用量(01  */

0x29,  0x03, /*  最大使用量(03  */

0x15,  0x00, /*  論理最小値(0  */

0x25,  0x01, /*  論理最大値(0  */

0x95,  0x03, /*  レポート数(3  */

0x75,  0x01, /*  レポートサイズ(1  */

0x81,  0x02, /*  入力(データ変数絶対)  */

0x95,  0x01, /*  レポート数(1  */

0x75,  0x05, /*  レポートサイズ(5  */

0x81,  0x01, /*  入力(定数); 5ビットパディング  */

0x05,  0x01, /*  使用法ページ(汎用デスクトップ)  */

0x09,  0x30, /*  使用法(X  */

0x09,  0x31, /*  使用法(Y  */

0x15,  0x81, /*  論理最小値(-127  */

0x25,  0x7F, /*  論理最大値(127  */

0x75,  0x08, /*  レポートサイズ(8  */

0x95,  0x02, /*  レポート数(2  */

0x81,  0x06, /*  入力(データ変数相対)  */

0xC0,  0xC0, /*  End Collection,  End Collection  */

0x09,  0x06, /*  使用法(キーボード)  */

0xA1,  0x01, /*  コレクション(アプリケーション)  */

0x85, 0x02,  /*  レポートID   */

0x05,  0x07, /*  使用法ページ(キーコード)  */

0x19,  224, /*  最小使用量  */

0x29,  231, /*  最大使用量  */

0x15,  0, /*  論理最小値  */

0x25,  1, /*  論理最大値  */

0x75,  1, /*  レポートサイズ= 1ビット  */

0x95,  8, /*  レポート数  */

0x81,  2, /*  入力(DataAbsolute=修飾子バイト  */

0x81,  1, /*  入力(定数)=予約済みバイト  */

0x75,  8, /*  レポートサイズ= 1バイト  */

0x95,  3, /*  レポート数= 3コード  */

//印刷可能なASCIIキー(およびCR)のみをサポートします  */

0x19,  0, /*  最小使用量  */

0x29,  0x38, /*  最大使用量  */

0x15,  0, /*  論理最小値  */

0x25,  0x38, /*  論理最大値  */

0x81,  0, /*  入力(データ配列)= 3キーコード  */ 

// LED5ビット入力レポートを宣言します  */

0x05,  0x08, /*  使用法ページ(LED  */

0x19,  0x01, /*  最小使用量  */

0x29,  0x05, /*  最大使用量  */

0x15,  0, /*  論理最小値  */

0x25,  0x01, /*  論理最大値  */

0x75,  0x01, /*  レポートサイズ= 1ビット  */

0x95,  0x05, /*  レポート数  */

0x91,  0x02, /*  出力(DataAbsolute= LED   */

0x95,  0x03, /*  レポート数  */

0x91,  0x01, /*  出力(定数)=次のバイト境界へのLEDパディング  */

0xC0  /*  コレクションの終了  */

マウスのレポートフォーマット:

CyU3PMemSet((uint8_t)outBuf.buffer, 0, 10);

/*  レポートデータを出力バッファーにコピー  */

outBuf.buffer[0] = (uint8_t) (0x01); /* レポートID  */

outBuf.buffer[1] = (uint8_t) (0x00); /* ボタンのクリック

outBuf.buffer[2] = (uint8_t) (glMouseData ); / * X

outBuf.buffer[3] = (uint8_t) (glMouseData [i + 1]); /* Y

status = CyU3PDmaChannelCommitBuffer(&glChHandleIntrCPU2U, 4, 0);

キーボードのレポートフォーマット:

CyU3PMemSet(outBuf.buffer, 0, 10);

/* レポートデータを出力バッファーにコピー */

outBuf.buffer[0] = (uint8_t) (0x02); /* レポートID */

outBuf.buffer[1] = (uint8_t) (0x02); /* Modifier */

outBuf.buffer[2] = (uint8_t) (0x00); /* Cosntant Byte */

outBuf.buffer[3] = (uint8_t) (0x06); /* C */

outBuf.buffer[4] = (uint8_t) (0x1C); /* Y */

outBuf.buffer[5] = (uint8_t) (0x28); /* Enter */

  status = CyU3PDmaChannelCommitBuffer(&glChHandleIntrCPU2U, 6, 0);

これらの変更は、FX3 SDKMouseDemoサンプル(デフォルトのSDKパス: C\Program Filesx86\Cypress\EZ-USB FX3 SDK\1.3\firmware\hid_examples\cyfx3_hid)に実装され、参照用にこのKBAに添付されています。

==============================

29-May-2020

Kenshow

0 Likes