文章目录
1 修改设备树文件
1、添加FT5426的pinctrl信息
FT5426 触摸芯片用到了 4 个 IO,一个复位 IO、一个中断 IO、I2C2 的 SCL 和 SDA,所以我们需要先在设备树中添加 IO 相关的信息。复位 IO 和中断 IO 是普通的 GPIO,因此这两个 IO可以放到同一个节点下去描述,I2C2 的 SCL 和 SDA 属于 I2C2,因此这两个要放到同一个节点下去描述。首先是复位 IO 和中断 IO,topeet_emmc_4_3.dts 文件里面默认有个名为“pinctrl_tsc”的节点,如果被删除了的话就自行创建,在此节点下添加触摸屏的复位 IO 和中断 IO 信息,修改以后的“pinctrl_tsc”节点内容如下所示:
1 pinctrl_tsc: tscgrp {
2 fsl,pins = <
3 MX6UL_PAD_SNVS_TAMPER9__GPIO5_IO09 0x10B0 /* TSC_RST */
4 MX6UL_PAD_GPIO1_IO09__GPIO1_IO09 0xF080 /* TSC_INT */
5 >;
6 };
继续添加 I2C2 的 SCL 和 SDA 这两个 IO 信息,topeet_emmc_4_3.dts 里面默认就已经添加了 I2C2 的 IO 信息,这是 NXP 官方添加的,所以不需要我们去修改。找到“pinctrl_i2c1”节点,此节点就是用于描述 I2C2 的 IO 信息,节点内容如下所示:
1 pinctrl_i2c2: i2c2grp {
2 fsl,pins = <
3 MX6UL_PAD_UART5_TX_DATA__I2C2_SCL 0x4001b8b0
4 MX6UL_PAD_UART5_RX_DATA__I2C2_SDA 0x4001b8b0
5 >;
6 };
最后在检查一下这四个引脚有没有被其他外设使用。如果有的话就需要屏蔽掉。
2、添加FT5426节点
FT5426 这个触摸 IC 挂载 I2C2 下,因此需要向 I2C2 节点下添加一个子节点,此子节点用于描述 FT5426,添加完成以后的 I2C2 节点内容如下所示:
1 &i2c2 {
2 clock_frequency = <100000>;
3 pinctrl-names = "default";
4 pinctrl-0 = <&pinctrl_i2c2>;
5 status = "okay";
6
7 /****************************/
8 /* 省略掉其他的设备节点 */
9 /****************************/
10
11
12 ft5426: ft5426@38 {
13 compatible = "edt,edt-ft5426";
14 reg = <0x38>;
15 pinctrl-names = "default";
16 pinctrl-0 = <&pinctrl_tsc>;
17 interrupt-parent = <&gpio1>;
18 interrupts = <9 0>;
19 reset-gpios = <&gpio5 9 GPIO_ACTIVE_LOW>;
20 interrupt-gpios = <&gpio1 9 GPIO_ACTIVE_LOW>;
21 };
22 };
第 12 行,触摸屏所使用的 FT5426 芯片节点,挂载 I2C2 节点下,FT5426 的器件地址为0X38。
第 14 行,reg 属性描述 FT5426 的器件地址为 0x38。
第 16 行,pinctrl-0 属性描述 FT5426 的复位 IO 和中断 IO 所使用的节点为 pinctrl_tsc。
第 17 行,interrupt-parent 属性描述中断 IO 对应的 GPIO 组为 GPIO1。
第 18 行,interrupts 属性描述中断 IO 对应的是 GPIO1 组的 IOI09。
第 19 行,reset-gpios 属性描述复位 IO 对应的 GPIO 为 GPIO5_IO09。
第 20 行,interrupt-gpios 属性描述中断 IO 对应的 GPIO 为 GPIO1_IO09。
2 编写多点电容触摸驱动
本实验例程路径:i.MX6UL终结者光盘资料/06_Linux驱动例程/20_multitouch
创建ft5426.c驱动文件,内容如下:
1 #include <linux/module.h>
2 #include <linux/ratelimit.h>
3 #include <linux/interrupt.h>
4 #include <linux/input.h>
5 #include <linux/i2c.h>
6 #include <linux/uaccess.h>
7 #include <linux/delay.h>
8 #include <linux/debugfs.h>
9 #include <linux/slab.h>
10 #include <linux/gpio.h>
11 #include <linux/of_gpio.h>
12 #include <linux/input/mt.h>
13 #include <linux/input/touchscreen.h>
14 #include <linux/input/edt-ft5x06.h>
15 #include <linux/i2c.h>
16
17 #define MAX_SUPPORT_POINTS 5 /* 5点触摸 */
18 #define TOUCH_EVENT_DOWN 0x00 /* 按下 */
19 #define TOUCH_EVENT_UP 0x01 /* 抬起 */
20 #define TOUCH_EVENT_ON 0x02 /* 接触 */
21 #define TOUCH_EVENT_RESERVED 0x03 /* 保留 */
22
23 /* FT5X06寄存器相关宏定义 */
24 #define FT5X06_TD_STATUS_REG 0X02 /* 状态寄存器地址 */
25 #define FT5x06_DEVICE_MODE_REG 0X00 /* 模式寄存器 */
26 #define FT5426_IDG_MODE_R 0XA4 /* 中断模式 */
27 #define FT5X06_READLEN 29 /* 要读取的寄存器个数 */
28
29 struct ft5x06_dev {
30 struct device_node *nd; /* 设备节点 */
31 int irq_pin,reset_pin; /* 中断和复位IO */
32 int irqnum; /* 中断号 */
33 void *private_data; /* 私有数据 */
34 struct input_dev *input; /* input结构体 */
35 struct i2c_client *client; /* I2C客户端 */
36 };
37
38 static struct ft5x06_dev ft5x06;
39
40 /*
41 * @description : 复位FT5X06
42 * @param - client : 要操作的i2c
43 * @param - multidev: 自定义的multitouch设备
44 * @return : 0,成功;其他负值,失败
45 */
46 static int ft5x06_ts_reset(struct i2c_client *