【Linux基础系列之】input系统简析

本文介绍了Linux输入子系统的组成,包括驱动层、输入子系统核心层和事件处理层。以ft5x06_ts驱动为例,详细阐述了驱动的probe过程,如何创建input_dev,设置事件类型和范围,注册中断及工作队列。同时,讲解了evdev_init函数、input_register_handler以及input_attach_handler的工作原理,最终事件如何通过evdev_pass_event传递给用户端应用程序进行处理。
摘要由CSDN通过智能技术生成

     输入子系统由驱动层(Drivers),输入子系统核心层(Input Core)和事件处理层(EventHandler)三部份组成;


(1)从设备驱动开始分析,以kernel/driver/touchscreen/ft5x06_ts.c的tp驱动为例,在tp驱动probe的过程当中,创建input_dev;

struct input_dev {
        ......
	struct input_id id;
	unsigned long evbit[BITS_TO_LONGS(EV_CNT)];//事件类型
	unsigned long keybit[BITS_TO_LONGS(KEY_CNT)];//按键
	unsigned long relbit[BITS_TO_LONGS(REL_CNT)];//相对设备
	unsigned long absbit[BITS_TO_LONGS(ABS_CNT)];//绝对设备,tp的坐标x,y就用这表示
	unsigned long mscbit[BITS_TO_LONGS(MSC_CNT)];//杂项设备
	unsigned long ledbit[BITS_TO_LONGS(LED_CNT)];//led灯
	unsigned long sndbit[BITS_TO_LONGS(SND_CNT)];//声音设备
	unsigned long ffbit[BITS_TO_LONGS(FF_CNT)];//强制反馈设备
	unsigned long swbit[BITS_TO_LONGS(SW_CNT)];//开关设备
	unsigned int hint_events_per_packet;
        ......
	struct device dev;
	struct list_head	h_list;
	struct list_head	node;
};

然后分配大小input = input_allocate_device();原型在/kernel/driver/input/input.c里面,很简单通过kmalloc分配大小,并初始话后面会用到的两个链表;

下面为tp驱动当中设置input事件的类型和初始值和范围,

        __set_bit(EV_KEY, input->evbit);
	__set_bit(EV_ABS, input->evbit);
	__set_bit(EV_SYN, input->evbit);
	__set_bit(BTN_TOUCH, input->keybit);
	__set_bit(ABS_MT_TOUCH_MAJOR, input->absbit);//tp按下去压力值
	__set_bit(ABS_MT_POSITION_X, input->absbit);//x坐标值
	__set_bit(ABS_MT_POSITION_Y, input->absbit);//y坐标值
	__set_bit(ABS_MT_WIDTH_MAJOR, input->absbit);//按键的范围值
	__set_bit(KEY_MENU,  input->keybit);
	__set_bit(KEY_BACK,  input->keybit);
	__set_bit(KEY_HOME,  input->keybit);
	__set_bit(KEY_SEARCH,  input->keybit);
	
	input_set_abs_params(input, ABS_MT_TOUCH_MAJOR, 0, 255, 0, 0);
	input_set_abs_params(input, ABS_MT_POSITION_X, 0, X_MAX, 0, 0);
	input_set_abs_params(input, ABS_MT_POSITION_Y, 0, Y_MAX, 0, 0);
	input_set_abs_params(input, ABS_MT_WIDTH_MAJOR, 0, 200, 0, 0);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值