最近在调试我们项目上的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的同学,可以从这几个方面入手,有时候一上来就量波形,而不去看看电压,方向是有点偏了。
端口电压是比较需要注意的,有一些芯片,只能支持3.3V,有的主控呢,特别是那些低功耗主控,GPIO口电压只有1.8V,这个就是差别了。所以硬件上可能需要一个转换电路,比较专业的人会叫他做分压电路。
我们的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-gpio
和 rst-gpio
。
然后看了MTK平台的触摸框架,发现人家控制复位脚和使能脚就不是在TP的驱动里面干的。
#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口的状态
xxx:/sys/devices/platform/soc/1000b000.pinctrl # cat mt_gpio |grep 24
24: 011000100
124: 00001010ffffffff
第一位是GPIO口模式
第二位是设置GPIO口方向
第三位是当前GPIO口电平
这里看到GPIO口已经是拉高了,但是用万用表测量电压
发现这个GPIO口电压还是低电平。
最后发现,这个电没有打开,然后我们打开了这个电源,然后触摸就可以使用了。
最终排查到这个位置之前,我让硬件把这个脚强制拉高测试了下,确实是因为这个电没有导致触摸不了的。这更加坚信了是这个问题。
#推荐阅读:
嵌入式Linux
微信扫描二维码,关注我的公众号
文章浏览阅读120次。.gitignore 配置文件用于配置不需要加入版本管理的文件,配置好该文件可以为我们的版本管理带来很大的便利,以下是个人对于配置 .gitignore 的一些心得。..._.gitignore文件配置!pom.xml什么意思
文章浏览阅读1.1k次。本项目为meaven项目。第一步:pom文件添加依赖` <dependency> <groupId>cn.jpush.api</groupId> <artifactId>jpush-client</artifactId> <version>3.3.12</ve..._cn.jpush.apijpush-client
文章浏览阅读1.7k次,点赞2次,收藏8次。 在研究CPU相关内容的时候,可以潜在地把存储当做一个简单的顺序存储器(类似一个大数组),CPU可以在常数时间里访问存储器的数据。但是实际上存储系统并不是这么简单的模型。存储器结构 实际的存储器模型可以形象的表示为金字塔结构(图片来自深入理解计算机系统,很好的书,值得一读)。每个上一层存储......_计算机系统的多级缓存
文章浏览阅读297次。Java关键字学习关键字的定义就是在java语言编程的时候,在关键的地方使用的单词,体现关键的地方的含义,这些单词都是特有的,事先定义好的。关键字的定义和特点定义:被java赋予了特殊含义,用做专门用途的单词。特点:关键字中所有字母都为小写用于定义数据类型的关键字名词名词解释class引用数据类型----类interface引用数据类型----..._java文字学习
文章浏览阅读1.7k次。导语: 看到这个题目大家可能不太清楚吧,现在随着科技技术的进步和大范围的普及,普通大众也渐渐掌握了各种新技术。对于手机换系统,大家应该都听说过,网上经常能够看到某某大神把 苹果 手机的 ios 系统刷成了安卓系统,把 小米 系统改成了苹果系统等等。而我们今天所要说的 ubuntu 手机系统安装也是这个原理,就是在我们手机上安装该系统。下面小编就来为大家介绍一下 ubuntu手机系统的安装教程 吧。...
文章浏览阅读2.2k次。Java应用(从applets的小范围到全套n层服务端企业应用)是一种典型的依赖型应用,它就是由一些互相适当地协作的对象构成的。因此,我们说这些对象间存在依赖关系。加入A组件调用了B组件的方法,我们就可以称A组件依赖于B组件。我们通过使用依赖注入,Java EE应用中的各种组件不需要以硬编码方式耦合在一起,甚至无需使用工厂模式。当某个Java 实例需要其他Java 实例时,系统自动提供所需要的
文章浏览阅读1w次。数据网格(datagrid)是一个使用频繁的组件,在开发列表功能的时候都会用到,它有两种绑定数据的属性url和data。url是一个url链接,通过发送请求,返回需要的数据,这里强调的是一个数据格式,并不是返回什么样的数据都能显示。{total:'',rows:[{},{}]}total是总数表示总共有多少行数据,rows是那一页要显示的数据内容。data的数据格式如下,这个实际开发过程中很少用。d_datagrid url参数
文章浏览阅读422次。我必须要说,Spark这个框架出现之前,我对很多大数据领域的框架源码甚至都是嗤之以鼻的。很多小伙伴在群里或者私信留言问我关于Spark的学习路径问题。Spark发展至今,应该说已经非常成熟..._王知无 spark
文章浏览阅读2.3k次。OpenResty概念讲解OpenResty介绍OpenResty 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。OpenResty 通过汇聚各种设计精良的 Nginx 模块(主要由 OpenResty 团队自主开..._openrestr原理图
文章浏览阅读284次。读取dev.txt,cli.txt的内容,通过多并发进行连接linux服务器完成操控命令的执行,多用于运维或者开发管理多台服务器,基本相同的操作,通过这个代码就是可以完成操作linux以及多命令的执行事项。cli.txt文件内容:--linux命令行,都是存放在这里。备注:运行上述代码的方法,在所在程序的目录下命令行下运行。dev.txt--服务器信息。#init mod的初始方式。sshv2.go文件。_golang 交换机运维
文章浏览阅读1.9w次,点赞6次,收藏24次。转载地址:http://www.cnblogs.com/chenpi/p/5377445.html当我们运行java程序时,发现程序不动,但又不知道是哪里出问题时,可以使用JDK自带的jstack工具去定位;废话不说,直接上例子吧,在window平台上的;死循环写个死循环的程序如下:package concurrency;public class Test _javacore 死循环
文章浏览阅读5.1k次,点赞5次,收藏51次。NodeJs篇一、下载安装nodeJS1、下载地址官方网址 NodeJs2、下载完成后,双击“node-v11.5.0-x64.msi”,开始安装Node.js,一路next,注意:安装目录看自己需求,本人安装在D:\nodejs目录下3、测试键盘按下【win+R】键,输入cmd 回车输入命令node -v 和 npm -v注意:新版的nodejs自带npm,可以理解npm就是对nodejs进行包管理,用于卸载和安装nodejs需要的东西4、在安装目录文件夹下创建node_cac_前端开发环境搭建