本实验的源码工程在开发板光盘资料的:i.MX6UL终结者光盘资料\04_裸机例程源码\17_touchscreen 目录下。我们在Ubuntu系统下使用命令“mkdir 17_touchscreen”建立“17_touchscreen”文件夹,如图 1所示:
然后使用“cd 17_touchscreen”命令进入到17_touchscreen文件夹,如图 2所示:
然后使用命令“cp -r …/16_i2c/* ./”将上一章试验中的所有内容拷贝到刚刚新建的“17_touchscreen”里面,如图 3所示:
然后在drivers目录下建立touchscreen文件夹,用来保存触摸的驱动文件,然后在“drivers/touchscreen”目录中新建ft5xx6.c.h和ft5xx6.c.c两个文件,然后在ft5xx6.c.h文件输入下面的代码:
1 #ifndef _FT5XX6_H
2 #define _FT5XX6_H
3
4 #include "imx6ul.h"
5 #include "gpio.h"
6
7 /* 宏定义 */
8 #define FT5426_ADDR 0X38 /* FT5426设备地址 */
9
10 #define FT5426_DEVICE_MODE 0X00 /* 模式寄存器 */
11 #define FT5426_IDGLIB_VERSION 0XA1 /* 固件版本寄存器 */
12 #define FT5426_IDG_MODE 0XA4 /* 中断模式 */
13 #define FT5426_TD_STATUS 0X02 /* 触摸状态寄存器 */
14 #define FT5426_TOUCH1_XH 0X03 /* 触摸点坐标寄存器,
15 * 一个触摸点用4个寄存器存
储坐标数据*/
16
17 #define FT5426_XYCOORDREG_NUM 30 /* 触摸点坐标寄存器数量 */
18 #define FT5426_INIT_FINISHED 1 /* 触摸屏初始化完成 */
19 #define FT5426_INIT_NOTFINISHED 0 /* 触摸屏初始化未完成 */
20
21 #define FT5426_TOUCH_EVENT_DOWN 0x00 /* 按下 */
22 #define FT5426_TOUCH_EVENT_UP 0x01 /* 释放 */
23 #define FT5426_TOUCH_EVENT_ON 0x02 /* 接触 */
24 #define FT5426_TOUCH_EVENT_RESERVED 0x03 /* 没有事件 */
25
26 /* 触摸屏结构体 */
27 struct ft5426_dev_struc
28 {
29 unsigned char initfalg; /* 触摸屏初始化状态 */
30 unsigned char intflag; /* 标记中断有没有发生 */
31 unsigned char point_num; /* 触摸点 */
32 unsigned short x[5]; /* X轴坐标 */
33 unsigned short y[5]; /* Y轴坐标 */
34
35 };
36
37 extern struct ft5426_dev_struc ft5426_dev;
38
39 /* 函数声明 */
40 void ft5426_init(void);
41 ^Mvoid gpio1_io9_irqhandler(void);
42 unsigned char ft5426_write_byte(unsigned char addr,
43 unsigned char reg,
44 unsigned char data);
45 unsigned char ft5426_read_byte(unsigned char addr,
46 unsigned char reg);
47 void ft5426_read_len(unsigned char addr,
48 unsigned char reg,
49 unsigned char len,
50 unsigned char *buf);
51 void ft5426_read_tpnum(void);
52 void ft5426_read_tpcoord(void);
53
54 #endif
该文件主要定义了一些宏用来表示FT5426的I2C地址,寄存器,以及一些操作状态,然后在27行定义了一个保存触摸信息的结构体,最后声明了一些FT5426操作的函数。
接下来我们打开ft5xx6.c
1 #include "ft5xx6.h"
2 #include "i2c.h"
3 #include "int.h"
4 #include "delay.h"
5 #include "stdio.h"
6
7 struct ft5426_dev_struc ft5426_dev;
8
9 /*
10 * @description : 初始化触摸屏,其实就是初始化FT5426
11 * @param : 无
12 * @return : 无
13 */
14 void ft5426_init(void)
15 {
16 unsigned char reg_value[2];
17
18 ft5426_dev.initfalg = FT5426_INIT_NOTFINISHED;
19
20 /* 1、初始化IIC2 IO
21 * I2C2_SCL -> UART5_TXD
22 * I2C2_SDA -> UART5_RXD
23 */
24 IOMUXC_SetPinMux(IOMUXC_UART5_TX_DATA_I2C2_SCL,1);
25 IOMUXC_SetPinMux(IOMUXC_UART5_RX_DATA_I2C2_SDA,1);
26
27 /* 配置I2C2 IO属性
28 *bit 16:0 HYS关闭
29 *bit [15:14]: 1 默认47K上拉
30 *bit [13]: 1 pull功能
31 *bit [12]: 1 pull/keeper使能
32 *bit [11]: 0 关闭开路输出
33 *bit [7:6]: 10 速度100Mhz
34 *bit [5:3]: 110 驱动能力为R0/6
35 *bit [0]: 1 高转换率
36 */
37 IOMUXC_SetPinConfig(IOMUXC_UART5_TX_DATA_I2C2_SCL,0x70B0);
38 IOMUXC_SetPinConfig(IOMUXC_UART5_RX_DATA_I2C2_SDA,0X70B0);
39
40 /* 2、初始化触摸屏中断IO和复位IO */
41 gpio_pin_config_t ctintpin_config;
42
43 IOMUXC_SetPinMux(IOMUXC_GPIO1_IO09_GPIO1_IO09,0); /* 复用为GPIO1_IO9 */
44 IOMUXC_SetPinMux(IOMUXC_SNVS_SNVS_TAMPER9_GPIO5_IO09,0);/* 复用为GPIO5_IO9 */
45
46 IOMUXC_SetPinConfig(IOMUXC_GPIO1_IO09_GPIO1_IO09,0xF080);
47 IOMUXC_SetPinConfig(IOMUXC_SNVS_SNVS_TAMPER9_GPIO5_IO09,