基于高通平台的TP调试

1、硬件原理

TP 相关的引脚有 SCL、SDA、VREG_L10、INT、RST,SCL、SDA用于I2C通讯,VREG_L10用于芯片供电,INT用于产生外部中断,RST是复位引脚。

2、涉及到的知识点

I2C子系统:(https://www.cnblogs.com/deng-tao/p/6130080.html)
INPUT输入子系统:(https://www.cnblogs.com/deng-tao/p/6094049.html)
工作队列:(http://bgutech.blog.163.com/blog/static/18261124320116181119889/)
中断:(http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=21977330&id=3755609)

在linux里,中断处理分为顶半(top half),底半(bottom half),在顶半里处理优先级比较高的事情,要求占用中断时间尽量的短,在处理完成后,就激活底半,有底半处理其余任务。底半的处理方式主要有soft_irq, tasklet, workqueue三种,他们在使用方式和适用情况上各有不同。soft_irq用在对底半执行时间要求比较紧急或者非常重要的场合,主要为一些subsystem用,一般driver基本上用不上。 tasklet和work queue在普通的driver里用的相对较多,主要区别是tasklet是在中断上下文执行,而work queue是在process上下文,因此可以执行可能sleep的操作。

3、功能的调试

a、工模信息的导入

为了方便查看 手机内部信息,项目一般会定制工模,TP正常工作后一般下一步是导入工模,A306的工模通过拨号可以查看,步骤如下。

  • 在makefile下包含wind_device_info下的文件

  • 要在common.c中包含相应的头文件,及定义一个wind_device_info 结构体。

  • 在来prob函数的末尾处把TP名称和版本信息放到wind_device_info结构体中,将就会显示到工模中。

b、手势功能的调试

  • 手势的作用是为了在熄屏状态下快速唤醒手机或应用,流程是当处于熄屏状态下,在屏幕上画相应的手势后,触摸ic处理相应的数据后产生中断,驱动程序根据数据上报相应的键值,然后上层根据键值就会打开相应的手势功能。

  • 中断中如何获取TP捕捉到的手势信息

     键值的上报:
     hx83102_ts_register_interrupt(ts->client);
       himax_int_register_trigger(client);
        request_threaded_irq(client->irq, NULL, himax_ts_thread,...);
          himax_ts_thread(int irq, void *ptr)
           himax_ts_isr_func((struct hx_83102_ts_data *)ptr);
            hx83102_ts_work(ts); //主要的工作在这个环节
             himax_wake_check_func();
               ret_event = himax_parse_wake_event(hx83102_ts); //解析手势键值
                input_report_key(hx83102_ts->input_dev, KEY_EVENT, 1);//上报键值,上层解析到键值会做相应动作。
                  input_sync(hx83102_ts->input_dev);//事件结束
    

c、TP固件升级

  • 固件升级是为了当TP中的IC固件升级后,可以在开机后自动加载目录中更新版的固件进行升级。
    1、读取 TP IC 中的固件版本号。
    2、读取代码(*.i文件)中TP固件版本号。
    3、将上述两个版本号比较,判断是否进行TP固件升级
    4、如何进行固件升级:

       //申请更新,创建工作队列, 可以把工作推后,交由一个内核线程去执行,因为固 
        件升级比较耗时。
         ts->himax_update_wq = create_singlethread_workqueue("HMX_update_reuqest");
      //准备更新TP的固件
       INIT_DELAYED_WORK(&ts->work_update, himax_update_register);
          himax_update_register();
           i_update_FW();
           fts_ctpm_fw_upgrade_with_sys_fs_32k(private_ts->client,\
            ImageBuffer,fullFileLength,false);
              i2c_himax_write(client, HX_CMD_TSSLPOUT,&cmd[0], 0, 
    DEFAULT_RETRY_CNT) 
    

你可能感兴趣的:(基于高通平台的TP调试)