[英]it seems disable_irq can't really mask the interrupt
似乎在我的代碼中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之后調用。 有誰知道發生了什么?
延遲處理中斷直到重新啟用正是“屏蔽”中斷意味着什么。 這正是disable_irq()
/ enable_irq()
應該如何工作的原因。
如果你想忽略一些中斷,只需將那個邏輯放在你的中斷處理程序中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.