1. 实验
基于 gpio 子系统框架,使用 platform 加 input 子系统驱动框架,编写使用内核定时器消抖的 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
-