i.MX6ULL终结者Linux 电容触摸屏实验实验程序编写

本文详细介绍了如何在i.MX6ULL平台上配置和编写FT5426电容触摸屏的驱动程序。首先,修改设备树文件,包括添加FT5426的pinctrl信息和FT5426节点。接着,编写驱动代码,包括设备结构体定义、初始化函数、中断服务函数等,实现了对FT5426的I2C读写操作和中断处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 *
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值