кажется, что disable_irq не может действительно маскировать прерывание - PullRequest
0 голосов
/ 21 мая 2019

Кажется, в моем коде 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;
}

, а затем я получаю следующий результат:

введите описание изображения здесь

Я в замешательстве, почему disable_irq не может действительно замаскировать прерывание, кажется, что эта функция только задерживает IRQ, и irq_handler все равно будет вызываться после enable_irq.Кто-нибудь знает, что случилось?

1 Ответ

0 голосов
/ 21 мая 2019

Задержка обработки прерывания до повторного включения - это именно то, что означает «маскировка» прерывания. Именно так disable_irq() / enable_irq() должны работать.

Если вы хотите игнорировать некоторые прерывания, просто поместите эту логику в обработчик прерываний.

...