设为首页 加入收藏

TOP

linux输入子系统(input subsystem)之按键输入和LED控制(三)
2017-10-13 09:58:32 】 浏览:6458
Tags:linux 输入 子系统 input subsystem 按键 LED 控制
39 //leds_event.code = SND_BELL; 40 leds_event.code = LED_MUTE; 41 42 /* [cgw]: KEY_L和KEY_S控制LED的亮灭 */ 43 if (buttons_event.code == KEY_L) { 44 leds_event.value = 0xAA; 45 } else if (buttons_event.code == KEY_S) { 46 leds_event.value = 0xEE; 47 } 48 49 /* [cgw]: 发送LED控制事件 */ 50 write(fd, &leds_event, sizeof(struct input_event)); 51 52 printf("led write!\n"); 53 } 54 } 55 } 56 57 int main(int argc, char **argv) 58 { 59 int Oflags; 60 61 /* [cgw]: 设置需要处理的信号SIGIO,即输入文件会请求一个SIGIO 62 * 信号,当有新数据到来这个信号会发给filp->f_owner进程 63 */ 64 signal(SIGIO, my_signal_fun); 65 66 fd = open("/dev/event1", O_RDWR | O_NONBLOCK); 67 68 //printf("fd = 0x%x\n", fd); 69 70 if (fd < 0) 71 { 72 printf("can't open!\n"); 73 } 74 75 /* [cgw]: 根据文件标识符fd,设置能够获得这个文件的进程(owner) 76 * getpid()获得当前进程ID 77 */ 78 fcntl(fd, F_SETOWN, getpid()); 79 80 /* [cgw]: 获得file->f_flags标志 */ 81 Oflags = fcntl(fd, F_GETFL); 82 83 /* [cgw]: 置位FASYNC使能异步通知 */ 84 fcntl(fd, F_SETFL, Oflags | FASYNC); 85 86 while (1) 87 { 88 /* [cgw]: 休眠 */ 89 sleep(1000); 90 } 91 92 return 0; 93 }

makefile

 1 KERN_DIR = /work/system/linux-2.6.22.6
 2 
 3 all:
 4     make -C $(KERN_DIR) M=`pwd` modules 
 5 
 6 clean:
 7     make -C $(KERN_DIR) M=`pwd` modules clean
 8     rm -rf modules.order
 9 
10 obj-m    += input_subsys_drv.o


2. 实验

2.1

安装驱动程序:

insmod input_subsys_drv.ko

1 # insmod input_subsys_drv.ko
2 input: input_subsys_dev as /class/input/input1
3 input subsys open!
4 input subsys init!

 

运行应用程序

./input_subsys_test

 1 # ./input_subsys_test
 2 type: 0x1 code: 0x26 value: 0x1
 3 type: 0x1 code: 0x26 value: 0x0
 4 led event!
 5 value: 0xaa
 6 led write!
 7 type: 0x11 code: 0x7 value: 0xaa
 8 type: 0x1 code: 0x1f value: 0x1
 9 type: 0x1 code: 0x1f value: 0x0
10 led event!
11 value: 0xee
12 led write!
13 type: 0x11 code: 0x7 value: 0xee


3. 现象分析

按一下按键KEY_L,终端输出:

type: 0x1 code: 0x26 value: 0x1  //按键按下
type: 0x1 code: 0x26 value: 0x0  //按键弹起
led event!                       //应用程序操作write, 发送LED控制事件,调用led_event()
value: 0xaa                      //读到的LED亮的命令
led write!                       //返回应用程序继执行
type: 0x11 code: 0x7 value: 0xaa //因为应用程序发送了事件给驱动程序,驱动把这个事件作为一个输入事件(相当于按键输入事件),同样通过异步通知反馈到应用程序

 

 

The end!

 

首页 上一页 1 2 3 下一页 尾页 3/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Greenplum源码编译安装(单机及集.. 下一篇20169211《Linux内核原理与分析》..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目