主芯片:v3s
主线linux内核4.13.16
由于主线已经自带了这个芯片的驱动了
打开这个驱动
添加设备树
ft6x06@38 {
compatible = "focaltech,ft6236";
reg = <0x38>;
interrupt-parent = <&pio>;
interrupts = <1 5 IRQ_TYPE_EDGE_FALLING>;/*
irq-gpios = <&pio 1 5 GPIO_ACTIVE_HIGH>;*/
reset-gpios = <&pio 1 3 GPIO_ACTIVE_LOW>;
touchscreen-size-x = <480>;
touchscreen-size-y = <272>;
};
现在遇到情况是,触摸能用,设备驱动也是有的
使用evtest测试也是可以的,但是点击一次,经常没有松开数据包提示
正常情况是,我点击屏幕之后,中断引脚会拉低,然后v3s会读取此时的触摸数据
但是我用示波器测试,触摸的时候,10ms一次中断,但是并不是每次中断都会读取数据(iic数据没信号)
然后我在驱动中添加了打印信息,证明示波器的测试是正确的
但是仔细看示波器发现,没有读取中断的时候,iic的时钟和信号有一点点的小毛刺,
首先,中断,iic信号线都添加了上拉电阻,观察示波器的波形也是比较好看的,
应该不是电源或者干扰的因素,
这个就很要命, 看起来就是丢包了,比如触摸一次,经常丢失了最后松开触摸的那个数据包,导致应用层以为一直在触摸没有松开
怎么搞好这个东西呢
最近编辑记录 a32425262 (2020-06-18 21:32:41)
离线
调试进度更新:
在群友的指导下,
我就忽略了中断,采用线程定时读取的方式,
我的想法是10ms读取一次,但是现在的我在进程中延时10ms,
实际用示波器看的效果是,变成了30ms了,我把延时改成1ms,还是30ms读取一次
我把延时删除,就变成了连续读取了。。。
现在调试的结果就是,读取坐标就正常了,也能获取到松开触摸的数据了
点击触摸的话没问题,但是使用滑动触摸的话,坐标点就不太准确,毕竟是30ms读取一次了
static int thread_function(void *data)
{
do {
msleep(10);
tc = 0;
edt_ft5x06_ts_isr(0, my_tsdata);//这个函数就是用于读取触摸数据的,本来是中断调用的,现在放在线程中
}while(1);
return tc;
}
最近编辑记录 a32425262 (2020-06-19 09:48:13)
离线
这是在应用程序里面读吗?
离线
这个是在驱动里面读的
这是在应用程序里面读吗?
离线
调试进度更新,
使用山寨的做法,保留原来中断读取触摸数据的函数不动
新建一个线程,虽然我是延时10ms,但是实际看示波器是30ms读取一次
后面有时间再找找合理的解决方法吧
最近编辑记录 a32425262 (2020-06-19 13:53:32)
离线
调试进度更新:
不采用中断得的方式,完全采用线程的轮询方式
内核的驱动线程中之前遇到的msleep不准
现在使用usleep_range(8000,10000);作为线程的延时函数
延时相对准确一点,实际用示波器观察,间隔约为10-12毫秒
---------------------------
论坛里里面有好几个用ft6336的,说是触摸不准,迟钝,的情况,应该也是类似的原因
用示波器查看INT和IIC的波形,是否每个INT,都有IIC的波形
我用以下命令查看触摸一次的中断次数
cat /proc/interrupts
实际发现有些时候没有进入中断
比如点击一次屏幕,一般ft6336一般有6次左右的中断,但是v3s经常会漏掉中断
PS:FT6336的INT连接到V3s的PB5
最近编辑记录 a32425262 (2020-06-19 19:01:58)
离线
祝贺 群里看到的
离线
我也遇到了一样的问题
我直接将下降沿触发
interrupts = <1 5 IRQ_TYPE_EDGE_FALLING>;
改成了低电平触发
interrupts = <1 5 IRQ_TYPE_LEVEL_LOW>;
(现在可以用。。。。 就是有点不清真
唯有爱与科技不可辜负。
知乎专栏:IAMLIUBO的神奇物联网之旅
博客园:IAMLIUBO
Gayhub: IAMLIUBO
离线
我也挺成功的
ft6x06@38 {
compatible = "focaltech,ft6236";
reg = <0x38>;
interrupt-parent = <&pio>;
interrupts = <4 5 IRQ_TYPE_LEVEL_LOW>;/*
irq-gpios = <&pio 4 5 GPIO_ACTIVE_HIGH>;*/
reset-gpios = <&pio 4 3 GPIO_ACTIVE_LOW>;
touchscreen-size-x = <240>;
touchscreen-size-y = <240>;
};
离线