【Android驱动】gt1x TP流程

事出有因,思考一下触发方式的问题

 

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_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);
}
    

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值