連載 1 Zaurus with Linux 図 6 kbdsim を使ったドライバ さらに、この存号を使った表記を組み合わせると、 Fn キ ー ( スキャンコード : 30 ) や Shift キー ( スキャンコード : PS / 2 キーポード 27 ) などの修飾キーの同日甲しをシミュレートすることが できます。たとえば、 # pk —d + 30 + 27 3 ー 27 ー 30 は、 Fn 十 Shift 十 C ( スキャンコード : 3 ) の同時押しに相 当します。 イ反想キーポード・プログラム pk は、 ソースも含めて、 ・ http://hp.vector.co ・ jp/authors/VA004814/ sl—zaurus で公開しています ( ただし、 kbdsim モジュールは別途入 文字コード 手してください ) 。このプログラムは、外部キーボード・ド 文字コードを SL - Zau 「 us のキーコードに変換 ライバを作るための kbdsim モジュールの動イ寉認を目的 キーコードおよび として作ったものですが、ほかにもおもしろい利用方法が メーク / ブレーク情報 あるかもしれません。 kbdsim. 0 から handle_scancode() 関数経由で 現在アクティブな任意のプロセスへ kbdsim はセキュリティ・ホールになる ? こまで、 kbdsim モジュールと、それを使ったイ反想キー キャンコードを読み取り、いったんそれを入力されるべき ボード・プログラムを紹介しましたが、これらの設定や使い 文字コードに変換したあと、再度 SL-Zaurus のキー・ス 方を誤るとセキュリティ上の問題となるおそれがあります。 キャンコードに変換し、 kbdsim モジュール経由でカーネ kbdsim モジュールは、 /dev/kbdsim に書き込まれた ル内のキー入力に書き込みます。 キー・スキャンコードをとくにチェックせずにカーネルに このドライパソフトは、 2 月号で紹介した ek2 の次の 渡します。また、イ磨誤キーポード・プログラム pk も、コ バージョンという末で、、 ek3 " と名付けました。 マンドライン引数を細かくチェックしているわけではあり 書式は、 2 月号の ek2 と同じです。 ません。たとえば、 ek3 [-rawlirkbIOIlhhc] [ シリアルポート ] # pk "cd / ; /bin/rm —rf * \ て " -raw は HP 200LX のように、キーボード・スキャ などとしてしまうと、ファイルシステムカ皮壊されてしま ンコードではなく文字コードをそのまま出力するものを接 います。 続した場合に指定します。—irkb101 は IrKB101 を介し セキュリティ上、問題となるような使い方をしないのは て、—hhc は Happy Hacking CradIe を介して PS/2 もちろんのこと、 /dev/kbdsim の書込み権限を root 以 キーポードを接続したときに指定します。シリアルポート 外には与えない (chmod 600 としておく ) 、必要のないと は、キーボードを接続したインターフェイスを指定します。 きは kbdsim モジュールは組み込まないといった注意が必 このドライバは、英語配列の PS/2 キーポードに対応し 要でしよう。 ています。 Happy Hacking Keyboard の場合には、以 kbdsim を使ったキーポード・ドライバ 下の特殊キーカ俐用できます。 pk を使って kbdsim モジュールの使用方法を確認した あと、最終目標の外部キーボード・ドライバを作成しまし 体キーポードのカーソルキーに対応 た。このプログラムは、図 6 のように、アダブタを介して ・ Fn 十 K (Home) : 本体キーボードの HOME キーに対応 ・ Fn 十 I (prtsc) : 画面キャプチャに対応 シリアル・インターフェイスから PS/2 キーボード・ス HP 200LX RS232C lrDA lrKB101 からのテータを PS / 2 キーポード スキャンコードに変換 PS/2 キーポード スキャンコード PS / 2 キーポードスキャンコードを 文字コードに変換 178 UN 工 X MAGAZ 工 NE 2004.5
図 5 kbdsim モジュール使用例 #include く fcntl . h> #include く unistd . h> main ( ) int fd; char s [ 2 ] ; fd = open ( "/dev/kbdsim" , O_WRONLY) ) ; s [ 0 ] 41 ; / * 1 のスキャンコード * / / * キーを押した * / write(fd, s, 2 ) ; sC1] = 0 ; / * キーを離した * / write(fd, s, 2 ) ; 連載 1 Zaurus with Linux を作成するか、 iPKG パッケージから kbdsim. 0 を抜き出 して適当なディレクトリに置きます。そして、デバイスフ アイル /dev/kbdsim を用意し、 insmod コマンドで kbd- sim. 。をカーネル・モジュールとして組み込みます。たと えば、 # mknod /dev/kbdsim c 61 0 # chmod 600 /dev/kbdsim # insmod —f kbdsim . 0 のようにします。 モジュールが組み込まれたかどうかは lsmod で確認します。 コマンド # lsmod Modu1e kbdsim pxa—bi Size 992 21328 Used by 0 (unused) 0 (unused) 外部プロセスからキーボード入力をシミュレートするに UNIX MAGAZINE 2004.5 5 PS/2 キーポードのキーポード・スキャンコードとはまったくの別勿で - す・ いるものを利用します。 linux24/drivers/char/corgi-keymap ・ map に書かれて なお、こ ーで使うキー・スキャンコード 5 は、 kernel/ レークを示す 0 を書き込んでいます。 示す 1 を write で書き込み、最後にスキャンコードとプ ンし、次に 1 キーのスキャンコードである 41 とメークを います。まず、デバイスファイルを書込みモードでオープ では、数字の 1 キーを押して離す動作をシミュレートして は、図 5 のようなプログラムを使います。このプログラム kbdsim の応用 kbdsim モジュールを使って、最終目標のキーポード・ ドライバを作成する前段階として、コマンドラインから指 定した文字列をキー入力に送り込む、、仮想キーボード " ソ フトを作ってみました。このソフトの名称は、仮想キーボ ード (pseudo keyboard) の頭文字をとって、、 pk" としま 0 pk は、次のようにして起動します。 pk s カれ 9 引数の s は、キー入力に送り込む文字列です。この 文字列では、バックスラッシュを使ったエスケープ・シー ケンスカ吏えます。たとえば、 \ r はキャリッジ・リターン ( 0x0d ) 、 \t はタブ ( 0X08 ) 、 \n は直 oxoa ) 、 \ \ はバック スラッシュ ( 0x5c ) になります。また、 \ ゅん勧でコン トロール文字を指定することもできます。 \Ac は ctrl 十 c ( 0X03 ) になります。 簡単な実行例を示します。 # pk 'echo "foo"\r' # echO " f00 " f00 pk -d [ + ト ] scancode. とすると、文字列ではなく scancode で指定したキー・ス キャンコードをキー入力として送り込むことができます。 scancode の前に符号を付けないと、 scancode で示される キーを押してから離す動作をシミュレートします。また、 、、十 " は scancode で示されるキーを押す動作を、 は scancode で示されるキーを離す動作をシミュレートしま す。したがって、次の 2 つの例は、どちらもスキャンコー ド 41 のキー ( 数字の 1 ) を押して離すことをシミュレート 1 行目では、 pk コマンドで、、 echo "foo"\r" という文字 列をキー入力に送り込むことを指示しています。そして、 2 行目では、その送り込まれた文字列がシェルに渡されてェ コーバックされています。 3 行目では、結果として入力さ れた echo コマンドの引数である foo が表示されています。 また、 # pk —d + 41 ー 41 # pk —d 41 することになります。 177
連載 1 Zaurus with Linux 語キーボードには、日本語キーポードの円記号キーに相当 するキーはありません。文字コード上は同じ文字 (0x5c) を表しているのに、違うキーが割り当てられているのです。 なお、日本語キーポードにおける円記号のスキャンコード は Ox6a 、英語キーポードにおけるバックスラッシュのス キャンコードは 0x5d です。 これらのことから、日本語キーポードの利用を前提とし ている SL ー 6000 では、英語キーポードでバッククオート・ キーとバックスラッシュ・キーを使う文字 ( ' 、 CtrI 十 \ など ) を入力することはできません。この問題を 解決するには、これらのキーに対応するキーポード・スキャ ンコードが、 SL ー 6000 内部でどのように扱われているのか を調べる必要があります。 このあたりについてもうすこし調べようとしたのです が、 SL ー 6000 の場合は、ほかの一般向け SL-Zaurus シ リーズなどと違ってサポートページに技術サポート情報が 掲載されていないので、手の出しようがありません。せめ て、 SL ー C700 / B500 における Qt のキーコード表 3 のよう なものがあればいいのですが、いまのところ情報は公開さ れていないようです。 SL ー 6000 についても、ほかの SL-Zaurus と同様に、各 種の内部資料やカーネルのソースコードなどの情報が公開 されるようになるといいですね。 S し C シリーズ用外部キーボード 2 月号で、 SL-C シリーズにアダブタを介して PS/2 キ ーポードを接続するためのドライパソフトを紹介しました。 このドライバは実装の容易さを優先させたため、ターミナ ルでしか使えず、 SL-Zaurus (Qt) 上のすべてのアプリ ケーションで利用できるものではありませんでした。 しかし、 SL ー 6000 に接続した日本語 USB キーボードの ように、 Qt 上のすべてのアプリケーションで外部キーボー ドが商に使える士竟に慣れると、この PS/2 キーボード・ ドライバも、ターミナル限定という制約を外したくなりま す。 2 月号に「ソースを公開しているので、どなたかチャ レンジしてみませんか」と書きましたが、けっきよく自分 で大幅に書き換えることにしました。 3 http://developer ・ ezaurus.com/sl-j/doc/software/ keyc0de-b500c700. pdf 176 図 4 kbdsim モシュール ユーザープロセス write(2) で書込み insmod で モジュール組込み kbdsim. 0 /dev/kbdsim Qt 上のアクティブな 任意のプロセス 、キー入力イベント 、キー入力情報 カーネル handl e_scancode() UNIX MAGAZINE 2004.5 メーク / ブレーク情報 キーコードおよび 4 http://www.killefiz.de/zaurus/showdetail.php?app=21 ソースに含まれる kbdsim. c をコンパイルして kbdsim. 0 kbdsim モジュールを利用するには、 VNC サーバーの で示すと図 4 のようになります。 が handle-scancode() に渡されます。この関係を模式図 1 ならメーク、 0 ならプレークです。そして、このデータ のメーク / プレーク ( 押したか離したか ) を示すフラグで、 のバイトはキー・スキャンコード、その次のバイトはキー sim を通じて 2 バイトずつのデータを受け取ります。最初 kbdsim モジュールは、外部プロセスから /dev/kbd- ています。 kernel/linux24/drivers/char/keyboard. c で定義され dle-scancode() 関数を呼び出しています。この関数は、 ネルとのインターフェイスとして、カーネル内部の han- イスにはデバイスファイル /dev/kbdsim を使い、カー す。このモジュールは、外部プロセスとのインターフェ スからのキーボード入力情報をカーネルに通知していま では、 kbdsim というモジュールを用いて、外部プロセ 今回は、 3 番目の方法を使いました。 VNC サーバー ・ VNC サーバー 4 のキーポード処理ルーチンを利用 ・インブットメソッド・プラグインを利用 ・ターミナル限定にしてサプシェルを利用 3 つを挙げました。 2 月号では、外部キーボードを実装する方法として次の VNC サーバーの kbdsim モジュール 本体キーポード
連載 1 Zaurus with Linux ・ Fn 十 , (End) : 本体キーボードの Menu キーに対応 ・右◇ : 本体キーポードの [ 全 / 半 ] キーに対応 現在のところ、キーポード配列などの情報はプログラム 内で静的に設定していますが、そのうち、キーマッピング を設定ファイルから読み込み、利用者の好みに応じたレイ アウトで使えるようにするつもりです。 今回のキーポード・ドライバでは、前回のドライバの課 題であった、 ・ターミナル以外で利用できない 画面キャプチャなどのキーシーケンスに対応していない 予期しないタイミングで省電力モードに移行する などの欠点が改善されています。キーボードによる操作 が、以前にもましで関商になりました。 このキーポード・ドライバは、ソースも含めてさきほど の仮想キーポード・プログラム pk と同じ Web サイトで 公開しています。 このようにキーポード・ドライバで外部キーポードが央 適に使えるようになると、その次はペンによるタッチスク リーン操作に、マウスなどの外部ポインティング・デバイ スを利用したくなります。マウスの物理的な接続方法はあ とで説明しますが、問題となるのは、マウスカーソルをどの ように表示するかという点ではないでしようか。なお、ペ ンによるタッチスクリーンの操作は、今回使った kbdsim と同様、 VNC サーバーに含まれる tssimd (touchscreen simulation daemon) でシミュレートすればいいでしよ PS/2 インターフェイス変換アダブタ ek3 と 2 月号で紹介した ek2 は、 PS/2 インターフェ イスを SL-Zaurus で手軽に扱うためのインターフェイス である IrDA や RS232C に変換するアダブタの利用を前 提としています。ところが、残念なことに、 2 月号で紹介 した IrKB101 (PS/2 → IrDA 変換アダブタ ) も Happy Hacking Cradle (PS/2 → RS232C 変換アダブタ ) も販 売終了となっています。 どちらのアダブタも、インターフェイス間の信 - 号形式変 換にワンチップ・マイコンを利用しているので、 PIC マイ コンなどを使えば、同様の変換アダブタの自作もそれほど 難しくはないでしよう。実際、 PC98-PS/2 キーポード変 UNIX MAGAZINE 2004.5 換アダブタ [ 3 ] では、 PIC マイコン ( PIC16C84 ー 10 ) と 2 つのトランジスタを使い、クロック同期式の双方向シリ アル・インターフェイスを、 RS232C とは電圧レベルだけ が異なる調歩同期式シリアル・インターフェイスに変換し ています。 この回路に、 TTL (0V/5V) から RS232C ( 土 15V ) への電圧レベル変換回路を追加すれば、 PS/2 → RS232C 奐アダブタを比較的簡単に作れそうです。 また、参考文献 [ 4 , 5 ] には、キーポードとマウスの PS / 2 インターフェイスの解説があります。これをみると、ハー ドウェアの仕様としては、 PS/2 キーボードも PS/2 マ ウスもほば同じであることが分かります。 PS / 2 マウスも、 PS/2 キーボードと同じ変換回路で SL-Zaurus に物理的 に接続できるでしよう。 さらに、インターネット上で調べてみると、 ATMEL の 8 ビット RISC マイコンである AVR のアプリケーショ ン・ノートには、そのものずばり、 PS / 2 キーボード・イ ンターフェイスを調歩同期式シリアル・インターフェイス に変換する回路と、そのサンプル・プログラムが掲載され ています [ 6 ] 。この回路では、マイコンと PS/2 キーボー ドはトランジスタなどを介さずに直結されているので、部 ロ数も少なくなり、製作もぐっと容易になりそうです。 ロロハ、、 赤外線ポート経由でキーポードを接続するのなら、 RS 232C ラインドライバ IC で有名な Maxim の Appllica- tion Note に、 RS232C を IrDA に変換するサンプル回 路が出ています [ 7 ] 。この回路は、シリアル→ IrDA 変換 用の IC とポーレートを決定するためのクロック・ジェネ レータ、そして外付けの赤外線素子や数のコンデンサな どから構成されており、あまり苦労せずに作れるでしよう。 市販のインターフェイス変換アダブタを入手するのは難 しそうですが、こまでに書いてきたように、自作へのハー ドルはそれほとくないと思います。外部キーポードを使 いたいのに変換アダブタが入手できない場合は、 こで挙 げた参考文献などを読みながら、電子工作にチャレンジさ れてはいカ功ゞでしようか。 今回は、 SL ー 6000 と SL-C シリーズ向けの外部キーボー ドの活用方法を紹介しました。 SL-Zaurus などの PDA おわりに 179