ISAKA Yoji
Thu, 19 Jun 2008 19:01:49 -0700
井坂です。先ほどの続きです。 前述のように、USB HID 複合機器の動作確認をしてみたところ、キーボードと マウスは認識され使えたものの、磁気カードリーダ部分のみ認識されませんでした。
そこで kernel source を眺めてみたところ、ukbd.c の probe_keyboard で
HID Boot Interface 以外のキーボードは判定していないようです。
/* Check that this is a keyboard that speaks the boot protocol. */
id = usbd_get_interface_descriptor(uaa->iface);
if (id
&& id->bInterfaceClass == UICLASS_HID
&& id->bInterfaceSubClass == UISUBCLASS_BOOT
&& id->bInterfaceProtocol == UPROTO_BOOT_KEYBOARD)
return 0; /* found it */
この判定方法だと、磁気カードリーダの他にも起動時に BIOS で認識されることが
想定されていないキーボード互換機器、たとえばバーコードスキャナや、単体の
テンキーなども、認識しないものがありそうに思われますが、いかがでしょうか
(まぁおそらくあまり需要はないという事なのでしょうが(^^;)。
そこで、HID 機器の Report Descriptor を確認して判定する処理に変更すれば、
そうした特殊な(?)機器へも対応できると思い、その処理を入れてみました。
とはいえ、もしこの方法で認識できないキーボードがあるとまずいので、従来の
処理(HID boot device で、その種類がキーボードになっているものを認識する)
を残しておくとともに、その処理で認識したキーボードについては
ukbd: It's HID boot keyboard, but new process miss it. Please report it!
と表示するようにしておきました。この表示が出るキーボードがある場合は
対策が必要だという事なので、もしこの表示を見かけたらお知らせください。
#もっとも、
id->bInterfaceClass == UICLASS_HID
&& id->bInterfaceSubClass == UISUBCLASS_BOOT
&& id->bInterfaceProtocol == UPROTO_BOOT_KEYBOARD
であればまず間違いなくキーボードなので、この判定は生かしておいてもいい
のですが、今回は動作確認をしていただきたいために、このようにしました。
また、ukbd.c の現在の処理では Usage Page を見に行く処理が入っていない
ようで、たとえば Usage Page (LED) を持たない機器にも LED の操作を送って
しまう、buffer size や polling interval が一般的でない機器は誤動作する
といった問題もあるかと思います。
とはいえ、今まで boot device でないというだけの理由で使えなかった
USBキーボード互換機器がもしあれば、それが使えるようになるという利点が
あると思うので、ひとまず patch を投げておきます。
----------
添付した patch は ukbd.c, hid.c の 7.0-RELEASE からの差分です。
USB キーボード互換機器をお持ちの方は、ひとまず動作確認していただけますと
幸いです。
# cd /usr/src/sys/dev/usb
# patch < /path/to/ukbd_nonboot.diff
このように差分を適用してから kernel を再構築し、再起動してお試しください。
では、以上よろしくお願いします。
---------------------------
井坂 洋士
<[メールアドレス保護]>
@コリドラス・ソフトウェア http://www.corys.jp/
PGP key fingerprint: 9CFF AAE9 EA9A 305A F614 11F1 2614 D2B6 3C08 F23D
PGP key signature:
http://pgp.nic.ad.jp:11371/pks/lookup?op=get&search=0x3C08F23D
ukbd_nonboot.diff
Description: ukbd_nonboot.diff