gt1x TP流程
程序员文章站
2022-03-22 16:42:35
...
事出有因,思考一下触发方式的问题
gt1x_ts_probe
├── ret = gt1x_request_io_port();
├
├── gt1x_init();
├
├── INIT_WORK(>1x_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(>1x_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, >1x_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);
}
上一篇: 字符设备驱动----LED驱动程序
下一篇: 递归分治--逆序/正序输出正数