Touch--驱动部分理解

在Touch----初识的基础上,今天主要是理解Touch的驱动。

1.丢log

在kernel/drivers/input/touchscreen/synaptics_dsx下的文件中的一些函数中加入一句printk("cassie------%s\n",__func__);重新编译bootimage,然后烧入到手机。重新开机,使用uart串口调试工具以及cutecom软件抓取log,并且将log保存到一个文件之中。

2.分析log

下面是其中的一部分log的截图。

Touch--驱动部分理解_第1张图片

由上图可以知道,和预期中的一样,开机过程中,首先跑的就是synaptics_dsx_core.c文件中的synaptics_rmi4_init函数。

在init函数中,会调用函数synaptics_rmi4_bus_init()。这个函数的原型在synaptics_dsx_i2c.c中。这个函数很简单,可以根据函数名大致猜测出就是注册i2c的驱动。实际上,也可以看成是一个全新的驱动,驱动的类型的i2c。之后依旧跑的是通文件中的synaptics_rmi4_i2c_probe函数。这个probe函数相对来说比较复杂。这个函数做的事情比较多。包括分配一些内存,分析设备树(parse_dt),并且在最后调用platform_device_register函数注册一个设备。

之后,会回到synaptics_dsx_core.c文件中文件中继续跑synaptics_rmi4_probe函数,这个函数的主要是给rmi4_data进行一些初始化以及对应上其功能函数。然后有调用synaptics_rmi4_get_reg,synaptics_rmi4_enable_reg获取regulators并且使能。然后是设置GPIO,得到中断号,中断使能等等。

3.suspend函数为什么注释掉了?

suspend的意思是挂起。挂起一般是为了省电。在学习的源码也就是synaptics_dsx_core.c中,发现没有调用suspend函数,并且将原来的函数注释掉了。后来发现,是改写了suspend,并且使用了EXPORT_SYMBOL(fun_name)的形式将函数放出去被别的文件调用了。也就是说,并不是没有suspend,而是可能因为一些时序的原因放在别的驱动中去挂起了。

4.为什么会有很多的report?

synaptics_rmi4_report_touch函数中,根据fhandler->fn_number选择调用不同的report函数。synaptics_rmi4_f11_abs_report;synaptics_rmi4_f12_abs_report;synaptics_rmi4_f1a_report三种情况。

首先,看看fhandler->fn_number是怎么得到的:synaptics_rmi4_report_touch函数是在synaptics_rmi4_sensor_report中被调用的,在synaptics_rmi4_sensor_report中,有定义一个变量(struct synaptics_rmi4_fn *fhandler;),然后用了下面的代码进行赋值。至于这个代码的具体含义,老实说,我看不懂~~

if (!list_empty(&rmi->support_fn_list)) 
{
		list_for_each_entry(fhandler, &rmi->support_fn_list, link) 
		{
			if (fhandler->num_of_data_sources) 
			{
				if (fhandler->intr_mask &intr[fhandler->intr_reg_num]) 
				{
					synaptics_rmi4_report_touch(rmi4_data,fhandler);
				}
			}
		}
}
在测试过程中,发现调用的是synaptics_rmi4_f12_abs_report,但是,并没有调用检测手势的情况。这个具体的原因以后再来补充。

5.对应于不同的手势(c,z等形状)是怎么处理的?

首先,不同的手势,是根据读取寄存器的值得到的两个值gesture_type ,gesture_alphabet,这两个值会作为不同手势的选择条件,但是这个只是必要条件,归根结底还是要看Touch识别出来的姿势的。实际上,在驱动中,只是单纯地报key,不同的手势只是key的值不一样,其处理方法是一样的。在上层可以做相应的处理,比如打开某个特定的APP或者实现其他功能。


总结:自己学习的效率实在是低下。需要整顿。




你可能感兴趣的:(touch)