JAJA452A january   2011  – may 2023

 

  1.   1
  2. 1MSP430™ USB HID Windows API プログラマー・ガイド
  3. 2はじめに
  4. 3実装
    1. 3.1 概要
    2. 3.2 ファイル構成
    3. 3.3 システム要件
    4. 3.4 MSP430 USB API スタック
    5. 3.5 Windows が物理 USB HID デバイスをホスト・アプリケーションにマッピングする方法
    6. 3.6 システム上で特定の HID デバイス / インターフェイスを見つけて開く
    7. 3.7 データの送受信
    8. 3.8 HID デバイスの動的接続 / 切断の検出
  5. 4関数呼び出しのリファレンス
    1. 4.1 デバイス接続管理および初期化呼び出し
      1. 4.1.1 VOID HID_Init(struct strHidDevice* pstrHidDevice)
      2. 4.1.2 DWORD HID_GetSerNums(WORD vid, WORD pid, struct strTrackSerialNumbers *serialNumList)
      3. 4.1.3 DWORD HID_GetNumOfInterfaces(WORD vid, WORD pid, DWORD numSerNums)
      4. 4.1.4 BYTE HID_Open(struct strHidDevice* pstrHidDevice, WORD vid, WORD pid, DWORD deviceIndex, char serialNumber[SERNUM_LEN], DWORD totalDevNum, DWORD totalSerNum)
      5. 4.1.5 BYTE HID_Close(struct strHidDevice* pstrHidDevice)
      6. 4.1.6 BYTE HID_GetVersionNumber(struct strHidDevice* pstrHidDevice, USHORT * VersionNumber)
    2. 4.2 データの送受信
      1. 4.2.1 BYTE HID_WriteFile(struct strHidDevice* pstrHidDevice, BYTE* buffer, DWORD bufferSize, DWORD* bytesSent)
      2. 4.2.2 BYTE HID_ReadFile(struct strHidDevice* pStrHidDevice, BYTE* buffer, DWORD bufferSize, DWORD* bytesReturned)
    3. 4.3 プラグ・アンド・プレイ管理
      1. 4.3.1 BYTE HID_RegisterForDeviceNotification(HWND hWnd, HDEVNOTIFY* diNotifyHandle)
      2. 4.3.2 BYTE HID_UnregisterForDeviceNotification(HDEVNOTIFY* diNotifyHandle)
      3. 4.3.3 BOOL IsDeviceAffected(struct strHidDevice* pstrHidDevice)
  6. 5デモ・アプリケーション
  7. 6MSP430 USB ツール・スイート
  8.   HID インターフェイスのデータ構造体:strHidDevice
  9.   HID-Datapipe デバイスに関するレポートの形式
  10.   C 関連資料
  11.   C 改訂履歴

Windows が物理 USB HID デバイスをホスト・アプリケーションにマッピングする方法

すべての USB デバイスには、ベンダ ID (VID) とプロダクト ID (PID) が含まれています。USB ホストは、VID/PID の組み合わせを使用して製品タイプを識別します。特定の VID のベンダから供給されている特定の PID のすべての製品が機能的に同一であると想定します。ホストは、その VID/PID を持つすべてのデバイスを特定の USB デバイス・クラス (HID や CDC など) に関連付けます。この VID/PID に遭遇すると、その特定のドライバがロードされます。

Windows HID ドライバ上では、状況が少し異なります。HID ドライバは、汎用インデックスで選択可能な「HID デバイス」のリストをバス上に保持し、このリストをその上のホスト・アプリケーションが利用できるようにします。このリストの「HID デバイス」は論理エンティティであり、物理 USB デバイスではありません。これらの論理エンティティは、必ずしもバス上の物理デバイスに直接マッピングされるわけではありません。

たとえば、特定の VID/PID を持つ複数の「HID デバイス」がホスト・アプリケーションに報告される可能性があります。これは、特定の製品タイプの複数の物理デバイスがこのホストに接続されていることを意味する場合があります。または、複数の HID インターフェイス (論理デバイスと考えることができる) を持つ複合デバイスが存在する可能性があります。さらに、4 個以上の「HID デバイス」が存在する場合は、図 3-2 に示すように、これら両方の要因が関係している可能性があります。

GUID-81CB5D7E-4D24-4DBA-866B-0A5AD8A59A36-low.gif図 3-2 Windows システム上での 「HID インターフェイス」から「HID デバイス」へのマッピング

この図では、Windows アプリケーションは、これらの「HID デバイス」が実世界では何を表すか、すぐに知ることはできません。

ホスト・アプリケーションが、このようなマルチデバイスの状況で機能することを望む場合、またはさらに、物理デバイス上の複数の HID データパイプを利用できるようにすることを望む場合、さらに調査する必要があります。各 HID デバイスから収集する必要がある重要な情報の 1 つは、シリアル番号 (図 3-2 では「sernum」と表記) です。USB デバイスはオプションで、同じ VID/PID を含む他のすべての物理機器の中で一意の機器を識別するシリアル番号を報告することができます。(MSP430 USB API スタックは、ディスクリプタ・ツールでシリアル番号を報告するように選択した場合、自動的にシリアル番号を報告できます。)

ホスト・アプリケーションは、バス上で認識されるすべての HID デバイスの VID、PID、およびシリアル番号を取得すると、バス上の状況を理解し始めることができます。特定の VID/PID を持つ 2 つの HID デバイスを見つけ、シリアル番号も同じである場合、これは 2 つの HID インターフェイスを持つ複合 HID デバイスであることがわかります。代わりに、これら 2 つの HID デバイスのシリアル番号が異なる場合、アプリケーションは 2 つのシングル・インターフェイス HID 物理デバイスを見ていることになります。

これらの手法を使用すると、開発者は複数の HID インターフェイスを持つデバイスを設計し、それぞれを特定の種類の情報のデータパイプ (複数の COM ポートに相当) として使用することができます。他の利点として、これは単一の HID インターフェイス (64kbps) の帯域幅制限を克服するのに役立ちます。MSP430 では、最大 8 つの HID インターフェイスを並列して実行でき、512kbps の帯域幅を提供します。

Windows が初期列挙時に、このデバイスがマウスまたはキーボードであることを USB ディスクリプタで認識した場合、Windows 自体がこの HID デバイスの「ホスト・アプリケーション」になることを付け加えておきます。レポート要求を発行し、そのデータを使用して画面上のマウスを制御したり、テキスト入力のためのデータを入力したりします。