井坂です。先ほどの続きです。

前述のように、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 を再構築し、再起動してお試しください。


 では、以上よろしくお願いします。

---------------------------
井坂 洋士 
<[&#x30E1;&#x30FC;&#x30EB;&#x30A2;&#x30C9;&#x30EC;&#x30B9;&#x4FDD;&#x8B77;]>
 @コリドラス・ソフトウェア 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

Attachment: ukbd_nonboot.diff
Description: ukbd_nonboot.diff

メールによる返信