<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          MTK 平臺TP調(diào)試遇坑

          共 3579字,需瀏覽 8分鐘

           ·

          2020-10-14 11:16

          3d12e74a926b29a2f0e0b03babcfe500.webp

          #前言

          最近在調(diào)試我們項(xiàng)目上的TP驅(qū)動,奈何一直不能使用,而且這個(gè)項(xiàng)目的硬件確定是沒有問題的「這個(gè)是前提」,我們在軟件上提升了SDK基線,在之前的基線版本上軟件是沒有問題的。

          然后我就趕緊檢查了兩個(gè)方面

          • 確定TP的供電是不是正常的
          • 確定TP的使能腳和復(fù)位腳是不是正常的

          確認(rèn)后發(fā)現(xiàn)兩個(gè)都不正常,趕緊排查供電部分的代碼,供電出來了,用i2c-tool讀取寄存器還是失敗

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

          然后就看復(fù)位的代碼,發(fā)現(xiàn)復(fù)位的驅(qū)動代碼竟然找不到,既然這樣,我只好拿出絕招了,硬件強(qiáng)拉復(fù)位腳,這樣終于可以讀到值了。

          2|xxx:/?#?i2cget?-f?-y?0?0x14?0x80
          0x12
          #調(diào)試I2C注意什么?

          7bbb8282e8cd858f9284ebe4a24df89b.webp

          調(diào)試注意

          這里的總結(jié)在之前的文章應(yīng)該有提過,遇到調(diào)試I2C的同學(xué),可以從這幾個(gè)方面入手,有時(shí)候一上來就量波形,而不去看看電壓,方向是有點(diǎn)偏了。

          端口電壓是比較需要注意的,有一些芯片,只能支持3.3V,有的主控呢,特別是那些低功耗主控,GPIO口電壓只有1.8V,這個(gè)就是差別了。所以硬件上可能需要一個(gè)轉(zhuǎn)換電路,比較專業(yè)的人會叫他做分壓電路。

          #在驅(qū)動里面找不到控制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>;
          ?};

          但是在我們的觸摸驅(qū)動里面找不到這個(gè)該死的 int-gpiorst-gpio

          41512354e85f2976446018833e7fb80f.webp

          使用source insight查找關(guān)鍵字#看了下MTK的觸摸框架

          然后看了MTK平臺的觸摸框架,發(fā)現(xiàn)人家控制復(fù)位腳和使能腳就不是在TP的驅(qū)動里面干的。


          10fe6cf2ceea9ecc3febcf3eb9b4a20b.webp

          MTK平臺TP驅(qū)動框架

          aa57f368e46bf1f22886689db596fb96.webp

          驅(qū)動分工#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;
          }

          然后這部分也排查了后 我們又看了下,觸摸還是有問題

          從這里可以知道我們在驅(qū)動的dts里面配置的復(fù)位腳和使能腳壓根就沒有用上,純粹就是脫褲子放屁,因?yàn)閷︱?qū)動代碼不熟悉導(dǎo)致的低級問題,這種問題反正我經(jīng)常干了的。

          #繼續(xù)排查電源

          我們先判斷了GPIO口的狀態(tài)


          3fe0693cf99763332ae3a4da0b9c81d9.webp

          復(fù)位GPIO

          3a93da1c3b1a89f585b218430edaeb18.webp

          復(fù)位GPIO口
          xxx:/sys/devices/platform/soc/1000b000.pinctrl?#?cat?mt_gpio??|grep?24
          ??24:?011000100
          ?124:?00001010ffffffff

          第一位是GPIO口模式
          第二位是設(shè)置GPIO口方向
          第三位是當(dāng)前GPIO口電平

          這里看到GPIO口已經(jīng)是拉高了,但是用萬用表測量電壓發(fā)現(xiàn)這個(gè)GPIO口電壓還是低電平。


          13e61ab79580a74472a89f61d572e88c.webp

          PMU相關(guān)引腳

          最后發(fā)現(xiàn),這個(gè)電沒有打開,然后我們打開了這個(gè)電源,然后觸摸就可以使用了。

          最終排查到這個(gè)位置之前,我讓硬件把這個(gè)腳強(qiáng)制拉高測試了下,確實(shí)是因?yàn)檫@個(gè)電沒有導(dǎo)致觸摸不了的。這更加堅(jiān)信了是這個(gè)問題。


          5e73f8a6574be6fe37f0b24c6d5ddfbb.webp

          打開電源



          #推薦閱讀:? ??專輯|Linux文章匯總? ??專輯|程序人生? ??專輯|C語言
          339936b39e63d7e4e599028c54fe98e7.webp


          嵌入式Linux微信掃描二維碼,關(guān)注我的公眾號?
          瀏覽 103
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  日韩成人三级 | 中文字幕在线观看免费高清完整版在线 | 综合色青娱乐 | 亚洲日韩一中文字幕 | 日日夜夜大香蕉 |