1 はじめに
Linux は、強力で安定したカーネル、容易な拡張と縮小、豊富なハードウェア サポートなどの多くの利点により、組み込みシステムで広く使用されています。多くの組み込み Linux システム、特にユーザーとの対話が盛んなシステムでは、多くの場合、特別なキーボードを装備する必要があります。現時点では、開発者は実際の状況に基づいて独自の特別なキーボードのドライバーを作成する必要があります。
2 Linux キーボード ドライバーの概要
Linux のほとんどのドライバーは階層アーキテクチャを採用しており、キーボード ドライバーも例外ではありません。 Linux では、キーボード ドライバーは 2 つの層で実装されます。このうち、上位層は一般的なキーボード抽象化層であり、基盤となる特定のハードウェアに依存しないキーボード ドライバーの一部の機能を完了し、基盤となる層にサービスを提供する役割を果たします。下位層はハードウェア処理層です。 、特定のハードウェアと密接に関係しており、主にハードウェアの直接処理を担当します。キーボードドライバーの上部の公開部分は driver/keyboard.c にあります。このファイルで最も重要なのは、EXPORT_SYMBOL マクロを使用してカーネルによってエクスポートされた handle_scancode 関数です。 handle_scancode によって完成される関数は次のとおりです。まずスキャン コードをキー コードに変換し、次に Shift、Alt、およびその他の拡張キーの押下に応じてキー コードをターゲット コード (通常は ASCII コード) に変換し、最後に ASCII コードを入力します。を端末デバイスのバッファに保存し、それをモニター上でエコーするようにタスクレットをスケジュールします。この関数はキーボード ドライバーのコア作業の一部を完了し、これらのコア論理関数は基礎となるハードウェアに依存しないため、分離して基礎となるハードウェア処理関数呼び出しにエクスポートできることがわかります。このファイルには他のいくつかのコールバック関数も定義されており、これらはキーボード ドライバーの上位レベルのパブリック部分によって呼び出され、基礎となるハードウェア処理関数によって実装されます。たとえば、kbd_init_hw、kbd_translate、kbd_unexpected_up などです。このうち、kbd_translate は handle_scancode によって呼び出され、スキャン コードをキー コードに変換する役割を果たします。キーボード ドライバーの基礎となるハードウェア処理部分は、ハードウェアによって実装が異なります。たとえば、PC プラットフォーム上の標準キーボードの基礎となるハードウェア処理機能は、driver/Pc_keyb.c に集中しています。このファイルには、キーボード割り込み処理関数keyboard_interrupt、スキャン コードからキー コードへの変換関数pckbd_translate、および基盤となるハードウェアに密接に関連するその他の関数が含まれています。
このアーキテクチャでは、特別なキーボードをシステムに追加することが特に明確です。開発者は、キーボードを駆動するための基礎となるハードウェア処理関数をドライバーに記述するだけで済みます。一般に、基盤となるハードウェア処理関数で最も重要な仕事は、キーボード割り込み処理で押されたキーのスキャン コードを取得し、それをパラメーターとして使用して handle_scancode を呼び出すことです。スキャン コードは自分で定義できますが、定義する必要があります。キーボード上の押されたキーの位置を一意に識別します。さらに、開発者は、カスタム スキャン コードからキー コードへの対応する変換関数 kbd_translate を提供する必要もあります。特定のキー コードの変換、ターミナルの入力バッファーへのターゲット コードの配置、およびエコー処理はすべて handle_scancode によって完了します。ここでは、カーネル エクスポート関数 handle_scancode が、キーボード ドライバー全体の上部の一般抽象化レイヤーとその下にあるハードウェア処理レイヤーを結合する上で重要な役割を果たしていることがわかります。
3 アプリケーション例
以下では、特定のアプリケーション例を使用して、組み込み Linux システムで特殊なキーボード用のドライバーを作成する具体的なプロセスを説明します。
3.1 ハードウェアモジュールの説明
このシステムの構築では、Samsung の S3C2410 開発ボードをハードウェア プラットフォームとして使用します。特別なキーボードのハードウェア モジュールは、主に 2 つの SN74hc164 チップと 4 行 16 列のマトリックス走査回路で構成されています。 SN74hc164 は、D フリップフロップを 8 個直列接続した 8 ビットのシリアル入力・パラレル出力のシフトレジスタです。その動作原理は単純に次のとおりです。SN74hc164 チップは、クロック CLK パルスの立ち上がりエッジで 8 クロック パルス後に、A ピンと B ピンのシリアル入力を出力ピン QA ~ QH に並列に出力します。その真理値表を図 1 に示します。
2 つの SN74hc164 チップを直列に接続した後、CLK ピンと CLR ピンをそれぞれ S3C2410 開発ボードの GPB2 ポートと GPB4 ポートに接続し、最初の SN74hc164 チップの A ピンと B ピンを GPB1 の開発ボードに接続します。ポートの場合、これら 3 つの GPIO ポートは出力ポートとして設定されます。このように、2 つの SN74hc164 レジスタを使用して 3 つの GPIO ポートのみを占有し、マトリックス スキャン回路の 16 列に入力を提供することで、コストを節約し、GPIO リソースの無駄を回避します。しかし、これはキーボード ドライバーの実装に特定の問題をもたらします。ドライバーは最初に SN74hc164 を駆動し、その後マトリックス回路の 16 列を制御する必要があります。マトリクス回路の 4 つの列ピンはそれぞれ S3C2410 の GPG6、GPG7、GPG8、GPG9 ポートに接続されており、これら 4 つのポートが割り込みソースとして設定されます。キーが押されていない場合、それは高電位として直接読み取られます。使用する場合、キーボードの 16 列はまず SN74hc164 チップを介して低電位に設定され、いずれかのキーが押されると、対応する行の GPG ポートに電圧がかかります。ハイからローへのジャンプ これにより割り込みがトリガーされます。
3.2 ソフトウェアモジュールの説明
上記は、組み込み Linux システムのキーボードドライバー実装 (1) の内容です。さらに関連した内容については、PHP 中国語 Web サイト (www.php.cn) に注目してください。