にゃごにゃ小学校

本家(HP)作製のネタ、あるいは記事にするには寸足らずな話を日記兼用でアップします。

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

 ノートPC(東芝Libretto L5)のLinux OSを、TurboLinuxからFedora Core 3に切替えてから、たまにキーボードが一瞬固まる(lockup)する現象が出始めた。数秒間、キーボードからの入力を受け付けなくなるのだ。
 それほど頻繁に起こるものではないし、最初はタイプミスで複数のキーなどを同時に押したときに起きるのだろうと思っていたのだが、ロックアップ中のタイプ文字はとりこぼしが起きてしまうのと、どうも正しくタイプしていても起きることもあることがわかってきた。現状では、講演や会議のときなど、画面を見ずに高速でタイプしているときは、数十文字がそっくり失われ、それに気づかないということが起こり得てしまうので、ちゃんと調べてみることにした。

 前からわかっていたことだが、この現象が起こると、dmesgコマンドでシステム・ログを確認した場合、下記のようなログが記録されている。


    input: AT Translated Set 2 keyboard on isa0060/serio0

これは、現象の発生回数と、ログの記録の間にはっきり相関関係があるのでまず間違いない。

 最初にまず、X Windowを疑ってみた。というのは、TurboLinuxのときだが、ふつうにインストールした後、ときどき、一度しかタイプしていないのに文字が2つ入ってしまう現象があり、このときはXサーバのXKBをディセーブル(Option "XkbDisable"を設定)することにより解消したからだ。
 しかし、同じようにXKBをディセーブルしたりキーボードのレイアウトやタイプ、マップ設定の変更などを行ってみたが、思わしい結果が出ない。
 そこで、Xを終了してしばらくコンソール画面でタイプしてみたところ、Xなしで同じ現象が発生した。システム・ログで記録されていたから、Xではなくカーネル側の要因である可能性はあったのだが、やはりそうであったようだ。

 ここで、本格的にネットでの調査開始。
 まず、Librettoシリーズに限らず、東芝のノートのキーボードはクセやバグがあるらしく、その手の情報が多く流れていた。今回のケースとは異なるようだが、ハングしてリブートしなければならないような深刻なものもあるらしい。
 それから、今回のようなlockupの現象だが、国内ではあまり記事を見かけなかったが、海外のメーリングリストでは、けっこう取り上げられていた。ということは、私が一時期疑っていた日本語入力のフロントエンドという問題ではないということだ。

 いろいろなやりとりを読んでみると、どうやらカーネルが2.6になってから発生するようになった現象らしい。2.4ではなかったという記述があちこちで見られた。取り上げられているシステム・ログの内容も私のものとまったく同じ。時期的には、2004年の夏頃に集中している。
 ところが、どうしたことか、かなり長いコメントの応酬がある板もあるのだが、どれもこれもしり切れとんぼ、結局問題が解決したとか、原因はどうだったとかいう解決策にたどりつくことなく、投稿がそれっきりになっている。
 大半がLinuxのヘビーユーザと見られるので、LinuxをあきらめてWindowsで我慢するとかいうようなことは考えにくいのだが、どうみても問題未解決のままあきらめている感じである。東芝からファームウエアのアップデートでも出た(Libretto L5にはそんなもの出ていない)のだろうか。そういう情報もなかったしなあ。もしかしてみんなあきらめて東芝を捨てた?

 こうなれば、もう自分でなんとかするしかない。カーネルをダウンバージョンする気はないし、別のノートに買い替えるお金もない。ましてやWindowsを使う気など、さらさらない。だれも解決策が見つけられないのなら、自分で見つけるのみ。

 で、真剣に(ほんとはそんなにちゃんと見てない)カーネルのソースを眺め始めてから、意外と簡単に、ここではないか、という箇所にたどり着いた。まあシステム・ログを見ても、serioのinputデバイスの部分に絡んでいることは明らかなのだから、範囲は知れている。

 細かいところはきりがないので割愛するが、ハード的にPS2接続として構成されているキーボードが、タイムアウトの発生か何かでいったんプラグを抜かれ、そして差し込み直したように振る舞っているらしい。そして、キーボードイベントの処理がリセットされている。そのリセットが終わるまでの入力が失われてしまっているようだ。
 海外のメーリングリストでは、drivers/input/serio/serio.cに原因を求めているものが多かったが、私がパッチを当てたソースは、Fedore Core 3の最新版、kernel 2.6.12のもので、drivers/input/keyboard/atkbd.c。

linux-2.6.12/drivers/input/keyboard/atkbd.c

○関数 atkbd_interrupt()
○パッチ
    switch (code) {

(310行目あたり)の、最初のcase文、
    case ATKBD_RET_BAT:

をコメントアウト。それだけ。

    310 switch (code) {
    311 #if 0
    312 case ATKBD_RET_BAT:
    313 atkbd->enabled = 0;
    314 serio_rescan(atkbd->ps2dev.serio);
    315 goto out;
    316 #endif
    317 case ATKBD_RET_EMUL0:

 ここで処理されているATKBD_RET_BATというコード(==0xaa)が、TOSHIBAのノートの場合なんらかの理由で不正に発生し、ドライバのリセット(serio_rescan()の呼び出し)につながっていると考えられる。

 カーネルをビルドし直して、テスト。
 すると、これまで

    input: AT Translated Set 2 keyboard on isa0060/serio0

というログメッセージが現れたタイミングで、代わりに

    atkbd.c: Unknown key pressed (translated set 2, code 0x12a on isa0060/serio0).
    atkbd.c: Use 'setkeycodes 2a ' to make it known.

というメッセージが記録されるようになり、キーボードのlockupは解消した。

 そっくり処理をコメントアウトしたのだから、副作用がありそうな気もするが、正常な場合にブートシーケンスで1回だけ現れるべき

    input: AT Translated Set 2 keyboard on isa0060/serio0

は、ちゃんと記録されているし、またそれ以外で、

    atkbd.c: Unknown key pressed (translated set 2, code 0x12a on isa0060/serio0).
    atkbd.c: Use 'setkeycodes 2a ' to make it known.

というログが現れるところもない。ということは、少なくとも私が使用している環境では、弊害はないのではないかと推測される。
 結局のところ、Librettoのキーボードがカーネルの想定外の動きをしているということで、その場合のイベントを無視する、という対応である。

 もっとも、けっこうあてずっぽうなパッチであるので、もし同じ現象に悩んで真似しようという方は、あくまで自己責任でお願いする。
 海外のメーリングリストにも、投稿すべきかどうか、ちょっと迷っているところである。

スポンサーサイト

コメント

コメントの投稿

Name
Title
E-mail
URL
Comment
Password
※入力しないと編集・削除ができません
 管理者にだけ表示を許可する

トラックバック

この記事へのトラックバックURL

http://questkpax.blog51.fc2.com/tb.php/171-9a1ad9f1

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。