MTK 平台TP调试遇坑

嵌入式Linux

共 3579字,需浏览 8分钟

 ·

2020-10-14 11:16

3d12e74a926b29a2f0e0b03babcfe500.webp

#前言

最近在调试我们项目上的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注意什么?

7bbb8282e8cd858f9284ebe4a24df89b.webp

调试注意

这里的总结在之前的文章应该有提过,遇到调试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

41512354e85f2976446018833e7fb80f.webp

使用source insight查找关键字#看了下MTK的触摸框架

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


10fe6cf2ceea9ecc3febcf3eb9b4a20b.webp

MTK平台TP驱动框架

aa57f368e46bf1f22886689db596fb96.webp

驱动分工#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口的状态


3fe0693cf99763332ae3a4da0b9c81d9.webp

复位GPIO

3a93da1c3b1a89f585b218430edaeb18.webp

复位GPIO口
xxx:/sys/devices/platform/soc/1000b000.pinctrl # cat mt_gpio  |grep 24
  24: 011000100
 124: 00001010ffffffff

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

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


13e61ab79580a74472a89f61d572e88c.webp

PMU相关引脚

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

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


5e73f8a6574be6fe37f0b24c6d5ddfbb.webp

打开电源



#推荐阅读:    专辑|Linux文章汇总    专辑|程序人生    专辑|C语言
339936b39e63d7e4e599028c54fe98e7.webp


嵌入式Linux微信扫描二维码,关注我的公众号 
浏览 30
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报