一、MTK电源管理组成

这里讲的电源管理驱动主要是SPM驱动,CPU idle驱动,CPU Hotplug驱动,CPU Frequency驱动等,代码主要集中在以下目录。

1:/home/ubuntu/Mediatek/code/kernel-3.18/drivers/misc/mediatek/base/power/

2:/home/ubuntu/Mediatek/code/kernel-3.18/drivers/base/power

3:/home/ubuntu/Mediatek/code/kernel-3.18/kernel/power/

4:/home/ubuntu/Mediatek/code/kernel-3.18/drivers/cpufreq/

5:/home/ubuntu/Mediatek/code/kernel-3.18/drivers/cpuidle/

二、Linux kernel Generic Power

1:Linux power初始化,首先使用pm_init初始化power manager工作队列,设置休眠镜像大小,创建attribute属性等。

/home/ubuntu/Mediatek/code/kernel-3.18/kernel/power/main.c

static struct attribute * g[] = {&state_attr.attr,
#ifdef CONFIG_PM_TRACE&pm_trace_attr.attr,&pm_trace_dev_match_attr.attr,
#endif
#ifdef CONFIG_PM_SLEEP&pm_async_attr.attr,&wakeup_count_attr.attr,
#ifdef CONFIG_PM_AUTOSLEEP&autosleep_attr.attr,
#endif
#ifdef CONFIG_PM_WAKELOCKS&wake_lock_attr.attr,&wake_unlock_attr.attr,
#endif
#ifdef CONFIG_PM_DEBUG&pm_test_attr.attr,
#endif
#ifdef CONFIG_PM_SLEEP_DEBUG&pm_print_times_attr.attr,
#endif
#endif
#ifdef CONFIG_FREEZER&pm_freeze_timeout_attr.attr,
#endif
//CodeSwitching start
#if 1// HIGUA&custom_changelogo_attr.attr,
#endif
//CodeSwitching endNULL,
};static struct attribute_group attr_group = {.attrs = g,
};struct workqueue_struct *pm_wq;
EXPORT_SYMBOL_GPL(pm_wq);static int __init pm_start_workqueue(void)
{pm_wq = alloc_workqueue("pm", WQ_FREEZABLE, 0);return pm_wq ? 0 : -ENOMEM;
}static int __init pm_init(void)
{int error = pm_start_workqueue();if (error)return error;hibernate_image_size_init();hibernate_reserved_size_init();power_kobj = kobject_create_and_add("power", NULL);if (!power_kobj)return -ENOMEM;error = sysfs_create_group(power_kobj, &attr_group);if (error)return error;pm_print_times_init();return pm_autosleep_init();
}core_initcall(pm_init);

2:Android用户层通过按键按钮触发 ‘echo mem > /sys/power/state’进行休眠相关的一些列流程

用户层这个命令是通过上述命令进行触发,处理代码为

/home/ubuntu/Mediatek/code/kernel-3.18/kernel/power/main.c

static ssize_t state_store(struct kobject *kobj, struct kobj_attribute *attr,const char *buf, size_t n)
{suspend_state_t state;int error;#ifdef CONFIG_MTK_HIBERNATIONchar *p;int len;
#endiferror = pm_autosleep_lock();if (error)return error;if (pm_autosleep_state() > PM_SUSPEND_ON) {error = -EBUSY;goto out;}state = decode_state(buf, n);#ifdef CONFIG_MTK_HIBERNATIONp = memchr(buf, '\n', n);len = p ? p - buf : n;if (len == 8 && !strncmp(buf, "hibabort", len)) {hib_log("abort hibernation...\n");error = mtk_hibernate_abort();goto out;}
#endifpr_warn("[%s]: state = (%d)\n", __func__, state);if (state < PM_SUSPEND_MAX) {error = pm_suspend(state);pr_warn("[%s]: pm_suspend() return (%d)\n", __func__, error);} else if (state == PM_SUSPEND_MAX) {
#ifdef CONFIG_MTK_HIBERNATIONhib_log("trigger hibernation...\n");if (!pre_hibernate()) {error = 0;error = mtk_hibernate();}
#else /* !CONFIG_MTK_HIBERNATION */error = hibernate();
#endif /* CONFIG_MTK_HIBERNATION */} else {error = -EINVAL;}out:pm_autosleep_unlock();return error ? error : n;
}power_attr(state);

3:进入pm_suspend流程,进入enter_state处理,然后进行相关的suspend_syssync_enqueue,suspend_prepare,suspend_devices_and_enter。

代码如下

/*** pm_suspend - Externally visible function for suspending the system.* @state: System sleep state to enter.** Check if the value of @state represents one of the supported states,* execute enter_state() and update system suspend statistics.*/
int pm_suspend(suspend_state_t state)
{int error;if (state <= PM_SUSPEND_ON || state >= PM_SUSPEND_MAX)return -EINVAL;pm_suspend_marker("entry");error = enter_state(state);if (error) {suspend_stats.fail++;dpm_save_failed_errno(error);} else {suspend_stats.success++;}pm_suspend_marker("exit");return error;
}
EXPORT_SYMBOL(pm_suspend);
/*** enter_state - Do common work needed to enter system sleep state.* @state: System sleep state to enter.** Make sure that no one else is trying to put the system into a sleep state.* Fail if that's not the case.  Otherwise, prepare for system suspend, make the* system enter the given sleep state and clean up after wakeup.*/
static int enter_state(suspend_state_t state)
{int error;trace_suspend_resume(TPS("suspend_enter"), state, true);if (state == PM_SUSPEND_FREEZE) {
#ifdef CONFIG_PM_DEBUGif (pm_test_level != TEST_NONE && pm_test_level <= TEST_CPUS) {pr_warning("PM: Unsupported test mode for freeze state,""please choose none/freezer/devices/platform.\n");return -EAGAIN;}
#endif} else if (!valid_state(state)) {return -EINVAL;}if (!mutex_trylock(&pm_mutex))return -EBUSY;if (state == PM_SUSPEND_FREEZE)freeze_begin();trace_suspend_resume(TPS("sync_filesystems"), 0, true);printk(KERN_INFO "PM: Syncing filesystems ... ");
#if MTK_SOLUTIONerror = suspend_syssync_enqueue();if (error) {pr_err("sys_sync timeout.\n");goto Unlock;}
#elsesys_sync();
#endifprintk("done.\n");trace_suspend_resume(TPS("sync_filesystems"), 0, false);pr_debug("PM: Preparing system for %s sleep\n", pm_states[state]);error = suspend_prepare(state);if (error)goto Unlock;if (suspend_test(TEST_FREEZER))goto Finish;trace_suspend_resume(TPS("suspend_enter"), state, false);pr_debug("PM: Entering %s sleep\n", pm_states[state]);pm_restrict_gfp_mask();error = suspend_devices_and_enter(state);pm_restore_gfp_mask();Finish:pr_debug("PM: Finishing wakeup.\n");suspend_finish();Unlock:mutex_unlock(&pm_mutex);return error;
}

三、suspend和resume流程

流程图如下所示:

在suspend中最终进入到syscore_suspend中最后调用到ops->suspend,反之在suspend流程在代码中同样suspend后执行逆向的过程

 syscore_resume();}arch_suspend_enable_irqs();BUG_ON(irqs_disabled());Enable_cpus:enable_nonboot_cpus();Platform_wake:platform_resume_noirq(state);dpm_resume_noirq(PMSG_RESUME);Platform_early_resume:platform_resume_early(state);Devices_early_resume:dpm_resume_early(PMSG_RESUME);Platform_finish:platform_resume_finish(state);

Android OrangePi 4G IOT(五) - MTK电源管理驱动(一)相关推荐

  1. Android OrangePi 4G IOT(二) - MTK更换调试串口

    一.Debug LOG串口更改 orangepi 4G iot的默认的log调试串口是在板子后面的,使用起来不方便,之前UART0焊接不好导致焊盘弄坏了,没办法,准备修改成插针的40pin引脚的的UA ...

  2. Android OrangePi 4G IOT(四) - MTK LK分析

    一.MTK启动流程 1-3:设备上电起来后,跳转到Boot ROM(不是flash)中的boot code中执行把pre-loader加载起到ISRAM, 因为当前DRAM(RAM分SRAM跟DRAM ...

  3. linux驱动编写(电源管理驱动)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 对于嵌入式设备来说,合适的电源管理,不仅可以延长电池的寿命,而且可以省电,延长设备运行时间,在提 ...

  4. android电源驱动程序,[转]Android虚拟电源管理驱动

    Android系统如果没有电源管理相关的驱动程序,在启动时将会提示如下错误: I/SystemServer(   50): Starting Battery Service. E/BatterySer ...

  5. linux 电源管理 唤醒,Android 4.0 中的PowerManager(电源管理--休眠唤醒) [转]

    转发请注明出处: 最近,在学习让系统进入休眠的过程中,学习了电源管理的相关知识.为了备忘和理清思路现整理成文,以便日后查阅. 移动设备由于自身的限制有一个硬伤就是电量的消耗问题.由于电池的电量有限,所 ...

  6. WinCE电源管理----驱动增加电源管理属性

    原文地址::http://www.cnblogs.com/we-hjb/archive/2010/01/27/1657973.html 对于移动设备来说,电源管理是比较重要的.为了让设备有更长的待机和 ...

  7. linux 电源管理驱动编写

    执行流程 驱动结构 1) 内核提供的接口 struct power_supply 在文件 include\linux\power_supply.h 中 2) 提供给用户的接口 sys/class/po ...

  8. Android9.0 P 电源管理android各版本电量优化功能策略

    针对电量优化android的改动 在最近几个android版本中已存在的电量优化功能基础上,Android 9 引入了一些新功能来持续改进设备电源管理,以确保将系统资源提供给最需要它们的应用. 近几个 ...

  9. mtk android平台学习,MTK平台的驱动学习——(阶段1规划篇)

    受老罗的影响,由于本人还是菜鸟,不能像老罗一样重头开始研究整个系统,决定从就近的工作开始,从android MTK 的驱动-->中间层-->应用层,一步一步研究. 一边看书,一边搜集网上的 ...

  10. linux 电池管理软件,Linux电源管理(2)_Generic PM之基本概念和软件架构

    Linux电源管理(2)_Generic PM之基本概念和软件架构 作者:wowo 发布于:2014-5-13 19:24 分类:电源管理子系统 1. 前言 这里的Generic PM,是蜗蜗自己起的 ...

最新文章

  1. CentOS 安装Python3
  2. 服务器市场严酷竞争下的众生相
  3. pytorch 初始化权重
  4. Targan 算法[有向图强连通分量]
  5. 色彩缤纷的python(改变字体颜色及样式)
  6. 同样是查询语言,它和 SQL 竟然有这么多不同
  7. 自学UI设计,应当具备的基础技能(软件)
  8. vue 函数 路由跳转_vue路由跳转的方式
  9. 西门子1200走总线FB284控制3台V90伺服和相机调整角 度,DP通讯控制FANUC机器人
  10. 语音识别行业技术和市场横向对比
  11. 7-3 皮球反弹高度 (10 分)
  12. 三元组事件抽取与简单代码实现
  13. CF1375G Tree Modification
  14. 在CMD中登陆MySQL
  15. 美国虚拟PSTN号码
  16. 系统架构师考试-案例
  17. cpu低端计算机配置清单,i3 4160/GTX750Ti剑灵/英雄联盟中低端组装机配置清单
  18. 担心PPT封面页不够出彩?这些例子你都知道吗?
  19. Python转换PDF,Word/Excel/PPT都能转!
  20. 2022-2027年中国品牌连锁酒店行业发展前景及投资战略咨询报告

热门文章

  1. App Store 上架流程
  2. 王小九用计算机弹桥边姑娘,抖音最火歌曲是哪首?QQ音乐开放平台《桥边姑娘》让“野狼”靠边站...
  3. SUNLORDINC顺络电子LTCC产品推广资料
  4. MYSQL将两张表的数据合并显示
  5. 软件测试系统性总结思维导图
  6. OpenKG数据逐一截图说明
  7. 最大报销额(01背包)
  8. Telink blt_soft_timer 改进
  9. 记录This request has been blocked; the content must be served over HTTPS.
  10. macbook/macos输入法乱跳