牛卧堂MCU技术交流
标题:
nuc977进入睡眠模式,但是不能通过按键唤醒设备
[打印本页]
作者:
匿名
时间:
2022-2-18 15:48
标题:
nuc977进入睡眠模式,但是不能通过按键唤醒设备
1 我在驱动程序中开启了按键中断
在porbe函数中,使用函数device_init_wakeup(&pdev->dev, 1)
2 通过SIMPLE_DEV_PM_OPS注册了key_drv_suspend函数,并在该函数里面通过enable_irq_wake(),使能了可以通过按键来唤醒系统
3 通过SIMPLE_DEV_PM_OPS注册了key_drv_resume函数,并在该函数里面通过disable_irq_wake(),关闭了可以通过按键来唤醒系统
SIMPLE_DEV_PM_OPS(wj_key_pm_ops, key_drv_suspend,key_drv_resume)
4 在driver中
.pm = &wj_key_pm_ops
最后加载驱动
5 在应用程序中通过调用echo mem > /sys/power/state让设备进入低功耗状态,但是按下按键,系统没有恢复。
这种情况大概是哪里出现问题了呢
//这个是我的驱动里面的suspend和resume函数
static int key_drv_suspend(struct device * dev, pm_message_t state)
{
printk("key supend\r\n");
printk("key_drv_suspend's which_irq[0] is %d\n", which_irq[0]);
printk("pm_message_t is %x\r\n", state.event);
enable_irq_wake(which_irq[0]);//使能中断唤醒
return 0;
}
static int key_drv_resume(struct device * dev)
{
printk("key resume\r\n");
is_dev_sleep_or_run = 2;
printk("key_drv_resume key is down: 按下按键, 唤醒设备\r\n");
disable_irq_wake(which_irq[0]);//关闭中断唤醒
return 0;
}
//static SIMPLE_DEV_PM_OPS(wj_key_pm_ops, key_drv_suspend, key_drv_resume);
static const struct dev_pm_ops wj_key_pm_ops = {
.suspend = key_drv_suspend,
.resume = key_drv_resume,
};
static struct platform_device_id key_drv_ids[] = {
{.name = "nuc977-key"},//匹配的名字
{}
};
static struct platform_driver key_driver = {
.driver = {
.name = "nuc977-key",
.owner = THIS_MODULE,
.pm = &wj_key_pm_ops,
},
.probe = key_drv_probe,
.remove = key_drv_remove,
.id_table = key_drv_ids,
// .suspend = key_drv_suspend,
// .resume = key_drv_resume,
};
低功耗附图.zip
2022-2-18 15:47 上传
点击文件名下载附件
93.73 KB, 下载次数: 365
作者:
arthur
时间:
2022-2-21 11:03
根据 NUC970 TRM 第 80页描述, SYS_WKUPSER (SYS_BA+0x058) 描述,系统唤醒源支持如下几种来源:
[31] USBH
[30] USBD
[28] WDT
[26] ADC
[24] RTC
[23] ETIMER3
[22] ETIMER2
[21] ETIMER1
[20] ETIMER0
[19] CAN1
[18] CAN0
[17] EMAC1
[16] EMAC0
[15] LVD
[13] UART10
[12] UART8
[11] UART6
[10] UART4
[9] UART2
[8] UART1
[7] EINT7
[6] EINT6
[5] EINT5
[4] EINT4
[3] EINT3
[2] EINT2
[1] EINT1
[0] EINT0
如果你的按键是通过 ADC 控制的,就支持 ADC源 唤醒,
你可以参考 drivers/input/nuvoton/nuc970adc.c 源码,通过如下代码控制寄存器 REG_WKUPSER 来唤醒
adc_key_resume()
{
...
__raw_writel(__raw_readl(REG_WKUPSER) & ~(1<<26), REG_WKUPSER);
disable_irq_wake(IRQ_ADC);
...
}
作者:
arthur
时间:
2022-2-21 11:11
内核配置中打开 ADC 按键唤醒:
Device Drivers --> Input device support --> Input NuC970/N9H30 ADC
< * > Keypad support
< * > Keypad wake-up support
欢迎光临 牛卧堂MCU技术交流 (http://nuvoton-mcu.com/)
Powered by Discuz! X3.2