正点原子 发表于 2020-6-9 11:51:17

【正点原子Linux连载】第二十八章多点电容触摸屏实验--摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南

本帖最后由 正点原子 于 2020-10-24 16:09 编辑

1)实验平台:正点原子阿尔法Linux开发板
2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434
3)全套实验源码+手册+视频下载地址:http://www.openedv.com/thread-300792-1-1.html
4)本章实例源码下载:   
5)对正点原子Linux感兴趣的同学可以加群讨论:876919289
6)关注正点原子公众号,获取最新资料





第二十八章多点电容触摸屏实验

      随着智能手机的发展,电容触摸屏也得到了飞速的发展。相比电阻触摸屏,电容触摸屏有很多的优势,比如支持多点触控、不需要按压,只需要轻轻触摸就有反应。ALIENTEK的三款RGB LCD屏幕都支持多点电容触摸,本章就以ATK7016这款RGB LCD屏幕为例讲解一下如何驱动电容触摸屏,并获取对应的触摸坐标值。

28.1多点电容触摸简介
      触摸屏很早就有了,一开始是电阻触摸屏,电阻触摸屏只能单点触摸,在以前的学习机、功能机时代被广泛使用。2007年1月9日苹果发布了划时代的第一代Iphone,也就是Iphone 2G,Iphone 2G上使用了多点电容触摸屏,而当时的手机基本都是使用的电阻触摸屏。电容触摸屏优秀的触摸品质和手感瞬间征服了消费者,带来了手机触摸屏的大变革,后面新出的手机也都采用了多点电容触摸屏。和电阻触摸屏相比,电容触摸屏最大的优点是支持多点触摸(后面的电阻屏也支持多点触摸,但是为时已晚),电容屏只需要手指轻触即可,而电阻屏是需要手指给予一定的压力才有反应,而且电容屏不需要校准。如今多点电容触摸屏已经得到了广泛的应用,手机、平板、电脑、广告机等等,如果要做人机交互设备的开发,多点电容触摸屏基本是不可能绕过去的。所以本章我们就来学习一下如何使用多点触摸屏,如何获取到多点触摸值。关于电容屏的物理原理我们就不去研究了,毕竟我们不是开发电容屏的,而是电容屏的使用者,我们只需要关注如何使用电容屏,如何得到其多点触摸坐标值即可。ALIENTEK的三款RGB LCD屏幕都是支持5点电容触摸屏的,本章我们同样以ATK-7016这款屏幕为例来讲解如何使用多点电容触摸屏。
      ATK-7016这款屏幕其实是由TFT LCD+触摸屏组合起来的。底下是LCD面板,上面是触摸面板,将两个封装到一起就成了带有触摸屏的LCD屏幕。电容触摸屏也是需要一个驱动IC的,驱动IC一般会提供一个I2C接口给主控制器,主控制器可以通过I2C接口来读取驱动IC里面的触摸坐标数据。ATK-7016、ATK-7084这两款屏幕使用的触摸控制IC是FT5426,ATK-4342使用的驱动IC是GT9147。这三个电容屏触摸IC都是I2C接口的,使用方法基本一样。
      FT5426这款驱动IC采用15*28的驱动结构,也就是15个感应通道,28个驱动通道,最多支持5点电容触摸。ATK-7016的电容触摸屏部分有4个IO用于连接主控制器:SCL、SDA、RST和INT,SCL和SDA是I2C引脚,RST是复位引脚,INT是中断引脚。一般通过INT引脚来通知主控制器有触摸点按下,然后在INT中断服务函数中读取触摸数据。也可以不使用中断功能,采用轮询的方式不断查询是否有触摸点按下,本章实验我们使用中断方式来获取触摸数据。
根所有的I2C器件一样,FT5426也是通过读写寄存器来完成初始化和触摸坐标数据读取的,I.MX6U的I2C我们已经在第二十六章做了详细的讲解,所以本章的主要工作就是读写FT5426的寄存器。FT5426的I2C设备地址为0X38,FT5426的寄存器有很多,本章我们只用到了其中的一部分,如表28.1.1所示:

表28.1.1.1 FT5426使用到的寄存器表
      表28.1.1.1中就是本章实验我们会使用到的寄存器。关于触摸屏和FT5426的知识就讲解到这里。
28.2硬件原理分析
本试验用到的资源如下:
、指示灯LED0。
、 RGB LCD屏幕。
③、触摸屏
④、串口
      触摸屏是和RGB LCD屏幕做在一起的,所以触摸屏也在RGB LCD接口上,都是连接在I.MX6U-ALPHA开发板底板上,原理图如图28.2.1所示:

图28.2.1触摸屏原理图
      从图28.2.1可以看出,触摸屏连接这I.MX6U的I2C2,INT引脚连接着I.MX6U的SNVS_TAMPER9,RST引脚连接着I.MX6U的GPIO1_IO9。在本章实验中使用中断方式读取触摸点个数和触摸点坐标数据,并且将其显示在LCD上。
28.3实验程序编写
      本实验对应的例程路径为:开发板光盘-> 1、裸机例程->19_touchscreen。
      本章实验在上一章例程的基础上完成,更改工程名字为“touchscreen”,然后在bsp文件夹下创建名为“touchscreen”的文件。在bsp/ touchscreen中新建bsp_ft5xx6.c和bsp_ft5xx6.h这两个文件,在bsp_ft5xx6.h中输入如下内容:
示例代码28.3.1 bsp_ft5xx6.h文件代码
1#ifndef _FT5XX6_H
2#define _FT5XX6_H
3/***************************************************************
4Copyright © zuozhongkai Co., Ltd. 1998-2019. All rights reserved.
5文件名    : bsp_ft5xx6.h
6作者      : 左忠凯
7版本      : V1.0
8描述      : 触摸屏驱动头文件,触摸芯片为FT5xx6,
9包括FT5426和FT5406。
10其他      : 无
11论坛      : www.openedv.com
12 日志      : 初版V1.0 2019/1/21 左忠凯创建
13 ***************************************************************/
14 #include "imx6ul.h"
15 #include "bsp_gpio.h"
16
17/* 宏定义 */
18 #define FT5426_ADDR                     0X38      /* FT5426设备地址      */
19
20 #define FT5426_DEVICE_MODE            0X00      /* 模式寄存器      */
21 #define FT5426_IDGLIB_VERSION         0XA1      /* 固件版本寄存器      */
22 #define FT5426_IDG_MODE               0XA4      /* 中断模式      */
23 #define FT5426_TD_STATUS                0X02      /* 触摸状态寄存器      */
24 #define FT5426_TOUCH1_XH                0X03      /* 触摸点坐标寄存器,
25                                                 * 一个触摸点用4个寄存器*/
26
27 #define FT5426_XYCOORDREG_NUM          30/* 触摸点坐标寄存器数量      */
28 #define FT5426_INIT_FINISHED         1/* 触摸屏初始化完成      */
29 #define FT5426_INIT_NOTFINISHED      0/* 触摸屏初始化未完成      */
30
31 #define FT5426_TOUCH_EVENT_DOWN                        0x00      /* 按下      */
32 #define FT5426_TOUCH_EVENT_UP                           0x01      /* 释放      */
33 #define FT5426_TOUCH_EVENT_ON                           0x02      /* 接触      */
34 #define FT5426_TOUCH_EVENT_RESERVED          0x03      /* 没有事件      */
35
36/* 触摸屏结构体 */
37struct ft5426_dev_struc
38{
39unsignedchar initfalg;      /* 触摸屏初始化状态                */
40unsignedchar intflag;      /* 标记中断有没有发生      */
41unsignedchar point_num;      /* 触摸点                */
42unsignedshort x;      /* X轴坐标                        */
43unsignedshort y;      /* Y轴坐标                        */
44};
45
46externstruct ft5426_dev_struc ft5426_dev;
47
48/* 函数声明 */
49voidft5426_init(void);
50
51void gpio1_io9_irqhandler(void);
52unsignedchar ft5426_write_byte(unsignedchar addr,
unsignedchar reg,
unsignedchar data);
53unsignedchar ft5426_read_byte(unsignedchar addr,
unsignedchar reg);
54void ft5426_read_len(unsignedchar addr,unsignedchar reg,
unsignedchar len,unsignedchar*buf);
55void ft5426_read_tpnum(void);
56void ft5426_read_tpcoord(void);
57 #endif
      文件bsp_ft5xx6.h文件中先是定义了FT5426的设备地址、寄存器地址和一些触摸点状态宏,然后在第37行定义了一个结构体ft5426_dev_struc,此结构体用来保存触摸信息,最后就是一些函数声明。接下来在bsp_ft5xx6.c中输入如下所示内容:
示例代码28.3.2 bsp_ft5xx6.c文件代码
/***************************************************************
Copyright © zuozhongkai Co., Ltd. 1998-2019. All rights reserved.
文件名   :bsp_ft5xx6.c
作者   : 左忠凯
版本   : V1.0
描述   : 触摸屏驱动文件,触摸芯片为FT5xx6,
包括FT5426和FT5406。
其他   : 无
论坛   : www.openedv.com
日志   : 初版V1.0 2019/1/21 左忠凯创建
***************************************************************/
1   #include "bsp_ft5xx6.h"
2   #include "bsp_i2c.h"
3   #include "bsp_int.h"
4   #include "bsp_delay.h"
5   #include "stdio.h"
6
7struct ft5426_dev_struc ft5426_dev;
8
9/*
10   * @description         : 初始化触摸屏,其实就是初始化FT5426
11   * @param               : 无
12   * @return            : 无
13   */
14void ft5426_init(void)
15{
16unsignedchar reg_value;
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      IOMUXC_SetPinConfig(IOMUXC_UART5_TX_DATA_I2C2_SCL, 0x70B0);
27      IOMUXC_SetPinConfig(IOMUXC_UART5_RX_DATA_I2C2_SDA, 0X70B0);
28
29/* 2、初始化触摸屏中断IO和复位IO */
30      gpio_pin_config_t ctintpin_config;
31      IOMUXC_SetPinMux(IOMUXC_GPIO1_IO09_GPIO1_IO09,0);
32      IOMUXC_SetPinMux(IOMUXC_SNVS_SNVS_TAMPER9_GPIO5_IO09,0);
33      IOMUXC_SetPinConfig(IOMUXC_GPIO1_IO09_GPIO1_IO09,0xF080);
34      IOMUXC_SetPinConfig(IOMUXC_SNVS_SNVS_TAMPER9_GPIO5_IO09,0X10B0);
35
36/* 中断IO初始化 */
37      ctintpin_config.direction = kGPIO_DigitalInput;
38      ctintpin_config.interruptMode = kGPIO_IntRisingOrFallingEdge;
39      gpio_init(GPIO1,9,&ctintpin_config);
40
41      GIC_EnableIRQ(GPIO1_Combined_0_15_IRQn);/* 使能GIC中对应的中断 */
42      system_register_irqhandler(GPIO1_Combined_0_15_IRQn,
(system_irq_handler_t)gpio1_io9_irqhandler,
NULL);/* 注册中断服务函数 */
43      gpio_enableint(GPIO1,9);/* 使能GPIO1_IO18的中断功能 */
44
45/* 复位IO初始化 */
46      ctintpin_config.direction=kGPIO_DigitalOutput;
47      ctintpin_config.interruptMode=kGPIO_NoIntmode;
48      ctintpin_config.outputLogic=1;
49      gpio_init(GPIO5,9,&ctintpin_config);
50
51/* 3、初始化I2C */
52      i2c_init(I2C2);
53
54/* 4、初始化FT5426 */
55      gpio_pinwrite(GPIO5,9,0);      /* 复位FT5426               */
56      delayms(20);
57      gpio_pinwrite(GPIO5,9,1);      /* 停止复位FT5426         */
58      delayms(20);
59      ft5426_write_byte(FT5426_ADDR, FT5426_DEVICE_MODE,0);
60      ft5426_write_byte(FT5426_ADDR, FT5426_IDG_MODE,1);
61      ft5426_read_len(FT5426_ADDR, FT5426_IDGLIB_VERSION,2,
reg_value);
62      printf("Touch Frimware Version:%#X\r\n",
((unsignedshort)reg_value<<8)+ reg_value);
63      ft5426_dev.initfalg = FT5426_INIT_FINISHED;/* 标记初始化完成 */
64      ft5426_dev.intflag =0;
65}
66
67/*
68   * @description         : GPIO1_IO9最终的中断处理函数
69   * @param               : 无
70   * @return               : 无
71   */
72void gpio1_io9_irqhandler(void)
73{
74if(ft5426_dev.initfalg == FT5426_INIT_FINISHED)
75{
76//ft5426_dev.intflag = 1;
77          ft5426_read_tpcoord();
78}
79      gpio_clearintflags(GPIO1,9);/* 清除中断标志位 */
80}
81
82/*
83   * @description         : 向FT5426写入数据
84   * @param – addr      : 设备地址
85   * @param - reg         : 要写入的寄存器
86   * @param – data      : 要写入的数据
87   * @return            : 操作结果
88   */
89unsignedchar ft5426_write_byte(unsignedchar addr,
unsignedchar reg,
unsignedchar data)
90{
91unsignedchar status=0;
92unsignedchar writedata=data;
93struct i2c_transfer masterXfer;
94
95/* 配置I2C xfer结构体 */
96      masterXfer.slaveAddress = addr;                /* 设备地址      */
97      masterXfer.direction = kI2C_Write;      /* 写入数据      */
98      masterXfer.subaddress = reg;                        /* 要写入的寄存器地址      */
99      masterXfer.subaddressSize =1;                        /* 地址长度一个字节      */
100   masterXfer.data =&writedata;                        /* 要写入的数据      */
101   masterXfer.dataSize =1;                        /* 写入数据长度1个字节      */
102
103if(i2c_master_transfer(I2C2,&masterXfer))
104         status=1;
105
106return status;
107}
108
109/*
110* @description         : 从FT5426读取一个字节的数据
111* @param – addr      : 设备地址
112* @param - reg         : 要读取的寄存器
113* @return            : 读取到的数据。
114*/
115unsignedchar ft5426_read_byte(unsignedchar addr,
unsignedchar reg)
116{
117unsignedchar val=0;
118
119struct i2c_transfer masterXfer;
120   masterXfer.slaveAddress = addr;      /* 设备地址                        */
121   masterXfer.direction = kI2C_Read;                /* 读取数据      */
122   masterXfer.subaddress = reg;      /* 要读取的寄存器地址      */
123   masterXfer.subaddressSize =1;      /* 地址长度一个字节      */
124   masterXfer.data =&val;      /* 接收数据缓冲区      */
125   masterXfer.dataSize =1;      /* 读取数据长度1个字节      */
126   i2c_master_transfer(I2C2,&masterXfer);
127return val;
128}
129
130/*
131* @description         : 从FT5429读取多个字节的数据
132* @param – addr      : 设备地址
133* @param - reg         : 要读取的开始寄存器地址
134* @param - len         : 要读取的数据长度.
135* @param - buf         : 读取到的数据缓冲区
136* @return            : 无
137*/
138void ft426_read_len(unsignedchar addr,unsignedchar reg,
unsignedchar len,unsignedchar*buf)
139{
140struct i2c_transfer masterXfer;
141
142   masterXfer.slaveAddress = addr;                /* 设备地址                */
143   masterXfer.direction = kI2C_Read;      /* 读取数据                */
144   masterXfer.subaddress = reg;      /* 要读取的寄存器地址      */
145   masterXfer.subaddressSize =1;      /* 地址长度一个字节      */
146   masterXfer.data = buf;      /* 接收数据缓冲区      */
147   masterXfer.dataSize = len;      /* 读取数据长度1个字节      */
148   i2c_master_transfer(I2C2,&masterXfer);
149}
150
151/*
152* @description         : 读取当前触摸点个数
153* @param               : 无
154* @return            : 无
155*/
156void ft5426_read_tpnum(void)
157{
158   ft5426_dev.point_num = ft5426_read_byte(FT5426_ADDR,
FT5426_TD_STATUS);
159}
160
161/*
162* @description         : 读取当前所有触摸点的坐标
163* @param               : 无
164* @return            : 无
165*/
166void ft5426_read_tpcoord(void)
167{
168unsignedchar i =0;
169unsignedchar type =0;
170//unsigned char id = 0;
171unsignedchar pointbuf;
172
173   ft5426_dev.point_num = ft5426_read_byte(FT5426_ADDR,
FT5426_TD_STATUS);
174
175/*
176      * 从寄存器FT5426_TOUCH1_XH开始,连续读取30个寄存器的值,
177      * 这30个寄存器保存着5个点的触摸值,每个点占用6个寄存器。
178      */
179   ft5426_read_len(FT5426_ADDR, FT5426_TOUCH1_XH,
FT5426_XYCOORDREG_NUM, pointbuf);
180for(i =0; i < ft5426_dev.point_num ; i++)
181{
182unsignedchar*buf =&pointbuf;

183         ft5426_dev.x=((buf<<8)| buf)&0x0fff;
184         ft5426_dev.y=((buf<<8)| buf)&0x0fff;
185         type = buf>>6;/* 获取触摸类型 */
186//id = (buf >> 4) & 0x0f;
187if(type == FT5426_TOUCH_EVENT_DOWN || type ==
FT5426_TOUCH_EVENT_ON )/* 按下*/
188{
189
190}else{/* 释放 */
191
192}
193}
194}
      文件bsp_ft5xx6.c中有7个函数,我们依次来看一下这7个函数。第1个是函数ft5426_init,此函数是ft5426的初始化函数,此函数先初始化FT5426所使用的I2C2接口引脚、复位引脚和中断引脚。接下来使能了FT5426所使用的中断,并且注册了中断处理函数,最后初始化了I2C2和FT5426。第2个函数是gpio1_io9_irqhandler,这个是FT5426的中断引脚中断处理函数,在此函数中会读取FT5426内部的触摸数据。第3和第4个函数分别为ft5426_write_byte和ft5426_read_byte,函数ft5426_write_byte用于向FT5426的寄存器写入指定的值,函数ft5426_read_byte用于读取FT5426指定寄存器的值。第5个函数是ft5426_read_len,此函数也是从FT5426的指定寄存器读取数据,但是此函数是读取数个连续的寄存器。第6个函数是ft5426_read_tpnum,此函数用于获取FT5426当前有几个触摸点有效,也就是触摸点个数。最后一个函数是ft5426_read_tpcoord,此函数就是读取FT5426各个触摸点坐标值的。
      最后在main.c中输入如下内容:
示例代码28.3.3 main.c文件代码
/**************************************************************
Copyright © zuozhongkai Co., Ltd. 1998-2019. All rights reserved.
文件名   : main.c
作者   : 左忠凯
版本   : V1.0
描述   : I.MX6U开发板裸机实验20 触摸屏实验
其他   : I.MX6U-ALPHAL推荐使用正点原子-7寸LCD,此款LCD支持5点电容触摸,
本节我们就来学习如何驱动LCD上的5点电容触摸屏。
论坛   : www.openedv.com
日志   : 初版V1.0 2019/1/21 左忠凯创建
**************************************************************/
1#include "bsp_clk.h"
2#include "bsp_delay.h"
3#include "bsp_led.h"
4#include "bsp_beep.h"
5#include "bsp_key.h"
6#include "bsp_int.h"
7#include "bsp_uart.h"
8#include "bsp_lcd.h"
9#include "bsp_lcdapi.h"
10 #include "bsp_rtc.h"
11 #include "bsp_ft5xx6.h"
12 #include "stdio.h"
13
14/*
15* @description         : 使能I.MX6U的硬件NEON和FPU
16* @param                : 无
17* @return               : 无
18*/
19void imx6ul_hardfpu_enable(void)
20{
21      uint32_t cpacr;
22      uint32_t fpexc;
23
24      /* 使能NEON和FPU */
25      cpacr = __get_CPACR();
26      cpacr =(cpacr &~(CPACR_ASEDIS_Msk | CPACR_D32DIS_Msk))
27                |(3UL<< CPACR_cp10_Pos)|(3UL<< CPACR_cp11_Pos);
28      __set_CPACR(cpacr);
29      fpexc = __get_FPEXC();
30      fpexc |=0x40000000UL;
31      __set_FPEXC(fpexc);
32}
33
34/*
35* @description          : main函数
36* @param                : 无
37* @return               : 无
38*/
39int main(void)
40{
41unsignedchar i =0;
42      unsignedchar state = OFF;
43
44      imx6ul_hardfpu_enable();      /* 使能I.MX6U的硬件浮点      */
45      int_init();      /* 初始化中断(一定要最先调用!)         */
46      imx6u_clkinit();      /* 初始化系统时钟      */
47      delay_init();      /* 初始化延时      */
48      clk_enable();      /* 使能所有的时钟      */
49      led_init();      /* 初始化led                           */
50      beep_init();      /* 初始化beep                        */
51      uart_init();      /* 初始化串口,波特率115200         */
52      lcd_init();      /* 初始化LCD                           */
53      ft5426_init();      /* 初始化触摸屏      */
54
55      tftlcd_dev.forecolor = LCD_RED;
56      lcd_show_string(50,10,400,24,24,
(char*)"ALPHA-IMX6U TOUCH SCREEN TEST");
57      lcd_show_string(50,40,200,16,16,
(char*)"TOUCH SCREEN TEST");
58      lcd_show_string(50,60,200,16,16,(char*)"ATOM@ALIENTEK");
59      lcd_show_string(50,80,200,16,16,(char*)"2019/3/27");
60      lcd_show_string(50,110,400,16,16,(char*)"TP Num:");
61      lcd_show_string(50,130,200,16,16,(char*)"Point0 X:");
62      lcd_show_string(50,150,200,16,16,(char*)"Point0 Y:");
63      lcd_show_string(50,170,200,16,16,(char*)"Point1 X:");
64                lcd_show_string(50,190,200,16,16,(char*)"Point1 Y:");
65      lcd_show_string(50,210,200,16,16,(char*)"Point2 X:");
66      lcd_show_string(50,230,200,16,16,(char*)"Point2 Y:");
67      lcd_show_string(50,250,200,16,16,(char*)"Point3 X:");
68      lcd_show_string(50,270,200,16,16,(char*)"Point3 Y:");
69      lcd_show_string(50,290,200,16,16,(char*)"Point4 X:");
70      lcd_show_string(50,310,200,16,16,(char*)"Point4 Y:");
71      tftlcd_dev.forecolor = LCD_BLUE;
72      while(1)
73      {
74      lcd_shownum(50+72,110, ft5426_dev.point_num ,1,16);
75      lcd_shownum(50+72,130, ft5426_dev.x,5,16);
76      lcd_shownum(50+72,150, ft5426_dev.y,5,16);
77      lcd_shownum(50+72,170, ft5426_dev.x,5,16);
78      lcd_shownum(50+72,190, ft5426_dev.y,5,16);
79      lcd_shownum(50+72,210, ft5426_dev.x,5,16);
80      lcd_shownum(50+72,230, ft5426_dev.y,5,16);
81      lcd_shownum(50+72,250, ft5426_dev.x,5,16);
82      lcd_shownum(50+72,270, ft5426_dev.y,5,16);
83      lcd_shownum(50+72,290, ft5426_dev.x,5,16);
84      lcd_shownum(50+72,310, ft5426_dev.y,5,16);
85
86      delayms(10);
87      i++;
88
89      if(i ==50)
90      {      
91                i =0;
92                state =!state;
93                led_switch(LED0,state);
94      }
95      }
96      return0;
97}
      文件main.c只第53行调用函数ft5426_init初始化触摸屏,也就是FT5426这个触摸驱动IC。最后在main函数的while循环中不断的显示获取到的触摸点数以及对应的触摸坐标值。因为本章实验我们采用中断方式读取FT5426的触摸数据,因此main函数中并没有读取FT5426的操作,只是显示触摸值。本章实验程序编写就到这里,接下来就是编译、下载和验证。
28.4编译下载验证
28.4.1 编写Makefile和链接脚本
修改Makefile中的TARGET为touchscreen,然后在INCDIRS和SRCDIRS中加入“bsp/touchscreen”,修改后的Makefile如下:
示例代码28.4.1.1Makefile文件代码
1CROSS_COMPILE      ?= arm-linux-gnueabihf-
2TARGET               ?= touchscreen
3
4/* 省略掉其它代码...... */
5
6INCDIRS      :=      imx6ul \
7                stdio/include \
8                bsp/clk \
9                bsp/led \
10                bsp/delay\
11                bsp/beep \
12                bsp/gpio \
13                bsp/key \
14                bsp/exit \
15                bsp/int \
16                bsp/epittimer \
17                bsp/keyfilter \
18                bsp/uart \
19                bsp/lcd \
20               bsp/rtc \
21               bsp/i2c \
22               bsp/ap3216c \
23                bsp/spi \
24               bsp/icm20608 \
25                bsp/touchscreen
26
27 SRCDIRS      :=      project \
28                stdio/lib \
29                bsp/clk \
30                bsp/led \
31               bsp/delay \
32                bsp/beep \
33                bsp/gpio \
34                bsp/key \
35                bsp/exit \
36                bsp/int \
37                bsp/epittimer \
38               bsp/keyfilter \
39                bsp/uart \
40                bsp/lcd \
41                bsp/rtc \
42               bsp/i2c \
43               bsp/ap3216c \
44                bsp/spi \
45                bsp/icm20608 \
46                bsp/touchscreen
47
48/* 省略掉其它代码...... */
49
50 clean:
51rm -rf $(TARGET).elf $(TARGET).dis $(TARGET).bin $(COBJS)$(SOBJS)
第2行修改变量TARGET为“touchscreen”,也就是目标名称为“touchscreen”。
      第25行在变量INCDIRS中添加触摸屏的驱动头文件(.h)路径。
      第46行在变量SRCDIRS中添加触摸屏的驱动文件(.c)路径。
      链接脚本保持不变。
28.4.2编译下载
      使用Make命令编译代码,编译成功以后使用软件imxdownload将编译完成的touchscreen.bin文件下载到SD卡中,命令如下:
chmod 777 imxdownload                              //给予imxdownload可执行权限,一次即可
./imxdownload touchscreen.bin /dev/sdd                //烧写到SD卡中
      烧写成功以后将SD卡插到开发板的SD卡槽中,然后复位开发板。默认情况下LCD界面如图28.4.2.1所示:

图28.4.2.1默认LCD显示
      当我们用手指触摸屏幕的时候就会在LCD上显示出当前的触摸点和对应的触摸值,如图28.4.2.2所示:

图28.4.2.2
      图28.4.2.2中有5个触摸点,每个触摸点的坐标全部显示到了LCD屏幕上。如果移动手指的话LCD上的触摸点坐标数据就会相应的变化。

页: [1]
查看完整版本: 【正点原子Linux连载】第二十八章多点电容触摸屏实验--摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南