3 核心层
核心层主要都是在input.c中处理。这里会处理各种Event,各种sensor,触摸事件,按键事件等等。流程图如下,
input_event方法直接调用input_handle_event方法进行处理,
void input_event(struct input_dev *dev,
unsigned int type, unsigned int code, int value)
{
unsigned long flags;
//判断是否是注册时的event类型,驱动probe时注册input_dev时设置了能响应的event类型
if (is_event_supported(type, dev->evbit, EV_MAX)) {
spin_lock_irqsave(&dev->event_lock, flags); //自旋锁枷锁
input_handle_event(dev, type, code, value);
spin_unlock_irqrestore(&dev->event_lock, flags); //解锁
}
}
input_handle_event首先调用input_get_disposition方法获取发送Event的类型,然后根据类型分别处理。
在上个小节中,发送加速度值的类型时EV_ABS,发送时间的值是EV_SYN。
input_get_disposition方法有关sensor代码如下,
case EV_SYN:
switch (code) {
case SYN_CONFIG:
case SYN_TIME_SEC:
case SYN_TIME_NSEC:
disposition = INPUT_PASS_TO_ALL;
break;
•••
case EV_ABS:
if (is_event_supported(code, dev->absbit, ABS_MAX))
disposition = input_handle_abs_event(dev, code, &value);
break;
由此可见,sensor的时间事件返回的是INPUT_PASS_TO_ALL
对于sensor事件, input_handle_abs_event 一般返回INPUT_PASS_TO_HANDLERS。
这些值的定义如下,
#define INPUT_IGNORE_EVENT 0
#define INPUT_PASS_TO_HANDLERS 1
#define INPUT_PASS_TO_DEVICE 2
#define INPUT_SLOT 4
#define INPUT_FLUSH 8
#define INPUT_PASS_TO_ALL (INPUT_PASS_TO_HANDLERS | INPUT_PASS_TO_DEVICE)
input_handle_event方法最后会调用input_pass_values方法进行处理,
input_pass_values(dev, dev->vals, dev->num_vals);
最后的input_to_handler主要逻辑