基于飞思卡尔i.MX 6Quad Sabrelite开发板的触摸屏调试
1 概述
本次任务是在飞思卡尔i.MX 6Quqd Sabrelite开发板上调试触屏驱动,触屏芯片是Goodix的gt828芯片,触屏接口是I2C。
操作系统:android 4.0.4
内核版本:3.0.15
2 调试步骤
2.1 硬件连接
2.1.1 开发板硬件接口
开发板已提供独立的接口用于触屏,其示意图如下:
它提供了一组I2C,电源、地和一个GPIO口。
2.1.2 GT828硬件接口
触屏芯片GT828的硬件接口如下:
其中INT是中断脚,RESET是复位脚,另一个需要注意的是芯片电压是3.3V。
2.1.3 连接
熟悉了开发板和芯片的硬件接口后,下一步就是要把他们连接起来。
1) 首先是电源脚,因开发板触屏接口的电源是5V,而芯片电压是3.3V,所以要另找3.3V的电源跟芯片接上。
2) 连接I2C管脚,开发板的I2C本身已有4.7K的上拉电阻,所以不用再外接上拉电阻。
3) 把开发板的GPIO_9连到芯片的INT脚,用于控制中断。
4) 芯片的RESET需要一个GPIO来控制,但开发板的触屏接口的GPIO脚只有一个GPIO_9,所以另找一个GPIO脚来控制RESET。
连接方式如下:
1 VCC33 => 3.3V
2 GND => 接地
3 SDA => 6 I2C3_SDA
4 SCL => 5 I2C3_SCL
5 INT => 4 GPIO9
6 RESET => DISP0_CONTRAST
注:INT脚和RESET脚不用再外接上拉电阻。
2.2 驱动修改
1、 把厂家提供的驱动文件gt813_827_828.c和gt813_827_828.h文件放到内核目录Kernel_imx/drivers/input/touchscreen
2、 修改gt813_827_828.h头文件。
1) 修改宏开关:
#defineGTP_CHANGE_X2Y 1 //x,y坐标互换
#defineGTP_CREATE_WR_NODE 0 //不进行在线升级要设为0,否则编译不通过
#defineGTP_ICS_SLOT_REPORT 1 //android 4.0配置成slot方式上报坐标
2) 修改INT和RESET管脚定义
#define GTP_RST_PORT MX6Q_SABRELITE_TP_RST
#define GTP_INT_PORT MX6Q_SABRELITE_CAP_TCH_INT1
其中MX6Q_SABRELITE_TP_RST 和MX6Q_SABRELITE_CAP_TCH_INT1定义在arch/arm/plat-mxc/include/mach/sabrelite.h文件中:
#define MX6Q_SABRELITE_TP_RST IMX_GPIO_NR(2,0)
#define MX6Q_SABRELITE_CAP_TCH_INT1 IMX_GPIO_NR(1, 9)
这两个管脚的定义是怎么样来的呢?参考硬件连接:
5 INT => 4 GPIO9
6 RESET => DISP0_CONTRAST
首先看INT脚,连到CPU的GPIO9,我们在i.MX 6Quad的datasheet上搜索GPIO_9,找到IOMUXC_SW_MUX_CTL_PAD_GPIO09,它的MUX_MODE描述为:
MUX Mode Select Field.
Select 1 of 7 iomux modes to beused for pad: GPIO_9.
NOTE: Pad GPIO_9 is involved inDaisy Chain.
000 ALT0 — Select signalESAI_RX_FS.
- Configure registerIOMUXC_ESAI_RX_FS_SELECT_INPUT for mode ALT0.
001 ALT1 — Select signalWDOG1_B.
010 ALT2 — Select signalKEY_COL6.
- Configure registerIOMUXC_KEY_COL6_SELECT_INPUT for mode ALT2.
011 ALT3 — Select signalCCM_REF_EN_B.
100 ALT4 — Select signalPWM1_OUT.
101 ALT5 — Select signalGPIO1_IO09.
110 ALT6 — Select signal SD1_WP.
- Configureregister IOMUXC_USDHC1_WP_ON_SELECT_INPUT for mode ALT6.
ALT5模式为GPIO1_IO09,所以配置为IMX_GPIO_NR(1, 9),同理RESET脚配置为IMX_GPIO_NR(2, 0)。
3) 修改分辨率:
#ifGTP_CUSTOM_CFG
#define GTP_MAX_HEIGHT 800
#define GTP_MAX_WIDTH 480
#define GTP_INT_TRIGGER 1 //0:Falling 1:Rising
#else
//屏幕的分辨率
#define GTP_MAX_HEIGHT 6400
#define GTP_MAX_WIDTH 9600
#define GTP_INT_TRIGGER 1
#endif
4) 修改其他宏定义:
//#defineGTP_INT_CFG S3C_GPIO_SFN(0xF) //注释掉
#defineGTP_GPIO_AS_INPUT(pin) do{\
gpio_direction_input(pin);\
}while(0)
#defineGTP_GPIO_AS_INT(pin) do{\
gpio_direction_input(pin);\
}while(0)
3、 配置I2C信息
在arch/arm/mach-mx6/board-ma6q_sabrelite.c中找到mxc_i2c2_board_info,在里面添加:
I2C_BOARD_INFO("Goodix-TS",0x5d),
修改完成后,像这样:
staticstruct i2c_board_info mxc_i2c2_board_info[] __initdata = {
{
I2C_BOARD_INFO("egalax_ts",0x4),
.irq =gpio_to_irq(MX6Q_SABRELITE_CAP_TCH_INT1),
},
{ I2C_BOARD_INFO("Goodix-TS",0x5d),
},
};
再配置i2c速率为400kb:
static struct imxi2c_platform_data mx6q_sabrelite_i2c_data = {
.bitrate = 400000,
};
4、 编译。
1) 在touchcreen目录下的Makefile中添加:
obj-$(CONFIG_TOUCHSCREEN_GT828) += gt813_827_828.o
2) 在同目录下的Kconfig文件中添加以下内容:
configTOUCHSCREEN_GT828
tristate "GT828 touchscreen driver"
depends on I2C
help
Say Yhere to support GT828/813/827 touchscreen. Tocompile this driver as a module, choose M here: the
module will be called gt828_ts
3) 配置menuconfig
在kenel目录下执行:make menuconfig
进入配置界面,把gt828的驱动的开关打开,示意如下:
Device Drivers ->
Input device support ->
Touchscreens->
<*>GT828 touchscreen driver
4) 在kenel目录下执行make uImage进行编译,编译成功后生成uImage文件,紧接着在android源码目录下执行make bootimage生成boot.img文件
5) 把boot.img文件烧录到tf卡中,启动系统。
3 软件调试
1、 启动系统后,发现系统的串口打印有问题,只能用adb登陆后用dmesg命令查看内核消息,发现内核一直输出这样的log:
GTP-ERROR->>[339]I@C transfer error.errno:-110
表示i2c通讯有问题,检查了一下管脚,发现i2c的SDA和SCL互相调换了,再重新焊接,把sda和scl接好。
2、 重新启动系统,发现i2c仍然不能通讯,log如下:
<4><<-GTP-INFO->>[362]Datanot ready!
<4><<-GTP-INFO->>[362]Datanot ready!
<4><<-GTP-INFO->>[362]Datanot ready!
<4><<-GTP-INFO->>[362]Datanot ready!
这个错误是在触屏驱动的终端函数中产生的。继续查看log,返现dmesg的输出没有包含gt828驱动初始化函数的打印,因gt828的初始化函数会打印如下信息:
[ 4.192103] <<-GTP-FUNC->>[1108]Func:goodix_ts_probe
[ 4.197196] <<-GTP-DEBUG->>[1110]I2C addr:5d
[ 4.201501] <<-GTP-INFO->>[1113]GTP DriverVersion:V1.2<2012/06/08>
…
我怀疑是dmesg打印不完全,那么要看完整的内核log只能把开发板的串口输出问题解决了。
3、 经过无数次尝试,终于把开发板的串口输出问题解决,解决方法是修改u-boot的串口输出端口为ttymxc1,原来的端口是ttymxc0。
4、 重新启动系统,查看串口打印log,发现gt828的驱动初始化信息仍然没出来。经过数次尝试,发现在gt828的驱动加载函数把late_initcall修改为module_init即可,修改如下:
module(goodix_ts_init);
module_exit(goodix_ts_exit);
修改后,编译、启动系统,发现驱动初始化log如下:
<<-GTP-INFO->>[1278]GTPdriver install.
<<-GTP-DEBUG->>[973]I2Caddr:5d
<<-GTP-INFO->>[976]GTPDriver Version:V1.2<2012/06/08>
<<-GTP-INFO->>[977]GTPDriver build@11:21:04,Jun 18 2013
<<-GTP-DEBUG->>[637]len1=112,len2=0,len3=0
<<-GTP-DEBUG->>[655]SENSORID:0
<<-GTP-DEBUG->>[706]X_MAX= 800,Y_MAX = 1280,TRIGGER = 0x00
<<-GTP-DEBUG->>[837]INTtrigger type:0
<<-GTP-INFO->>[1046]GTPworks in interrupt mode.
<<-GTP-INFO->>[741]ICVERSION:00_0000
i2c-core: driver [isl29023] usinglegacy suspend method
i2c-core: driver [isl29023] usinglegacy resume method <<-GTP-INFO->>[362]Datanot ready!
<<-GTP-INFO->>[362]Datanot ready!
<<-GTP-INFO->>[362]Datanot ready!
<<-GTP-INFO->>[362]Datanot ready!
<<-GTP-INFO->>[362]Datanot ready!
从IC VERSION:00_0000可以判断i2c通讯不正常。
于是再次检查软件、硬件,经过n此尝试,确定软件是没问题的,硬件的RST、INT脚也工作正常,剩下的就可能是i2c硬件问题了。
果断换一个i2c口,把原来的i2c3改为i2c2。硬件改好后,在board-ma6q_sabrelite.c中找到mxc_i2c1_board_info,在里面添加:
I2C_BOARD_INFO("Goodix-TS",0x5d),
重新编译、烧录系统。
5、 启动系统后发现log正常,触屏工作正常,大功告成!
基于飞思卡尔i.MX 6Quad Sabrelite开发板的触摸屏调试的更多相关文章
- 恩智浦iMX6Q核心板/飞思卡尔Cortex-A9高稳定性低功耗开发板
iMX6Q核心板-商业级 iMX6Q-Plus核心板 iMX6DL核心板-商业级 iMX6Q核心板-工业级 iMX6核心板区别: 名称 主频 内存 存储 SATA接口 运行温度 引角扩展 iMX6Q核 ...
- 痞子衡嵌入式:飞思卡尔i.MX RT系列MCU开发那些事 - 索引
大家好,我是痞子衡,是正经搞技术的痞子.本系列痞子衡给大家介绍的是飞思卡尔i.MX RT系列微控制器相关知识. 飞思卡尔半导体(现恩智浦半导体)于2017年开始推出的i.MX RT系列开启了高性能MC ...
- 痞子衡嵌入式:飞思卡尔i.MX RT系列MCU特性介绍(4)- RT105x选型
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔i.MX RT系列MCU的RT105x选型. 大家都知道i.MX RT105x是i.MX RT系列第一款产品,在提这款产品特性的 ...
- 痞子衡嵌入式:飞思卡尔i.MX RTyyyy系列MCU硬件那些事(1)- 官方EVK简介
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔i.MX RTyyyy系列MCU的配套EVK板. 半导体设计厂商发布任何一块MCU芯片新品,一般都会同步推出基于这款MCU的配套 ...
- 痞子衡嵌入式:飞思卡尔i.MX RTyyyy系列MCU硬件那些事(2.2)- 在串行NOR Flash XIP调试原理
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔i.MX RTyyyy系列EVK在串行NOR Flash调试的原理. 本文是i.MXRT硬件那些事系列第二篇的续集,在第二篇首集 ...
- 痞子衡嵌入式:飞思卡尔i.MX RT系列MCU启动那些事(2)- Boot配置(BOOT Pin/eFUSE)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔i.MX RT系列MCU的Boot配置. 在上一篇文章 Boot简介 里痞子衡为大家介绍了Boot基本原理以及i.MXRT Bo ...
- 痞子衡嵌入式:飞思卡尔i.MX RTyyyy系列MCU硬件那些事(2.1)- 玩转板载OpenSDA,Freelink调试器
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔i.MX RTyyyy系列EVK上板载调试器的用法. 本文是i.MXRT硬件那些事系列第二篇,第一篇痞子衡给大家整体介绍了i.M ...
- 痞子衡嵌入式:飞思卡尔i.MX RTyyyy系列MCU启动那些事(2)- Boot配置(BOOT Pin/eFUSE)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔i.MX RTyyyy系列MCU的Boot配置. 在上一篇文章 Boot简介 里痞子衡为大家介绍了Boot基本原理以及i.MXR ...
- 痞子衡嵌入式:飞思卡尔i.MX RTyyyy系列MCU特性那些事(1)- 概览
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔i.MX RTyyyy系列MCU的基本特性. ARM Cortex-M微控制器芯片厂商向来竞争激烈,具体可参看我的另一篇文章&l ...
随机推荐
- C语言中给数组赋随机值
srand和rand两个函数配合可以产生伪随机数序列.rand函数在产生随机数前,需要系统提供的生成伪随机数序列的种子,rand根据这个种子的值产生一系列随机数.如果系统提供的种子没有变化,每次调用r ...
- QPointer更安全,QScopedPointer自动出范围就删除,QSharedDataPointer帮助实现隐式共享
http://blog.csdn.net/hai200501019/article/details/8474582http://blog.csdn.net/hai200501019/article/d ...
- duilib之源码分析
<duilib之源码分析>1 stdAfx.h * lengthof(x) 计算数组长度宏 * MAX 两值最大 * MIN 两值最小 * CLAMP(x,a,b) x在a,b之间则取 ...
- opencv分水岭算法对图像进行切割
先看效果 说明 使用分水岭算法对图像进行切割,设置一个标记图像能达到比較好的效果,还能防止过度切割. 1.这里首先对阈值化的二值图像进行腐蚀,去掉小的白色区域,得到图像的前景区域.并对前景区域用255 ...
- C语言数据结构----栈的定义及实现
本节主要说的是数据结构中的栈的基本定义和实现的方式,其中实现的方式采用的是复用顺序表和单向链表的方式. 一.栈的基本定义 1.栈是一种特殊的线性表,只能从固定的方向进出,而且栈进出的基本原则是:先进栈 ...
- NYOJ10,skiing
skiing 时间限制:3000 ms | 内存限制:65535 KB 难度:5 描写叙述 Michael喜欢滑雪百这并不奇怪, 由于滑雪的确非常刺激.但是为了获得速度,滑的区域必须向下倾斜,并且 ...
- Ch02 从零开始实例学习5
演练:添加模型 原文链接:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/adding-a-model ...
- poj 1564 Sum It Up | zoj 1711 | hdu 1548 (dfs + 剪枝 or 判重)
Sum It Up Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Sub ...
- 原码、反码、补码和移码事实上非常easy
近期在备战软考,复习到计算机组成原理的时候,看到书中关于原码.反码.补码和移码的定义例如以下(n是机器字长): 原码: 反码: 补码: 移码: 看完这些定义以后,我的脑袋瞬间膨胀到原来的二倍!这样变态 ...
- MongoDB系列之三(副本集配置)
今天我测试了一下MongoDB的副本集的配置. 首先从概念上说一下MongoDB副本集和主从复制的区别.其实副本集(Replica Set)是主从复制的高级形式.高级在哪里呢?主动复制实现了数据备份+ ...