大家好,又见面了,我是你们的朋友全栈君。
问题一:资源获取Gt911数据手册
在韦老师给的资料里,路径为\06_Datasheet\Extend_modules\7寸LCD模块\电容触控芯片GT911 Datasheet_121120(海威思.pdf
问题二:需要准备哪些知识
1.能够修改设备树
2.能够编写字符设备驱动
3.能够在linux下编写中断程序
4.能够在linux下编写IIC收发程序
5.了解input子系统
6.移植tslib(用于校准,测试触摸屏)
gt911硬件连接(韦老师的板子):
可以看到gt911只需要4个IO来控制
SDA:IIC数据线———–UART5_RXD
SCL:IIC时钟线———–UART5_TXD
RST:复位引脚———–SNVS_TAMPER2
INT:中断引脚————GPIO1_IO05
问题三:如何修改设备树
UART5_RXD和UART5_TXD引脚属于IIC2,在原厂的设备树中已经帮我们做好了IIC2的初始化,因此我们需要在i2c2节点下添加gt911设备
&i2c2 {
clock_frequency = <100000>;
pinctrl-names = “default”;
pinctrl-0 = <&pinctrl_i2c2>;
status = “okay”;
codec: wm8960@1a {
compatible = “wlf,wm8960”;
reg = <0x1a>;
clocks = <&clks IMX6UL_CLK_SAI2>;
clock-names = “mclk”;
wlf,shared-lrclk;
};
gt9xx@5d {
compatible = “goodix,gt9xx”;
reg = <0x5d>;
pinctrl-names = “default”;
pinctrl-0 = <&pinctrl_tsc_gt9xx>;
interrupt-parent = <&gpio1>;
interrupts = <5 IRQ_TYPE_EDGE_FALLING>;
reset-gpios = <&gpio5 2 GPIO_ACTIVE_LOW>;
irq-gpios = <&gpio1 5 GPIO_ACTIVE_LOW>;
irq-flags = <2>; /*1:rising 2: falling*/
/*7*/
goodix,cfg-group0 = [
00 20 03 E0 01 05 0D 00 01 08
28 0F 50 32 03 05 00 00 00 00
00 00 00 00 00 00 00 8A 2A 0C
45 47 0C 08 00 00 00 02 02 2D
00 00 00 00 00 03 64 32 00 00
00 28 64 94 C5 02 07 00 00 04
9C 2C 00 8F 34 00 84 3F 00 7C
4C 00 77 5B 00 77 00 00 00 00
00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00
00 00 18 16 14 12 10 0E 0C 0A
08 06 04 02 FF FF 00 00 00 00
00 00 00 00 00 00 00 00 00 00
00 00 16 18 1C 1D 1E 1F 20 21
22 24 13 12 10 0F 0A 08 06 04
02 00 FF FF FF FF FF FF 00 00
00 00 00 00 00 00 00 00 00 00
00 00 00 00 24 01
];
status = “okay”;
};
reg:IIC从设备地址
pinctrl-0:使用的引脚(中断引脚和复位引脚)
goodix,cfg-group0:gt911需要配置的寄存器的默认值
然后我们还需要在设备树中添中断引脚的复位引脚
在iomux节点下添加以下内容
pinctrl_tsc_gt9xx: gt9xx_tscgrp {
fsl,pins = <
MX6ULL_PAD_SNVS_TAMPER2__GPIO5_IO02 0x10B0
MX6UL_PAD_GPIO1_IO05__GPIO1_IO05 0x10B0
>;
};
其中中断引脚和复位引脚都配置为上拉模式
问题四:gt911初始化流程
gt911地址配置
gt911地址可以配置为0x28和0xBA
这里我们选择0xBA地址,因此上电时序为
INT=0
RST=0
延时10ms
RST=1
延时10ms
依据手册,还有一步是要将INT脚转为悬浮输入态
由于linux的IIC地址在低7位,因此gt911的实际地址是0xBA>1=0x5d,这就是为什么我们在设备树中将GT911的地址配置为0x5d
gt911需要配置的寄存器
gt911需要配置186个寄存器,分别为0x8047-0x8100
在配置流程为
软件复位
配置寄存器0x8047-0x8100
结束软件复位
其中软件复位由0x8040寄存器控制:
写入 2 即可复位 GT911,在硬复位之后,一般要往该寄存器写 2 实行软复位。然后写入 0,即可正常读取坐标数据(并且会结束软复位)。
0x8047-0x8100寄存器中以下寄存器比较重要
这里共186个寄存器,用于配置GT9147的各个参数,这些配置一般由厂家提供给我们(一个数组),所以我们只需要将厂家给我们的配置,写入到寄存器中即可。
3.初始化中断
寄存器配置过后我们需要将INT引脚初始化为中断模式,下降沿触发。
4.读取坐标
坐标寄存器地址为0x8140-0x8177
0x8140~0x8143 是产品ID寄存器,用于保存产品ID,对于GT9147,这4个寄存器读出来是:9、1、4、7四个字符(ASCII码格式)。一次可以通过这四个寄存器的值来判断驱动IC的型号,从而判断是OTT2001A还是GT9147,以便执行不同的初始化。
其中0x814E (状态寄存器) 比较重要,
我们仅关心最高位和最低四位,最高位用于表示buffer状态,如果有数据(坐标/按键),buffer就会是1,最低四位用于表示有效触点的个数,范围是:0~5,0表示没有触摸,5表示有5点触摸。
当中断发生时我们需要读取这个寄存器的值,bit7告诉我们是否可以读取,当我们读取完成之后还要将bit7清零,否则中断一直触发。
0x814F-0x8177(共30个寄存器)为坐标点,读取相应的寄存器即可获取坐标。
这里共分成5组(5个点),每组6个寄存器存储数据,以触点1的坐标数据寄存器组为例,一般只用到触点的x,y坐标,所以只需要读取0x8150~0x8153的数据,组合即可得到触点坐标。其他4组分别是:0x8158 0x8160 0x8168 和0x8171等开头的16个寄存器组成,分别针对触点2~4的坐标。同样GT9147也支持寄存器地址自增,只需要发送寄存器的首地址,然后连续读取即可,GT9147会地址自增,从而提高读取速度。
结语:其实网上由gt911的官方库,可以很方便的移植,但是由于这个驱动相对简单,所以自己写收获会更多。
参考于:http://bbs.100ask.net/article/35
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/149245.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...