1、分层
设备驱动层:
本层要驱动开发者自己实现,可参考drivers/input/keyboard/key.c
1.结构体:
![](//img-blog.csdn.net/20170207140215287?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMDI0MzMwNQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
核心层:
内核已帮我们完成,在drivers/input/input.c
1.结构体:
![](//img-blog.csdn.net/20170207140412426?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMDI0MzMwNQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
![](//img-blog.csdn.net/20170207140528542?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMDI0MzMwNQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
事件处理层:
针对不同的类型,内核分别提供了三个事件处理:
0-31 joystick joydev.c
32----63 mouse mousedev.c
64----95 event evdev.c
1.结构体:
![](//img-blog.csdn.net/20170207140816717?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMDI0MzMwNQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
2、步骤流程:
方法1:
struct input_dev dev;
方法2:
struct input_dev *dev ;
struct input_dev __must_check *input_allocate_device(void);
2.初始化
1. 支持什么事件
set_bit(EV_KEY,input_dev.evbit);
2、支持什么子事件
set_bit(BTN_0,input_dev.keybit));
3、设置事件参数
3.注册:
int __must_check input_register_device(struct input_dev *);
4.在需要的地方上报事件
static inline void input_report_key(struct input_dev *dev, unsigned int code, int value)
例如:
input_report_key(&input_dev,BTN_0,0);
input_report_key(&input_dev,BTN_0,1);
input_sync(&input_dev);
5.释放:
void input_unregister_device(struct input_dev *);
3、实例:
![](//img-blog.csdn.net/20170207141901327?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMDI0MzMwNQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
源码下载
4、源码追踪:
![](//img-blog.csdn.net/20170207192530984?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMDI0MzMwNQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
更多细节见xmind思维导图。