内核:linux-3.4.99
bootloade:u-boot-2012-04-01
开发板:mini2440
参考:韦东山第三期视频,电源管理
边看视频边写代码边做实验,由于没有用韦老师视频中提供的现成的bootloade,image 等等,没想到一个suspend实现,把我折腾了很久,过程很曲折,但好在在各种调试中,我也学到了很多。
1.在开发板启动后 命令行键入“echo mem > /sys/power/state"没有反应?
键入之后,系统一点反应也没有 ,尝试"cat mem > /sys/power/state“后也为空。PM根本就没起来,难道PM没初始化,查看mach-smdk2440.c文件中的代码,原来我之前在学习移植linux内核代码的时候,没有PM的概念,就把PM相关的初始化代码给注释掉了(s3c_pm_init();)还原后,重新编译。cat查看就能看到支持mem suspend了。
2.使用“echo mem > /sys/power/state"进入suspend需注册唤醒源,在key驱动中的reques_irq之后,用irq_set_irq_wake函数注册,之后调用“echo mem > /sys/power/state",此时系统进入休眠。随之,问题3又来了。
3系统进入休眠后,由于我的开发板的uImage,filesystem 都是通过NFS挂载的,此时网络就中断了,明明视频上韦老师的网络还是连着的?
还是查看源码,韦老师的DM9000源码是自己重新改过的,我的dm9000用的是内核自带的源码。阅读后发现,内核自带的源码有suspend,resume函数:
static const struct dev_pm_ops dm9000_drv_pm_ops = {
.suspend = dm9000_drv_suspend,
.resume = dm9000_drv_resume,
};
当系统进入休眠后,dpm_suspended_list会调用dm9000的suspend函数,此时网络就进入了休眠,于是就断开了。当
//.pm