ubuntu22.04上的gt9xx 触摸异常问题

问题描述

最近项目的板子(3588s)有一个bug:ubuntu22.04,屏幕是mipi屏幕带触摸功能。触摸芯片是gt9xx系列芯片。现象是第一次开机时候是能触摸,触摸一直正常。当系统锁屏后,再解锁屏幕,发现屏幕不能触摸了。

原因分析:

 cat proc/interrupts

异常时候发现触摸时候没有中断了。

可能是休眠了

goodix_ts_early_resume
goodix_ts_early_suspend

发现没有进入这个两个函数。

可能是关闭中断了

gtp_irq_enable
gtp_irq_disable

发现执行顺序正常

4.查看注册中断时候怎么样注册的

ret = devm_request_threaded_irq(&(ts->client->dev), ts->irq, NULL, 
            goodix_ts_irq_handler, ts->irq_flags | IRQF_ONESHOT ,ts->client->name, ts);

IRQF_ONESHOT 是干啥的?
去掉IRQF_ONESHOT 发现锁屏后 触摸正常了。

知识点

当用于Linux内核中的中断描述符时,这些宏定义具有以下含义:

IRQF_SHARED: 表示中断线是与其他设备共享的,多个设备可以共享同一条中断线。
IRQF_PROBE_SHARED: 表示要尝试探测共享中断,用于在硬件探测阶段标记共享中断。
__IRQF_TIMER: 用于表示中断是一个定时器中断。
IRQF_PERCPU: 表示此中断是每CPU的中断。
IRQF_NOBALANCING: 中断不会被负载平衡,不会被移动到不同的CPU核心上。
IRQF_IRQPOLL: 允许中断轮询。
IRQF_ONESHOT: 中断在被触发后只会被处理一次,之后会自动禁用。
IRQF_NO_SUSPEND: 表示中断不能被挂起。
IRQF_FORCE_RESUME: 强制中断从挂起状态中恢复。
IRQF_NO_THREAD: 中断处理程序不会创建线程。
IRQF_EARLY_RESUME: 表示中断在早期被恢复。
IRQF_COND_SUSPEND: 表示中断可以被条件挂起。

  IRQF_ONESHOT 是用于中断描述符标志的一个选项。当将 IRQF_ONESHOT 标志设置为中断描述符时,它表示该中断应该被处理一次后自动禁用,直到驱动程序重新启用它。
使用 IRQF_ONESHOT 标志的典型情况是处理需要执行一次性操作而不需要重新触发的中断。例如,在某些情况下,中断是由硬件设备的状态变化触发的,但处理这个中断后不再需要重新触发相同的操作。通过将 IRQF_ONESHOT 设置为中断描述符的标志,可以确保中断处理程序只会被调用一次,然后自动禁用,直到驱动程序明确重新启用该中断。

查看中断服务函数代码

static irqreturn_t goodix_ts_irq_handler(int irq, void *dev_id)
{
    struct goodix_ts_data *ts = dev_id;

    GTP_DEBUG_FUNC();
 
    gtp_irq_disable(ts);

    if (device_can_wakeup(&ts->client->dev))
        pm_stay_awake(&ts->client->dev);

    queue_work(goodix_wq, &ts->work);
    
    return IRQ_HANDLED;
}

每次进入中断时候都会停止中断。与IRQF_ONESHOT 配合使用会不会多余了?
当然每次锁屏后为啥中断就停止了。多发几次debug信息也能知道。
还有内核自带gt9xx驱动写得有点乱。

最后的调试结果图。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值