linux input子系统键盘驱动实现

问: 为何要基于input子系统??
答: 因为linux下所有GUI都可以接收input子系统的消息。写基于GUI的程序时可以用GUI实现的按键机制,而不是单片机的思维,一个死循环来处理用户输入。

不扯淡了,一切尽在源码中!

硬件平台: s3c2440
软件平台: linux-3.1.6 + qt-4.7.4

此驱动源码以GPL协议开放.

点击(此处)折叠或打开

  1. #include <linux/module.h>
  2. #include <linux/init.h>
  3. #include <linux/interrupt.h>
  4. #include <linux/platform_device.h>
  5. #include <linux/input.h>
  6. #include <linux/slab.h>

  7. #include <mach/regs-gpio.h>
  8. #include <linux/gpio.h>
  9. #include <linux/irq.h>


  10. #define DHOLE2440_KBD "dhole2440kbd"
  11. #define DHOLE2440_KBD_IRQ_NUM (6)
  12. #define KBD_NONE (0xff)

  13. #define KBD_UP (0)
  14. #define KBD_DOWN (1)

  15. typedef struct _dhole2440_key{
  16.     unsigned int gpio;/*对应gpio口*/
  17.     unsigned int irq;/*对应中断*/
  18.     int n_key;/*键值*/
  19. }dhole2440_key;

  20. struct dhole2440_kbd{
  21.     dhole2440_key keys[DHOLE2440_KBD_IRQ_NUM];
  22.     struct timer_list key_timer; /*按键去抖定时器*/
  23.     unsigned int key_status; /*按键状态*/
  24.     struct input_dev *input;
  25. };

  26. struct dhole2440_kbd *p_dhole2440_kbd;


  27. struct dhole2440_kbd *get_kbd(void)
  28. {
  29.     printk("get_kbd p_dhole2440_kbd=%x\n", (unsigned int)p_dhole2440_kbd);
  30.     return p_dhole2440_kbd;
  31. }

  32. void set_kbd(struct dhole2440_kbd *p_kbd)
  33. {
  34.     p_dhole2440_kbd = p_kbd;

  35.     printk("set_kbd p_kbd=%x, p_dhole2440_kbd=%x\n",
  36.         (unsigned int)p_kbd, (unsigned int)p_dhole2440_kbd);
  37. }

  38. static irqreturn_t dhole2440_kbd_handler(int irq, void *p_date)
  39. {
  40.     unsigned int n_key = 0;
  41.     struct dhole2440_kbd *p_kbd = p_date;
  42.     unsigned int key_state = 0;
  43.     int i;

  44.     for(i = 0; i < DHOLE2440_KBD_IRQ_NUM; i++)
  45.     {
  46.         if( irq == p_kbd->keys[i].irq )
  47.         {
  48.             key_state = s3c2410_gpio_getpin(p_kbd->keys[i].gpio);
  49.             n_key = p_kbd->keys[i].n_key;
  50.             break;
  51.         }
  52.     }

  53.     printk("dhole2440_kbd_handler n_key=%d, key_state=%d\n"
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值