「USBキーボード」はどういう仕組みで動作しているのか?

GIGAZINE
2022年07月05日 23時00分
動画



多くの人々は何気なく「USBキーボード」をPCに接続して使っていますが、詳しい仕組みについて考えてみた人は多くないかもしれません。「一体どういう仕組みでUSBキーボードは動作しているのか?」という疑問について、ガジェット系YouTuberのベン・イーター氏が解説しています。

How does a USB keyboard work? – YouTube
[embedded content]

今回は電気信号を解析するオシロスコープを用いて、USBキーボードの仕組みを見ていきます。まず、USBキーボードを接続する前のオシロスコープには、「D+(黄色)」と「D-(緑色)」の2本の信号線が表示されています。


DELL製のUSBキーボードをオシロスコープに接続すると、D+は比較的低いままの位置ですが、D-は高い位置へと動きました。


D+が低くD-が高い位置にあることは、USBキーボードが「Low Speed(最大転送速度が1.5Mbps)」のアイドル状態であることを示しています。


つまり、この信号の変化により「USBキーボードがデバイスに接続されていること」および「接続がLow Speedであること」を表しているというわけです。


試しに別のUSBキーボードを接続してみると、こちらは「High Speed(最大転送速度が480Mbps)」だったようでD+は高い位置へ、D-は低い位置へと動きました。


キーを押してもオシロスコープの波形には変化がありませんが、これはUSBキーボードの通信がPC側から始められるため。しかし今回は特別なケーブルに接続して、オシロスコープにUSBキーボードからの信号を反映できるようにして調査します。


すると、オシロスコープに信号が生じました。


ズームするとこんな感じ。


細かく波形を分析するため、ズームした波形をスクリーンショットで記録し……


Photoshopで結合。


そして紙に書き出してみるとこんな波形になります。


ほとんどの部分は「D+が高くD-が低い」または「D+が低くD-が高い」という風に、お互いに反対方向に動く波形になっていますが、ところどころ「D+が低くD-も低い」という状態になっている部分があります。


これはシングルエンドゼロ(SE0)と呼ばれる状態です。


波形にSE0を示すとこんな感じ。


SE0が2ビット続くことは「パケットの終わり」を示すとのことで……


この波形には大きく3つのパケットが含まれていることがわかります。


また、D+が低くD-が高い状態は「J状態」、D+が高くD-が低い状態は「K状態」とされており……


各ビットごとにJ状態とK状態を記入するとこんな感じ。


パケットの終了からしばらくはJ状態が続き、K状態になったところがパケットのスタート地点です。最初は決まって「KJKJKJKK」というパターンから始まりますが、これは「Syncパケット」と呼ばれる信号の同期部分を示しているため、実際のデータはそれ以降の部分に含まれているとのこと。


パケットのデータは「0」と「1」の繰り返しで表されていますが、この波形は「K」と「J」のどちらかが「0」または「1」に対応しているわけではありません。この波形では「前の状態と異なる=0」、「前の状態と同じ=1」となっているとのことで、最初の「KJKJKJ…KK」の次にある「K」は「1」を表しています。次に来る「J」は「0」、その次の「K」も「0」、次に来る「K」は「1」という風に0と1を割り当てていくことができます。


手動でパケットを解読していくと、最初のパケットは「IN」というデバイスIDの入力コマンドと、「24」というUSBキーボードのデバイスID、そして確認コマンドを表していることがわかりました。


次のパケットはより長くこんな感じ。「DATA0」というデータの入力コマンドと、「00」「00」「00」「00」「00」「00」「00」「00」という8ビットのデータ、そして確認コマンドとなっています。


最後のパケットは、送信するデータの確認パケットとなっていました。


ここで重要なのは2つ目の「00」「00」「00」「00」「00」「00」「00」「00」というデータパケットですが、これが意味しているのは「何のキーも押していない」ということです。


今度はより高機能なオシロスコープにUSBキーボードを接続し、キーを押した時のパケットを見ていきます。


接続して調整すると、先ほど手動で解読したパケットがオシロスコープに直接表示されるようになりました。キーを押していない時のデータパケットはやはり「00」「00」「00」「00」「00」「00」「00」「00」で……


「Windowsキー」「Shiftキー」「Ctrlキー」などを押すと、最初の1つ目のビットが各キーに対応する値に変動します。たとえば「Ctrlキー」は「01」で、「Altキー」は「04」で表示されます。


複数のキーを同時に押すと、それぞれのキーに対応する値を合算した値が表示され、どのキーを同時に押しているかが判別できる仕組みです。今回は「Ctrlキー」と「Altキー」を同時に押しているので、「01」と「04」を合算した「05」が表示されているというわけです。


頭から2つ目のビットは何にも使用されず常に「00」の状態で、「A」や「B」といったその他のキーは残る6つのビットの組み合わせで表示されるとのこと。


複数のキーを押すと6つのビットがそれぞれ異なる値を取り、最大6つのキーを「同時に押している」と認識できるようになっていました。なお、この入力キーの認識能力についてはUSBキーボードの性能によって差があるため、物によってはもっと多くのキーを同時に押しても識別できるとイーター氏は述べました。


この記事のタイトルとURLをコピーする

Source

タイトルとURLをコピーしました