Linux 嵌入式驱动开发 INPUT 子系统:gpio、platform、input字符设备驱动开发框架

1. 实验

基于 gpio 子系统框架,使用 platforminput 子系统驱动框架,编写使用内核定时器消抖的 key 中断输入驱动程序。

2. 概念
  • input 核心层会向 Linux 内核注册一个字符设备
  • 在系统启动以后就会在 /sys/class 目录下有一个生成一个 input
  • input 子系统的所有设备主设备号都为 13
  • input_dev 结构体表示 input 设备
  • input_event 结构体表示上报事件数据类型
3. INPUT 驱动框架
3.1 驱动
  • input_allocate_device 函数申请一个 input_dev 结构体 step1

    /* 函数原型 */
    /*
     * return: 	申请到的 input_dev 
     */
    struct input_dev *input_allocate_device(void);
    
  • input_free_device 函数释放申请到的 input_dev step6

    /* 函数原型 */
    void input_free_device(struct input_dev *dev);
    
  • input_dev 初始化,主要初始化内容: step2

    • 初始化设备名 name

      input_dev->name = "xxx";
      
    • 事件类型 evbit :可选的事件类型定义在 include/uapi/linux/input.h 文件

      #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		/* SOUND */
      #define EV_REP			0x14		/* 重复事件 */
      #define EV_FF			0x15		/* 压力事件 */
      #define EV_PWR			0x16		/* 电源事件 */
      #define EV_FF_STATUS	0x17		/* 压力状态事件 */
      #define EV_MAX			0x1f		/* MAX */
      #define EV_CNT			(EV_MAX+1)	/* CNT */
      
    • 事件值 keybit :按键值定义在 include/uapi/linux/input-event-codes.h 文件

      #define KEY_RESERVED			0
      #define KEY_ESC					1
      #define KEY_1					2
      #define KEY_2					3
      #define KEY_3					4
      #define KEY_4					5
      #define KEY_5					6
      #define KEY_6					7
      ...
      #define BTN_TRIGGER_HAPPY40		0x2e7
      
    • 三种方法初始化事件类型和事件值

      /*********第一种设置事件和事件值的方法***********/
      __set_bit(EV_KEY, inputdev->evbit); /* 设置产生按键事件 */
      __set_bit(EV_REP, inputdev->evbit); /* 重复事件 */
      __set_bit(KEY_0, inputdev->keybit); /* 设置产生哪些按键值 */
      
      /*********第二种设置事件和事件值的方法***********/
      keyinputdev.inputdev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REP);
      keyinputdev.inputdev->keybit[BIT_WORD(KEY_0)] |= BIT_MASK(KEY_0);
      
      /*********第三种设置事件和事件值的方法***********/
      keyinputdev.inputdev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REP
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值