博文

目前显示的是标签为“keyboard”的博文

C编程实现键盘LED灯闪烁方法2

在《C编程实现键盘LED灯闪烁》一文中使用了定时器和ioctl的方式实现键盘LED灯周期性闪烁,而键盘本身作为一个输入设备,那么在Linux下也有对应的input_event,故而本次使用它来实现一次,本次很简陋,采用死循环的方式,省去了定时器的麻烦。 关于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,我这边找到的信息如下: 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 从上面看到对应是event3,那么等会操作/dev/input/event3文件即可。 至此,基本的内容说明了一下,下面还是上代码吧: #include <stdio.h> #include <linux/input.h> #include <...

C编程实现键盘LED灯闪烁

在《Shell脚本实现键盘LED灯闪烁》一文中,我们已感受到了控制的乐趣,一步步向硬件逼近,这次我们在Linux下使用C语言进行系统调用来实现该功能。这里面会涉及到应用层定时器和ioctl系统调用来控制键盘LED灯状态。 关于应用层定时器需要涉及到信号机制,其包含有alarm闹钟和timer定时器两种,其与信号机制分别说明如下(这两种均是自动循环的,即不需要处理函数里再设置一遍定时器超时设置): 1.alarm 运行man alarm命令后有关于该函数的使用说明,其函数原型如下: #include <unistd.h> unsigned int alarm(unsigned int seconds); 当设定的时间到了后会发出SIGALRM信号,需要对应的信号处理函数配套处理。 2.timer 运行man setitimer命令后有相关说明,本次会用到的函数原型如下: #include <sys/timer.h> int setitimer(int which, const struct itimerval *new_value, struct itimerval *old_value); 其中which是设置的定时器类型,分别对应如下: ITIMER_REAL:实时定时器,发SIGALRM信号; ITIMER_VIRTUAL:应用进程执行时间定时器,发SIGVTALRM信号; ITIMER_PROF:应用进程执行和内核交互时间定时器,发SIGPROF信号。 从上面可以看出,同一时间只能有3个定时器存在,分别对应3种类型。那么上面的信号要如何处理呢?执行man signal命令有相关的函数原型如下: #include <signal.h> typedef void (*sighandler_t)(int); sighandler_t signal(int signum, sighandler_t handler); 这signal函数除了与定时器配套外,还可以捕获其他信号,执行man 7 signal命令可以查看到。 好了,关于定时器部分就说到这。 而关于键盘LED灯控制,我们需要用到TTY设备的ioctl系统调用函数,该函数是标准的字符设备接口(可以不实现),其接口原型(执...