留言板
路过的蜗牛们,在这里留个脚印吧~
蜗窝欢迎各种言论,谈天说地、技术交流、问题求救、跳槽招聘、牢骚抱怨……哈哈。
评论:
wowo
2015-08-17 14:09
2015-08-17 14:09
@fire:1. 什么时候会使用PM resume唤醒Kernel呢?
====================================
我不太确定您这里的“PM resume”指的是什么,是指System sleep过程中的resume动作(和Runtime PM对应)吗?如果是的话,resume是和suspend成对出现的,只有suspend了,才会resume。
2. 一般情况下,唤醒源是那些没有被disable的中断,电源芯片应该也是其中的一种,和具体系统的设计有关。
3. 我们系统上的pm resume代码如下, 我想问下,系统挂起后,是不是只要PM resume之后,才能接收到runtime resume?
======================================================
这个问题的本质是Runtime PM和System sleep(suspend&resume etc.)之间的交互, 我一直没有来得及写。您可以先参考“Documentation/power/runtime_pm.txt”中的相关的内容,这里我们先简单的讨论一下。
a)就某个设备而言,suspend的过程中,RPM和System sleep之间的关系可以分为三种:一,先RPM suspend,后System sleep suspend;二,先System sleep suspend,后RPM suspend;三,RPM suspend和System sleep suspend之间互相交叉。
b)显然,kernel power managerment的同步机制应该会保证第三种情况不会发生,就先忽略。
c)第二种情况,由于先System sleep suspend,情况比较简单,PM core会在prepare阶段(suspend_devices_and_enter->dpm_suspend_start->dpm_prepare->device_prepare),get一次RPM的引用计数(pm_runtime_get_noresume),以保证系统不会再RPM suspend,此后的过程,就是正常的suspend流程。因此这种情况也不会发生。
d)第一种情况有些复杂,如果设备已经RPM suspend了,那么System sleep suspend要怎么做?要强调的是,这种情况下,RPM suspend、System sleep suspend以及后续的resume行为,完全是由设备驱动决定的,例如,RPM suspend执行“浅睡眠(可以唤醒系统)”,System sleep suspend执行“深睡眠(不可以唤醒系统)”,等等。
e)因此,设备驱动对已经RPM suspend的设备,再执行System sleep suspend时,很有可能会先把设备从RPM suspend状态唤醒,然后再让它进入System sleep suspend状态,而这一切Runtime PM已经不知情了。
f)回到resume的过程,来探讨一下您提出的两个问题(主要针对第一种情况)。
g)首先,系统没有从suspend状态resume的时候,RPM机制肯定是没有激活的,因此,肯定是System sleep resume后,才可能有RPM resume。至于是否一定有RPM resume,这依赖于System sleep resume后,设备的实际状态。
h)如果设备在System sleep suspend之前,已经RPM suspend了,它的RPM status就是SUSPEND状态。但在System sleep resume之后,设备有可能直接变成full power on状态了(这和设备驱动的策略有关),因此就和RPM的实际status不符,怎么办呢?手动修改RPM状态,使其变成ACTIVE的(pm_runtime_set_active(dev) ),这就是那三句话的意思。
I)最后,如果设备已经是RPM ACTIVE了,在需要RPM resume的时候,就不会再真正执行resume操作;甚至,如果之后不需要再使用设备,有可能会执行RPM suspend。
有点长,希望能帮到您。
====================================
我不太确定您这里的“PM resume”指的是什么,是指System sleep过程中的resume动作(和Runtime PM对应)吗?如果是的话,resume是和suspend成对出现的,只有suspend了,才会resume。
2. 一般情况下,唤醒源是那些没有被disable的中断,电源芯片应该也是其中的一种,和具体系统的设计有关。
3. 我们系统上的pm resume代码如下, 我想问下,系统挂起后,是不是只要PM resume之后,才能接收到runtime resume?
======================================================
这个问题的本质是Runtime PM和System sleep(suspend&resume etc.)之间的交互, 我一直没有来得及写。您可以先参考“Documentation/power/runtime_pm.txt”中的相关的内容,这里我们先简单的讨论一下。
a)就某个设备而言,suspend的过程中,RPM和System sleep之间的关系可以分为三种:一,先RPM suspend,后System sleep suspend;二,先System sleep suspend,后RPM suspend;三,RPM suspend和System sleep suspend之间互相交叉。
b)显然,kernel power managerment的同步机制应该会保证第三种情况不会发生,就先忽略。
c)第二种情况,由于先System sleep suspend,情况比较简单,PM core会在prepare阶段(suspend_devices_and_enter->dpm_suspend_start->dpm_prepare->device_prepare),get一次RPM的引用计数(pm_runtime_get_noresume),以保证系统不会再RPM suspend,此后的过程,就是正常的suspend流程。因此这种情况也不会发生。
d)第一种情况有些复杂,如果设备已经RPM suspend了,那么System sleep suspend要怎么做?要强调的是,这种情况下,RPM suspend、System sleep suspend以及后续的resume行为,完全是由设备驱动决定的,例如,RPM suspend执行“浅睡眠(可以唤醒系统)”,System sleep suspend执行“深睡眠(不可以唤醒系统)”,等等。
e)因此,设备驱动对已经RPM suspend的设备,再执行System sleep suspend时,很有可能会先把设备从RPM suspend状态唤醒,然后再让它进入System sleep suspend状态,而这一切Runtime PM已经不知情了。
f)回到resume的过程,来探讨一下您提出的两个问题(主要针对第一种情况)。
g)首先,系统没有从suspend状态resume的时候,RPM机制肯定是没有激活的,因此,肯定是System sleep resume后,才可能有RPM resume。至于是否一定有RPM resume,这依赖于System sleep resume后,设备的实际状态。
h)如果设备在System sleep suspend之前,已经RPM suspend了,它的RPM status就是SUSPEND状态。但在System sleep resume之后,设备有可能直接变成full power on状态了(这和设备驱动的策略有关),因此就和RPM的实际status不符,怎么办呢?手动修改RPM状态,使其变成ACTIVE的(pm_runtime_set_active(dev) ),这就是那三句话的意思。
I)最后,如果设备已经是RPM ACTIVE了,在需要RPM resume的时候,就不会再真正执行resume操作;甚至,如果之后不需要再使用设备,有可能会执行RPM suspend。
有点长,希望能帮到您。
linuxer
2015-08-05 09:00
2015-08-05 09:00
@misakmm20001:我会先把中断子系统和时间子系统这两个大坑填满,之后应该是内存管理部分了。
内核同步的文章有心情就写,进程管理之后考虑写存储系统,大概这些内容足够写到2020年了。wowo似乎陷入电源管理子系统中不能自拔,呵呵
BTW,我们都是从事linux相关的系统软件工作,驱动开发是其中之一。
内核同步的文章有心情就写,进程管理之后考虑写存储系统,大概这些内容足够写到2020年了。wowo似乎陷入电源管理子系统中不能自拔,呵呵
BTW,我们都是从事linux相关的系统软件工作,驱动开发是其中之一。
wowo
2015-08-05 09:05
2015-08-05 09:05
@linuxer:电源管理差不多收尾了,接下来写什么,还在犹豫中。想写显示相关的东西,又怕写不好。
PS:linuxer同学,你随便一写就要写到2020年啊?真吓人。哈哈。
PS:linuxer同学,你随便一写就要写到2020年啊?真吓人。哈哈。
Daniel Shieh
2015-10-21 11:19
2015-10-21 11:19
@linuxer:linuxer是不是对网络非常精通?在一个群里有个对网络很精通,写过很多网络方面博客的linuxer,不知道此linuxer是不是彼linuxer?嘿嘿
fucker
2015-07-28 19:09
2015-07-28 19:09
linuxer & wowo:
大神们好~!
非常感谢你们的精彩分享,文章写的很美,很让人振奋。非常感叹你们怎么可以知道那么多呢。。。。
因为我是手机行业,虽然也做的是驱动,但是感觉做的很肤浅,如果仅仅完成工作,也行不需要这么深的知识,但是我真的很佩服你们,因为我觉得能把知识分享给别人是一种美。希望自己也有一天可以在这里写点干货。所以有点疑惑想请教下。
①工作需要,可能不需要这么深的知识,那么如何才能研究的这么深入呢?
②如果仅仅是看代码,总觉得有点肤浅,总觉得需要用实验来验证下,但是这样的话,感觉又太慢了,你们是怎么平衡的呢?
③如果从知识转换为财富的角度,你们觉的这样研究下去,将来的出路是什么呢?因为我总又种预感,终端将来只能是一个为云服务的简单入口,起到的作用和价值会越来越弱。
也行我的思路有些乱,,,我现在大概这些问题,以后再请教!
thanks
大神们好~!
非常感谢你们的精彩分享,文章写的很美,很让人振奋。非常感叹你们怎么可以知道那么多呢。。。。
因为我是手机行业,虽然也做的是驱动,但是感觉做的很肤浅,如果仅仅完成工作,也行不需要这么深的知识,但是我真的很佩服你们,因为我觉得能把知识分享给别人是一种美。希望自己也有一天可以在这里写点干货。所以有点疑惑想请教下。
①工作需要,可能不需要这么深的知识,那么如何才能研究的这么深入呢?
②如果仅仅是看代码,总觉得有点肤浅,总觉得需要用实验来验证下,但是这样的话,感觉又太慢了,你们是怎么平衡的呢?
③如果从知识转换为财富的角度,你们觉的这样研究下去,将来的出路是什么呢?因为我总又种预感,终端将来只能是一个为云服务的简单入口,起到的作用和价值会越来越弱。
也行我的思路有些乱,,,我现在大概这些问题,以后再请教!
thanks
linuxer
2015-07-28 23:11
2015-07-28 23:11
@fucker:第一个问题,如何研究的这么深入?喜欢是最大的动力,只有发自内心的喜欢才可以付出时间和精力。第二个问题,研究linux kernel当然是一个实践的活动,例如你想要优化内核中的某些操作。不过目前我们主要是阅读代码为主,动手实践较少,有机会的话申请一些开发板什么的就有实践机会了,我们一直在寻找ARM64的服务器平台,希望可以在上面有些动手机会,不过目前时机还不成熟。第三个问题,研究内核其实不太容易带来财富,如果为了财富,可以考虑一些互联网软件或者一些应用程序软件,研究内核毕竟是一个小众行为,多半是自爽吧,我们目前没有什么明确的目标,也许将来搞一些高端的内核培训,也许可以出一些书籍,目前反正都有工作,能养家糊口,这个网站就是一个纯粹技术交流的平台
Daniel Shieh
2015-07-21 17:46
2015-07-21 17:46
wowo,现在遇到一个问题,查看源码,最晚从2.6.25内核开始,内核中的sys_msgget,sys_msgsnd,sys_msgrcv,sys_msgctl几个函数的原型都找不到了,都只能在linux/syscalls.h头文件中看到声明,但是找不到函数源码?这是什么逻辑呢?而且好多地方还调用了这个函数,这是什么机制变了还是怎么啦?希望过来人明示。需要在内核态中使用消息队列,不知道有没有更好的建议。
Daniel Shieh
2015-07-21 17:48
2015-07-21 17:48
@Daniel Shieh:是2.6.25内核之后,至少2.6.30内核开始就找不到这些函数的源码了,这是怎么了?网上搜了很多,找不到答案啊。
Daniel Shieh
2015-07-22 10:00
2015-07-22 10:00
@linuxer:谢谢linuxer指点。用软件的确跳转不到,后来我自己找源码目录看的时候,也看到ipc目录下边了,有util.c和msg.c,内容大致看了下,的确是通过宏的方式了。不过我编译的内核模块,编译ok,但是在加载的时候会报错,unknown symbol in the module,查看log,就是上面说的三个函数:
unknown symbol sys_msgget
unknown symbol sys_msgsnd
unknown symbol sys_msgrcv
这可能是什么原因呢?
另外一个问题是,在内核中使用消息队列的方式是使用这些函数吗?还是有别的使用方法?
unknown symbol sys_msgget
unknown symbol sys_msgsnd
unknown symbol sys_msgrcv
这可能是什么原因呢?
另外一个问题是,在内核中使用消息队列的方式是使用这些函数吗?还是有别的使用方法?
linuxer
2015-07-22 12:19
2015-07-22 12:19
@Daniel Shieh:毫无疑问这是符号解析的问题,要解决这个问题首先要问自己这样的问题:内核的众多符号中,哪些可以被模块引用?
实际上,内核中只有用EXPORT_SYMBOL和EXPORT_SYMBOL_GPL定义的符号才能被模块引用,也就是说sys_msgget这个符号没有被内核export出来,因此,虽然内核定义了这个符号,但是对于模块而言,它是不可见的。
如何解决呢?本质上,sys_xxx是给userspace的程序使用的,内核不应该直接使用,不过也有些场景,例如在内核中操作文件。
因此,如果一定要这么做,一般而言,可以考虑使用底层的函数,不要直接调用sys_xxx函数。不过你能否告知你的场景?应该有比消息队列更好的方式
实际上,内核中只有用EXPORT_SYMBOL和EXPORT_SYMBOL_GPL定义的符号才能被模块引用,也就是说sys_msgget这个符号没有被内核export出来,因此,虽然内核定义了这个符号,但是对于模块而言,它是不可见的。
如何解决呢?本质上,sys_xxx是给userspace的程序使用的,内核不应该直接使用,不过也有些场景,例如在内核中操作文件。
因此,如果一定要这么做,一般而言,可以考虑使用底层的函数,不要直接调用sys_xxx函数。不过你能否告知你的场景?应该有比消息队列更好的方式
Daniel Shieh
2015-07-22 13:24
2015-07-22 13:24
@linuxer:使用场景:私有的无线协议栈在内核态下实现,协议栈的内部用到了消息队列。以前这部分的协议是在其他系统上以应用的方式实现的,现在要移植到linux内核态下。所以就想用系统调用的内部实现函数去替代这部分。不知道linuxer有没有更好的建议,可以用什么替代这部分?
Daniel Shieh
2015-07-23 09:39
2015-07-23 09:39
@linuxer:原来在用户空间的协议栈,在两个进程间通过消息队列传输协议数据,发送方根据消息类型通过消息队列发送数据,接收端收到数据后,进行分析,并执行相关的功能操作。你说的交互方式是这些吗?还是别的什么?
所有的逻辑都移到内核,协议部分和协议内部的分析并执行功能都移植到内核态。
内核态下还是要创建两个或者三个内核线程。
不知道这些信息够不够?谢谢linuxer耐心的帮我解决问题!
所有的逻辑都移到内核,协议部分和协议内部的分析并执行功能都移植到内核态。
内核态下还是要创建两个或者三个内核线程。
不知道这些信息够不够?谢谢linuxer耐心的帮我解决问题!
linuxer
2015-07-23 21:14
2015-07-23 21:14
@Daniel Shieh:我现在还是不是非常明白你的通讯模型,建议你还是在讨论区发一篇单独的文档和大家一起探讨。当然,这份文档需要描述清楚之前的软件架构以及目前你想调整的软件架构。要画出block diagram,描述各个block的功能以及各个block之间的接口。只有把逻辑理清楚,才能给出适合的解决方案。
Daniel Shieh
2015-08-03 11:32
2015-08-03 11:32
@linuxer:具体就是需要对收到的IP包进行私有协议的处理,传递私有协议处理的IP包给另一个线程,本来之前应用层处理用的是消息队列,现在移植到内核态,内核中应该使用什么机制去替换这种方式呢?实在是没查到相关的资料啊。
coldcl@163.com
2015-07-20 20:16
2015-07-20 20:16
根据mtk的介绍,前面那个preloader应该是他们有自己的相关芯片的一些初始化,然后才等待启动bootloader,所以我才觉得纳闷,看博主有没有碰到类似的情形
shoujixiaodao
2015-07-21 10:19
2015-07-21 10:19
@coldcl@163.com:preloader是芯片公司自己写的一个初始化流程而已。会初始化emmc,dram等。会把lk的执行bin copy到dram中,然后直接跳转过去就执行lk的代码了。不会涉及到WFI的。
coldcl@163.com
2015-07-21 11:27
2015-07-21 11:27
@shoujixiaodao:就是在preloader的时候,会进入到WFI这里,然后等待lk的唤醒...到WFI的时候是一个循环,没有跳出去
coldcl@163.com
2015-07-20 15:19
2015-07-20 15:19
博主,想请问一个关于armv8架构启动的问题,之前的v7,大概就是硬件会到一个给定的地址去load uboot,然后call kernel,但是像mtk,它有一个自己的preloader,lk(也就是bootloader),在启动之后,它先调用preloader,然后调用WFI进入standby,根据前面你的WFI的分析,后面应该是硬件去唤醒而进入到lk,这里有什么资料详细介绍是怎么触发WFI状态进入lk的吗,谢谢!!!
buyit
2015-07-13 16:15
2015-07-13 16:15
请教一个RTC设计的问题:
假设一款SOC里面没有外接的RTC,只有内部的RTC,这个内部的RTC是用timer和counter来模拟的,并不是一个真正的可以设置年月日的RTC。
SOC内部的RTC放在always on的domain里面,系统suspend的时候继续运行。
假设现在android的闹钟设置了一个5分钟之后的唤醒时间,然后全系统进入suspend,那么等闹钟时间到了,假设这个RTC有能力让系统的PMU先收到通知,然后PMU有能力唤醒AP,通常情况下AP core的resume过程是先走一遍ROM code,然后再运行kernel 的resume 过程。kernel resume的时候会把GIC 中断控制器恢复,当GIC 恢复的时候,请问RTC的中断会瞬间被触发从而调用到它的中断处理函数吗? 假设RTC的irq pin是level-triggered并且在系统resume的过程中irq pin一直处于active状态。
1. 假设RTC的中断处理函数在系统resume的过程中不会被触发,那么很显然系统需要在RTC driver自己的resume函数里面想办法通知RTC framework: RTC到期的事件已经发生了。比如说在RTC driver的resume函数里面呼叫rtc_update_irq() ? kernel里面很难看到类似的实现。。。
2. 假设RTC的中断处理函数在系统resume的过程中被触发,那么看上去一切和系统不睡眠的时候处理RTC事件是一样的,在中断处理函数中呼叫rtc_update_irq()把事件上报给RTC framework层。
假设一款SOC里面没有外接的RTC,只有内部的RTC,这个内部的RTC是用timer和counter来模拟的,并不是一个真正的可以设置年月日的RTC。
SOC内部的RTC放在always on的domain里面,系统suspend的时候继续运行。
假设现在android的闹钟设置了一个5分钟之后的唤醒时间,然后全系统进入suspend,那么等闹钟时间到了,假设这个RTC有能力让系统的PMU先收到通知,然后PMU有能力唤醒AP,通常情况下AP core的resume过程是先走一遍ROM code,然后再运行kernel 的resume 过程。kernel resume的时候会把GIC 中断控制器恢复,当GIC 恢复的时候,请问RTC的中断会瞬间被触发从而调用到它的中断处理函数吗? 假设RTC的irq pin是level-triggered并且在系统resume的过程中irq pin一直处于active状态。
1. 假设RTC的中断处理函数在系统resume的过程中不会被触发,那么很显然系统需要在RTC driver自己的resume函数里面想办法通知RTC framework: RTC到期的事件已经发生了。比如说在RTC driver的resume函数里面呼叫rtc_update_irq() ? kernel里面很难看到类似的实现。。。
2. 假设RTC的中断处理函数在系统resume的过程中被触发,那么看上去一切和系统不睡眠的时候处理RTC事件是一样的,在中断处理函数中呼叫rtc_update_irq()把事件上报给RTC framework层。
linuxer
2015-07-14 09:32
2015-07-14 09:32
@buyit:我先说一下我的看法,稍后再去查证。
当系统进入suspend状态的时候,为了节省GIC的大部分功能都是disable的,因为大部分的中断都不需要响应了,需要响应的的一般只剩下RTC、或者一两个GPIO的中断(多半是和power key以及charger相关),对于gic而言,其内部也可以分成中断检测HW block和wakeup功能HW block,在suspend的时候,中断检测相关的HW block被disable了,而保留了wakeup功能HW block以便检测到唤醒事件,从而wakup processor。
对于RTC hw block而言,一旦到期会立刻触发level电平通知GIC(应该是SPI类型的),在suspend状态的时候,不会导致GIC向processor报告中断事件,但是可以唤醒processor,当cpu执行resume的过程中,恢复了GIC的中断检测HW block的功能之后,GIC立刻可以检测到RTC的电平事件(没有clear interrupt,这个level 电平可以保持住),从而触发一个中断。
当系统进入suspend状态的时候,为了节省GIC的大部分功能都是disable的,因为大部分的中断都不需要响应了,需要响应的的一般只剩下RTC、或者一两个GPIO的中断(多半是和power key以及charger相关),对于gic而言,其内部也可以分成中断检测HW block和wakeup功能HW block,在suspend的时候,中断检测相关的HW block被disable了,而保留了wakeup功能HW block以便检测到唤醒事件,从而wakup processor。
对于RTC hw block而言,一旦到期会立刻触发level电平通知GIC(应该是SPI类型的),在suspend状态的时候,不会导致GIC向processor报告中断事件,但是可以唤醒processor,当cpu执行resume的过程中,恢复了GIC的中断检测HW block的功能之后,GIC立刻可以检测到RTC的电平事件(没有clear interrupt,这个level 电平可以保持住),从而触发一个中断。
buyit
2015-07-14 10:14
2015-07-14 10:14
@linuxer:我之前接触的soc里面,GIC在system suspend的时候会掉电,suspend之后会用系统的一个独立的PMU来接管唤醒的中断源。假设RTC可以触发MPU,MPU再唤醒AP,然后AP经过了ROM code之后回到了resume的流程,那么在resume的早期中有一步是去重新初始化GIC的,RTC的中断理论上来说在这一步会被恢复,于是应该会在之后的某一个时间点被触发。
不过我有另外一个问题,是对android的alarm system的: 假设RTC的irq没有连接到GIC,但是连接到了PMU,那么当RTC里面设置的闹钟时间到了之后,系统是可以从suspend状态被唤醒的,AP也可以走进resume的过程,只是RTC的irq在AP也就是kernel这边不存在,那么这种情况下android的闹钟应用是否还能正常判断出来自己设置的闹钟到期了?
不过我有另外一个问题,是对android的alarm system的: 假设RTC的irq没有连接到GIC,但是连接到了PMU,那么当RTC里面设置的闹钟时间到了之后,系统是可以从suspend状态被唤醒的,AP也可以走进resume的过程,只是RTC的irq在AP也就是kernel这边不存在,那么这种情况下android的闹钟应用是否还能正常判断出来自己设置的闹钟到期了?
功能
最新评论
- wangjing
写得太好了 - wangjing
写得太好了! - DRAM
圖面都沒辦法顯示出來好像掛點了。 - Simbr
bus至少是不是还有个subsystem? - troy
@testtest:只要ldrex-modify-strex... - gh
Linux 内核在 sparse 内存模型基础上实现了vme...
文章分类
随机文章
文章存档
- 2025年4月(5)
- 2024年2月(1)
- 2023年5月(1)
- 2022年10月(1)
- 2022年8月(1)
- 2022年6月(1)
- 2022年5月(1)
- 2022年4月(2)
- 2022年2月(2)
- 2021年12月(1)
- 2021年11月(5)
- 2021年7月(1)
- 2021年6月(1)
- 2021年5月(3)
- 2020年3月(3)
- 2020年2月(2)
- 2020年1月(3)
- 2019年12月(3)
- 2019年5月(4)
- 2019年3月(1)
- 2019年1月(3)
- 2018年12月(2)
- 2018年11月(1)
- 2018年10月(2)
- 2018年8月(1)
- 2018年6月(1)
- 2018年5月(1)
- 2018年4月(7)
- 2018年2月(4)
- 2018年1月(5)
- 2017年12月(2)
- 2017年11月(2)
- 2017年10月(1)
- 2017年9月(5)
- 2017年8月(4)
- 2017年7月(4)
- 2017年6月(3)
- 2017年5月(3)
- 2017年4月(1)
- 2017年3月(8)
- 2017年2月(6)
- 2017年1月(5)
- 2016年12月(6)
- 2016年11月(11)
- 2016年10月(9)
- 2016年9月(6)
- 2016年8月(9)
- 2016年7月(5)
- 2016年6月(8)
- 2016年5月(8)
- 2016年4月(7)
- 2016年3月(5)
- 2016年2月(5)
- 2016年1月(6)
- 2015年12月(6)
- 2015年11月(9)
- 2015年10月(9)
- 2015年9月(4)
- 2015年8月(3)
- 2015年7月(7)
- 2015年6月(3)
- 2015年5月(6)
- 2015年4月(9)
- 2015年3月(9)
- 2015年2月(6)
- 2015年1月(6)
- 2014年12月(17)
- 2014年11月(8)
- 2014年10月(9)
- 2014年9月(7)
- 2014年8月(12)
- 2014年7月(6)
- 2014年6月(6)
- 2014年5月(9)
- 2014年4月(9)
- 2014年3月(7)
- 2014年2月(3)
- 2014年1月(4)
2015-08-15 17:10
你对Linux的管理流程很深入,请教个问题,最近碰到的critical bug都和PM有关。
什么时候会使用PM resume唤醒Kernel呢? 只有电源芯片,外部IRQ之类的才能PM resume吗?
我们系统上的pm resume代码如下, 我想问下,系统挂起后,是不是只要PM resume之后,才能接收到runtime resume?
atomic_set(&motg->pm_suspended, 0);
if (motg->async_int || motg->sm_work_pending) {
pm_runtime_get_noresume(dev);
ret = msm_otg_resume(motg);
/* Update runtime PM status */
pm_runtime_disable(dev); //不是很明白这三句的含义
pm_runtime_set_active(dev);
pm_runtime_enable(dev);
if (motg->sm_work_pending) {
motg->sm_work_pending = false;
msm_queue_sm_work(motg);
}
}