UART経由でOpen WRTでUSB HID信号をミラーリングする[閉じる]

UART経由でOpen WRTでUSB HID信号をミラーリングする[閉じる]

設定: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/rdescDEVICE_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レポートを渡すことで自動的に処理されます。

関連情報