悠然此心 發表於 2019-5-8 11:46:00

goodix gt911 在 Android 开发板上的适配流程

<p>2019-05-08</p>
<p>关键词:rk3128触摸屏适配、goodix gt911&nbsp;适配、goodix&nbsp;gt9xx&nbsp;触摸屏适配、gt9xx.c、rk平台触摸屏适配</p>
<blockquote>
<p>本篇文章记录了笔者在运行着 Android 4.4 的 rk3128 开发板上适配 goodix gt911 触摸屏的过程。</p>
</blockquote>
<hr>
<h2>1、GT911 触摸屏简介</h2>
<p>&nbsp;</p>
<p>这款触摸屏是分辨率为 1024*600 的横向式电容触摸屏。</p>
<p>&nbsp;</p>
<p>它的接口类型为 I2C ,供电电压和通讯电压均为 3.3V 。这款触摸屏内置了上拉电阻,这意味着我们的开发板上与该触摸屏的接口处不需要设置上拉电阻。</p>
<p>&nbsp;</p>
<p>关于线序,同样是 GT911 ,不同批次的器件都有不同的线序。具体的要自行与厂家确认。这里我们必须要注意,即使是厂家发给我们的规格书,也有可能是错误的!当我们遇到莫名其妙的问题时,就得怀疑是否厂家给错资料了。</p>
<p>&nbsp;</p>
<h2>2、DTS 配置</h2>
<p>&nbsp;</p>
<p>dts 文件配置这边配置的主要是 CPU 与触摸屏之间 I2C 通信的信息。那这里就必须得查看您的开发板原理图,看看与触摸屏相连的 I2C 是接到 CPU 的哪块 I2C 模块里。笔者这边是接到了 rk3128 的 I2C2 里,如下原理图所示</p>
<p style="text-align: center"><img src="https://img2018.cnblogs.com/blog/1146198/201905/1146198-20190508102415675-1102100040.png"></p>
<p>那这里,直接在您使用到的 dts 中作如下配置即可</p>
<div class="cnblogs_code">
<pre>&amp;<span style="color: rgba(0, 0, 0, 1)">i2c2 {
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> touch pannel</span>
    status = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">okay</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
    ts@5d {
      compatible </span>= <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">goodix,gt9xx</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
      reg </span>= &lt;<span style="color: rgba(128, 0, 128, 1)">0x5d</span>&gt;<span style="color: rgba(0, 0, 0, 1)">;
      irq</span>-gpio = &lt;&amp;gpio1 GPIO_B0 IRQ_TYPE_LEVEL_LOW&gt;<span style="color: rgba(0, 0, 0, 1)">;   
      rst</span>-gpio = &lt;&amp;gpio0 GPIO_D1 GPIO_ACTIVE_HIGH&gt;<span style="color: rgba(0, 0, 0, 1)">;   
      pwr</span>-gpio = &lt;&amp;gpio1 GPIO_A4 GPIO_ACTIVE_HIGH&gt;<span style="color: rgba(0, 0, 0, 1)">;
      max</span>-x = &lt;<span style="color: rgba(128, 0, 128, 1)">1024</span>&gt;<span style="color: rgba(0, 0, 0, 1)">;
      max</span>-y = &lt;<span style="color: rgba(128, 0, 128, 1)">600</span>&gt;<span style="color: rgba(0, 0, 0, 1)">;
      gt</span>-type = &lt;<span style="color: rgba(128, 0, 128, 1)">911</span>&gt;<span style="color: rgba(0, 0, 0, 1)">;
    };

};</span></pre>
</div>
<p>这里来简单解释一下上面的配置信息。</p>
<p>&nbsp;</p>
<p>compatible 照着填就好了。</p>
<p>&nbsp;</p>
<p>reg 是 I2C 通信地址。这个地址是固定的,百度一下 goodix gt911 的 datasheet 里能看到它的地址。要么填 0x14 要么填 0x5d 。</p>
<p>&nbsp;</p>
<p>接下来三个 irq-gpio , rst-gpio , pwr-gpio 也是对照着原理图来填即可。</p>
<p>&nbsp;</p>
<p>再下面两个 max-x , max-y 就是分辨率了。</p>
<p>&nbsp;</p>
<p>最后一个 gt-type 填的是触摸屏型号。这个型号是用于后面驱动用来区分触摸屏类型进而加载不同的配置程序用的。</p>
<p>&nbsp;</p>
<h2>3、驱动文件配置</h2>
<p>&nbsp;</p>
<p>驱动相关的文件主要的就 3 个文件</p>
<p style="margin-left: 30px">1、gt9xx.c</p>
<p style="margin-left: 30px">2、gt9xx.h</p>
<p style="margin-left: 30px">3、cfg 文件</p>
<p>&nbsp;</p>
<p>当然这些文件的根源都来自于触摸屏厂家,不过笔者这边已经修改了一下这些文件,使其更符合笔者这边的情况。文末会附上这些文件以及部分相关参考资料。</p>
<p>&nbsp;</p>
<h4>1、gt9xx.c</h4>
<p>我们首先来看一下这个这个 gt9xx.c 文件。这里需要再次声明,<strong>下面所分析的代码是经过笔者这边修改过的代码</strong>。它的入口函数可以认为就是</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">int</span> goodix_ts_probe(<span style="color: rgba(0, 0, 255, 1)">struct</span> i2c_client *client, <span style="color: rgba(0, 0, 255, 1)">const</span> <span style="color: rgba(0, 0, 255, 1)">struct</span> i2c_device_id *id)</pre>
</div>
<p>在这个函数中,可以看到读取了前面 dts 中配置的信息</p>
<p style="text-align: center"><img src="https://img2018.cnblogs.com/blog/1146198/201905/1146198-20190508104928175-1972659483.png"></p>
<p style="text-align: center"><img src="https://img2018.cnblogs.com/blog/1146198/201905/1146198-20190508104950441-278118595.png"></p>
<p>从上面代码我们就知道,前面 dts 中的配置名,必须要与这份代码里的一致,不然会导致读不出配置信息来的。</p>
<p>&nbsp;</p>
<p>关于这份 C 代码,需要注意的也就这一点了。</p>
<p>&nbsp;</p>
<p>还有就是可以关注一下 gt9xx.h 文件。</p>
<p>&nbsp;</p>
<p>头文件里有几个宏,是关乎调试打印的,在我们适配过程中打开这些打印可以帮助我们定位一些问题。</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">#define</span> DEBUG_SWITCH 0
<span style="color: rgba(0, 0, 255, 1)">#define</span> GTP_DEBUG_ON          0
<span style="color: rgba(0, 0, 255, 1)">#define</span> GTP_DEBUG_FUNC_ON   0</pre>
</div>
<p>这几个打印默认都是关闭的,可以将它们置 1 打开。</p>
<p>&nbsp;</p>
<h4>2、cfg 文件</h4>
<p>cfg 文件是触摸屏的初始化指令,它在上电后由 CPU 将这些指令通过 I2C 写到触摸屏的芯片中。笔者这边提供的文件名称是 " 6399_GT911_04.cfg " 也会一并在文末附上下载链接。</p>
<p>&nbsp;</p>
<p>这份 cfg 文件是在 gt9xx.h 中配置的。</p>
<p style="text-align: center"><img src="https://img2018.cnblogs.com/blog/1146198/201905/1146198-20190508105942189-897937313.png"></p>
<p>在这份头文件中还有好几处地方可以填写这些 cfg 文件,而驱动程序具体引用了哪一份数组,您可以自行查看 gt9xx.c 确定。笔者这边使用的就是上图所示的 gtp_dat_gt11 数组。</p>
<p>&nbsp;</p>
<h4>3、驱动移植</h4>
<p>将我附件中的 gt9xx 目录整个拷贝到以下目录</p>
<div class="cnblogs_code">
<pre>./kernel/drivers/input/touchscreen</pre>
</div>
<p>&nbsp;</p>
<p>然后修改 touchscreen 目录下的 Makefile 文件。</p>
<p>&nbsp;</p>
<p>这个 Makefile 中定义的就是要编译哪个平台的触摸屏驱动的。笔者这边因为总共就只适配一种触摸屏,即 goodix gt911 的。所以直接将这份 Makefile 中的 obj-y 修改为如下形式的</p>
<div class="cnblogs_code">
<pre>obj-y += gt9xx/</pre>
</div>
<p>&nbsp;</p>
<p>基本上,做到这一步以后,就可以直接编译的了。</p>
<p>&nbsp;</p>
<h2>4、调试&nbsp;</h2>
<p>&nbsp;</p>
<p>调试首先可以看上电时的内核打印日志。和触摸屏相关的打印都是以下列关键字开头的</p>
<div class="cnblogs_code">
<pre>&lt;&lt;-GTP-INFO-&gt;&gt;
&lt;&lt;-GTP-DEBUG-&gt;&gt;
&lt;&lt;-GTP-ERROR-&gt;&gt;</pre>
</div>
<p>您介时留心一下看是否有错误信息。</p>
<p>&nbsp;</p>
<p>另一种查看工作状态的方式是看中断统计信息</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">cat</span> /proc/interrupts</pre>
</div>
<p>驱动顺利加载的话,可以看到列出来的信息里有</p>
<p style="margin-left: 30px">1、i2c2</p>
<p style="margin-left: 30px">2、gt9xx</p>
<p>的统计信息。这些信息记录的就是这些中断发生的次数,通常我们与触摸屏交互,都能产生好多次中断的。</p>
<p>&nbsp;</p>
<p>还有一种方式是查看触摸屏驱动在 proc 中注册的信息</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">cat</span> /proc/gt9xx_config</pre>
</div>
<p>这条指令会列出两段指令信息。</p>
<p>&nbsp;</p>
<p>第 2 段指令即是从触摸屏芯片中读出来的值,如果读出来的值是全 0 ,那么说明 I2C 通信不成功,我们所配置的 cfg 没有写入到触摸屏中。</p>
<p>&nbsp;</p>
<hr>
<p>&nbsp;</p>
<p>附件:&nbsp;</p>
<p style="margin-left: 30px">链接:https://pan.baidu.com/s/1N4uYEbZ6H6ktSy4c_lxBaw&nbsp; &nbsp; &nbsp;提取码:44mo&nbsp;</p>

</div>
<div id="MySignature" role="contentinfo">
    +++<br><br>
来源:https://www.cnblogs.com/chorm590/p/rk3128_201904261912.html
頁: [1]
查看完整版本: goodix gt911 在 Android 开发板上的适配流程