一:添加A13专用操作函数
二:修改配置文件,修改触摸屏的名字,IIC设备地址。
三:修改模块加载函数为A13的模式
四:在i2c_driver结构中填充address_list和class成员
五:修改probe函数
修改注册中断的函数elan_ktf2k_ts_register_interrupt修改如下
1)设置中断模型
err = ctp_set_irq_mode("ctp_para", "ctp_int_port",CTP_IRQ_MODE);
2)注册中断函数里修改中断号和触发方式
err = request_irq(SW_INT_IRQNO_PIO, elan_ktf2k_ts_irq_handler,
IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING |
IRQF_SHARED, client->name, ts);
六:修改代码里面所有使用到中断号的地方,都改为SW_INT_IRQNO_PIO
七:修改中断处理程序
下面的程序
修改为:
八:完成上面的修改之后把驱动加载进系统,发现没有触摸屏幕一直有中断发生。
检查串口打印的信息是 Int poll failed!,对中断IO口的操作不正确。
对中断IO的读取状态操作如下
把gpio_get_value(ts->intr_gpio);修改为 ctp_ops.get_pendown_state();此函数是A13专用的读取中断引脚状态的函数。
它的返回值:
return value:
* return PRESS_DOWN: if down
* return FREE_UP: if up,
* return 0: do not need process, equal free up.
最后修改为:
把gpio_get_value(ts->intr_gpio);修改为 ctp_ops.get_pendown_state();
此函数是A13专用的读取中断引脚状态的函数。
它的返回值:
return value:
* return PRESS_DOWN: if down
* return FREE_UP: if up,
* return 0: do not need process, equal free up.
最后修改为:
0:表示按下?
1:表示松开?
这样做取决于这个函数__elan_ktf2k_ts_poll的返回值,因为它返回不是0
的话就会给调用它的函数返回了错误码。
返回了错误码之后__hello_packet_handler函数中就打印Int poll failed!
九:把所有的gpio的操作函数,改成A13专用的gpio操作函数。
十:处理报点
1)此触摸屏支持2个手指触摸
上报事件处理代码中去掉或者注释5个和10个手指触摸相关的代码。
2)上报触摸点数问题
触摸的数据被保存在一个全局的buf数组里面。
其中buf[0]是表示触摸屏支持的是2个手指或者是5个,10个。其中值为0x5a的是支持2个手指的。
Buf[1], Buf[2], Buf[3],保存的是第一个手指触摸的数据
Buf[4], Buf[5], Buf[6],保存的是第二个手指触摸的数据
Buf[7] 是ID号
3)X,Y坐标和XY值如果翻转处理如下
对读出的XY坐标信息的处理:
x = ((x*800)/Y_RESOLUTION);
y = ((y*600)/X_RESOLUTION);
处理X,Y坐标的翻转:
调换elan_ktf2k_ts_parse_xy(&buf[idx], &y, &x); 函数的实参顺序
处理X,Y坐标值的大小翻转:
X = ELAN_TS_Y_MAX -x;
y = ELAN_TS_Y_MAX - y;
十:添加休眠唤醒机制
1:实现Android的early_suspend和late_resume机制函数,在probe函数里面注册
2:实现外设的suspend和resume
问题:休眠之后,电源是被切断的,使用厂家给的resume驱动代码会出现以下错误
源码如下:
修改elan_ktf2k_ts_resume为: