Touch--驱动部分理解

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

1.丢log

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

2.分析log

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


由上图可以知道,和预期中的一样,开机过程中,首先跑的就是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;),然后用了下面的代码进行赋值。至于这个代码的具体含义,老实说,我看不懂~~

  1. if (!list_empty(&rmi->support_fn_list))   
  2. {  
  3.         list_for_each_entry(fhandler, &rmi->support_fn_list, link)   
  4.         {  
  5.             if (fhandler->num_of_data_sources)   
  6.             {  
  7.                 if (fhandler->intr_mask &intr[fhandler->intr_reg_num])   
  8.                 {  
  9.                     synaptics_rmi4_report_touch(rmi4_data,fhandler);  
  10.                 }  
  11.             }  
  12.         }  
  13. }  
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或者实现其他功能。


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




                </div>
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值