初期化部分。この部分には、ハードウェア層とソフトウェア層の初期化が含まれます。この例では、まず SN74hc164 チップが使用するマトリックス回路と GPIO ポートを設定して、CPU がそれらを制御してアクセスできるようにする必要があります。 GPIO ポートを入力、出力、または割り込みソースとして設定するには、対応する GPIO 制御レジスタに正しい値を設定する必要があります。具体的な値は、S3C2410 開発ボードのマニュアルを参照してください。たとえば、GPB1 を SN74hc164 の入力端子として設定するには、GPBCON 制御ワードの 2 つのビット 2 と 3 をバイナリ 01 に設定する必要があります。GPG6 を低電圧ジャンプ割り込みソースとして設定するには、2 つのビット 12 と 3 をバイナリ 01 に設定する必要があります。 GPGCON の 13 ビットをバイナリ 10 に設定する必要があります。ハードウェアの初期化操作が完了したら、ソフトウェア層の初期化です。まず、キーボード割り込み処理関数をシステムに登録し、次に割り込みが発生したときにカーネルのタイマー キューでハングするようにタイマー構造を設定します。タイマーがキーボードのスキャン動作をトリガーします。最後に、SN74hc164 を通じてマトリクス回路の 16 列が 0 に設定されます。
割り込み処理部分。前に述べたように、ソフトウェアのこの部分が行うべきことは、特別なキーボードをスキャンし、どのキーが押されたかを判断し、安定したスキャン コードを取得してから、カーネル エクスポート関数 handle_scancode を呼び出すことです。このアプリケーションでは、特殊キーボードのレイアウトは PC の標準キーボードのレイアウトと似ているため、PC キーボードの対応するキーのシステム スキャン コードを特殊キーボードの各キーのスキャン コードとして直接使用します。同時に、PC キーボード ドライバーも使用します。スキャン コードからキー コードへの変換関数 pckbd_translate が、kbd_translate 関数として使用されます。
どのキーが押されたかを判断するアルゴリズムは次のとおりです。割り込みが発生すると、割り込み番号に基づいて押されたキーがどの行であるかをすでに判断できますが、押されたキーがどの列であるかを判断する必要もあります。この目的のために、最初に直列に接続された 2 つの SN74hc164 チップに CLR 信号を送信し、それをクリアしてから 16 個の 1 を送信します。これにより、この時点で特別なキーボードの列がすべて High になります。キーボードのポートはすべて高電位です。 16 クロック パルスの下で、1 個の 0 と 15 個の 1 が SN74hc164 チップに送信されるため、0 は各列に 1 回だけ表示され、同時にキーボードの行ポートがスキャンされます。押されたキーの列が 0 に設定されている場合、そのキーが配置されている行は Low レベルを読み取ります。この「ウォーク 0 メソッド」を使用すると、キーボードのどのキーが押されたかを判断できます。しかし、この単純なスキャン アルゴリズムでは十分ではありません。このタイプのマトリックス スキャン キーボードでは、キーを押したり離したりするたびに 10 ~ 20 ミリ秒 (この期間の長さはハードウェアの特性によって決まります) のバリ ジッターが発生するためです。図 2 に示すように、安定したキー情報を取得するには、ユーザーが 1 つのキーを押したときに複数のキーを押したと誤認しないように、このジッターを除去する方法を見つける必要があります。バリ取りの一般的な方法は、キーボード割り込みが到着したときにすぐにキーボードをスキャンするのではなく、一定期間待ってからバリ ジッターをスキップした後にキーボードをスキャンすることです。疑似コードは次のとおりです。
一定期間待機します。時間をかけてジッターをスキップします。
キーボードのキーが押されていない場合は、
終了して戻ります。
再度しばらく待って、同じキーがまだ押されている場合
はスキャン コードを返します。
else
は直接戻ります。 ただし、busy メソッドが使用されます。バリを除去するための作業が行われます。忙しい待機期間中は、システムは有用な作業を行うことができません。これは、コンピューティング リソースが限られている組み込み Linux システムにとっては贅沢な無駄です。このアプリケーションでは、組み込みシステムに適したバリ取りソリューションを設計し、良好な結果が得られました。Linux カーネルはタイマー キューを提供するため、このメカニズムを使用してビジー待機を回避し、システム パフォーマンスを向上させることができます。キーボードのキーが押されると、キーボード割り込みハンドラーはまず割り込みソースを閉じ、ポーリング モードに入り、タイマー リスト オブジェクトをタイマー キューにハングした後に終了します。カーネルにフックされたタイマーは時間どおりにトリガーされ、トリガーされる関数は次のタスクを完了します。まず、キーボード全体のすべてのキーをスキャンし、スキャン結果を静的な 2 次元配列変数 snap_shot_matrix[16 ][4] に保存します。 ]。この変数は、キーボード スキャンにおける現時点でのキーボード上のすべてのキーの押下状態を表します。キーが押されていない場合、つまりリリース状態にある場合、snap_shot_matrix の対応する値は 0 に設定されます。キーが押された場合、snap_shot_matrix の対応する値は 1 ずつ増加します。値が 1 ずつ増加した後、事前に指定された数値より大きい場合、その値は安定した値であるとみなされ、その値をサイズ 16*4 の別の 2 次元配列変数 current_matrix の対応する座標に設定できます。 1 に設定します。それ以外の場合は 0 に設定します。この変数は、キーボード上の現在のキーストロークの安定した値を表します。つまり、今回のスキャンで得られたサンプリングデータを加工してsnap_shot_matrixに保存し、この変数の値に基づいてフィルタリングしてcurrent_matrixを取得するという処理を行います。このスキャンの安定値 current_matrix を取得した後、それを前回取得した安定値previous_matrixと比較して、キーボード上のキーの状態が前回のスキャンと比較して現時点で変化しているかどうか、およびこの時点のキーボードの状態が変化しているかどうかを判断します。キーが押されたかどうかが変更されます。キーボード上のどのキーも押されていないことが判明した場合は、キーボード割り込みをオンにして、再度割り込みモードに戻します。キーボード上のキーが押され、それが最後にスキャンされた押されたキーと異なる場合は、すぐにキー処理関数 process_key を呼び出します。この関数は、キーボード ドライバーの上位レベル関数 handle_scancode を呼び出します。キーボードで押されたキーが最後に押されたキーである場合、カウンターが特定の指定値に達すると、いわゆる自動リピート機能が開始されます。つまり、ユーザーは特定のキーを押し続けます。ドライバーはキーボード入力を繰り返し自動的に生成します。このカウンタは、押されたキーが変わると 0 に設定されます。ただし、キーボード上にまだ押されているキーがある限り、現在読み取られているキーボード安定値 current_matrix をprevious_matrix にコピーし、前述のタイマー オブジェクトをカーネル タイマー キューに再度ハングし、しばらくしてから全体をスキャンします。キーボードのキーがすべて押されなくなるまで、キーボードをもう一度押します。
4 結論
情報社会とコンピュータソフトウェアおよびハードウェア技術の進歩に伴い、組み込み情報製品の設計とアプリケーションは急速に発展しており、独自の組み込み Linux システムに特別なキーボードドライバを追加する必要性も高まっています。普遍的な。 Linux のキーボード ドライバーの全体的なフレームワークを紹介した後、この記事では、S3C2410 開発ボード上の特殊なキーボードを例として取り上げ、組み込み Linux 環境で特殊なキーボード用のドライバーを作成するときに実行する必要がある作業について説明します。 、同様の基礎を提供する開発では、アイデアと参照を提供します。
(T114)
上記は、組み込み Linux システムのキーボード ドライバー実装の (1) (2) の内容です。さらに関連する内容については、PHP 中国語 Web サイト (www.php) を参照してください。 .cn)!