内核: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 = &dm9000_drv_pm_ops,
后,在使系统进入休眠,此时网络就不断了。问题应该就解决了吧,其实是噩梦的开始,接下来的问题,我花了两周才搞定。
4.“echo m

本文记录了在mini2440开发板上使用Linux-3.4.99内核实现电源管理suspend过程中遇到的问题及解决办法。包括:1) PM初始化代码的恢复;2) 注册唤醒源以进入休眠,但因网络中断导致的问题,通过修改dm9000驱动的电源管理函数解决;3) 按键唤醒导致系统重启,原因是GPIO配置错误,修正后成功唤醒;4) 唤醒后网卡出现警告,目前通过替换DM9000驱动解决。
最低0.47元/天 解锁文章
2631

被折叠的 条评论
为什么被折叠?



