LinuxRuntimePM½éÉÜ

本文发布时间: 2019-Mar-22
Ò»¡¢Runtime PMÒýÑÔ1. ±³¾°£¨1£©displayµÄÐèÇó£¨2£©ÏµÍ³Õû»ú¶¯Ì¬¹¦ºÄÓÅ»¯µÄÐèÇó£¨3£©upstream2. ½â¾ö·½°¸£¨1£©ÒýÈëdebounce£¨2£©Ê¹ÓÃͳһµÄworkqueueÀ´¹ÜÀíÈÎÎñ£¨3£©ÊµÊ±µØ¹Ø±Õ²»ÐèÒª¹¤×÷µÄdevice£¨4£©µ±device×÷Ϊparentʱ£¬ËùÓеÄchild²»¹¤×÷ʱ£¬¹Ø±Õ¸Ãdevice£¨5£©ÒýÈëpm_rutime3. ÐÔÄÜÖ¸±ê£¨1£©¿ìËÙ¿ª¹ØÆÁ³¡¾°£¬ÁÁÆÁËÙ¶ÈÌáÉý£¨2£©¶¯Ì¬¹¦ºÄ£¬¸üΪÎȶ¨£»»½ÐѶø²»ÁÁÆÁµÄ³¡¾°£¬¹¦ºÄ¸üµÍ£¨3£©ÓÐÖúÓÚ½µµÍϵͳÕû»ú¶¯Ì¬¹¦ºÄ¶þ¡¢Runtime PM¿ò¼Ü1. Runtime PM²ã´Î½á¹¹2. Runtime PM״̬3. Runtime PM¿ØÖÆÁ÷³Ì ÿ¸öÉ豸»òÕß×Óϵͳ¶¼»áÏòRuntime PM core×¢²á3¸öcallback¡£ ÔÚstruct dev_pm_ops½á¹¹ÌåÖУ¬¶¨ÒåÁËÕâÈý¸öcallback£º struct dev_pm_ops { ... int (*runtime_suspend)(struct device *dev); int (*runtime_resume)(struct device *dev); int (*runtime_idle)(struct device *dev); .suspend .resume }; ×¢£ºÒýÈëruntimeÖ®ºó£¬suspend ½Ó¿ÚÐèºÍruntime½Ó¿Ú·ÅÔÚͬһ¸öÊý¾Ý½á¹¹ÄÚ£»4. rpm_status£¨include\linux\pm.h£© enum rpm_status { RPM_ACTIVE = 0, /* ±íʾruntime_resume()±»³É¹¦Ö´ÐÐ */ RPM_RESUMING, /* ±íʾruntime_resume()ÕýÔÚ±»Ö´ÐÐ */ RZ†·Ÿ"http:///pro/pkqt/" target="_blank" class="keylink">QTV9TVVNQRU5ERUQsIC8qILHtyr5ydW50aW1lX3N1c3BlbmQoKbG7s8m5pta00NAgKi88YnI+CiAgICAgICAgICAgIFJQTV9TVVNQRU5ESU5HLCAvKiCx7cq+cnVudGltZV9zdXNwZW5kKCnV/dTasbvWtNDQICovPGJyPgogICAgICAgIH07PGJyPgo8L3A+Cgo8cD41LiBycG1fcmVxdWVzdKOoaW5jbHVkZVxsaW51eFxwbS5oo6k8L3A+CjxwPiAgICAgICAgZW51bSBycG1fcmVxdWVzdCB7PGJyPgogICAgICAgICAgICBSUE1fUkVRX05PTkUgPSAwLFJQTV9SRVFfSURMRSwgLyog1rTQ0HJ1bnRpbWVfaWRsZSgpICovPC9wPgo8cD4gICAgICAgICAgICBSUE1fUkVRX1NVU1BFTkQsIC8qINa00NBydW50aW1lX3N1c3BlbmQgKCkgKi88YnI+CiAgICAgICAgICAgIFJQTV9SRVFfQVVUT1NVU1BFTkQsICAvKiDR07PZYXV0b3N1c3BlbmRfZGVsYXm689a00NBydW50aW1lX3N1c3BlbmQoKSAqLzxicj4KICAgICAgICAgICAgUlBNX1JFUV9SRVNVTUUsICAvKiDWtNDQcnVudGltZV9yZXN1bWUoKSAqLzxicj4KICAgICAgICB9Ozxicj4KICAgICAgIMfrx/O1xMDg0M2jqMno1sNyZXF1ZXN0X3BlbmRpbmeyxdPQ0KejqaGjPGJyPgo8L3A+Cgo8cD42LiBJZGxlIFJlZmVyZW5jZSBBUEk8L3A+CjxwPiAgICAgICAgcG1fcnVudGltZV9wdXRfbm9pZGxlOiBvbmx5IHB1dDxicj4KICAgICAgICBwbV9ydW50aW1lX2lkbGU8YnI+CiAgICAgICAgcG1fcmVxdWVzdF9pZGxlo7phc3luYzxicj4KICAgICAgICBwbV9ydW50aW1lX3B1dDogcHV0ICYjNDM7IGFzeW5jPGJyPgogICAgICAgIHBtX3J1bnRpbWVfcHV0X3N5bmM8YnI+CjwvcD4KCjxwPjcuIFN1c3BlbmQgUmVmZXJlbmNlIEFQSTwvcD4KPHA+ICAgICAgICBwbV9zY2hlZHVsZV9zdXNwZW5kPGJyPgogICAgICAgIHBtX3J1bnRpbWVfc3VzcGVuZDogPGJyPgogICAgICAgIHBtX3J1bnRpbWVfcHV0X3N5bmNfc3VzcGVuZDogcHV0PGJyPgogICAgICAgIHBtX3J1bnRpbWVfYXV0b3N1c3BlbmQ6IGF1dG88YnI+CiAgICAgICAgcG1fcmVxdWVzdF9hdXRvc3VzcGVuZKO6YXN5bmMgJiM0MzsgYXV0bzxicj4KICAgICAgICBwbV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZDogcHV0ICYjNDM7IGFzeW5jICYjNDM7IGF1dG88YnI+CiAgICAgICAgcG1fcnVudGltZV9wdXRfc3luY19hdXRvc3VzcGVuZDogcHV0ICYjNDM7IGF1dG88YnI+CjwvcD4KCjxwPjguIFJlc3VtZSBSZWZlcmVuY2UgQVBJPC9wPgo8cD4gICAgICAgIHBtX3J1bnRpbWVfZ2V0X25vcmVzdW1lPGJyPgogICAgICAgIHBtX3J1bnRpbWVfcmVzdW1lPGJyPgogICAgICAgIHBtX3JlcXVlc3RfcmVzdW1lOiBhc3luYzxicj4KICAgICAgICBwbV9ydW50aW1lX2dldDogZ2V0ICYjNDM7IGFzeW5jPGJyPgogICAgICAgIHBtX3J1bnRpbWVfZ2V0X3N5bmM6IGdldDxicj4KPC9wPgoKPHA+OS4gRGV2aWNlIFJ1bnRpbWUgc3VzcGVuZCDB97PMPC9wPgo8cD4gICAgtKW3oqO6PGJyPgogICAgICAgIHBtX3NjaGVkdWxlX3N1c3BlbmQ8YnI+CiAgICAgICAgcG1fcnVudGltZV9zdXNwZW5kOiA8YnI+CiAgICAgICAgcG1fcnVudGltZV9wdXRfc3luY19zdXNwZW5kOiBwdXQ8YnI+CiAgICAgICAgcG1fcnVudGltZV9hdXRvc3VzcGVuZDogYXV0bzxicj4KICAgICAgICBwbV9yZXF1ZXN0X2F1dG9zdXNwZW5ko7phc3luYyAmIzQzOyBhdXRvPGJyPgogICAgICAgIHBtX3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kOiBwdXQgJiM0MzsgYXN5bmMgJiM0MzsgYXV0bzxicj4KICAgICAgICBwbV9ydW50aW1lX3B1dF9zeW5jX2F1dG9zdXNwZW5kOiBwdXQgJiM0MzsgYXV0bzxicj4KICAgIHN1c3BlbmS1xMz1vP6jujxicj4KICAgICAgICB1c2FnZV9jbnQ9IDA7IDxicj4KICAgICAgICBkaXNhYmxlX2RlcHRoID0gMDsgPGJyPgogICAgICAgIHJ1bnRpbWVfc3RhdHVzID0gUlBNX0FDVElWRTxicj4KPC9wPgo8cD48aW1nIHNyYz0="http:///uploadfile/files/2015/0113/20150113182312241.jpg" alt="">10. Device Runtime PM idleÁ÷³Ì idleµÄ´¥·¢£º pm_runtime_put_noidle: only put pm_runtime_idle pm_request_idle£ºasync pm_runtime_put: put + async pm_runtime_put_sync idleµÄÌõ¼þ£º usage_cnt= 0; disable_depth = 0; runtime_status = RPM_ACTIVE11. Device Runtime PM resumeÁ÷³Ì ´¥·¢£º pm_runtime_get_noresume pm_runtime_resume pm_request_resume: async pm_runtime_get: get + async pm_runtime_get_sync: get Ìõ¼þ£º disable_depth = 0 runtime_status != RPM_ACTIVEÈý¡¢Runtime PMºÍÉ豸ģÐÍ1. Device Runtime PM ³õʼ»¯£¨1£©É豸ģÐÍÍê³Épm_runtime µÄ³õʼ»¯£»£¨2£©¶Ôpm_runtime ״̬µÄ¸Ä±ä£¬ÐèÔÚdevice_register Ö®ºóʵÏÖ£»£¨3£©É豸ģÐÍ£¬ÔÚµ÷ÓÃdrv probe, remove, shutdown µÈ½Ó¿Úʱ£¬ ¿ÉÒÔ±£Ö¤pm_runtime ´¦ÓÚdisable ״̬£¬»òÆäËûÔ¼¶¨×´Ì¬£» void pm_runtime_init(struct device *dev) { dev->power.runtime_status = RPM_SUSPENDED; dev->power.idle_notification = false; dev->power.disable_depth = 1; atomic_set(&dev->power.usage_count, 0); dev->power.runtime_error = 0; atomic_set(&dev->power.child_count, 0); pm_suspend_ignore_children(dev, false); dev->power.runtime_auto = true; dev->power.request_pending = false; dev->power.request = RPM_REQ_NONE; dev->power.deferred_resume = false; dev->power.accounting_timestamp = jiffies; INIT_WORK(&dev->power.work, pm_runtime_work); dev->power.timer_expires = 0; setup_timer(&dev->power.suspend_timer, pm_suspend_timer_fn, (unsigned long)dev); init_waitqueue_head(&dev->power.wait_queue); } platform_device_register(&platform_disp_device); pm_runtime_set_active(&platform_disp_device.dev); pm_runtime_get_noresume(&platform_disp_device.dev); pm_runtime_enable(&platform_disp_device.dev); pm_runtime_set_autosuspend_delay(&platform_disp_device.dev, 5000); pm_runtime_use_autosuspend(&platform_disp_device.dev); platform_driver_register(&disp_driver);2. Device Runtime PM removeÁ÷³Ì3. Device Runtime PM shutdownÁ÷³ÌËÄ¡¢Runtime PMºÍµçÔ´¹ÜÀí1. system sleep flow2. system sleep flow: resume3. system sleep flow: suspendÎå¡¢Runtime PMʵÀý·ÖÎö


(以上内容不代表本站观点。)
---------------------------------
本网站以及域名有仲裁协议。
本網站以及域名有仲裁協議。

2024-Mar-04 02:09pm
栏目列表