电磁触摸屏和电容触摸屏原理虽然不同,但对驱动来讲,没有什么区别,都是input设备.
一,移植
kernel/drivers/input/touchscreen/
添加驱动文件,修改Makefile,Kconfig
kernel/arch/arm/configs/d801_defconfigd801_defconfig
+CONFIG_TOUCHSCREEN_WACOM_I2C=y
/arch/arm/mach-msm/board-8226-gpiomux.c
根据电路图在board-8226-gpiomux.c中配置用到的GPIO,注意要用宏把冲突的GPIO互斥掉
在d801.dtsi添加
根据电路图,此设备挂载在I2C5上,所以在i2c@f9927000结点下添加
+ wacom@9 {
+ compatible = "wacom,i2c";
+ reg = <0x9>;
+ interrupt-parent = <&msmgpio>;
+ interrupts = <13 0x2>;
+ wacom,power-en-gpio = <&msmgpio 24 0x00>;
+ wacom,flash-rewrite-gpio = <&msmgpio 12 0x00>;
+ wacom,pen-detect-gpio = <&msmgpio 23 0x00>;
+ wacom,irq-gpio = <&msmgpio 13 0x00>;
+ wacom,reset-gpio = <&msmgpio 22 0x00>;
+ };
几个GPIO的配置也可以不加,可以在驱动程序中直接赋值,这样就不需要在驱动程序中解析了.
二,调试
这方面要多和"原厂FAE"深入详细沟通,因为datasheet和code都不靠谱,而且很多代理的FAE都不太懂.
这次FAE给的代码只要移植到本平台,根据我们的电路配置一下上电和引脚就可以读出数据,但数据不对.
原因:他们给的代码是读19byte,打印log发现读出的数据和datasheet上数据包的格式不匹配.后来按照datasheet读8byte,打印log发现读出的数据仍然和datasheet上数据包的格式不匹配.后来找到规律发现实际读出的数据是10byte一组.哎,经验不足,被同样经验不足的代理FAE忽悠来忽悠去,也没给出个合理解释,就一句话他们芯片没有问题,是我们软件的问题.最后问原厂FAE,原来是他们的datasheet错了,数据应该是10byte,按照新的位定义重新解析数据就可以了.
我们的手机是竖屏的,电磁屏的定义是横屏的,转换一下坐标就可以对应上了.
下面两个函数将tp的分辨率和屏的分辨率对应
input_set_abs_params(input, ABS_X, 0, pdata->x_max_logical, 0, 0);
input_set_abs_params(input, ABS_Y, 0, pdata->y_max_logical, 0, 0);
下面代码用于创建一个设备节点,应用程序通过此节点控制电磁屏的开关.
static struct device_attribute wacom_i2c_dev_attr = {
.attr = {
.name = "wacom_state",
.mode = S_IRWXU|S_IRWXG|S_IRWXO,
},
.show = wacom_i2c_show,
.store = wacom_i2c_store,
};
wacom_i2c_class = class_create(THIS_MODULE, "wacom");
wacom_i2c_dev = device_create(wacom_i2c_class, NULL, 0, NULL,
device_create_file(wacom_i2c_dev, &wacom_i2c_dev_attr);
下面代码注册回调,让TP根据LCD进行开关.
wac_i2c->fb_notif.notifier_call = fb_notifier_callback;
error = fb_register_client(&wac_i2c->fb_notif);