作者 主題: Linux 在驅動程式中如何判定 Capslock...等之按鍵狀態?  (閱讀 17051 次)

0 會員 與 1 訪客 正在閱讀本文。

n00b

  • 可愛的小學生
  • *
  • 文章數: 1
    • 檢視個人資料
請問在 Linux Device Driver 中如何得知 Capslock, Numlock, ScrollLock 這幾個按鍵的狀態?
例如該如何得知現在系統在大寫或小寫中, 或是 Numlock 已開啟?
我 trace 過 keyboard driver, 只知道該如何送 input_event 但不知道該如何得知目前鍵盤狀態,
Document 裡的 input 也未提及, 看了幾本跟 kernel 與 LDD3 都未提到.
我想要設計 function key 功能, 所以需要知道那幾個鍵該如何使用. (或是有人知道 KEY_FN 這幾個 event 該如何使用嗎?)

id4fox

  • 憂鬱的高中生
  • ***
  • 文章數: 103
  • 40 oz 挑戰成功!
    • 檢視個人資料
因為我也是 Driver 上的新手~所以請對我講的保持懷疑求證的態度~
我認為應該由 struct input_dev *dev->led 這理著手

我看的是 usbkbd.c 這個原始碼
首先 Capslock 等按鈕直覺會想到 input device,按下按鈕事件就是 *event( ) 了
指向的是 usb_kbd_event( ) 這個函數。
裡面發現:
----------------------------------------------------------------------------------------------------------------------------------------
kbd->newleds = (!!test_bit(LED_KANA,    dev->led) << 3) | (!!test_bit(LED_COMPOSE, dev->led) << 3) |
                           (!!test_bit(LED_SCROLLL, dev->led) << 2) | (!!test_bit(LED_CAPSL,   dev->led) << 1) |
                           (!!test_bit(LED_NUML,    dev->led));
----------------------------------------------------------------------------------------------------------------------------------------
這是 dev->led 存在所有 led 的狀態,而 LED_CAPSL 等定義,表示第幾個 bit 代表該 LED
如 LED_CAPSL 就是 0x01,第二個 bit
這一行將鍵盤相關的LED取出,組成方便辨識的一串bit。

我想,是不是可以直接以 LED 的狀態來識別目前的設定?(如大小寫)
至於 function key,感覺是視 AP 而有不同的運作方式,Driver 只是幫你改記憶體罷了。

elleryq

  • 鑽研的研究生
  • *****
  • 文章數: 908
  • 性別: 男
    • 檢視個人資料
    • Thinking more...

參考:
 * Console IOCTLs Under Linux
 * Linux Programming Hints | Linux Journal
 * man 4 console_ioctl (KDGETLED/KDSETLED)

Kernel 裡的 code 是在 drivers/char/vt_ioctl.c

指令是 setleds

我自己試的結果,在 gnome terminal 裡去下 setleds 或在程式裡用 ioctl ,會出現 EINVAL 的錯誤,無法讀取 keyboard 燈號的狀態
如果是在純 console 下就可以。


Plan your work, then work your plan.
我的首頁:http://blog.elleryq.idv.tw
351899by http://counter.li.org

elleryq

  • 鑽研的研究生
  • *****
  • 文章數: 908
  • 性別: 男
    • 檢視個人資料
    • Thinking more...

X 裡的話,根據這篇 hardy.dropblog › Trying to detect the state of the caps-lock key in X 的回覆裡,可以用 XkbGetIndicatorState

或是用 xset q | grep LED 來取得。
Plan your work, then work your plan.
我的首頁:http://blog.elleryq.idv.tw
351899by http://counter.li.org