高通電源管理函數的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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...