+ -
当前位置:首页 → 问答吧 → Linux 在驅動程式中如何判定 Capslock...等之按鍵狀態?

Linux 在驅動程式中如何判定 Capslock...等之按鍵狀態?

时间:2010-06-23

来源:互联网

请问在 Linux Device Driver 中如何得知 Capslock, Numlock, ScrollLock 这几个按键的状态?
例如该如何得知现在系统在大写或小写中, 或是 Numlock 已开启?
我 trace 过 keyboard driver, 只知道该如何送 input_event 但不知道该如何得知目前键盘状态,
Document 里的 input 也未提及, 看了几本跟 kernel 与 LDD3 都未提到.
我想要设计 function key 功能, 所以需要知道那几个键该如何使用. (或是有人知道 KEY_FN 这几个 event 该如何使用吗?)

作者: n00b   发布时间: 2010-06-23

因为我也是 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 只是帮你改记忆体罢了。

作者: id4fox   发布时间: 2010-08-20


参考:
 * 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 下就可以。


作者: elleryq   发布时间: 2010-08-23


X 里的话,根据这篇 hardy.dropblog › Trying to detect the state of the caps-lock key in X 的回覆里,可以用 XkbGetIndicatorState

或是用 xset q | grep LED 来取得。

作者: elleryq   发布时间: 2010-08-23

热门下载

更多