【问题标题】:Linux suspend/resume code flow (on android phone)Linux 暂停/恢复代码流(在安卓手机上)
【发布时间】:2012-11-07 01:32:59
【问题描述】:

有没有人知道关于 android/linux 挂起/恢复的整个过程和代码流如何的好读物(按手机上的结束键后)? 我正在尝试理解和阅读相关的代码和文件。

或者,如果有人可以指出我要查看的代码...

【问题讨论】:

    标签: android linux linux-device-driver resume suspend


    【解决方案1】:

    希望能帮到你。

    Android 是基于 Linux 的,所以和 Linux Suspend Resume 的基础差不多。 几乎没有额外的功能,最重要的是 WakelocksEarly Suspend,它们的添加是为了让手机、PDA 更省电,因为它们的电池有限。

    现在让我们从您的要求开始: 只要您按下电源按钮,显然就会触发中断,从而启动序列。

    区别:您应该已经注意到,只要按下电源按钮,LCD 和触控就会进入睡眠状态。它们是early_suspend。设备可能已启动,只是最耗电的 LCD,触摸已进入睡眠状态。然后在后台检查Wakelocks,是否有人正在获取,好像有人正在获取,然后执行那些待处理的任务。

    Common: 然后文件系统被同步(RAM--> NAND)并且进程被冻结。然后设备被挂起,然后 CPU 状态被保存,然后它进入睡眠状态。序列在 Linux 和 Android 中都很常见。

    Android 收到 event.POWER 并确认不存在 wake_lock 后,Android 由echo mem > /sys/power/state触发内核中的挂起流程:

    state_store >> pm_suspend >> enter_state >>suspend_prepare >>suspend_devices_and_enter >> dpm_suspend_start >> dpm_suspend >> device_suspend >> __device_suspend ---> suspend_enter(在__device_suspend完成后由suspend_device_and_enter调用)

    上述序列在 Linux 和 Android 中都存在。

    文件: 暂停.c,(内核/电源/) wakelock.c、main.c(驱动程序/基础/电源)。

    注意:所有 SoC 特定的挂起回调,如 enter、valid、begin 都存在于 pm.c 中,存在于 arch/arm/

    【讨论】:

    • 您好,谢谢!这正是我想知道的。
    • 查看简历的顺序与此完全相反。请记住,系统启动时,内核会维护一个设备列表(所有注册设备的列表)。排序是这样的,即在其父级之前没有子级可以处于活动状态,从而保持层次结构。因此,当设备恢复时,首先使 CPU 处于活动状态,然后是 IRQ,然后是设备(父--> 子),然后是被冻结的进程。当所有这些任务完成后,调用 late_resume 来启动 touch 和 lcd。有关代码流,请参阅 lxr 和导航。它会让事情变得更清楚。如果有任何疑问,请询问。
    • @shingaridavesh 你的答案有什么参考吗?
    【解决方案2】:

    这是一个关于暂停/恢复代码流的大话题(在android手机上)。内核中的代码流已由shingaridavesh说明。

    更重要的是,内核私有接口(机制)将系统挂起到 Android。但大部分控制逻辑(策略)都在Android系统的PowerManagerService中。我希望这能帮助您了解按下电源键后系统的真正作用。

    1。举报 PowerKey

    1. 在内核中通过输入系统报告电源键事件,可能是这样的:(取决于你是什么SoC平台)

      input_report_key(powerkeydev,KEY_POWER, 1); 输入同步(powerkeydev); msleep(1); input_report_key(powerkeydev,KEY_POWER, 1); input_sync(powerkeydev);

      KEY_POWER = 116 在 include/uapi/linux/input.h 中定义

    2. android 中的键码映射 android/frameworks/base/data/keyboards/Generic.kl android/frameworks/native/include/input/KeycodeLables.h

    3. 拦截 Key 事件 android/frameworks/base/services/core/java/com/anroid/server/policy/PhoneWindowManager.java interceptKeyBeforeQueueing() >> interceptPowerKeyUp() >> powerPress() >> powerPress >> case SHORT_PRESS_POWER_GO_TO_SLEEP >> mPowerManager.goToSleep

    4. 在 PowerManagerService 中管理唤醒锁: PowerManager.java: goToSleep() -> mService.goToSleep() PowerManagerService.java: goToSleep() -> goToSleepInternal -> goToSleepNoUpdateLocked() -> updatePowerStateLocked() -> updateSuspendBlockerLocked()(清除唤醒锁

    2。 libsuspend 触发挂起

    1. suspend_thread_func 检查应该每 100 毫秒暂停一次。在所有唤醒锁定清除后:

      android/system/core/libsuspend/autosuspend.c: suspend_thread_func() -> write(state_fd, sleep_state, strlen(sleep_state))

    这个菜单:echo "mem" > /sys/power/state,触发内核中的挂起流程。

    3。如何设置自动挂起线程?

    线程 suspend_thread_func() 由以下人员创建:

    1. 初始化自动挂起

      android/system/core/libsuspend/autosuspend.c: int autosuspend_enable(void)

    2. 在 jni 中调用 autosuspend

      android/frameworks/base/services/core/jni/com_android_server_power_PowerManagerService.cpp: autosuspend_enable() -> nativeSetAutoSuspend()

    3. 由 PowerManagerService 初始化

      android/services/core/java/com/android/server/power/PowerManagerService.java: nativeSetAutoSuspend(boolean enable);

    【讨论】:

    • 完全手工编辑这个问题。如果这个答案有用,请补充。 ^_^
    猜你喜欢
    • 2021-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多