USB keyboard hot-plug in FreeBSD

話說我的 blog 好像整整空了一個多月?

因為準備推甄與專題比賽,整個十一月份是空白的
可不能讓它變成雙月誌阿…

今天為 FreeBSD-box 買了 黑色的 USB 鍵盤,在 Lab 裡試用
下意識的第一個動作就是把食指伸到”G” & “H” 的中間找小紅點…

廢話不多說,來看看如何在 FreeBSD 底下達到 USB 鍵盤熱插拔吧!!


*原理解說
FreeBSD 在 3.1 之後就支援 USB
通常鍵盤偵測的順位是 AT(or PS/2) 的 atkbd
接下來才是 USB 的 ukbd
因此,分別被 assign 到 /dev/kbd0/dev/kbd1 這兩個 character file
但若是系統僅存在一支 USB keyboard,則將 ukbd assign 到 /dev/kbd0

倘若只是如此,一旦鍵盤沒有在開機前就接上
system boot 的過程中沒有偵測到,便不會載入 keyboard driver

因此我們要在還要告訴 kernel 的 system console,也就是 sc0
儘管開機時沒有偵測到 keyboard,也要載入 keyboard driver
並定期掃描鍵盤是否被接上。

如此一來,就達到 hot-pulgged 的目的!!

*系統配置
確認 kernel 以下配置是 enabled,否則要 recompile kernel:

device uhci
device ohci
device usb
device ukbd

device sc0 at isa? 0x0100

前四項是 USB 鍵盤的相關設定
最後一項就是 syscons 加上 0x0100 旗標,表示定期掃描鍵盤是否存在

並在 /etc/rc.conf 中加入

usbd_enable=”YES”

之後 reboot

藉由以上的 kernel configuration
就再也不怕鍵盤拔下重複插上後無法動作的窘境 😛

*參考資料

  • http://www.freebsd.org/doc/en_US.ISO8859-1/books/faq/compatibility-kbd-mice.html#USBKBD
  • http://www.freebsddiary.org/headless.php
  • manpage of FreeBSD:ukbd(4), kbdcontrol(1) & syscons(4)

    *附記
    那麼 PS/2 能不能達到一樣的目的呢?

    基本上,PS/2 的規格並不支援熱插拔

    所以這就要看系統的 implementation 了…
    然而,FreeBSD 底下可以藉由改變 kernel options 的方式來達成:
    原本的 kernel configuration 當中有一行

    device atkbd0 at atkbdc? irq 1 flags 0x1

    將其更改為

    device atkbd0 at atkbdc? irq 1

    原因是因為 atkbd 的旗標定義:

    bit 0 (FAIL_IF_NO_KBD)

    預設是載入鍵盤 driver 的,但在核心設定檔中卻將旗標改成 Bit 1。

  • 發佈留言

    發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *