#前言

最近在调试我们项目上的TP驱动,奈何一直不能使用,而且这个项目的硬件确定是没有问题的「这个是前提」,我们在软件上提升了SDK基线,在之前的基线版本上软件是没有问题的。

然后我就赶紧检查了两个方面

  • 确定TP的供电是不是正常的

  • 确定TP的使能脚和复位脚是不是正常的

确认后发现两个都不正常,赶紧排查供电部分的代码,供电出来了,用i2c-tool读取寄存器还是失败

2|xxxx:/ # i2cget -f -y 0 0x14 0x80
Error: Read failed

然后就看复位的代码,发现复位的驱动代码竟然找不到,既然这样,我只好拿出绝招了,硬件强拉复位脚,这样终于可以读到值了。

2|xxx:/ # i2cget -f -y 0 0x14 0x80
0x12

#调试I2C注意什么?

调试注意

这里的总结在之前的文章应该有提过,遇到调试I2C的同学,可以从这几个方面入手,有时候一上来就量波形,而不去看看电压,方向是有点偏了

端口电压是比较需要注意的,有一些芯片,只能支持3.3V,有的主控呢,特别是那些低功耗主控,GPIO口电压只有1.8V,这个就是差别了。所以硬件上可能需要一个转换电路,比较专业的人会叫他做分压电路。

#在驱动里面找不到控制reset脚的代码

我们的dts代码是这样写的

 cap_touch@14 {compatible = "mediatek,cap_touch";reg = <0x14>;interrupt-parent = <&pio>;interrupts = <25 IRQ_TYPE_EDGE_FALLING>;int-gpio = <&pio 25 0>;rst-gpio = <&pio 24 0>;};

但是在我们的触摸驱动里面找不到这个该死的 int-gpiorst-gpio

使用source insight查找关键字

#看了下MTK的触摸框架

然后看了MTK平台的触摸框架,发现人家控制复位脚和使能脚就不是在TP的驱动里面干的。

MTK平台TP驱动框架

驱动分工

#mtk-tpd.c 里面控制GPIO的代码

#dts代码

&touch {vtouch-supply = <&mt6392_vgp1_reg>;tpd-resolution = <720 1280>;use-tpd-button = <0>;tpd-key-num = <4>;tpd-key-local= <139 172 158 0>;tpd-key-dim-local = <60 850 50 30 180 850 50 30 300 850 50 30 420 850 50 30>;tpd-max-touch-num = <5>;tpd-filter-enable = <1>;tpd-filter-pixel-density = <124>;tpd-filter-custom-prameters = <0 0 0 0 0 0 0 0 0 0 0 0>;tpd-filter-custom-speed = <0 0 0>;pinctrl-names = "default", "state_eint_as_int", "state_eint_output0", "state_eint_output1","state_rst_output0", "state_rst_output1";pinctrl-0 = <&CTP_pins_default>;pinctrl-1 = <&CTP_pins_eint_as_int>;pinctrl-2 = <&CTP_pins_eint_output0>;pinctrl-3 = <&CTP_pins_eint_output1>;pinctrl-4 = <&CTP_pins_rst_output0>;pinctrl-5 = <&CTP_pins_rst_output1>;status = "okay";
};

#c代码

int tpd_get_gpio_info(struct platform_device *pdev)
{int ret;TPD_DEBUG("[tpd %d] mt_tpd_pinctrl+++++++++++++++++\n", pdev->id);
pr_err("Lomen 0.1\n");pinctrl1 = devm_pinctrl_get(&pdev->dev);if (IS_ERR(pinctrl1)) {ret = PTR_ERR(pinctrl1);dev_err(&pdev->dev, "fwq Cannot find touch pinctrl1!\n");return ret;}
pr_err("Lomen 0.2\n");pins_default = pinctrl_lookup_state(pinctrl1, "default");if (IS_ERR(pins_default)) {ret = PTR_ERR(pins_default);dev_err(&pdev->dev, "fwq Cannot find touch pinctrl default %d!\n", ret);}eint_as_int = pinctrl_lookup_state(pinctrl1, "state_eint_as_int");if (IS_ERR(eint_as_int)) {ret = PTR_ERR(eint_as_int);dev_err(&pdev->dev, "fwq Cannot find touch pinctrl state_eint_as_int!\n");return ret;}eint_output0 = pinctrl_lookup_state(pinctrl1, "state_eint_output0");if (IS_ERR(eint_output0)) {ret = PTR_ERR(eint_output0);dev_err(&pdev->dev, "fwq Cannot find touch pinctrl state_eint_output0!\n");return ret;}eint_output1 = pinctrl_lookup_state(pinctrl1, "state_eint_output1");if (IS_ERR(eint_output1)) {ret = PTR_ERR(eint_output1);dev_err(&pdev->dev, "fwq Cannot find touch pinctrl state_eint_output1!\n");return ret;}if (tpd_dts_data.tpd_use_ext_gpio == false) {rst_output0 = pinctrl_lookup_state(pinctrl1, "state_rst_output0");if (IS_ERR(rst_output0)) {ret = PTR_ERR(rst_output0);dev_err(&pdev->dev, "fwq Cannot find touch pinctrl state_rst_output0!\n");return ret;}rst_output1 = pinctrl_lookup_state(pinctrl1, "state_rst_output1");if (IS_ERR(rst_output1)) {ret = PTR_ERR(rst_output1);dev_err(&pdev->dev, "fwq Cannot find touch pinctrl state_rst_output1!\n");return ret;}}TPD_DEBUG("[tpd%d] mt_tpd_pinctrl----------\n", pdev->id);return 0;
}

然后这部分也排查了后 我们又看了下,触摸还是有问题

从这里可以知道我们在驱动的dts里面配置的复位脚和使能脚压根就没有用上,纯粹就是脱裤子放屁,因为对驱动代码不熟悉导致的低级问题,这种问题反正我经常干了的。

#继续排查电源

我们先判断了GPIO口的状态

复位GPIO

复位GPIO口

xxx:/sys/devices/platform/soc/1000b000.pinctrl # cat mt_gpio  |grep 2424: 011000100124: 00001010ffffffff

第一位是GPIO口模式
第二位是设置GPIO口方向
第三位是当前GPIO口电平

这里看到GPIO口已经是拉高了,但是用万用表测量电压发现这个GPIO口电压还是低电平。

PMU相关引脚

最后发现,这个电没有打开,然后我们打开了这个电源,然后触摸就可以使用了。

最终排查到这个位置之前,我让硬件把这个脚强制拉高测试了下,确实是因为这个电没有导致触摸不了的。这更加坚信了是这个问题。

打开电源

#推荐阅读:

专辑|Linux文章汇总

专辑|程序人生

专辑|C语言

嵌入式Linux

微信扫描二维码,关注我的公众号 

MTK 平台TP调试遇坑相关推荐

  1. MTK |Android KKL 平台TP调试

    MTK Android KK&L 平台TP调试 一. 简介 二. 硬件电路 三. 添加TP的简单流程(以GT9XX为例) 3.1首先在Projecconfig.mk定义的TP宏控 3.2如果是 ...

  2. MTK平台TP驱动框架解析

    一,TP驱动代码的组成 MTK平台TP驱动主要包括两处文件: 1,kernel-3.18\drivers\input\touchscreen\mediatek\mtk_tpd.c 平台设备驱动,主要为 ...

  3. MTK平台驱动调试的资料

    最近要从事MTK6260平台方面的开发工作.工作内容包括BSP调试及部分功能的代码移植.之前没有接触过这类工作内容,所以在网上查找了一些资料,并添加到自己的博客上,方便自己查找. 以下为其他人的资料: ...

  4. 我在MTK平台下调试音频ALSA

    #前言 前言我就随便写了,因为是项目的需要,我需要在我们的MTK8167S平台上面调试音频.包括录音和播放. #硬件原理图 因为是我们公司的项目,我就不能把完整的原理图给出来.因为两个MIC不涉及机密 ...

  5. MTK平台充电调试总结

    摘要:调试电池的充放电管理,首先需要深入了解锂电池的电池原理和特点,充放电特性以及基本的电池安全问题.然后需要对MTK的电池管理驱动程序有深入的了解,理解电池充放电算法的基本原理.在此基础上,对充放电 ...

  6. android平台TP调试无法正常使用问题

    首先RST内部上拉,外部应该取消上拉,INT对地电容会影响到I2C通讯成功,I2C正常不该增加对地电容,I2C可以正常通讯,但是会使上升沿变缓慢,影响到Trise导致TP无法正常工作

  7. MTK65XX平台充电调试总结

    MTK平台充电调试总结 摘要:调试电池的充放电管理,首先需要深入了解锂电池的电池原理和特点,充放电特性以及基本的电池安全问题.然后需要对MTK的电池管理驱动程序有深入的了解,理解电池充放电算法的基本原 ...

  8. QualcommMTK平台lcd/tp调试及问题总结(一)----背光

    Qualcomm&MTK平台lcd/tp调试及问题总结 LCD原理结构 LCD背光板 下偏光板 薄膜基板(TFT) 液晶 彩色滤光片 上偏光片 原理 视图如下 高通平台 lk启动方式下(主要安 ...

  9. 《TP基础篇——MTK平台》

    日期:2015.08.06 导言:在MTK平台的TP驱动调试里,最最基础的不是了解它的原理是怎么实现的,而是如何在这个平台上添加一个新的TP驱动代码. 一. 如何在MTK平台上添加一个新的TP驱动   ...

最新文章

  1. sql insert and update
  2. mdadm,用命令做RAID
  3. ASP长文章内容自动分页函数
  4. 第一站---大连---看海之旅
  5. 实现远程连接MySQL
  6. Linux 下的进程间通信:管道、消息队列、共享文件、共享内存
  7. Lc695-岛屿的最大面积
  8. 【笔记】定积分的近似计算
  9. 计算机怎么开启tftp服务器,win7电脑如何开启tftp服务器 电脑开启tftp服务器操作方法...
  10. 什么软件可以在给多个视频添加马赛克同时批量裁剪画面呢?
  11. 超好用的图床-生成图片在线链接
  12. java-nio网络编程
  13. python结构方程模型_SEM结构方程模型分析的数据需要至少多少样本量
  14. 力扣题库63-不同路径II(C语言)
  15. opencv如何把一个矩阵不同列分离开_【opencv基础】OpenCV从Mat中提取某些行或列
  16. 苹果企业签名独立、非独立什么意思?
  17. 【C#】Whisper 离线语音识别(微软晓晓语音合成的音频)(带时间戳、srt字幕)...
  18. 硬盘知识:硬盘中蓝盘、绿盘、黑盘、红盘有什么区别?
  19. 微信聊天记录服务器端口是什么意思,微信端口异常是什么意思?
  20. Elixir GenServer

热门文章

  1. 台式计算机的配置清单表格,电脑配置清单表格,为你分别介绍不同价位的三种配置清单...
  2. 制作绿色软件 不在控制面板软件卸载中显示
  3. Android WebView点击返回键回到上一个html
  4. 在微信小程序中怎么让一个页面的信息传递到另一个页面
  5. 2020-03-10
  6. 【论文阅读】SyncPerf: Categorizing, Detecting, and Diagnosing Synchronization Performance Bugs
  7. 2019网易互娱8.9笔试
  8. SVN Working copying #39;xxxxx/xxxx/xxxx#39; locked
  9. java迷宫鼠_C++ 迷宫算法(迷宫老鼠)
  10. 软件分享之浏览器部分