电容式触摸屏技术是利用人体的电流感应进行工作的。电容式触摸屏是一块四层复合玻璃屏,玻璃屏的内表面和夹层各涂有一层ITO,最外层是一薄层矽土玻璃保护层,夹层ITO涂层作为工作面,四个角上引出四个电极,内层ITO为屏蔽层以保证良好的工作环境。 当手指触摸在金属层上时,由于人体电场,用户和触摸屏表面形成以一个耦合电容,对于高频电流来说,电容是直接导体,于是手指从接触点吸走一个很小的电流。这个电流分别从触摸屏的四角上的电极中流出,并且流经这四个电极的电流与手指到四角的距离成正比,控制器通过对这四个电流比例的精确计算,得出触摸点的位置。
这些采集和计算工作都由屏体上的电容触摸芯片完成,i.MX6ULL通过中断引脚、I2C接口与该芯片通信,获取触摸具体坐标数据。下面来进行电容触摸支持的配置。
硬件原理
LCD接口上关于电容触摸的引脚一共四个:
IIC1_SDA、IIC1_SCL是I2C1的数据和时钟引脚,用于与触摸芯片通信,在I2C1的配置,在之前I2C章节已经讲过,这里不再重复配置;TP_INT是触摸芯片的中断引脚,查表后知道,PAD NAME为SNVS_TAMPER1;TP_RST是触摸芯片复位引脚,PAD NAME为SNVS_TAMPER0。
IOMUX配置
I2C1已经配置过,不再配置,只需配置TP_INT(SNVS_TAMPER1)、TP_RST(SNVS_TAMPER0),打开arch/arm/boot/dts/imx6ull-pinfunc-snvs.h文件,搜索SNVS_TAMPER1和SNVS_TAMPER0:
在arch/arm/boot/dts/imx6ull-elf1-emmc.dts设备树文件的&iomuxc_snvs节点下,增加子节点pinctrl_tsc_ic:
|
pinctrl_tsc_ic: tsc_icgrp { ???????fsl,pins = < ??????????????MX6ULL_PAD_SNVS_TAMPER0__GPIO5_IO00 ?0x10b0 ??????????????MX6ULL_PAD_SNVS_TAMPER1__GPIO5_IO01 ?0x8000000 ???????>; }; |
注意:在设备树文件中,有GPIO5_IO00的其他复用,我们注释掉:
增加设备节点
ElfBoard搭配的电容屏使用的是goodix的GT9XX系列触摸芯片,增加对goodix的GT9XX系列触摸芯片的支持,在i2c1节点下增加子节goodix_ts@5d:
|
goodix_ts@5d { ????????????????compatible = "goodix,gt9xx"; ????????????????reg = <0x5d>; ????????????????pinctrl-names = "default"; ????????????????pinctrl-0 = <&pinctrl_tsc_ic>; ????????????????status = "okay"; ????????????????interrupt-parent = <&gpio5>; ????????????????interrupts = <1 2>; ????????????????goodix,rst-gpio = <&gpio5 0 ?GPIO_ACTIVE_LOW>; ????????????????goodix,irq-gpio = <&gpio5 1 ?GPIO_ACTIVE_LOW>; ????????????????goodix,cfg-group0 = [ ????????????????????????42 D0 02 00 05 05 75 01 01 0F 24 ????????????????????????0F 64 3C 03 05 00 00 00 02 00 00 ????????????????????????00 16 19 1C 14 8C 0E 0E 24 00 31 ????????????????????????0D 00 00 00 83 33 1D 00 41 00 00 ????????????????????????00 00 00 08 0A 00 2B 1C 3C 94 D5 ????????????????????????03 08 00 00 04 93 1E 00 82 23 00 ????????????????????????74 29 00 69 2F 00 5F 37 00 5F 20 ????????????????????????40 60 00 F0 40 30 55 50 27 00 00 ????????????????????????00 00 00 00 00 00 00 00 00 00 00 ????????????????????????00 00 00 00 00 00 00 14 19 00 00 ????????????????????????50 50 02 04 06 08 0A 0C 0E 10 12 ????????????????????????14 16 18 1A 1C 00 00 00 00 00 00 ????????????????????????00 00 00 00 00 00 00 00 00 00 1D ????????????????????????1E 1F 20 21 22 24 26 28 29 2A 1C ????????????????????????18 16 14 13 12 10 0F 0C 0A 08 06 ????????????????????????04 02 00 00 00 00 00 00 00 00 00 ????????????????????????00 00 00 00 00 00 00 00 9C 01]; ????????????????goodix,cfg-group2 = [ ????????????????????????48 D0 02 00 05 05 75 01 01 0F 24 ????????????????????????0F 64 3C 03 05 00 00 00 02 00 00 ????????????????????????00 16 19 1C 14 8C 0E 0E 24 00 31 ????????????????????????0D 00 00 00 83 33 1D 00 41 00 00 ????????????????????????3C 0A 14 08 0A 00 2B 1C 3C 94 D5 ????????????????????????03 08 00 00 04 93 1E 00 82 23 00 ????????????????????????74 29 00 69 2F 00 5F 37 00 5F 20 ????????????????????????40 60 00 F0 40 30 55 50 27 00 00 ????????????????????????00 00 00 00 00 00 00 00 00 00 00 ????????????????????????00 00 00 00 00 00 00 14 19 00 00 ????????????????????????50 50 02 04 06 08 0A 0C 0E 10 12 ????????????????????????14 16 18 1A 1C 00 00 00 00 00 00 ????????????????????????00 00 00 00 00 00 00 00 00 00 1D ????????????????????????1E 1F 20 21 22 24 26 28 29 2A 1C ????????????????????????18 16 14 13 12 10 0F 0C 0A 08 06 ????????????????????????04 02 00 00 00 00 00 00 00 00 00 ????????????????????????00 00 00 00 00 00 00 00 3C 01]; ????????}; |
添加后效果如下:
其中reg=<0x5d>是该芯片的i2c地址;
interrupt-parent = <&gpio5>表示使用中断控制器为GPIO5;
interrupts = <1 2>属性中的“1“表示使用中断控制器的第1个引脚,“2”表示使用的中断触发方式为下降沿触发。
goodix,rst-gpio = <&gpio5 0 ?GPIO_ACTIVE_LOW>;
goodix,irq-gpio = <&gpio5 1 ?GPIO_ACTIVE_LOW>;
分别表示复位和中断连接的具体引脚。
goodix,cfg-group0和goodix,cfg-group1,表示芯片的配置数据,芯片初始化的时候或者出现异常时需要重新对其寄存器进行配置。
666