输入子系统模型
- 构建出口入口函数
module_init(simple_input_dev_init);
module_exit(simple_input_dev_exit);
MODULE_LICENSE(“GPL”); - 初始化simple_input_dev_init
static int __init simple_input_dev_init(void)
{
int ret;
//构建input device对象
key_input_dev = input_allocate_device();
if(key_input_dev == NULL)
{
printk(“input_allocate_device error\n”);
return -ENOMEM;
}
//初始化 evbit, keybit, absbit, relbit
// 驱动一个按键 KEY_DOWN
// set_bit(EV_KEY, key_input_dev->evbit);
key_input_dev->evbit[BIT_WORD(EV_KEY)] |= BIT_MASK(EV_KEY); //能够支持按键类型
key_input_dev->keybit[BIT_WORD(KEY_DOWN)] |= BIT_MASK(KEY_DOWN); // 1<< 108%32
//更加简单
// 将108bit设置1 ,等同于上面的表达式
//set_bit(KEY_DOWN,key_input_dev->keybit);
//__set_bit(KEY_UP,key_input_dev->keybit);
// 注册一个input device
ret = input_register_device(key_input_dev);
if(ret != 0)
{
printk(“input_register_device error\n”);
goto err_0;
}
// 硬件的初始化
Ret=request_irq(IRQ_EINT(1),key_input_irq_svc,IRQF_TRIGGER_FALLING|IRQF_TRIGGER_RISING,”eint1_keydow”, NULL);
if(ret != 0)
{
printk(“request_irq error\n”);
goto err_1;
}
return 0;
err_1:
input_unregister_device(key_input_dev);
err_0:
input_free_device(key_input_dev);
return ret;
} - 创建key_input_dev
struct input_dev *key_input_dev; - 执行中断函数
irqreturn_t key_input_irq_svc(int irqno, void *dev_id)
{
// 获取到gpio口状态
unsigned int value = gpio_get_value(S5PV210_GPH0(1));
if(value){ //抬起
printk(“KEY_DOWN up \n”);
//如果要将数据交给用户,上报过程
input_report_key(key_input_dev, KEY_DOWN, 0);
input_sync(key_input_dev); //同步,表示上报数据结束
}else{ //按下
printk(“KEY_DOWN pressed \n”);
input_event(key_input_dev, EV_KEY, KEY_DOWN, 1);
input_sync(key_input_dev); //
}
return IRQ_HANDLED;
} - 关闭入口函数
static void __exit simple_input_dev_exit(void)
{
free_irq(IRQ_EINT(1), NULL);
input_unregister_device(key_input_dev);
input_free_device(key_input_dev);
}