FineArt News

USBデバイス認識

USB-IF(USBインプリメンターズ・フォーラム: USB Implementers Forum)は、USB (Universal Serial Bus)の規格と準拠性を維持するための非営利団体であり、USB-IFが定めた規格に基づいて開発者や製造業者は一貫した情報をより簡単にメンテし、下位互換の製品を開発することができます。

USBはデータ通信方式であり、データバスでもあり、最も複雑なバスの1つでもあります。

USBプロトコルでは、デバイスはホストモードとデバイスモードに分かれ、USBホストとUSBデバイスの2つに分類されます。簡単に言えば、USBホストはUSBデバイスに接続可能なハードウェアを指し、例えば使用するPCにあるUSBポートがUSBホストになります。一方、USBデバイスは一般的な移動式デバイスで、例えばスマートフォンや外部記憶デバイスなどがあります。

大部分のユーザはUSBデバイスしか使用していないので、USBデバイスの第一印象は「使いやすい」ということでしょう。ほとんどのUSBデバイスはソフトウェアドライバをインストールする必要がなく直接使用できますが、USBハードウェアポートにはいくつか種類があり、それぞれ対応しているデバイスが異なるので混乱することがあるかもしれません。一般的なUSBポートは、Mini USB・Micro USB・Type Cなどがありますが、どのポートを使用するかは使用するUSBデバイスに依存します。

新しいPCやノートPCを購入する場合、USBホストの転送速度は考慮すべき要素の1つです。新しいUSB規格(例:USB 3.X、USB 4など)をサポートしている場合、より高速なデータ転送速度を実現できます。

USBデバイスのソフトウェア特性

オペレーティングシステムにとって、USBの仕様はデバイスツリー内の1つにすぎませんが、あまりにも便利なため各種ハードウェアメーカーがこぞってUSB上で製品を開発しました。例えば、初期のマウスはRS232ポートを使用していましたが、現在はほとんどがUSB仕様になっています。初期のキーボードはPS2ポートでしたが、現在はほとんどがUSBや2.4Gワイヤレスレシーバー仕様になってます。さらに初期のネットワークカードはPCI仕様でしたが、現在の外部ネットワークカードや外部無線LANカードもUSB仕様になっています。また、外付けハードディスク・カメラ・サウンドカード・携帯電話など、ほとんどすべての外付け機器がUSBで接続されています。

USBデバイスが各種のハードウェアをエミュレートできるのはなぜでしょうか?それは、Windowsにとってこれらのデバイスは仮想デバイスであり、デバイスドライバの開発者がドライバを介してさまざまな仮想デバイスを連結したり、異なる物理デバイスにデータを導いたりできるからです。

Windows上のアプリケーションを開発するエンジニアは、標準のAPIを使用してさまざまなデバイスに接続させることができます。実際、アプリケーションを開発するエンジニアにとって、APIに対応するデバイスハードウェアがどこにあるかを全く気にする必要がありません。APIによる仮想化のおかげで、デバイスの物理的な存在場所はどこか(ローカル?リモート?)、どのようなハードウェア仕様で実装されているか(IDE?SATA?USB?)などを気にせず実装できます。

実例

いくつかの例を見て、この仮想デバイスの変換を説明しましょう。例えば、アプリケーションエンジニアがWord.exeを作成して、ユーザが文書を編集した後にストレージデバイスに保存するとします。

例1:ドライバを使用してSATAインターフェースを介してファイルをハードディスクに保存し、仮想デバイスを再構成します。複数階層を経由しているのが分かります。

例2:ファイルをUSBインターフェースを介してUSBドライブに保存します。

例3、例4:ファイルをネットワークに介して他のデバイスに転送します。(OneDriveやネットワークドライブなど)

例5:ユーザーがE:\にファイルを保存したと思っているが、実際にはファイルの内容が暗号化されてF:\に保存されます。

この中で唯一異なるのは中間インターフェースです。ドライバは、上部(入力部分)がソフトウェアインタフェースに一致するように下部を調整して、ファイルシステムに接続します。中間インターフェースでは、つまりドライバの下部は異なるハードウェアインタフェースに応じて異なります。したがって、この部分を修正するだけで、同じUSB規格でさまざまな機能(ファイルシステム・マルチメディアシステムなど)を実装できます。

例5の例では、再度ファイルシステムに戻せます。これが一般的な仮想ハードディスク技術です。

USBデバイス制御と一意性

すべてのUSBデバイスに一意性がある訳ではありません。一般的にUSBデバイスのプロダクトID(PID)、ベンダーID(VID)からどの会社のどのタイプのデバイスであるかを判断できますが、個別のデバイスまでは判別できません。例えば同じメーカーのUSBマウスがWindowsシステム下で同じPID、VIDを持つことは珍しくありません。

USBメモリであれば、ほとんどすべてに一意なシリアル番号があるため(一部シリアル番号がないデバイスもあります)、同じに見えるUSBメモリでも区別することができます。一般的にハードディスクやメディアドライブもユニークなシリアルを持っています。ユニークなシリアルがない場合、同じ見た目のハードウェアを区別するのは困難です。

さらに、一部のデバイスには公開されていないユニークなシリアルがあり、特別な方法でのみ取得できる場合もあります。例えば、ネットワークカードのMACアドレス・組み込みシステム(Embedded System)のCPU・DebugツールのJTEG・SWDなどは、ハードウェア上で独自に定義された方法で取得できます。残念ながらWindowsシステムは、これら独自に定義されたユニークなシリアルの取得に対応していません。

Windowsは一般的な一意性のあるシリアルのみサポートしています。 Windowsがデバイスの一意性を認識した場合、CM_DEVCAP_UNIQUEIDに表示されます。

デバイスに一意性がある場合、デバイスを正確に指定して制御できます。例えば、会社名義で購入したUSBメモリにあるシリアル番号をTSF制御プログラムに入力して社内に配布するとUSBメモリごとに個別に制御可能になり、個人で持ち込んだUSBメモリを禁止できます。