输入子系统模型解析
1.为什么需要输入子系统?
2.输入子系统的介绍
3.输入子系统案例分析
范例代码
#include<linux/init.h>
#include<linux/module.h>
#include<linux/input.h>
#include<linux/miscdevice.h>
#include<linux/fs.h>
#include<linux/interrupt.h>
#include<linux/io.h>
#include<linux/irq.h>
#include<linux/slab.h>
#include<linux/vmalloc.h>
#include<asm/uaccess.h>
#include<linux/sched.h>
MODULE_LICENSE("GPL");
#define GPX1CON 0x11000C20
#define GPX1DAT 0x11000C24
unsigned int *gpx1con;
unsigned int *gpx1dat;
unsigned int key_num = 0;
wait_queue_head_t key_queue;
struct work_struct *work1;
struct timer_list key_timer;
struct input_dev *button_dev;
void work1_fun(struct work_struct *work)
{
mod_timer(&key_timer,jiffies+HZ/10);
}
void key_timer_func(unsigned long data)
{
unsigned int key_val;
key_val = readl(gpx1dat)&(0x1<<1);
if(key_val==0)
{
key_num = 1;
input_report_key(button_dev,KEY_1,1);
}
//printk("\nhome key down\n");
key_val = readl(gpx1dat)&(0x1<<2);
if(key_val==0)
{
key_num = 2;
input_report_key(button_dev,KEY_2,1);
}
//wake_up(&key_queue);//按键按下则唤醒进程
//printk("\n back key down\n")
input_sync(button_dev);
}
irqreturn_t key_int(int irq,void *dev_id)
{
//检测是否发生了按键中断
//消除按键中断
//提交下半部分
schedule_work(work1);
return 0;
}
void keyinit()
{
gpx1con = ioremap(GPX1CON,4);
writel(readl(gpx1con)&~(0xff<<4)|(0xff<<4),gpx1con);
gpx1dat = ioremap(GPX1DAT,4);
}
static int button_init()
{
button_dev = input_allocate_device();//分配输入设备结构
set_bit(EV_KEY,button_dev->evbit);//申明所支持的事件类型
set_bit(KEY_1,button_dev->keybit);//申报可能商报的值编号
set_bit(KEY_2,button_dev->keybit);
input_register_device(button_dev);//注册输入设备
request_irq(IRQ_EINT(9),key_int,IRQF_TRIGGER_FALLING,"key",(void *)1);
request_irq(IRQ_EINT(10),key_int,IRQF_TRIGGER_FALLING,"key",(void *)2);
keyinit();
work1 = kmalloc(sizeof(struct work_struct),GFP_KERNEL);//创建工作
INIT_WORK(work1,work1_fun);
init_timer(&key_timer);//初始化定时器
key_timer.function = key_timer_func;//添加超时函数
add_timer(&key_timer);//向内核注册
init_waitqueue_head(&key_queue);//初始化等待队列
return 0;
static void button_exit()
{
input_unregister_device(button_dev);
}
module_init(button_init);
module_exit(button_exit);