通过 GPIO 中断将 k70 从 VLPS 深度睡眠中唤醒

Posted

技术标签:

【中文标题】通过 GPIO 中断将 k70 从 VLPS 深度睡眠中唤醒【英文标题】:wake up k70 from VLPS deep sleep by GPIO interrupt 【发布时间】:2017-05-02 13:37:52 【问题描述】:

我无法通过 GPIO 中断将 k70 (Kinetis) 从 VLPS 深度睡眠中唤醒。

这是在 uCLinux 下,我启用了 CONFIG_PM。之后,我可以通过“echo mem > /sys/power/state”让 K70 进入深度睡眠,并从 UART 调试控制台唤醒它。但我无法通过触发 GPIO 中断唤醒。我已经通过中断处理程序的打印确认了中断在睡眠前后工作,并且我还确认了在触发 GPIO 中断后,GPIO 引脚值在睡眠期间从 0 变为 1。

根据K70手册,我应该可以通过GPIO中断唤醒VLPS。有没有人知道为什么我不能?

谢谢

【问题讨论】:

【参考方案1】:

首先,您的 GPIO 驱动程序应该实现 IRQ 芯片。 (从上面的描述我不知道平台是什么,那里使用的GPIO驱动程序是什么)。

其次,IRQ 芯片实现必须有->irq_set_wake() 回调存在并正确实现。

第三,调用者,通过gpiod_get()获得GPIO线必须执行:

struct gpio_desc *gd;
int irq;

gd = gpiod_get(...);
if (IS_ERR(gd))
  return PTR_ERR(gd);

irq = gpiod_to_irq(gd);
if (irq < 0)
  return irq;

/* Now! */
enable_irq_wake(irq); /* This does the trick */

【讨论】:

以上是关于通过 GPIO 中断将 k70 从 VLPS 深度睡眠中唤醒的主要内容,如果未能解决你的问题,请参考以下文章

四 . 树莓派A20 GPIO中断程序编写(1基本处理)

stm32 外部中断 能读gpio值吗

Zephry_GPIO的中断使用详解以及中断原理

GPIO中断

GPIO中断

补偿ARM中断的延迟?