MTK 平臺TP偵錯遇坑

2020-10-16 22:00:26

#前言

最近在偵錯我們專案上的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 24
  24: 011000100
 124: 00001010ffffffff

第一位是GPIO口模式
第二位是設定GPIO口方向
第三位是當前GPIO口電平

這裡看到GPIO口已經是拉高了,但是用萬用表測量電壓發現這個GPIO口電壓還是低電平。

PMU相關引腳

最後發現,這個電沒有開啟,然後我們開啟了這個電源,然後觸控就可以使用了。

最終排查到這個位置之前,我讓硬體把這個腳強制拉高測試了下,確實是因為這個電沒有導致觸控不了的。這更加堅信了是這個問題。

開啟電源

#推薦閱讀:

    專輯|Linux文章彙總

    專輯|程式人生

    專輯|C語言

嵌入式Linux

微信掃描二維條碼,關注我的公眾號