简体   繁体   English

似乎disable_irq无法真正掩盖中断

[英]it seems disable_irq can't really mask the interrupt

It seems in my code disable_irq can't really disable the irq, i have follwoing code 似乎在我的代码中disable_irq无法真正禁用irq,我有以下代码

rc  = devm_request_threaded_irq(&client->dev, irq, NULL, 
        name_for_ask_question_irq_handler,
        IRQF_ONESHOT | IRQF_TRIGGER_FALLING, client->name, data);
if (rc < 0) {
    dev_err(&client->dev, "request irq failed \n");
    return rc;
}

/* IRQ handler threadeded, this can (and will) sleep */
static irqreturn_t name_for_ask_question_irq_handler(int irq, void *dev)
{
    struct touch_point_data *pdata = dev;

    dev_err(&pdata->client->dev, "%s:%d irq handler \n", __func__, __LINE__);

    return IRQ_HANDLED;
}

static ssize_t wakeup_i2c_store(struct device *dev,
                struct device_attribute *attr,
                const char *buf, size_t size)
{
    struct touch_point_data *pdata = dev_get_drvdata(dev);

    if (buf[0] == '1') {
        disable_irq(pdata->client->irq);
        gpiod_direction_output(pdata->gpiod_irq, 0);
        udelay(100);
        gpiod_direction_output(pdata->gpiod_irq, 1);
        udelay(100);
        gpiod_direction_output(pdata->gpiod_irq, 0);
        udelay(100);
        gpiod_direction_output(pdata->gpiod_irq, 1);
        udelay(100);
        gpiod_direction_input(pdata->gpiod_irq);
        dev_err(&pdata->client->dev, "%s:%d disable irq \n", __func__, __LINE__);
    } else if (buf[0] == '2') {
        enable_irq(pdata->client->irq);
        dev_err(&pdata->client->dev, "%s:%d enable irq \n", __func__, __LINE__);
    }

    return size;
}

and then i get following result: 然后我得到以下结果:

enter image description here 在此输入图像描述

i am confused, why disable_irq can't really mask the interrupt, it seems this funtion only delay the IRQ, and the irq_handler will still be called after enable_irq. 我很困惑,为什么disable_irq无法真正掩盖中断,似乎这个功能只会延迟IRQ,而irq_handler仍会在enable_irq之后调用。 Is there anyone know what happened? 有谁知道发生了什么?

Delaying the interrupt from being handled until re-enabled is exactly what "masking" an interrupt means. 延迟处理中断直到重新启用正是“屏蔽”中断意味着什么。 That's precisely how disable_irq() / enable_irq() are supposed to work. 这正是disable_irq() / enable_irq()应该如何工作的原因。

If you want to ignore some interrupts, just put that logic in your interrupt handler. 如果你想忽略一些中断,只需将那个逻辑放在你的中断处理程序中。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM