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

最近在調(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注意什么?
這里的總結(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-gpio 和 rst-gpio 。

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


#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)常干了的。
我們先判斷了GPIO口的狀態(tài)


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口電壓還是低電平。

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


