設定:OpenWRTを実行するLinkitボード(Smart 7688 Duo)とUSBホストに接続された汎用キーボード。
目的:/dev/input/event0から得られた信号をダンプし、ボードの基本UARTを介してAtmega32u4に送信します。したがって、このAtmegaは接続されているマシンのキーボードのように動作します。
これまで私が得たのは、キーボードから信号を受け取り、OpenWRTのatmegaにシリアルで送信するのは難しくありません。しかし、本当の問題は、Atmegaが実際のキーボードのように動作するようにすることです。
私はこれに基づいてPythonスクリプトを使用します。回答データの可視化を簡単にするために、シリアルを介してArduino IDEコンソールに簡単に送信できます。だから簡単なものを使うキーボードを押してください()Arduinoスケッチの説明マシンのキーを再現し、ATmegaはHIDのように動作します。
それは非常に簡単に見え、あなたがしなければならないことは単純なキーストロークをまねるだけです。しかし、同時キー押下、修飾キー、Caps Lockなど、実際のキーボードのすべての機能を再現するのは難しかった。
似たようなことを試した人はいますか?
PS:私の考えは、Arduinoキーボードクラスを変更して送信できるようにすることです。主なレポートOpenWRTから受け取った生データを処理する方法ですが、前述したように結果は非常に複雑です。私はそれを許したくないもし氏名受信したデータ型ごとにAtmegaに一致するキーを実行するように指示します。単に信号をミラーリングする方法があると思います。
編集する:
多くの努力と時間を費やして助けてくれた@dirktに感謝します。非常に生産的な議論であり、多くを学びました。 /dev/hidraw0から得られたレポートが反対側のすべての特殊キーを実装していると言われたときに必要な答えに近いです。
したがって、収集した情報で質問を変更してください。 キーボードから[修飾子、予約、キー、キー、キー、キー、キー、キー]形式でレポートをインポートする方法
/dev/hidraw0はキーとイベント(1:押された0:ドロップ2:保留)を返しますが、修飾子のバイトを取得する方法がわかりません。 (今は保管するのを忘れてしまいました)
答え1
部分的な答え:
まず、いくつかのことをまとめましょう。
私が正しく理解した場合、OpenWRTはMPU(MT7688)で実行されています。 MPUはUARTの後ろにMCU(ATmega)があり、MPUには汎用USB HIDキーボードが接続されるUSBコントローラがある。
カーネルでは、キーストロークは次の階層を通過します。
keyboard -> USB -> HID -> input
したがって、キーボードはUSBパケットをHIDレポートデータを含む「割り込み」に送信します。 HIDデータはHID記述子に記載されており、キーボードの場合、通常は修飾子バイトと最大6つの同時キーを押します。ただし、他の形式も可能です。から生のhidレポートを読むことができます/dev/hidrawX
。 HIDレポートは、個々のキーを押す/解除するカーネル入力レイヤーイベントに変換されます/dev/input/event0
。
これはUARTやその背後にあるATmegaとは何の関係もありません。
現在、USB以外のバスを介してHIDデバイスをカーネル層に接続する方法がいくつかあります。たとえば、I2CまたはUARTを介して。
あなたが欲しいものは何ですか?これはUSBキーボードイベントの存在とは関係ありません/dev/input/event0
。
もう1つの選択肢は、ATmega側で必要に応じて独自のプライベートプロトコルを開発し、次の方法で新しい入力層デバイスを登録する小さなCプログラムを実行することです。入力、UARTを読み取り、入力レイヤーイベントを送信します。
あなたが欲しいものは何ですか?同様に、USBキーボードイベントの存在/dev/input/event0
やこれらのイベントをUARTに転送することとは関係ありません。
それともMPUからキーボードイベントを取得し、ATmegaに送信し、そこで処理してから再送信し、実際の入力イベントとして機能するようにしますか?これは確かに可能ですが、MPUでこれをしない理由は何であるかを自分に尋ねる必要があります。
それでは実際の目標を説明してください。。現時点では少し不明です。 Linux入力レイヤーを操作したり、Linux HIDレイヤーを操作したり、両方のレイヤーにイベントを挿入したり、必要な操作を実行したりできます。形式は特に難しくありません。あなたは具体的でなければなりません何あなたが欲しい。
OpenWRTから受け取った生データを使用して、必要な方法でKeyReportsを送信できるようにArduinoキーボードクラスを変更します。
あまり意味がありません。カーネルレベルには「Arduinoキーボードクラス」はありません。開発システムの一部として「Arduinoキーボードクラス」を使用する場合協会それに。おそらくあまり役に立ちません。他の形式(HIDレポート、入力レイヤーイベント)についても知っておく必要があります。
編集する
したがって、要約すると(次に質問するときも同様の方法で説明してください。質問も参照してください)。XYの問題):
USBキーボードと他のコンピュータの間に中間デバイスが必要です。ここでは、他のコンピュータは通常のキーボードのみを表示し、キーログを実行して他のイベントをトリガーできます。 (仲介デバイスが実際のハードウェアである必要があるか、操作に役立つか、キーボードイベントをさらに処理するデバイスがPCにインストールされているかどうかを指定しませんでした。)
これを行うには、Linkitボードを使用したいと思います。 LinkitボードのMPUはキーボードのUSBホストとして機能します。 UARTを介してMCU(ATmega)に接続され、MCU自体がUSB HIDデバイスとして機能し、それを別のPCに接続することができます。
USB HIDデバイスとして機能するには、MCUは3つの作業を実行する必要があります。つまり、レポートを説明するHID記述子が必要で、HIDキーボード押下レポートを送信し、次の設定をしてPCのHIDレポートに応答する必要があります。キーボードLEDなど、私はあなたがこれらすべてを処理するATmegaライブラリを持っていると仮定します。
最も簡単な方法は、実際のUSBキーボードからHID記述子をコピーすることです。/sys/kernel/debug/hid/DEVICE_ID/rdesc
DEVICE_IDがキーボードを識別するHID記述子の人が読める形式を見つけることができます。開始する16進数を解析するか、この情報を直接取得できるioctlがあるかどうかを確認してください。
その後、ATmegaと通信するために一時プロトコルを使用するMPUの小さなプログラムが必要です。次の作業を行う必要があります。 (1)USB hid機器が接続されている場合は、HID記述子を読み、解析し、HID記述子をATmegaに送信します。 (2)ループに入り、UARTを介してキーボード番号でHIDレポートを渡し、UARTから受信したHIDレポートを作成します/dev/hidrawN
。 (3)USBキーボードの接続が切断されたら、「終了」メッセージを送信します。N
/dev/hidrawN
ATmegaでは、利用可能なHIDライブラリを使用して反対側を実装するには、小さなプログラムが必要です。
キーロギングなどを実装する側を選択できます。
同時キー入力、Caps LockなどはすべてHIDレポートを渡すことで自動的に処理されます。