欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

gt1x TP流程

程序员文章站 2022-03-22 16:42:35
...
事出有因,思考一下触发方式的问题

 

gt1x_ts_probe
 ├── ret = gt1x_request_io_port();
 ├ 
 ├── gt1x_init();
 ├ 
 ├── INIT_WORK(&gt1x_work, gt1x_ts_work_func);
 ├
 ├── ret = gt1x_request_input_dev();
 ├─
 ├── ret = gt1x_request_irq();
 ├── 
 ├── 其他宏定义功能
 

gt1x_init:
    1.上电复位
    2.检查校验固件
    3.获得芯片类型
    4.读出版本信息
    5.发送config data初始化面板
    6.创建proc debug节点
    7.其他宏定义功能

------------------------------
中断的处理:
    1.probe里初始化工作队列:
            INIT_WORK(&gt1x_work, gt1x_ts_work_func);   //参数:名字,工作函数
    
    2.probe里申请中断
           gt1x_request_irq();
                   |
          ret = request_irq(gt1x_i2c_client->irq, gt1x_ts_irq_handler, irq_table[gt1x_int_type], gt1x_i2c_client->name, gt1x_i2c_client);

这里创建了一个handler,也就是中断上半部,对中断作出快速反应,中断一来,handler执行。

看下handler做了什么:
 static irqreturn_t gt1x_ts_irq_handler(int irq, void *dev_id)
 {
     GTP_DEBUG_FUNC();
     gt1x_irq_disable();
     queue_work(gt1x_wq, &gt1x_work);
     return IRQ_HANDLED;
 }

//queue_work将gtx_work放入gt1x_wq这个队列中,指示cpu在合适的时候执行
//gt1x_work也就是对应上面的gt1x_ts_work_fun
//这个fun主要做的事就是先通过i2c读出触摸位置坐标,再通过input子系统上报坐标到event


这里的gt1x_ts_irq_handler和gt1x_ts_work_func就是内核中断上半部和下半部的概念。


-------------
gt1x_init_panel代码分析
{

    1.GTP_DRIVER_SEND_CFG宏控制,主要是把cfg-data或者group的数据memcpy到cfgs[]里面
    
    2.GTP_CUSTOM_CFG宏控制,主要作用是代码客制化分辨率,触发方式,WakLevel这三个东西,
        通过这段代码,重新改写配置参数。(也即是说配置参数设置优先级小于代码设置优先级)

    3.这里重点分析下出触发模式到底由谁设置的。代码还是配置参数?

        #define TRIGGER_LOC         (GTP_REG_CONFIG_TRIGGER - GTP_REG_CONFIG_DATA)
        #define GTP_REG_CONFIG_TRIGGER      0x8056
        #define GTP_REG_CONFIG_DATA         0x8050        

    所以TRIGGER_LOC = 6,也就是说配置参数,数组的第七个数的位影响了中断触发模式。(下图的0x35)
    

gt1x TP流程

gt1x TP流程

这里计算一下,下降沿发
    gt1x_config[7] = 0x35 & 0x01 = 0x35

然后if ((gt1x_abs_x_max == 0) && (gt1x_abs_y_max == 0)) {
     //...
    gt1x_int_type = (gt1x_config[TRIGGER_LOC]) & 0x03;
        0x35 & 0x03 = 1
    //...
}

这里代码逻辑是看懂了,config-data和GTP_INT_TRIGGER都可以更改触发方式。
(但实际验证过一种,代码改成上升沿和下降沿,结果都是下降沿触发,只是中断电压发生了变化??
下图电压记录)
触发主要使用:
   IRQ_TYPE_EDGE_RISING, IRQ_TYPE_EDGE_FALLING, IRQ_TYPE_LEVEL_LOW, IRQ_TYPE_LEVEL_HIGH

常用的是上升沿和下降沿触发

-------------------
实际中我手上的gt5688,是下降沿触发。但是我在代码里面设置时,设置为上升沿和下降沿都能使用。

1.代码设置为上升沿触发时,电压表测得中断脚,电压变化:

    待机无触摸,中断脚1.2v, 触摸0v

2.代码设置为下降沿触发时,电压表测得中断脚,电压变化:
    待机无触摸,中断脚1.77v,触摸0.6v

--------------------

 

 

3.然后是对代码是否设置分辨率的判断,
    if ((gt1x_abs_x_max == 0) && (gt1x_abs_y_max == 0)) {
        正常走的这个,分辨率由固件设置 
    }

    4.打印GTP_INFO("X_MAX=%d,Y_MAX=%d,TRIGGER=0x%02x,WAKEUP_LEVEL=%d", gt1x_abs_x_max, gt1x_abs_y_max, gt1x_int_type, gt1x_wakeup_level);

    5,这句话很重要,从这句log里面可以确定分辨率,触发方式,唤醒电平
    
    6.下发配置参数
            ret = gt1x_send_cfg(gt1x_config, gt1x_cfg_length);
}
    

 

 

相关标签: 驱动