91在线观看视频-91在线观看视频-91在线观看免费视频-91在线观看免费-欧美第二页-欧美第1页

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

電源管理入門:驅動Runtime PM管理

yzcdx ? 來源:OS與AUTOSAR研究 ? 2023-11-29 10:13 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

Runtime PM管理也就是設備驅動里面的電源管理,即設備驅動結構體里面的struct dev_pm_ops,只控制設備自己的電源。這樣可以在設備不需要工作的時候可以進入到低功耗狀態,更好的管理設備自己的電源,所謂:“各掃門前雪”。

為什么需要Runtime PM?

不同于系統的電源管理,設備自己的電源管理更加的細化。這就像一個層級關系,系統整體的是一個大的電源狀態管理,但是對于眾多的集成外國設備也不能一刀切,就是不能要干活都干活要休息都休息,要細化管理不能懶政,就對每個設備自己也來一套電源狀態管理,直接把機制從系統哪里復制過來一份一個閹割版的就夠用,采用分而治之的思想,只要系統要統一指揮的時候聽話就可以,其他時候可以自己決策執行就是runtime PM管理。這里的設備有可能是外設,比如sensor、lcdc等。這里的設備也有可能是SOC內部的某些IP,比如codec、dspusb等。

1. 框架介紹

1.1 為什么需要Runtime PM Framework?

系統基本的電源管理,例如關機休眠等,需要調用device的電源Runtime API就是ops回調函數,而且需要按一個順序的queue去實施,而且系統跟設備狀態發生沖突的時候也需要去處理,綜上就需要一個Framework去統一做這些事情

設備驅動需要根據系統的一些參數來決定自己的電源狀態,例如CPU是否idle等,就需要系統框架的支持

當設備處于低功耗模式時,wakeup signal常常需要platform或者bus的支持。

1.2 系統框架圖

3f1a5378-8dda-11ee-939d-92fbcf53809c.png

數據結構:

3f326544-8dda-11ee-939d-92fbcf53809c.png

image.png

關機舉例:

3f575624-8dda-11ee-939d-92fbcf53809c.png

休眠舉例:

3f6d659a-8dda-11ee-939d-92fbcf53809c.png

2. Drivers

Device drivers(包括bus、class、power domain)實現了runtime pm相關的runtime_idle/runtime_suspend/runtime_resume三個回調:

runtime_suspend用于實現設備的低功耗操作

runtime_resume用于實現設備的低功耗恢復相關的操作

runtime_idle屬于runtime_suspend的一個過渡,用于緩沖頻繁的suspend與resume,它會判斷設備是否具備suspend的條件,如果具備在合適的時機,就會suspend設備。

runtime_suspend與runtime_resume回調函數里會調用clock framework/reset framework/regulator framework提供的時鐘開關、復位、電源開關接口。這里以SPI驅動為例進行說明:

subsys_initcall(pl022_init);

static int __init pl022_init(void)
{
        return amba_driver_register(&pl022_driver);
}

static struct amba_driver pl022_driver = {
        .drv = {
                .name        = "ssp-pl022",
                .pm        = &pl022_dev_pm_ops,
        },
        .id_table        = pl022_ids,
        .probe                = pl022_probe,
        .remove                = pl022_remove,
};

static const struct dev_pm_ops pl022_dev_pm_ops = {
        SET_SYSTEM_SLEEP_PM_OPS(pl022_suspend, pl022_resume)
        SET_RUNTIME_PM_OPS(pl022_runtime_suspend, pl022_runtime_resume, NULL)
};
                         
#define SET_RUNTIME_PM_OPS(suspend_fn, resume_fn, idle_fn) 
        .runtime_suspend = suspend_fn, 
        .runtime_resume = resume_fn, 
        .runtime_idle = idle_fn,

pm結構體dev_pm_ops 中的有3個以runtime開頭的成員函數:runtime_suspend()、runtime_resume()和runtime_idle(),它們輔助設備完成運行時的電源管理

struct dev_pm_ops {
    ...
    int (*runtime_suspend)(struct device *dev);
    int (*runtime_resume)(struct device *dev);
    int (*runtime_idle)(struct device *dev);
    ...
};

運行時的PM與前文描述的系統級掛起到RAM時候的PM不太一樣,它是針對單個設備,指系統在非睡眠狀態的情況下,某個設備在空閑時可以進入運行時掛起狀態,而在不是空閑時執行運行時恢復使得設備進入正常工作狀態,如此,這個設備在運行時會省電。

3f8f8fda-8dda-11ee-939d-92fbcf53809c.png

每個設備處理好自己的電源管理,在不需要工作時進入低功耗狀態。也就是"各人自掃門前雪"。Linux提供了一系列API,以便于設備可以聲明自己的運行時PM狀態:

函數名字 功能
pm_runtime_suspend 引發設備的掛起,執行相關的runtime_suspend()函數。
pm_schedule_suspend “調度”設備的掛起,延遲delay毫秒后將掛起工作掛入pm_wq等待隊列,結果等價于delay毫秒后執行相關的runtime_suspend()函數。
pm_runtime_resume 引發設備的恢復,執行相關的runtime_resume()函數。
pm_request_resume 發起一個設備恢復的請求,該請求也是掛入pm_wq等待隊列。
pm_runtime_idle 引發設備的空閑,執行相關的runtime_idle()函數。
pm_request_idle 發起一個設備空閑的請求,該請求也是掛入pm_wq等待隊列。
pm_runtime_enable 使能設備的運行時PM支持。
pm_runtime_disable 禁止設備的運行時PM支持。
pm_runtime_getpm_runtime_get_sync 增加設備的引用計數(usage_count),這類似于clk_get(),會間接引發設備的runtime_resume()。
pm_runtime_putpm_runtime_put_sync 減小設備的引用計數,這類似于clk_put(),會間接引發設備的runtime_idle()。

3. Runtime PM core

Runtime pm core主要提供了三類函數接口:

提供enable/disable接口給設備驅動,用于該設備驅動決定是否打開或關閉RPM,

提供get、put類接口給設備驅動,用于決定什么時候進入或者恢復設備低功耗,

在設備驅動調用了get、put接口后RPM會調用各設備驅動實現的runtime_suspend/runtime_resume接口

對于決定設備是否進入低功耗的get/put接口的調用時機,一般會在操作設備相關寄存器前調用get接口,在操作完相關寄存器后調用put接口。或者在設備驅動的open、release、start、stop等接口里調用,用戶層的services通過ioctrl或者驅動提供的文件節點調用驅動的這些接口。

我們可以這樣簡單地理解Linux運行時PM的機制,每個設備(總線的控制器自身也屬于一個設備)都 有引用計數usage_count和活躍子設備(Active Children,子設備的意思就是該級總線上掛的設備)計數child_count,當兩個計數都為0的時候,就進入空閑狀態,調用pm_request_idle(dev)。

當設備進入空閑狀態,與pm_request_idle(dev)對應的PM核并不一定直接調用設備驅動的runtime_suspend(),它實際上在多數情況下是調用與該設備對應的bus_type的runtime_idle()。

在具體的設備驅動中,一般的用法則是在設備驅動probe()時運行pm_runtime_enable()使能運行時PM支持,在運行過程中動態地執行“pm_runtime_get_xxx()->做工作->pm_runtime_put_xxx()”的序列。如代碼清單19.19中的drivers/watchdog/omap_wdt.c OMAP的看門狗驅動。

在omap_wdt_start()中啟動了pm_runtime_get_sync(),

而在omap_wdt_stop()中調用了pm_runtime_put_sync()。

static const struct watchdog_ops omap_wdt_ops = {
        .owner                = THIS_MODULE,
        .start                = omap_wdt_start,
        .stop                = omap_wdt_stop,
        .ping                = omap_wdt_ping,
        .set_timeout        = omap_wdt_set_timeout,
        .get_timeleft        = omap_wdt_get_timeleft,
};

static int omap_wdt_start(struct watchdog_device *wdog)
{

    pm_runtime_get_sync(wdev->dev);//告訴內核要開始用看門狗這個設備了,如果看門狗設備已經進入省電模式(之前引用計數為0且執行了運行時掛起),會導致該設備的運行時恢復
    
static int omap_wdt_stop(struct watchdog_device *wdog)
{
    pm_runtime_put_sync(wdev->dev);//告訴內核不用這個設備了,如果引用計數變為0且活躍子設備為0,則導致該看門狗設備的運行時掛起。

在一些設備上不使用的時候不能立即掛起,,因為掛起狀態的進入和恢復需要一些時間,如果設備不在掛起之間保留一定的時間,頻繁進出掛起反而會帶來新的開銷。因此,我們可根據情況決定只有設備在空閑了一段時間后才進入掛起(一般來說,一個一段時間沒有被使用的設備,還會有一段時間不會被使用),基于此,一些設備驅動也常常使用自動掛動模式進行編程

3fa8a93e-8dda-11ee-939d-92fbcf53809c.png

在執行操作的時候聲明pm_runtime_get(),操作完成后執行pm_runtime_mark_last_busy()和pm_runtime_put_autosuspend(),一旦自動掛動的延時到期且設備的使用計數為0,則引發相關runtime_suspend()入口函數的調用。

設備驅動PM成員的runtime_suspend()一般完成保存上下文、切到省電模式的工作,而runtime_resume()一般完成對硬件上電、恢復上下文的工作

4. power domain framework

一個power domain上可能包含多個IP,每個IP可能對應一個或多個設備。這些設備會在dts中描述與power domain的綁定關系。系統初始化的時候,會將這個power domain放到一個鏈表中,然后根據設備中dts描述的與power domain的關系,將設備掛在power domain節點下的鏈表中。

當某個設備驅動通過put接口調用,將usage_count從1減少到0,這時會先調用power domain注冊的runtime_suspend接口,在這個接口中,會先調用該設備驅動的runtime_suspend,然后遍歷該power domain下所有的設備是否都允許suspend(各設備驅動的usage_count是否為0),若允許就會直接調用關閉power domian的接口,否則直接返回。當某個設備驅動通過get接口調用,將usage_count從0增加到1,這時會先調用power domain注冊的runtime_resume接口,在這個接口中,會先將power domain上電,然后再調用設備驅動對應的runtime_resume回調函數,讓設備退出低功耗。

5. runtime pm的sysfs

對于支持rpm的設備,在相應的設備節點下有多個rpm相關屬性的文件節點,分別為control,runtime_susupend_time,runtime_active_time,autosuspend_delay_ms,runtime_status。接口在文件: /kernel/drivers/base/power/sysfs.c中描述。

/sys/devices/.../power/control

on - 調用pm_runtime_forbid接口,增加設備的引用計數,然后resume設備。

auto - 調用pm_runtime_allow接口,減少設備的引用計數,如果設備的引用計數為0,則idle設備。

3fcbb53c-8dda-11ee-939d-92fbcf53809c.png

/sys/devices/.../power/runtime_status

active - 設備的狀態是正常工作狀態。

suspend- 設備的狀態是低功耗模式。

suspending-設備的狀態正在從active->suspend轉化。

resuming-設備的狀態正在從suspend->active轉化。

error-設備runtime出現錯誤,此時runtime_error的標志置位。

unsupported-設備的runtime 沒有使能,此時disable_depth標志置位。

/sys/devices/.../power/runtime_suspend_time

設備在suspend狀態的時間

/sys/devices/.../power/runtime_active_time

設備在active狀態的時間

/sys/devices/.../power/autosuspend_delay_ms

設備在idle狀態多久之后suspend,設置延遲suspend的延遲時間。

后記:

在編寫驅動的時候,如果涉及電源管理的功耗需求,就需要實現struct dev_pm_ops,為驅動程序增加一個電源管理的功能,會更加的靈活,也是我們去優化系統功耗的一個重要方向。因為大多數程序估計是供應商提供的,但是我們自己的加的硬件的程序估計是我們自己去寫的,并且做業務挺耗電,給自己寫的驅動加個電源管理就挺好。

審核編輯:湯梓紅
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 電源管理
    +關注

    關注

    117

    文章

    6432

    瀏覽量

    146098
  • cpu
    cpu
    +關注

    關注

    68

    文章

    11076

    瀏覽量

    216998
  • soc
    soc
    +關注

    關注

    38

    文章

    4386

    瀏覽量

    222678
  • 函數
    +關注

    關注

    3

    文章

    4379

    瀏覽量

    64827
  • runtime
    +關注

    關注

    0

    文章

    17

    瀏覽量

    2289

原文標題:電源管理入門-16 驅動Runtime PM管理

文章出處:【微信號:OS與AUTOSAR研究,微信公眾號:OS與AUTOSAR研究】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    Linux電源管理Runtime PM的軟件框架

    device driver(或者driver所在的bus、class等)需要提供3個回調函數,runtime_suspend、runtime_resume和runtime_idle,分別用于suspend device、resu
    發表于 09-15 15:57 ?2294次閱讀
    Linux<b class='flag-5'>電源</b><b class='flag-5'>管理</b>:<b class='flag-5'>Runtime</b> <b class='flag-5'>PM</b>的軟件框架

    電源管理入門-Regulator驅動是什么?Regulator的作用是什么?

    Regulator是Linux系統中電源管理的基礎設施之一,用于穩壓電源管理,是各種驅動子系統中設置 電壓的標準接口。
    的頭像 發表于 11-16 16:51 ?1.4w次閱讀
    <b class='flag-5'>電源</b><b class='flag-5'>管理入門</b>-Regulator<b class='flag-5'>驅動</b>是什么?Regulator的作用是什么?

    電源管理入門:Thermal熱管理

    管理指的是在電子設備或系統中通過各種方式控制其溫度來保證其正常工作或延長壽命的過程。其中包括散熱設計、溫度監測、溫度控制等方面。熱管理的重要性越來越凸顯,尤其在高性能計算、人工智能等領域的應用中更為重要。
    的頭像 發表于 11-29 10:09 ?6850次閱讀
    <b class='flag-5'>電源</b><b class='flag-5'>管理入門</b>:Thermal熱<b class='flag-5'>管理</b>

    電源管理入門:Power supply子系統

    對于便攜設備來說,電源管理更加的重要,因為電池電量有限,容易電量焦慮。除了省電管理外,還需要對電池進行監控管理和充放電管理,這樣保護好電池和
    的頭像 發表于 11-29 10:15 ?6321次閱讀
    <b class='flag-5'>電源</b><b class='flag-5'>管理入門</b>:Power supply子系統

    電源管理入門:Power Domain管理

    SoC中通常有很多IP,按邏輯可以把幾個相關功能的IP劃為一個電源域。一個電源域內的IP,通常按相同的方式由同一個硬件模塊PMIC供電,電壓一樣并且電源管理例如休眠喚醒一致。
    的頭像 發表于 11-29 10:16 ?4675次閱讀
    <b class='flag-5'>電源</b><b class='flag-5'>管理入門</b>:Power Domain<b class='flag-5'>管理</b>

    電源管理入門-芯片設計中的電源管理介紹

    SCP直接控制SoC的電源和時鐘,而AP通過硬件和軟件接口協同管理
    的頭像 發表于 12-06 09:16 ?4335次閱讀
    <b class='flag-5'>電源</b><b class='flag-5'>管理入門</b>-芯片設計中的<b class='flag-5'>電源</b><b class='flag-5'>管理</b>介紹

    電源管理入門:Hypervisor中的電源管理

    很多時候聽說Hypervisor,但是對底層軟件技術不了解的人感覺挺神秘。本篇文章簡單介紹下Hypervisor的基本概念,另外介紹下電源管理在Hypervisor之上多OS間怎么應用。
    的頭像 發表于 12-06 09:27 ?2081次閱讀
    <b class='flag-5'>電源</b><b class='flag-5'>管理入門</b>:Hypervisor中的<b class='flag-5'>電源</b><b class='flag-5'>管理</b>

    LINUX電源管理的相關資料分享

    Linux的系統suspend和resumeLinux內核 runtime_PM 框架Linux內核電源管理綜述
    發表于 11-15 07:10

    如何對PCI設備的電源進行管理

    1 PCI設備的電源管理PCI設備的電源管理包括系統PMruntime
    發表于 12-27 07:17

    Linux電源管理的系統架構和驅動

    ,牽扯到系統級的待機、頻率電壓變換、系統空閑時的處理以及每個設備驅動對系統待機的支持和每個設備的運行時( Runtime )電源管理,可以說它和系統中的每個設備
    發表于 01-03 06:36

    Linux電源管理之Generic PM Suspend功能簡析

    管理接口”的描述。設備驅動----具體設備驅動的位置,不再涉及。3)平臺依賴PMinclude/linux/suspend.h----定義平臺依賴PM相關的操作函數集arch/xxx/
    發表于 08-10 15:20

    需要了解的Linux中電源管理接口

    Linux電源管理中,相當多的部分是在處理Hibernate、Suspend、Runtime PM等功能。而這些功能都基于一套相似的邏輯,即“Power management inte
    發表于 04-22 17:35 ?1227次閱讀

    LINUX電源管理

    Linux的系統suspend和resumeLinux內核 runtime_PM 框架Linux內核電源管理綜述
    發表于 11-07 19:36 ?8次下載
    LINUX<b class='flag-5'>電源</b><b class='flag-5'>管理</b>

    Linux電源管理--PM QoS

    (requester)。PM QoS framework針對兩種對象分別提供了電源管理的基礎框架和接口。 那么在電源管理的范疇內要如何理解服
    發表于 01-05 14:37 ?1次下載
    Linux<b class='flag-5'>電源</b><b class='flag-5'>管理</b>--<b class='flag-5'>PM</b> QoS

    PCI設備的電源管理

    1 PCI設備的電源管理PCI設備的電源管理包括系統PMruntime
    發表于 01-05 14:37 ?3次下載
    PCI設備的<b class='flag-5'>電源</b><b class='flag-5'>管理</b>
    主站蜘蛛池模板: 日本高清色视频在线观看免费 | 天天干夜夜夜操 | 一区国产传媒国产精品 | 手机看片中文字幕 | 亚洲高清在线视频 | 激五月| www.射| 色狠狠狠色噜噜噜综合网 | 亚洲电影一区二区 | 狠狠色丁香婷婷综合视频 | 国产农村三片免费网站 | 2021国产成人精品久久 | 国产国拍亚洲精品mv在线观看 | 中文字幕亚洲一区二区三区 | 日本国产高清色www视频在线 | 欧美激情片网站 | videosxxoo18在线 | 亚洲日本三级 | 夜夜爽夜夜操 | 性爽爽 | 日本欧美一区二区三区不卡视频 | 97色伦人人| аbt天堂资源在线官网 | 久久精品国产免费观看99 | 天天色天天草 | 国产亚洲新品一区二区 | 黄色成人免费网站 | 欧美性天天影视 | 亚洲精品福利视频 | 2021天天躁狠狠燥 | 国产一级特黄aa大片爽爽 | 国产美女精品久久久久中文 | 亚洲成年人影院 | xxx69日本hd| 成人国产三级在线播放 | 免费又黄又硬又大爽日本 | 天堂在线最新资源 | 欧美69xx性欧美 | 丁香花在线 | 狠狠色噜噜狠狠狠狠五月婷 | 国产最好的精华液网站 |