色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

3天內不再提示

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

yzcdx ? 來源:OS與AUTOSAR研究 ? 2023-11-29 10:15 ? 次閱讀

對于便攜設備來說,電源管理更加的重要,因為電池電量有限,容易電量焦慮。除了省電管理外,還需要對電池進行監控管理充放電管理,這樣保護好電池和系統,能用的更久。

1. Power supply框架都做些什么

這里我們以安卓為例:

439bd30e-8dda-11ee-939d-92fbcf53809c.png

APP 層:該部分屬于電量上報的最后的環節。其主要工作是:監聽系統廣播并對 UI 作出相應更新,包括電池電量百分比,充電狀態,低電提醒,led 指示燈,異常提醒等。

FrameWork 層:本層的 Battery 服務使用 Java 代碼寫成,運行在 FrameWork 中的SystemServer 進程。該系統服務的主要作用是:監聽電池信息變化消息,并將該消息以系統廣播的形式轉發至 Android 系統中各處。

Native 層:Healthd 守護進程屬于 Android Native 層的一個系統服務,負責接受 Kernel Driver 層上報的 uevent 事件,對電池信息和充電狀態實時監控。

Kernel 層:本層屬于電池的驅動部分,由 Charger-manager 驅動、充電 IC 驅動、Fuel 驅動構成,負責與硬件交互,注冊 Power supply 屬性,并生成 uevent 上報 Native 層。包含充電狀態管理、電量統計與更新。

關機充電
關機充電是單獨啟動的一個 linux 應用,通過系統調用直接讀取 sysfs 來獲取電池信息,init 進程會根據啟動模式來啟動 charge 服務,不會啟動 android 相關進程。

我們這里只關注kernel層:

43be2e40-8dda-11ee-939d-92fbcf53809c.png

power supply framework在kernel/drivers/power/下。內核抽象出來power supply子系統為驅動提供了統一的框架。功能包括:

1.抽象PSY設備的共性,向用戶空間提供統一的API

2.為底層PSY驅動的編寫,提供簡單、統一的方式。同事封裝并實現公共邏輯。

power supply class位于drivers/power/目錄中,主要由3部分組成(可參考下圖的軟件架構):

1)power supply core,用于抽象核心數據結構、實現公共邏輯。位于drivers/power/power_supply_core.c中。

2)power supply sysfs,實現sysfs以及uevent功能。位于drivers/power/power_supply_sysfs.c中。

3)power supply leds,基于linux led class,提供PSY設備狀態指示的通用實現。位于drivers/power/power_suppply_leds.c中。

最后,驅動工程師可以基于power supply class,實現具體的PSY drivers,主要處理平臺相關、硬件相關的邏輯。這些drivers都位于drivers/power/目錄下。

2. 相關數據結構和接口

2.1 數據結構

struct power_supply:用于抽象PSY設備

/* include/linux/power_supply.h */
struct power_supply {
const struct power_supply_desc *desc;//PSY描述符

char **supplied_to;
size_t num_supplicants;

char **supplied_from;
size_t num_supplies;
struct device_node *of_node;

/* Driver private data */
void *drv_data;

/* private */
struct device dev;
struct work_struct changed_work;
struct delayed_work deferred_register_work;
spinlock_t changed_lock;
bool changed;
bool initialized;
bool removing;
atomic_t use_cnt;
#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
};

struct power_supply_desc:該描述符定義了psy的屬性

/* Description of power supply */
struct power_supply_desc {
const char *name;//PSY name
enum power_supply_type type;//PSY類型
enum power_supply_usb_type *usb_types;//usb類型
size_t num_usb_types;//usb類型個數
enum power_supply_property *properties;//該PSY具有的屬性列表
size_t num_properties;//屬性的個數

/*
 * Functions for drivers implementing power supply class.
 * These shouldn't be called directly by other drivers for accessing
 * this power supply. Instead use power_supply_*() functions (for
 * example power_supply_get_property()).
 */
int (*get_property)(struct power_supply *psy,//用于獲取psy屬性的回調函數
    enum power_supply_property psp,
    union power_supply_propval *val);
int (*set_property)(struct power_supply *psy,//用于設置psy屬性的回調函數
    enum power_supply_property psp,
    const union power_supply_propval *val);
/*
 * property_is_writeable() will be called during registration
 * of power supply. If this happens during device probe then it must
 * not access internal data of device (because probe did not end).
 */
int (*property_is_writeable)(struct power_supply *psy,//返回指定的屬性值是否可寫(用于sysfs)
     enum power_supply_property psp);
void (*external_power_changed)(struct power_supply *psy);//當一個PSY設備存在并且屬性發生改變時,power supply core會調用該回調函數,通知PSY driver,以便讓它做出相應的處理
void (*set_charged)(struct power_supply *psy);

/*
 * Set if thermal zone should not be created for this power supply.
 * For example for virtual supplies forwarding calls to actual
 * sensors or other supplies.
 */
bool no_thermal;
/* For APM emulation, think legacy userspace. */
int use_for_apm;
};

power_supply_battery_info:管理靜態電池參數的推薦結構

2.2 接口

power_supply_core.c主要負責設備狀態變化邏輯,power_supply_sysfs.c主要負責文件節點相關邏輯。

power_supply_changed:在驅動中檢測到硬件狀態發生變化,會通過該函數調度起psy中的changed_work。該工作隊列負責發送notifier(內核內不同模塊之間)和通過uevent進行change上報。

void power_supply_changed(struct power_supply *psy)
{
unsigned long flags;

dev_dbg(&psy->dev, "%s
", __func__);

spin_lock_irqsave(&psy->changed_lock, flags);
psy->changed = true;
pm_stay_awake(&psy->dev);
spin_unlock_irqrestore(&psy->changed_lock, flags);
schedule_work(&psy->changed_work);
}
EXPORT_SYMBOL_GPL(power_supply_changed);

power_supply_register:通過調用__power_supply_register負責注冊一個psy設備,一般在設備驅動的probe流程中調用

power_supply_get_by_name:通過名字獲取PSY指針

power_supply_put:釋放獲取到的PSY指針,與power_supply_get_by_name成對使用

3. 充電驅動

43d0d504-8dda-11ee-939d-92fbcf53809c.png

Charge Manger、Fuel Gauge、Charge IC,這三部分作為獨立的設備驅動均注冊到 Power-supply 中,每一個設備為單獨的 PSY。PSY 之間可以通過 power supply 屬性相互訪問。

fuel-gauge 跟 charge-ic是服務于 charge-manger,charge-manger 不需要了解硬件細節,僅通過獲取相應功能的 PSY 設備實例,通過這個 PSY 的屬性獲取相應信息。

3.1 Charger Manager

Charger Manager 是充電的控制策略層,主要負責:

修復并更新電量百分比。

充電流程管理(charging,notcharging,discharging,full 充電狀態轉換管理)。

安全管理(Ovp,Health,Charge Time out)。

溫控管理(Jeita 功能,thermal 限流)。

電池電量顯示策略(充放電曲線)。

電池容量管理(容量自學習功能)。

Charger Manager 以“battery”名字注冊至 Power Supply 架構,會讀寫 Fuel Gauge 和 Charger IC 的 Power supply 屬性。

charger-manager {
    compatible = "charger-manager";
    cm-name = "battery";
    cm-poll-mode = <2>; //”_cm_monitor”輪詢模式
    cm-poll-interval = <15000>;//”_cm_monitor”輪詢時間間隔
    cm-battery-stat = <2>;//電池在位檢測方法,電壓法

    cm-fullbatt-vchkdrop-ms = <30000>;//充滿電后,檢查復充條件的周期
    cm-fullbatt-vchkdrop-volt = <84000>;//滿電后復充電壓條件
    cm-fullbatt-voltage = <4350000>;//軟件滿電電壓判斷閾值,必須配置
    cm-fullbatt-current = <120000>;;//軟件滿電電流判斷閾值,必須配置
    cm-fullbatt-capacity = <100>;//電池滿電時百分比

    cm-num-chargers = <1>;//charger ic數量
    //cm-chargers = "sc2721_charger";
    cm-chargers = "fan54015_charger";//charger ic名字
    cm-fuel-gauge = "sc27xx-fgu";//fgu名字

    /* in deci centigrade */
    cm-battery-cold = <200>;
    cm-battery-cold-in-minus;
    cm-battery-hot = <800>;
    cm-battery-temp-diff = <100>;

    /* Allow charging for 6hr */
    cm-charging-max = <36000000>;
    /* recovery charging after stop charging 45min */
    cm-discharging-max = <2700000>;

    /* the interval to feed charger watchdog */
    cm-wdt-interval = <0>;

    /* drop voltage in microVolts to allow shutdown */
    cm-shutdown-voltage = <3470000>;//低電關機電壓

    /* when 99% of the time is exceeded, it will be forced to 100% */
    cm-tickle-time-out = <1500>;

    /* how much time to allow capacity change */
    cm-one-cap-time = <60>;//允許電量增加1%最快時間

    /* when the safe charging voltage is exceeded, stop charging */
    cm-charge-voltage-max = <6500000>;//充電器過壓保護電壓閾值
    /* drop voltage in microVolts to restart charging */
    cm-charge-voltage-drop = <700000>;//復充電壓條件
    //Jeita 溫控策略
    cm-jeita-temp-table = <1000 1030 700000 4200000>,   //不同溫度范圍內的充電電流和充電截止電壓
                    <1150 1180 2000000 4400000>,   //默認最大充電電流為2A
                    <1450 1420 2000000 4400000>,   //充電電壓為4.35V
                    <1600 1570 700000 4200000>;

    regulator@0 {
            cm-regulator-name = "vddgen0";
            cable@0 {
                    cm-cable-name = "USB";
                    extcon = <&extcon_gpio>;
            };
    };
};

充電溫控策略說明

電池溫度T(℃) 充電電流 ICC(mA) 充電截止電壓 VEOC(mV)
T≤0 700 4200
0 2000 4400
15≤T<45 2000 4400
45≤T<60 700 4200
T≥60 0 4200

bat: battery {
    compatible = "simple-battery";
    charge-full-design-microamp-hours = <3900000>;//電池容量uAh
    charge-term-current-microamp = <200000>;//截止充電電流
    constant_charge_voltage_max_microvolt = <4400000>;//截止充電電壓
    factory-internal-resistance-micro-ohms = <115000>;//電池內阻
    voltage-min-design-microvolt = <3561000>;//Vocv低報警電壓

    //電池容量 – 溫度補償表
    capacity-temp-table = <60 100>, <40 100>, <25 100>, <0 100>, <(-10) 80>;
    //電池內阻值 – 溫度補償表
    resistance-temp-table = <60 60>, <40 70>, <25 100>, <0 328>, <(-20) 887>;
};

3.2 Fuel Gauge

PMIC部分主要負責:

庫倫計電量積分

充電器類型獲取

電池在位檢測

開機電壓管理

內阻 – 溫度,容量 – 溫度等補償算法

sc27xx_fuel_gauge 以“sc27xx-fgu”名字注冊至 Power supply 架構,提供屬性給 Charger Manager 讀寫。

pmic_fgu: fgu@a00 {
    compatible = "sprd,sc27xx-fgu", "sprd,sc2731-fgu";
    reg = <0xa00>;
    bat-detect-gpio = <&pmic_eic 9 0>;
    nvmem-cell-names = "fgu_calib";
    nvmem-cells = <&fgu_calib>;
    io-channels = <&pmic_adc 0>, <&pmic_adc 14>, <&pmic_adc 16>;
    io-channel-names = "bat-temp", "charge-vol", "charger-cur";
    interrupt-parent = <&sc2721_pmic>;
    interrupts = <3 IRQ_TYPE_LEVEL_HIGH>;
    monitored-battery = <&bat>;
    sprd,calib-resistance-real = <20000>;//庫侖計芯片真實采樣電阻
    sprd,calib-resistance-spec = <20000>;//庫侖計芯片規格電阻
};

3.3 Charger IC

Charger IC 主要負責以下具體內容:

打開/關閉充電

設置充電電流

設置截止充電電壓點

打開/關閉 OTG

以 Fan54015 為例,將“fan54015_charger”名字注冊至 Power supply 架構。提供屬性給 Charger Manager讀寫。

&i2c3 {
   status = "okay";
   clock-frequency = <400000>;

   fan54015_chg: charger@6a {
           compatible = "fairchild,fan54015_chg";
           reg = <0x6a>;
           phys = <&hsphy>;
           monitored-battery = <&bat>;
           extcon = <&extcon_gpio>;
           vddvbus:otg-vbus {
                   regulator-name = "vddvbus";
           };
   };
};

4. 怎樣基于power supply class編寫PSY driver

最后從PSY driver的角度,說明一下怎么基于power supply class編寫驅動:

(1)根據硬件spec,確定PSY設備具備哪些特性,并把他們和enum power_supply_property對應。

(2)根據實際情況,實現這些properties的get/set接口。

(3)定義一個struct power_supply 變量,并初始化必要字段后,調用power_supply_register或者power_supply_register_no_ws,將其注冊到kernel中。

(4)根據實際情況,啟動設備屬性變化的監控邏輯,例如中斷,輪詢等,并在發生改變時,調用power_supply_changed,通知power suopply core。

power supply子系統的引入 以市面上一款常見的的平板方案來看一看,進入平板的sys/class/power_supply/目錄下

43e71ac6-8dda-11ee-939d-92fbcf53809c.png

可以看到這里有三個****PSY設備,分別對應USB充電器DC充電器,和電池。

進入battery目錄下,發現下面有各種各樣的屬性,另外兩個atc260x-usb 、atc260x-wall目錄下分別也是這樣。

43f53c3c-8dda-11ee-939d-92fbcf53809c.png

然后在內核中找到對應的代碼,進行學習,然后仿制一個出來就可以。以battery驅動為例來分析。

static int __init atc260x_gauge_init(void)

atc260x_gauge_probe(struct platform_device *pdev)

soc_post_process(struct atc260x_gauge_info *info)

power_supply_register(struct device *parent, struct power_supply *psy)

power_supply_changed(struct power_supply *psy)

在相關的函數上打點斷點,然后就可以學習了。

后記:

Linux內核博大精深,里面的機制太多了,不調試或者工作涉及根本學不精。可以了解了解概念和數據結構。遇到了先調試,必須知道了再去查資料研究,學不完,根本學不完。。。

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

    關注

    115

    文章

    6177

    瀏覽量

    144444
  • 接口
    +關注

    關注

    33

    文章

    8575

    瀏覽量

    151015
  • Linux
    +關注

    關注

    87

    文章

    11292

    瀏覽量

    209328
  • 安卓
    +關注

    關注

    5

    文章

    2126

    瀏覽量

    57146
  • 電池
    +關注

    關注

    84

    文章

    10560

    瀏覽量

    129471

原文標題:電源管理入門-17 Power supply子系統

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

收藏 人收藏

    評論

    相關推薦

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

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

    電源管理入門Power Domain管理

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

    External-Sync Power Supply

    switching noise, the power supply can be automaticallysynchronized at the fixed frequency
    發表于 03-27 15:56

    HIGH CURRENT OFF LINE POWER SUPPLY

    Design Engineers are constantly pushed to reduce thespace and cost of the power supply
    發表于 05-12 11:01

    ATX Switching power supply 開關電源電路

    ATX Switching power supply 開關電源電路 [hide] [/hide]
    發表于 12-20 13:40

    Power Supply and Ground Design for a WiFi Transceiver

    `Power Supply and Ground Design for a WiFi Transceiver無線接收器的電源和接地設計雖然是英文資料,但是很精典哦。`
    發表于 01-28 17:39

    SWITCH POWER SUPPLY DESIGN

    SWITCH POWER SUPPLY DESIGN
    發表于 08-16 11:53

    什么是穩壓電源(Regulated Power Supply)

    https://www.iiiff.com/article/316981什么是穩壓電源(Regulated Power Supply)?穩壓電源是與電力設備一起使用的設備。它確保設備免
    發表于 06-30 07:02

    高通平臺power_supply 框架下添加第三方充電IC的驅動方法 精選資料分享

    1.power_supply電源框架介紹:power supply framework在kernel/drivers/power/下。內核抽
    發表于 07-22 09:50

    【學習打卡】OpenHarmony的電源管理服務子系統介紹

    正如標準的windows或者linux系統一樣,任何系統都少不了電源管理服務子系統,這是一個系統
    發表于 07-23 22:09

    電源設計軟件power Supply Designer II

    電源設計軟件power Supply Designer 2I
    發表于 04-18 23:57 ?329次下載
    <b class='flag-5'>電源</b>設計軟件<b class='flag-5'>power</b> <b class='flag-5'>Supply</b> Designer II

    Power Supply Management—Principles

    Power Supply Management—Principles, Problems, and Parts:INTRODUCTION Power supply
    發表于 09-25 08:18 ?26次下載

    防火墻原理入門

    防火墻原理入門 防火墻能增強機構內部網絡的安全性。防火墻系統決定了哪些內部服務可以被外界訪問;外界的哪些人可以訪問內部的服務以及哪
    發表于 08-01 10:21 ?1022次閱讀
    防火墻原<b class='flag-5'>理入門</b>

    Power Supply Topologies 電源拓撲結構

    本文檔內容結合介紹了Power Supply Topologies電源拓撲結構,供參考。
    發表于 02-10 12:25 ?32次下載

    個人導航設備的電源管理子系統設計

    電子發燒友網站提供《個人導航設備的電源管理子系統設計.doc》資料免費下載
    發表于 11-13 10:56 ?0次下載
    個人導航設備的<b class='flag-5'>電源</b><b class='flag-5'>管理</b><b class='flag-5'>子系統</b>設計
    主站蜘蛛池模板: 87.6在线收听| 超碰免费视频在线观看| 熟女理发厅| 我的漂亮朋友在线观看全集免费| 国产在线午夜| 国产成人精品视频频| 1234成人网| 亚洲国产成人精品不卡青青草原| 男生插曲女生身全过程| 国产一区二区三区国产精品| mxgs-877痉挛媚药按摩| 影音先锋2017av天堂| 午夜伦理:伦理片| 朋友的娇妻好爽好烫嗯 | 草莓AV福利网站导航| 在线高清电影理论片4399| 性生交片免费无码看人| 欧美日韩亚洲综合2019| 韩日美无码精品无码| 国产精品大全国产精品| 成人午夜精品久久久久久久秋霞| 竹菊影视一区二区三区| 91精选国产| 99久久久免费精品免费| 91九色麻豆| 99re8在线视频精品| 99热久久这里只精品国产WWW | 久久久无码精品无码国产人妻丝瓜| 国产在线高清亚洲精品一区 | 怡春院院日本一区二区久久| 亚洲天堂999| 中文字幕日本在线mv视频精品| 伊人亚洲AV久久无码精品| 2020亚洲 欧美 国产 日韩| 51国产偷自视频在线视频播放| 4399日本电影完整版在线观看免费| 99久久精品免费看国产一区二区| 在线观看视频中文字幕| 99国产精品久久人妻无码| 超碰久久国产vs| 国产自啪偷啪视频在线|