Windows system >> Windowsの知識 >  >> Linuxシステムチュートリアル >> Linuxチュートリアル >> Linuxの入力サブシステム分析

Linuxの入力サブシステム分析

  
 


Linuxの入力サブシステムは、例えば、マウス、キーボード、タッチパネル入力装置が属するように、駆動フレームの入力装置を提供します。のドキュメント/入力ディレクトリ、入力コアコードinput.cとinput.hで入力サブシステムに関するLinuxのマニュアル。グラブ、タイミングキーイベント、この記事では、入力の実装で、そのようなinput_dev->
詳細には関係しません。
1. input_handle、input_handler、input_devを
input_handle、input_handler、input_devを入力サブシステムは、最も重要な3つのデータ構造です。入力イベントを取得する上位アプリケーションinput_handler
のL。上位アプリケーションデバイス入力デバイスノードを開いて、ノードは読み出し、マウスの動き、キーボード情報などを取得するために情報を書き込みます。ここでファイル操作関数は、デバイスノードinput_handlerによって提供されます。
さL input_devをを等、例えば、マウス、キーボードなど、特定のデバイスを表します。 Linuxのコンピュータ
はL
、複数のマウス、複数のキーボードに取り付けることができます。各マウスカーソルの動きを制御することができ、すべてのキーボードは、通常使用することができます。この入力サブシステムは、同時にinput_devをから入力された複数のメッセージを取得することが可能な、関連するinput_handle input_devを複数として具体。一方、Linuxデバイスは、同時に特定のデバイスに関連付けられた入力ノードの複数を有することができるように、デバイスノードによって任意のアプリケーション、例えば特定のデバイスKeyihuodeマウス、キーボード等のようなすべての情報を入力します。だから、input_devをとinput_handlerの間で多くの関係に関連付けられており、これらの関係はinput_handleで表されます。
input_handle DEVと1.1ハンドラはinput_devをポインタ、ポインタinput_handlerが含まれてい
間の関連付けを確立し、彼らはハンドラとDEV-1との間の関係を確立することができます。 input_handlerでは、あなたがハンドラに関連付けられているすべてのDEVを見つけることが可能なハンドラ関連付けられたハンドルへのすべてのinput_handle h_list、およびポイントのリストがあります。同様に、input_devをして、DEVハンドルに関連するこれらのすべてを見つけることができますDEV関連するハンドラを指し、また、すべてのinput_handle h_listのリストがあります。そしてinput_handle、input_handlerと複雑なネットワーク構造を構築することによりinput_devを二つのリストの間で。
その後、input_handler間の会合のルールとは何ですかinput_devを?それは関連付ける必要がありますどのような状況の下で、ある、としないときに関連付けること?これは、ハンドラとdevの間のマッチングの仕組みが必要です。
input_handlerは、ブラックリストはブラックリストであり、すべてのDEV整合フィルタリングを余儀なくされる二つのポインタ、id_table及びブラックリストを有し;そしてマッチdevに任意とid_tableハンドラに関連すること。 CONST構造体input_device_id
* id_table; *ブラックリストconstの構造体input_device_idを
;
構造体input_device_id {
kernel_ulong_tフラグ;
__u16 BUSTYPE;
__u16ベンダー;
__u16生成物;
__ U16バージョン;
kernel_ulong_t evbit [INPUT_DEVICE_ID_EV_MAX /BITS_PER_LONG + 1];
kernel_ulong_t keybit [INPUT_DEVICE_ID_KEY_MAX /BITS_PER_LONG + 1];
kernel_ulong_t relbit [INPUT_DEVICE_ID_REL_MAX /BITS_PER_LONG + 1];
kernel_ulong_t absbit [INPUT_DEVICE_ID_ABS_MAX /BITS_PER_LONG + 1];
kernel_ulong_t mscbit [INPUT_DEVICE_ID_MSC_MAX /BITS_PER_LONG + 1];
kernel_ulong_t ledbit [INPUT_DEVICE_ID_LED_MAX /BITS_PER_LONG + 1];
kernel_ulong_t sndbit [INPUT_DEVICE_ID_SND_MAX /BITS_PER_LONG + 1];
kernel_ulong_t ffbit [INPUT_DEVICE_ID_FF_MAX /BITS_PER_LONG + 1];
kernel_ulong_t swbit [INPUT_DEVICE_ID_SW_MAX /BITS_PER_LONG + 1];
kernel_ulong_t driver_info;
};
この構造体では、フラグは、いくつかのマスクが含まれています。
に#define INPUT_DEVICE_ID_MATCH_BUS 1
の#define INPUT_DEVIC E_ID_MATCH_VENDOR 2
の#define INPUT_DEVICE_ID_MATCH_PRODUCT 4
の#define INPUT_DEVICE_ID_MATCH_VERSION 8ようにバス型、ベンダー、部品番号、バージョン番号、およびと一致するように、これらのマスクを
。情報が選択された一致しない場合には、マッチング処理のフラグをスキップするdriver_info必要性を設定します。
evbit [INPUT_DEVICE_ID_EV_MAX /BITS_PER_LONG + 1]は、イベント・マスクのサポートを含んでいます。
の#define EV_SYNは0x00 //EV_SYNの#define EV_KEYは0x01 //入力キーボード入力のシリーズをマーク
エンドの相対変位のため
の#define EV_RELが0x02 //マウス<:入力サブシステムは、以下のイベントをサポートしていますBR>絶対
の#define EV_ABS 0x03の//タッチスクリーン座標の#define EV_MSC 0x04の
の#define EV_SW 0x05の
の#define EV_LED 0x11を//キーボードなど
の#define EV_SND 0x12を
LED制御#define EV_REP 0x14の
の#define EV_FF 0x15の
の#define EV_PWR 0x16
の#define EV_FF_STATUS 0x17の
ハンドラは、イベントの特定の種類をサポートし、evbit対応するビットがセットされている場合。特定のビットをevbit場合、特定のイベントに対応するマスクアレイの構造と効果的であろう。例えば、EV_KEYセットは、対応するkeybitアレイを効果的に特定のキーハンドラサポートの種類を定義する配列です。ハンドラとDEVが一致する必要がある場合は、devがサポートされているすべてのイベントハンドラをサポートすることができなければならない。しかし、ハンドラはDEVが提供できるすべてのイベントに対処する必要はありません。
の#define MATCH_BIT(ビット、MAX)\\
用(i = 0; I< BITS_TO_LONGS(MAX); iは++)\\
IF((ID->ビット[i]が&#038; DEV- >!ビット[I])= ID->ビット[I])\\
破壊;! \\
場合(I = BITS_TO_LONGS(MAX))\\
続け、一致約
具体的なプロセスは、参照がinput_match_deviceに機能することができます。
2. input_devを
すべてinput_devを、クラスが'&と呼ばれる仮想デバイスであり、入力',クラス登録機能:
class_register(&#038; input_class);ので登録する必要が
物理的な機器は、物理的なデバイスは、この親デバイス登録input_devをしています。
はinput_register_device機能によって完成
input_devを登録input_devを2.1を記録しました。
INT input_register_device(構造体input_devを* DEV)
__set_bit(EV_SYN、DEV-> evbit); //ビットを強制的
//タイマーを初期化する第一の時間遅延タイムアウト値をREP_DELAY EV_SYNを設定します、REP_PERIODタイムアウト遅延値
init_timer //(アンプ&; DEV->タイマー)後に初めて
IF(DEV->!担当者[rEP_DELAY]&#038;&#038;! DEV->担当者[REP_PERIOD]){
DEV-> timer.data =(長い)DEV;
DEV-> timer.function = input_repeat_key;
DEV->担当者[rEP_DELAY] = 250。
DEV->担当者[REP_PERIOD] = 33;
}
//キーを取得し、デフォルトの機能設定キー
を設定した場合(DEV->! getkeycode)DEV-> getkeycode = input_default_getkeycode;
IF(DEV->! setkeycode)DEV-> setkeycode = input_default_setkeycode;
//デバイスの名前を設定し、その後、デバイスを登録
のsnprintf(DEV-> dev.bus_id、はsizeof(DEV - > dev.bus_id)、
"入力%LD"(unsigned long型)atomic_inc_return(&#038; input_no) - 1);
device_add(&#038; DEV-> DEV);
list_add_tail (&#038; DEV->ノード、&#038; input_dev_list); //鎖input_dev_listにデバイスを追加表
//登録済みの各ハンドラのために、
list_for_each_entry(ハンドラ、&#038; input_handler_list、ノード)をinput_attach_handler呼び出し
input_attach_handler(DEV、ハンドラ); //参照の次のセクション
//PROC関連する操作
input_wakeup_procfs_readers();zh-CN"],null,[1],zh-TW"]]]

Copyright © Windowsの知識 All Rights Reserved