linux驱动之--输入子系统

输入子系统模型

  1. 构建出口入口函数
    module_init(simple_input_dev_init);
    module_exit(simple_input_dev_exit);
    MODULE_LICENSE(“GPL”);
  2. 初始化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;
    }
  3. 创建key_input_dev
    struct input_dev *key_input_dev;
  4. 执行中断函数
    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;
    }
  5. 关闭入口函数
    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);
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值