电容式触摸屏技术是利用人体的电流感应进行工作的。电容式触摸屏是一块四层复合玻璃屏,玻璃屏的内表面和夹层各涂有一层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,表示芯片的配置数据,芯片初始化的时候或者出现异常时需要重新对其寄存器进行配置。
添加GT9xx驱动
一、将ELF 1开发板资料包2-Linux 源代码2-1 驱动源码4_gt9xxgt9xx.c拷贝到内核源码的drivers/input/touchscreen/路径下:
二、将ELF 1开发板资料包2-Linux 源代码2-1 驱动源码4_gt9xxgt9xx.h拷贝到内核源码的include/linux/路径下:
三、修改Kconfig:
elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$ vi drivers/input/touchscreen/Kconfig |
添加以下内容:
config TOUCHSCREEN_GT9xx tristate "GT9xx I2C Touchscreen support" depends on I2C help Say Y here if you have an touchscreen based on the GT9xx family of controllers connected to your system.
If unsure, say N.
To compile this driver as a module, choose M here: the module will be called gt9xx. |
添加后效果如下:
四、修改Makefile:
elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$ vi drivers/input/touchscreen/Makefile |
添加以下内容:
obj-$(CONFIG_TOUCHSCREEN_GT9xx) += gt9xx.o |
添加后效果如下:
另外,需要在Makefile最后一行添加:
EXTRA_CFLAGS += -Wno-error=date-time # Fix compile error on gcc 4.9 and later |
五、将GT9xx驱动编译进内核:
使用make menuconfig打开图形化配置界面:
elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$ make menuconfig |
找到以下位置,我们可以在这里选择Y编译进内核,或者M编译成模块,或者N选择不编译。选择编译进内核:
Device Drivers -> Input device support -> Touchscreens |
六、替换配置文件
通过make menuconfig修改的内容写入到了.config文件,当使用make imx6ull_elf1_defconfig配置内核源码时,.config文件会被覆盖,因此,需要替换原有的imx6ull_elf1_defconfig。
elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$ cp .config arch/arm/configs/imx6ull_elf1_defconfig |
编译测试
编译内核和设备树并拷贝到开发板:
elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$ ./build.sh elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$ scp arch/arm/boot/zImage root@172.16.0.175:/run/media/mmcblk1p1/ elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$ scp arch/arm/boot/dts/imx6ull-elf1-emmc.dtb root@172.16.0.175:/run/media/mmcblk1p1/ |
进行sync操作后断电,开发板连接好800x480 LCD电容屏之后,启动后可以正常触摸。