代码托管在gitee平台
https://gitee.com/maziot-samsung/jz2440v3.drivers/tree/master/input
根据韦东山所讲。本次实验通过3个按键模拟键盘输入ls和回车。
首先借助Linux输入子系统来完成这个实验。当按了某个按键的时候,要让操作系统认为这是输入了一个字母。那么我们要做的就是按下按键的时候向操作系统上报一个按键事件。
程序分析
从入口函数开始看:首先分配一个input_dev结构体。然后填充这个结构体。首先允许它能够产生那类事件。在Linux中一共有这么些事件
/*
* Event types
*/
#define EV_SYN 0x00 //同步事件
#define EV_KEY 0x01 //按键事件
#define EV_REL 0x02 //相对坐标
#define EV_ABS 0x03 //绝对坐标
#define EV_MSC 0x04 //其它
#define EV_SW 0x05
#define EV_LED 0x11 //LED
#define EV_SND 0x12 //声音
#define EV_REP 0x14 //Repeat
#define EV_FF 0x15 //力反馈
#define EV_PWR 0x16 //电源
#define EV_FF_STATUS 0x17 //状态
#define EV_MAX 0x1f
#define EV_CNT (EV_MAX+1)
然后是填充结构体 允许他产生那些事件。在按键事件中我们允许他产生KEY_L,KEY_S,KEY_ENTER
三种事件。最后注册这个结构体 input_register_device 就OK了。
由于机械按键存在抖动,我们采取延时消抖以及为了提高按键的灵敏度而采取中断的方式。首先初始化一个定时器。并且给定时器的函数指针赋值。最后添加定时器就可以了。
最后分析下两个函数。中断函数和定时器函数,中断函数中给irq_pd赋值了一个dev_id。由于每个按键的dev_id都是不同的,可以由此来区分是那个按键,当按键按下触发中断之后全局变量临时存储是那个而按键,然后进入定时器函数,先获取这个按键,然后读取IDR得到时按下还是松开的状态,最后调用input_event 函数上报按键事件。