C编程实现键盘LED灯闪烁方法2
在《C编程实现键盘LED灯闪烁》一文中使用了定时器和ioctl的方式实现键盘LED灯周期性闪烁,而键盘本身作为一个输入设备,那么在Linux下也有对应的input_event,故而本次使用它来实现一次,本次很简陋,采用死循环的方式,省去了定时器的麻烦。
关于input_event,需要引用到Linux内核源码的include/linux/input.h头文件,而在应用程序中,我们采用很简单的write系统调用来设置,而写入的数据格式如下:
关于input_event,需要引用到Linux内核源码的include/linux/input.h头文件,而在应用程序中,我们采用很简单的write系统调用来设置,而写入的数据格式如下:
struct input_event { struct timeval time; __u16 type; __u16 code; __s32 value; };
对于我们来说,本次需要设置的type是EV_LED,而code则分别是LED_NUML、LED_CAPSL、LED_SCROLLL,value为1时亮,为0时灭。
好了,对这初步了解后,那我们write的对象是谁呢?我们通过/proc/bus/input/devices可以找到我们的键盘对应的event,我这边找到的信息如下:
好了,对这初步了解后,那我们write的对象是谁呢?我们通过/proc/bus/input/devices可以找到我们的键盘对应的event,我这边找到的信息如下:
I: Bus=0003 Vendor=1241 Product=1603 Version=0110
N: Name=" USB Keyboard"
P: Phys=usb-0000:00:1d.7-3.1/input0
S: Sysfs=/devices/pci0000:00/0000:00:1d.7/usb2/2-3/2-3.1/2-3.1:1.0/input/input4
U: Uniq=
H: Handlers=sysrq kbd event3
B: PROP=0
B: EV=120013
B: KEY=1000000000007 ff800000000007ff febeffdff3cfffff fffffffffffffffe
B: MSC=10
B: LED=7
N: Name=" USB Keyboard"
P: Phys=usb-0000:00:1d.7-3.1/input0
S: Sysfs=/devices/pci0000:00/0000:00:1d.7/usb2/2-3/2-3.1/2-3.1:1.0/input/input4
U: Uniq=
H: Handlers=sysrq kbd event3
B: PROP=0
B: EV=120013
B: KEY=1000000000007 ff800000000007ff febeffdff3cfffff fffffffffffffffe
B: MSC=10
B: LED=7
从上面看到对应是event3,那么等会操作/dev/input/event3文件即可。
至此,基本的内容说明了一下,下面还是上代码吧:
至此,基本的内容说明了一下,下面还是上代码吧:
#include <stdio.h> #include <linux/input.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> //find from:/proc/bus/input/devices or /dev/input/* #define KB_INPUT_EVENT_PATH "/dev/input/event3" int main(void) { int fd = 0; struct input_event ev; ev.type = EV_LED; fd = open(KB_INPUT_EVENT_PATH, O_RDWR); if (fd < 0) { printf("Open keyboard input event file failed!\n"); return 1; } while(1) { ev.code = LED_NUML; ev.value = 1; write(fd, &ev, sizeof(ev)); ev.code = LED_CAPSL; write(fd, &ev, sizeof(ev)); ev.code = LED_SCROLLL; write(fd, &ev, sizeof(ev)); sleep(1); ev.value = 0; write(fd, &ev, sizeof(ev)); ev.code = LED_CAPSL; write(fd, &ev, sizeof(ev)); ev.code = LED_NUML; write(fd, &ev, sizeof(ev)); sleep(1); } return 0; }
其对应的Makefile文件内容如下:
all: gcc -o timer_keyboard_led_flash timer_keyboard_led_flash.c clean: rm -rf timer_keyboard_led_flash
对应的源码文件目录树如下:
/home/xinu/xinu/c_cpp/timer_keyboard_led_flash_input_event/
├── Makefile
└── timer_keyboard_led_flash.c
记得make完成后要用sudo执行。
参考网址:
http://tscsh.blog.163.com/blog/static/2003201032013225103629425/
http://blog.csdn.net/chenzhixin/article/details/2173530
http://askubuntu.com/questions/321512/how-to-set-or-clear-usb-keyboard-leds
/home/xinu/xinu/c_cpp/timer_keyboard_led_flash_input_event/
├── Makefile
└── timer_keyboard_led_flash.c
记得make完成后要用sudo执行。
参考网址:
http://tscsh.blog.163.com/blog/static/2003201032013225103629425/
http://blog.csdn.net/chenzhixin/article/details/2173530
http://askubuntu.com/questions/321512/how-to-set-or-clear-usb-keyboard-leds
评论
发表评论