1.makefile、Kconfig、.config的区别

   http://www.cnblogs.com/taomaomao/archive/2012/01/05/2312816.html

2.原理和逻辑说明

3. kthread_run()函数详细说明

首先看看它的定义之处才发现它是一个宏函数,而不是一个真正意义上的函数。这个函数会创建一个名为namefmt的内核线程,这个线程刚创建时不会马上执行,要等到它将kthread_create() 返回的task_struct指针传给wake_up_process(),然后通过此函数运行线程。touch_event_handler这个函数就是创建的运行函数。

原理和逻辑说明

原理和逻辑说明

 http://blog.chinaunix.net/uid-28776666-id-3797013.html

 

4. http://blog.csdn.net/forever_2015/article/details/53000643#comments

http://blog.csdn.net/forever_2015/article/details/53047993

系统启动流程,包括从preloader->lk,lk->kernel,有源码分析的,感兴趣可以了解下,有助于梳理思路

5.闪屏 http://blog.csdn.net/cailiwei712/article/details/8485513

6.调试屏的一些理论知识:http://blog.csdn.net/u012719256/article/details/54633365

7.安卓输入子系统流程:http://blog.csdn.net/wangkaiblog/article/details/12085183

8.这2篇文章写得不错 大家有空学习下  后续TP划线慢这种问题我们来主导分析,buffer是否满;

http://gityuan.com/2016/12/31/input-ipc/

   http://gityuan.com/2017/01/01/input-anr/

9.eventhub

http://xiaoyesuncle.lofter.com/

 

10.追代码记录,兼容二供TP,二供只能最多显示4点

看手机getevent -p

查看发现第二个手指的数据正常上报,但是,屏幕上没有显示,有可能是显示之间被释放了导致,所以就去排查触摸释放的,

input_mt_slot(ts->input_dev, i);

input_event(dev, EV_ABS, ABS_MT_SLOT, slot);

input_handle_event(dev, type, code, value);

input_get_disposition(dev, type, code, &value); 获得事件处理者身份

input_handle_abs_event(dev, code, &value);

 

11.输入子系统事件上报流程:

https://blog.csdn.net/coldsnow33/article/details/12841077

input事件处理流程 input driver -> input core ->event handler -> userspace 给应用程序

事件的传递过程:首先在驱动层调用inport_report_abs,然后调用input core层的input_event,input_event调用了input_handle_event对事件进行分派,调用input_pass_event,在这里他会把事件传递给具体的handler层,然后在相应handler的event处理函数中,封装一个event,然后把它投入evdev的那个client_list上的client的事件buffer中,等待用户空间来读取。

 

代码追踪:

input_report_abs(ts->input_dev, ABS_MT_POSITION_X, input_x);

input_event(dev, EV_ABS, code, value);

input_handle_event(dev, type, code, value);

(1)input_handle_abs_event(dev, code, &value);

input_is_mt_value(code)

(2)input_pass_values(dev, dev->vals, dev->num_vals)

input_to_handler(handle, vals, count);

  handler->events(handle, vals, count);

.events           = evdev_events,

      evdev_pass_values(client, vals, count, ev_time);

            __pass_event

//发送信号SIGIO信号给fasync_struct 结构体所描述的PID,触发应用程序的SIGIO信号处理函数

             kill_fasync(&client->fasync, SIGIO, POLL_IN);

.fasync        = evdev_fasync,

.read         = evdev_read,

input_event_to_user(buffer + read, &event)

copy_to_user(buffer,&compat_event,sizeof(struct input_event_compat)

.read       = evdev_read,

cdev_init(&evdev->cdev, &evdev_fops); //最终在/dev/目录里面生成了字符设备

framework

eventhub.cpp

输入子系统框架总结:

首先的话是我们核心层的,执行的时候会注册我们的设备号,然后在handler层注册input_handler,也就是evdev_handler会注册到核心层维护的链表中,这些都是内核帮你完成的,然后再device层我们需要做硬件初始化获取数据,而且需要将我们的设备注册到链表中,注册进来就就会遍历input_handler_list链表,找到对应的handler,匹配成功后会调用connect方法,connect就会帮我们分配出evdev,evdev就记录了input_handler和input_device之间的关系,还会帮我们创建设备节点,还会注册cdev从而可以让应用调用,然后当我们应用程序调用open,read等接口的时候就会调用input_handler层实现的xxx_open,那么这个open就会帮你分配好evdev_client,最终在input_dev层上报数据的时候会自动调用input_handler,这个里面就会调用events填充上报的数据到缓冲区client,此时如果没有唤醒队列的话应用read的时候会阻塞,而唤醒队列后最终使用copy_to_user来给应用数据。

原文链接:https://blog.csdn.net/u010802169/article/details/80489602

12.

相关文章: