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.