韦东山驱动视频笔记——6.输入子系统之编写驱动程序

linux内核版本:linux-2.6.30.4 

目的:当按下K1,K2,K3,K4时,分别代表输入L、S、ENTER、LEFTSHIFT

经过上一节知道,在我们写驱动的时候input核心层和handler层都不需要修改,要修改的只是input_device层。

写一个符合input子系统驱动程序的步骤:

1.分配一个input_device结构体;

2.设置

3.注册

4.硬件相关代码,比如中断服务程序里上报事件

  1 #include <linux/module.h>  
  2 #include <linux/init.h>  
  3 #include <linux/fs.h>  
  4 #include <linux/interrupt.h>  
  5 #include <linux/irq.h>  
  6 #include <linux/sched.h>  
  7 #include <linux/pm.h>  
  8 #include <linux/sysctl.h>  
  9 #include <linux/proc_fs.h>  
 10 #include <linux/delay.h>  
 11 #include <linux/input.h>  
 12   
 13 #include <mach/hardware.h>  
 14 #include <mach/regs-gpio.h>  
 15   
 16 struct pin_desc   
 17 {  
 18     int irq;  
 19     char *name;  
 20     unsigned int pin;  
 21     unsigned int key_val;  
 22 };  
 23   
 24 static struct pin_desc pins_desc[4] =   
 25 {  
 26     {IRQ_EINT1, "S1", S3C2410_GPF1, KEY_L},  
 27     {IRQ_EINT4, "S2", S3C2410_GPF4, KEY_S},  
 28     {IRQ_EINT2, "S3", S3C2410_GPF2, KEY_ENTER},  
 29     {IRQ_EINT0, "S4", S3C2410_GPF0, KEY_LEFTSHIFT},  
 30 };  
 31   
 32 static struct pin_desc *irq_pd;  
 33 static struct timer_list timer;  
 34 static struct input_dev *seventh_dev;  
 35   
 36 static irqreturn_t buttons_irq(int irq, void *dev_id)  
 37 {  
 38     irq_pd = (struct pin_desc *)dev_id;  
 39     mod_timer(&timer, jiffies+HZ/100);  
 40       
 41     return IRQ_RETVAL(IRQ_HANDLED);  
 42 }  
 43   
 44   
 45   
 46 static void timer_fuction(unsigned long data)  
 47 {  
 48       
 49     struct pin_desc *pin = irq_pd;  
 50     unsigned int pinval;  
 51   
 52     if (!pin)  
 53         return;  
 54       
 55     pinval = s3c2410_gpio_getpin(pin->pin);  
 56       
 57     if (pinval)  
 58     {  
 59         //松开,最后一个参数:0-松开,1-按下  
 60         input_event(seventh_dev, EV_KEY, pin->key_val, 0);  
 61         input_sync(seventh_dev);  
 62     }  
 63     else  
 64     {  
 65         //按下  
 66         input_event(seventh_dev, EV_KEY, pin->key_val, 1);  
 67         input_sync(seventh_dev);  
 68     }  
 69 }  
 70   
 71 int seventh_init()  
 72 {  
 73     int i;  
 74     /*1. 分配一个input_device结构体*/    
 75     seventh_dev = input_allocate_device();  
 76       
 77     /*2. 设置*/  
 78     /*2.1 能产生哪类事件*/  
 79     set_bit(EV_KEY, seventh_dev->evbit);  
 80     set_bit(EV_KEY, seventh_dev->evbit);//能产生重复类事件  
 81     /*2.2 能产生这类操作里的哪些事件:L,S,ENTER,LEFTSHIFT*/  
 82     set_bit(KEY_L, seventh_dev->keybit);  
 83     set_bit(KEY_S, seventh_dev->keybit);  
 84     set_bit(KEY_ENTER, seventh_dev->keybit);  
 85     set_bit(KEY_LEFTSHIFT, seventh_dev->keybit);  
 86       
 87     /*3. 注册*/  
 88     input_register_device(seventh_dev);  
 89       
 90     /*4. 硬件相关操作*/  
 91     init_timer(&timer);  
 92     timer.function = timer_fuction;  
 93     add_timer(&timer);  
 94     for (i = 0; i < 4; i++)  
 95     {  
 96         request_irq(pins_desc[i].irq, buttons_irq, IRQ_TYPE_EDGE_BOTH, pins_desc[i].name, &pins_desc[i]);  
 97     }  
 98     return 0;  
 99 }  
100 static void seventh_exit()  
101 {  
102     int i;  
103     for (i = 0; i < 4; i++)  
104     {  
105         free_irq(pins_desc[i].irq, &pins_desc[i]);  
106     }  
107     del_timer(&timer);  
108     input_unregister_device(seventh_dev);  
109     input_free_device(seventh_dev);  
110 }  
111   
112 module_init(seventh_init);  
113 module_exit(seventh_exit);  
114   
115 MODULE_LICENSE("GPL");  

测试:

 

1.hexdump /dev/event0

     省略           秒           微秒         类   code    value

0000000 00ac 0000 b539 0007 0001 0026 0001 0000
0000010 00ac 0000 b557 0007 0000 0000 0000 0000
0000020 00ac 0000 3ba9 0009 0001 0026 0000 0000
0000030 00ac 0000 3bc0 0009 0000 0000 0000 0000

这里格式对应的是

1 struct input_event {
2 struct timeval time;
3 __u16 type; 
4 __u16 code;
5 __s32 value;
6 };

type(类)为1表示EV_KEY,code为0x26表示KEY_L value为1表示按下,0表示松开

2.如果没有启动QT,cat /dev/tty1

当按下K1,K2,K3时,在串口终端上输出ls

3.

先在板子上输入ps看,在接受我们输入显示的是900这个进程,

看一下它打开了哪些文件ls -l /proc/900/fd

可以看到标准输入输出和错误都是串口,可以用下面命令修改它的标准输入

exec 0</dev/tty1, 然后这时候再按K1,K2,K3,这时候就能把当前目录下的文件显示出来

不知道为什么我的标准输入改不成/dev/tty1,所以这个没有试验

posted @ 2013-08-08 11:25  linux_rookie  阅读(1095)  评论(0编辑  收藏  举报