高通電源管理函數的power_supply的調用關係

来源:https://www.cnblogs.com/linhaostudy/archive/2019/10/24/11731019.html
-Advertisement-
Play Games

以msm8909為例,高通的主要文件有幾個: qpnp linear charger.c(線性充電器) qpnp vm bms.c(BMS管理) power_supply_core.c(power_supply對外部提供對應介面) 其中,vm_bus的power_supply一般為struct po ...


以msm8909為例,高通的主要文件有幾個:

  • qpnp-linear-charger.c(線性充電器)
  • qpnp-vm-bms.c(BMS管理)
  • power_supply_core.c(power_supply對外部提供對應介面)

其中,vm_bus的power_supply一般為struct power_supply *bms_psy;
而linear-charger則是struct power_supply usb_psy;
(當然這隻是一個命名方式而已了)

power_supply具體參考這篇博客:

Linux power supply class(1)_軟體架構及API彙整【轉】


struct power_supply {
    const char *name;
    enum power_supply_type type;
    enum power_supply_property *properties;
    size_t num_properties;

    char **supplied_to;
    size_t num_supplicants;

    char **supplied_from;
    size_t num_supplies;
#ifdef CONFIG_OF
    struct device_node *of_node;
#endif

    int (*get_property)(struct power_supply *psy,
                enum power_supply_property psp,
                union power_supply_propval *val);
    int (*set_property)(struct power_supply *psy,
                enum power_supply_property psp,
                const union power_supply_propval *val);
    int (*property_is_writeable)(struct power_supply *psy,
                     enum power_supply_property psp);
    void (*external_power_changed)(struct power_supply *psy);
    void (*set_charged)(struct power_supply *psy);

    /* For APM emulation, think legacy userspace. */
    int use_for_apm;

    /* private */
    struct device *dev;
    struct work_struct changed_work;
    spinlock_t changed_lock;
    bool changed;
#ifdef CONFIG_THERMAL
    struct thermal_zone_device *tzd;
    struct thermal_cooling_device *tcd;
#endif

#ifdef CONFIG_LEDS_TRIGGERS
    struct led_trigger *charging_full_trig;
    char *charging_full_trig_name;
    struct led_trigger *charging_trig;
    char *charging_trig_name;
    struct led_trigger *full_trig;
    char *full_trig_name;
    struct led_trigger *online_trig;
    char *online_trig_name;
    struct led_trigger *charging_blink_full_solid_trig;
    char *charging_blink_full_solid_trig_name;
#endif
};

獲取電量百分比改變:

在vm_bus.c中一般都有power_supply_changed()函數來改變其節點屬性;

power_supply_changed(&chip->bms_psy);(qpnp-vm-bms.c) -->
power_supply_changed()中有一個工作隊列schedule_work(&psy->changed_work);(power_supply_core.c)-->
power_supply_changed_work()工作隊列-->
class_for_each_device(power_supply_class, NULL, psy,__power_supply_changed_work);對power_supply_class下的每個設備都進行匹配 -->
__power_supply_changed_work調用psy->external_power_changed中的函數-->
qpnp_vm_bms_ext_power_changed是bms_psy.external_power_changed註冊的回調函數;

qpnp_vm_bms_ext_power_changed則是獲取電池的狀態,根據各個函數來判斷;

獲取電量值:

power supply class將所有可能PSY屬性,以枚舉型變數形式抽象出來,PSY driver可以根據設備的實際情況,從中選取一些。

enum power_supply_property {
    /* Properties of type `int' */
    POWER_SUPPLY_PROP_STATUS = 0, //該PSY的status,主要是充電狀態,包括:unknown,charging,discharging,not charging full,
    POWER_SUPPLY_PROP_CHARGE_TYPE,//充電類型
    POWER_SUPPLY_PROP_HEALTH, //健康狀況,包括:good dead  over voltage等
    POWER_SUPPLY_PROP_PRESENT, //電量百分比
    POWER_SUPPLY_PROP_ONLINE,  //是否線上
    POWER_SUPPLY_PROP_AUTHENTIC,
    POWER_SUPPLY_PROP_TECHNOLOGY, //採用的技術
    POWER_SUPPLY_PROP_CYCLE_COUNT,
    POWER_SUPPLY_PROP_VOLTAGE_MAX,
    POWER_SUPPLY_PROP_VOLTAGE_MIN,
    POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN,
    POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN,
    POWER_SUPPLY_PROP_VOLTAGE_NOW,
    POWER_SUPPLY_PROP_VOLTAGE_AVG,
    POWER_SUPPLY_PROP_VOLTAGE_OCV,
    POWER_SUPPLY_PROP_CURRENT_MAX,
    POWER_SUPPLY_PROP_CURRENT_NOW,
    POWER_SUPPLY_PROP_CURRENT_AVG,
    POWER_SUPPLY_PROP_POWER_NOW,
    POWER_SUPPLY_PROP_POWER_AVG,
    POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN,
    POWER_SUPPLY_PROP_CHARGE_EMPTY_DESIGN,
    POWER_SUPPLY_PROP_CHARGE_FULL,
    POWER_SUPPLY_PROP_CHARGE_EMPTY,
    POWER_SUPPLY_PROP_CHARGE_NOW,
    POWER_SUPPLY_PROP_CHARGE_AVG,
    POWER_SUPPLY_PROP_CHARGE_COUNTER,
    POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT,
    POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX,
    POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE,
    POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX,
    POWER_SUPPLY_PROP_CHARGE_CONTROL_LIMIT,
    POWER_SUPPLY_PROP_CHARGE_CONTROL_LIMIT_MAX,
    POWER_SUPPLY_PROP_ENERGY_FULL_DESIGN,
    POWER_SUPPLY_PROP_ENERGY_EMPTY_DESIGN,
    POWER_SUPPLY_PROP_ENERGY_FULL,
    POWER_SUPPLY_PROP_ENERGY_EMPTY,
    POWER_SUPPLY_PROP_ENERGY_NOW,
    POWER_SUPPLY_PROP_ENERGY_AVG,
    POWER_SUPPLY_PROP_CAPACITY, /* in percents! */
    POWER_SUPPLY_PROP_CAPACITY_ALERT_MIN, /* in percents! */
    POWER_SUPPLY_PROP_CAPACITY_ALERT_MAX, /* in percents! */
    POWER_SUPPLY_PROP_CAPACITY_LEVEL, //容量
    POWER_SUPPLY_PROP_TEMP,
    POWER_SUPPLY_PROP_TEMP_ALERT_MIN,
    POWER_SUPPLY_PROP_TEMP_ALERT_MAX,
    POWER_SUPPLY_PROP_TEMP_AMBIENT,
    POWER_SUPPLY_PROP_TEMP_AMBIENT_ALERT_MIN,
    POWER_SUPPLY_PROP_TEMP_AMBIENT_ALERT_MAX,
    POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW,
    POWER_SUPPLY_PROP_TIME_TO_EMPTY_AVG,
    POWER_SUPPLY_PROP_TIME_TO_FULL_NOW,
    POWER_SUPPLY_PROP_TIME_TO_FULL_AVG,
    POWER_SUPPLY_PROP_TYPE, /* use power_supply.type instead */
    POWER_SUPPLY_PROP_SCOPE,
    /* Local extensions */
    POWER_SUPPLY_PROP_USB_HC,
    POWER_SUPPLY_PROP_USB_OTG,
    POWER_SUPPLY_PROP_CHARGE_ENABLED,
    /* Local extensions of type int64_t */
    POWER_SUPPLY_PROP_CHARGE_COUNTER_EXT,
    /* Properties of type `const char *' */
    POWER_SUPPLY_PROP_MODEL_NAME,
    POWER_SUPPLY_PROP_MANUFACTURER,
    POWER_SUPPLY_PROP_SERIAL_NUMBER,
};

根據屬性來判斷:

qpnp-linear-charger.c中的chip->bms_psy->get_property(qpnp-linear-charger.c)————>
qpnp_vm_bms_power_get_property————>
get_prop_bms_capacity

設置電量:

以設置充電狀態為例,POWER_SUPPLY_STATUS_CHARGING為其power_supply需要設置的狀態,並且使用POWER_SUPPLY_PROP_STATUS來確定設置的東西:

vm_bus只有在復充的時候會會設置充電,其他情況都只有linear-charge充電器中使用:

ret.intval = POWER_SUPPLY_STATUS_CHARGING;
rc = chip->batt_psy->set_property(chip->batt_psy,
        POWER_SUPPLY_PROP_STATUS, &ret);

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • set 命令:命令將value數值存儲在指定的key中; key:鍵值 key-value 結構中的 key,用於查找緩存值。 flags:可以包括鍵值對的整型參數,客戶機使用它存儲關於鍵值對的額外信息 。 exptime:在緩存中保存鍵值對的時間長度(以秒為單位,0 表示永遠) bytes:在緩存 ...
  • linux 快捷鍵1、ls 列出本地址上文件, -a 列出所有(包括隱藏文件) -l 按照列表方式顯示 -t 按照時間方式排序 2、touch 創建文件 3、 echo 'abc' > 文件名 寫入文件內容(覆蓋之前的內容) echo 'cdc' >> 文件名 在文件後面添加信息 4、mkdir - ...
  • FastDFS FastDFS的作者餘慶在其 "GitHub" 上是這樣描述的:“FastDFS is an open source high performance distributed file system. It's major functions include: file storin ...
  • 1.軟體介紹 VirtualBox VirtualBox 是一款免費的開源虛擬機軟體,所謂虛擬機軟體,就是能夠提供各種模擬的硬體環境,並且在其上安裝各種操作系統,目前支持Window,Linux,Mac OS X.其下載地址可以點擊這裡。點擊鏈接後,因為是要在window下安裝,可以參考下麵,直接點 ...
  • 一般基於Linux發行的操作系統,如centos,Ubuntu下的服務管理命令:service和systemctl。以我目前的實踐來看,這兩個命令在用法上是一致的。 基於UNIX的solaris環境下的命令: svcs和svcadm 根據博客:https://blog.csdn.net/u01337 ...
  • 宿主機連接wifi,虛擬機無法聯網 查看是否有網路圖標 操作一: sudo service network-manager stopsudo rm /var/lib/NetworkManager/NetworkManager.statesudo service network-manager sta ...
  • 項目中需要一個聊天室的功能,所以需要websocket通信,選擇了使用 模塊,主要記錄下 部署的配置和一些坑. 原項目是通過nginx+uwsgi部署的,這裡我沒做任何改動,只是通過Nginx將特定請求路徑代理到daphne上.部署前對 配置的一些修改可以直接參考 "官方文檔" ,這個比較簡單,也沒 ...
  • 1、關閉HDMI輸出 /opt/vc/bin/tvservice -o 2、關閉模塊 vi /etc/modules #snd-bcm2835 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...