目录

  • 基于展锐SL8541E平台,linux内核为4.14版本
    • 一、充电驱动代码框架
    • 二、power supply简介
      • 1.Power Supply主要部分
      • 2.Power Supply核心数据结构
        • struct power_supply:用于抽象PSY设备
        • struct power_supply_desc:该描述符定义了psy的属性
        • power_supply_battery_info:管理静态电池参数的推荐结构
      • 3.相关接口函数
    • 三、充电驱动描述
      • 1.Charger Manager
      • 2.Fuel Gauge
      • 3.Charger IC
      • 4.fan54015芯片充电驱动
      • 5.充电电流软硬件匹配
      • 6.kconfigs配置
      • 7.ADB终端读取PSY属性
    • 四、DTS 设备文件关联节点
      • 1.i2c3节点
      • 2.pmic_fpu节点
      • 3.bat: battery节点
      • 4.charger-manager节点

基于展锐SL8541E平台,linux内核为4.14版本

一、充电驱动代码框架

Android 层充电构架如图 所示,充电设备驱动按照标准的 linux power supply 架构设计,通过 ueventd守护进程 Healthd 上报相关信息,并将消息广播。

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 层。包含充电状态管理、电量统计与更新。
Kernel 充电驱动文件:
− kernel4.14/drivers/power/supply/charger-manager.c
− kernel4.14/drivers/power/supply/sc27xx_fuel_gauge.c
− kernel4.14/drivers/power/supply/sc2720-charger.c
− kernel4.14/drivers/power/supply/sc2721-charger.c
− kernel4.14/drivers/power/supply/fan54015-charger.c
− kernel4.14/drivers/power/supply/sc2730_fast_charger.c
关机充电
关机充电展讯单独启动的一个 linux 应用,通过系统调用直接读取 sysfs 来获取电池信息,init 进程会根据启动模式来启动 charge 服务,不会启动 android 相关进程。

:Framework是一个中间层的软件,提供软件开发的框架。其目有三:

  1. 屏蔽具体的实现细节,固定对上的接口,这样可以方便上层软件的开发和维护;
  2. 尽可能抽象公共逻辑,并在Framework内实现,以提高重用性、减少开发量;
  3. 向下层提供一系列的回调函数,下层软件可能面对差别较大的现实,但只要填充这些回调函数,即可完成所有逻辑,减小了开发的难度。

二、power supply简介

power supply(psy)是Linux中从供电驱动抽象出来的子系统,是Linux电源管理的重要组成部分。psy是一个中间层,在kernel中是属于设备驱动的一部分,psy的作用主要是向用户空间汇总各类供电的状态信息。抽象出来的各类信息对应一个枚举类型power_supply_property。在驱动层,主要是两大模块,与电池相关的驱动和与充放电管理相关的驱动,这两大模块主要处理硬件相关的逻辑,在硬件状态发生变化时,会触发相关的中断,驱动层会调用相应的中断函数,并更新修改相应的psy节点值。驱动负责更新psy节点的状态,HAL层会去读这些节点,驱动在检测硬件、传感器信息变化会去更新节点值。psy子系统的基础是建立在设备驱动模型之上的,主要运用了其中的class、device、kobject、sysfs、uevent相关知识,也是驱动设备模型的一个具体应用。psy子系统中power_supply_class对应着系统中供电设备类,是一个抽象化的集合。

1.Power Supply主要部分

power supply framework在kernel/drivers/power/supply/目录下
主要由3部分组成
1、power supply core,用于抽象核心数据结构、实现公共逻辑。位于drivers/power/supply/power_supply_core.c中
2、power supply sysfs,实现sysfs以及uevent功能。位于drivers/power/supply/power_supply_sysfs.c中
3、power supply leds,基于linux led class,提供PSY设备状态指示的通用实现。位于drivers/power/supply/power_suppply_leds.c中。

2.Power Supply核心数据结构

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_THERMALstruct thermal_zone_device *tzd;struct thermal_cooling_device *tcd;
#endif#ifdef CONFIG_LEDS_TRIGGERSstruct 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 nameenum 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:管理静态电池参数的推荐结构

/** This is the recommended struct to manage static battery parameters,* populated by power_supply_get_battery_info(). Most platform drivers should* use these for consistency.* Its field names must correspond to elements in enum power_supply_property.* The default field value is -EINVAL.* Power supply class itself doesn't use this.*/struct power_supply_battery_info {int energy_full_design_uwh;        /* microWatt-hours */int charge_full_design_uah;        /* microAmp-hours */int voltage_min_design_uv;      /* microVolts */int precharge_current_ua;       /* microAmps */int charge_term_current_ua;      /* microAmps */int constant_charge_current_max_ua; /* microAmps */int constant_charge_voltage_max_uv; /* microVolts */int factory_internal_resistance_uohm;   /* microOhms */int ocv_temp[POWER_SUPPLY_OCV_TEMP_MAX];/* celsius */int rint_temp[POWER_SUPPLY_OCV_TEMP_MAX];/* celsius */int rint_cap[POWER_SUPPLY_CAP_TEMP_MAX];struct power_supply_battery_ocv_table *ocv_table[POWER_SUPPLY_OCV_TEMP_MAX];int *rint_cap_temp[POWER_SUPPLY_OCV_TEMP_MAX];int ocv_table_size[POWER_SUPPLY_OCV_TEMP_MAX];struct power_supply_vol_temp_table *temp_table;struct power_supply_capacity_temp_table *cap_table;struct power_supply_resistance_temp_table *resistance_table;int temp_table_size;int cap_table_size;int resistance_table_size;int ocv_temp_size;int rint_temp_size;int rint_cap_size;struct power_supply_charge_current cur;
};

3.相关接口函数

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\n", __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_register() - Register new power supply* @parent:  Device to be a parent of power supply's device, usually*       the device which probe function calls this* @desc: Description of power supply, must be valid through whole*       lifetime of this power supply* @cfg:   Run-time specific configuration accessed during registering,*       may be NULL** Return: A pointer to newly allocated power_supply on success* or ERR_PTR otherwise.* Use power_supply_unregister() on returned power_supply pointer to release* resources.*/
struct power_supply *__must_check power_supply_register(struct device *parent,const struct power_supply_desc *desc,const struct power_supply_config *cfg)
{return __power_supply_register(parent, desc, cfg, true);
}
EXPORT_SYMBOL_GPL(power_supply_register);

power_supply_get_by_name:通过名字获取PSY指针

/*** power_supply_get_by_name() - Search for a power supply and returns its ref* @name: Power supply name to fetch** If power supply was found, it increases reference count for the* internal power supply's device. The user should power_supply_put()* after usage.** Return: On success returns a reference to a power supply with* matching name equals to @name, a NULL otherwise.*/
struct power_supply *power_supply_get_by_name(const char *name)
{struct power_supply *psy = NULL;struct device *dev = class_find_device(power_supply_class, NULL, name,power_supply_match_device_by_name);if (dev) {psy = dev_get_drvdata(dev);atomic_inc(&psy->use_cnt);}return psy;
}
EXPORT_SYMBOL_GPL(power_supply_get_by_name);

power_supply_put:释放获取到的PSY指针,与power_supply_get_by_name成对使用

/*** power_supply_put() - Drop reference obtained with power_supply_get_by_name* @psy: Reference to put** The reference to power supply should be put before unregistering* the power supply.*/
void power_supply_put(struct power_supply *psy)
{might_sleep();atomic_dec(&psy->use_cnt);put_device(&psy->dev);
}

三、充电驱动描述

Kernel 驱动分为三个部分,分别是 Charge Manger、Fuel Gauge、Charge IC。这三部分作为独立的设备驱动均注册到 Power-supply 中,每一个设备为单独的 PSY。PSY 之间可以通过 power supply 属性相互访问,这三者的关系可以通过图 1-4 来表示。虽然每个 PSY 都是独立的,但实际上 fuel-gauge 跟 charge-ic是服务于 charge-manger,charge-manger 不需要了解硬件细节,仅通过获取相应功能的 PSY 设备实例,通过这个 PSY 的属性获取相应信息。

1.Charger Manager

Charger Manager 是充电的控制策略层,主要负责:

  1. 修复并更新电量百分比。
  2. 充电流程管理(charging,notcharging,discharging,full 充电状态转换管理)。
  3. 安全管理(Ovp,Health,Charge Time out)。
  4. 温控管理(Jeita 功能,thermal 限流)。
  5. 电池电量显示策略(充放电曲线)。
  6. 电池容量管理(容量自学习功能)。

Charger Manager 以“battery”名字注册至 Power Supply 架构,会读写 Fuel Gauge 和 Charger IC 的 Power
supply 属性。

2.Fuel Gauge

PMIC 部分主要负责:

  1. 库伦计电量积分
  2. 充电器类型获取
  3. 电池在位检测
  4. 开机电压管理
  5. 内阻 – 温度,容量 – 温度等补偿算法

sc27xx_fuel_gauge 以“sc27xx-fgu”名字注册至 Power supply 架构,提供属性给 Charger Manager 读写。

3.Charger IC

Charger IC 主要负责以下具体内容:

  1. 打开/关闭充电
  2. 设置充电电流
  3. 设置截止充电电压点
  4. 打开/关闭 OTG
    以 Fan54015 为例,将“fan54015_charger”名字注册至 Power supply 架构。提供属性给 Charger Manager
    读写。

4.fan54015芯片充电驱动

//kernel/drivers/power/supply/fan54015-charger.c
//usb类型列表
static enum power_supply_usb_type fan54015_charger_usb_types[] = {POWER_SUPPLY_USB_TYPE_UNKNOWN,POWER_SUPPLY_USB_TYPE_SDP,POWER_SUPPLY_USB_TYPE_DCP,POWER_SUPPLY_USB_TYPE_CDP,POWER_SUPPLY_USB_TYPE_C,POWER_SUPPLY_USB_TYPE_PD,POWER_SUPPLY_USB_TYPE_PD_DRP,POWER_SUPPLY_USB_TYPE_APPLE_BRICK_ID
};
//PSY属性列表
static enum power_supply_property fan54015_usb_props[] = {POWER_SUPPLY_PROP_STATUS,POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT,POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT,POWER_SUPPLY_PROP_ONLINE,POWER_SUPPLY_PROP_HEALTH,POWER_SUPPLY_PROP_USB_TYPE,
};
//PSY描述符
static const struct power_supply_desc fan54015_charger_desc = {.name           = "fan54015_charger",.type           = POWER_SUPPLY_TYPE_USB,.properties        = fan54015_usb_props,.num_properties       = ARRAY_SIZE(fan54015_usb_props),.get_property     = fan54015_charger_usb_get_property,.set_property      = fan54015_charger_usb_set_property,.property_is_writeable = fan54015_charger_property_is_writeable,.usb_types        = fan54015_charger_usb_types,.num_usb_types        = ARRAY_SIZE(fan54015_charger_usb_types),
};

5.充电电流软硬件匹配

根据硬件所采用的采样电阻值,在驱动中匹配8个电流档位。

static int fan54015_charger_set_current(struct fan54015_charger_info *info,u32 cur)
{u8 reg_val;if (cur < 700000)reg_val = 0x0;else if (cur >= 700000 && cur < 900000)reg_val = 0x1;else if (cur >= 900000 && cur < 1100000)reg_val = 0x2;else if (cur >= 1100000 && cur < 1300000)reg_val = 0x3;else if (cur >= 1300000 && cur < 1500000)reg_val = 0x4;else if (cur >= 1500000 && cur < 1700000)reg_val = 0x5;else if (cur >= 1700000 && cur < 1900000)reg_val = 0x6;else if (cur >= 1900000)reg_val = 0x7;return fan54015_update_bits(info, FAN54015_REG_4,FAN54015_REG_CURRENT_MASK | FAN54015_REG_RESET_MASK,reg_val << FAN54015_REG_CURRENT_MASK_SHIFT);
}static int fan54015_charger_get_current(struct fan54015_charger_info *info,u32 *cur)
{u8 reg_val;int ret;ret = fan54015_read(info, FAN54015_REG_4, &reg_val);if (ret < 0)return ret;reg_val &= FAN54015_REG_CURRENT_MASK;reg_val = reg_val >> FAN54015_REG_CURRENT_MASK_SHIFT;switch (reg_val) {case 0:*cur = 656000;//*cur = 550000;break;case 1:*cur = 786000;//*cur = 650000;break;case 2:*cur = 1048000;//*cur = 750000;break;case 3:*cur = 1180000;//*cur = 850000;break;case 4:*cur = 1442000;//*cur = 1050000;break;case 5:*cur = 1574000;//*cur = 1150000;break;case 6:*cur = 1836000;//*cur = 1350000;break;case 7:*cur = 1966000;//*cur = 1450000;break;default:*cur = 656000;//*cur = 550000;}return 0;
}

6.kconfigs配置

kconfig 文件是通过配置宏来管理文件或代码是否需要进行编译,是linux可裁剪特性的主要实现方式。(ps:makefile的作用是用来管理文件之间的依赖关系的)
修改文件路径:kernel4.14/arch/arm/configs/su806_v2_defconfig

//添加Fan54015驱动,取消SC2721驱动
-# CONFIG_CHARGER_FAN54015 is not set
-CONFIG_CHARGER_SC2721=y
-# CONFIG_GHT_FEATURE_DISABLE_CHARGING is not set
+CONFIG_CHARGER_FAN54015=y
+# CONFIG_CHARGER_SC2721 is not set

7.ADB终端读取PSY属性

四、DTS 设备文件关联节点

文件路径:kernel4.14/arch/arm/boot/dts/su806-v2-evk/su806-native.dts

1.i2c3节点

&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";};};
};

2.pmic_fpu节点

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.bat: battery节点

bat: battery {compatible = "simple-battery";charge-full-design-microamp-hours = <3900000>;//电池容量uAhcharge-term-current-microamp = <200000>;//截止充电电流constant_charge_voltage_max_microvolt = <4400000>;//截止充电电压factory-internal-resistance-micro-ohms = <115000>;//电池内阻voltage-min-design-microvolt = <3561000>; //Vocv低报警电压ocv-capacity-celsius = <(-20) 0 20 40 60>;ocv-capacity-table-0 = <4350000 100>, <4278000 95>, <4218000 90>,<4167000 85>, <4117000 80>, <4067000 75>,<4017000 70>, <3967000 65>, <3917000 60>,<3867000 55>, <3817000 50>, <3781000 45>,<3756000 40>, <3733000 35>, <3713000 30>,<3698000 25>, <3683000 20>, <3667000 15>,<3628000 10>, <3548000 5>, <3400000 0>;ocv-capacity-table-1 = <4350000 100>, <4278000 95>, <4218000 90>,<4167000 85>, <4117000 80>, <4067000 75>,<4017000 70>, <3967000 65>, <3917000 60>,<3867000 55>, <3817000 50>, <3781000 45>,<3756000 40>, <3733000 35>, <3713000 30>,<3698000 25>, <3683000 20>, <3667000 15>,<3628000 10>, <3548000 5>, <3400000 0>;ocv-capacity-table-2 = <4350000 100>, <4278000 95>, <4218000 90>,<4167000 85>, <4117000 80>, <4067000 75>,<4017000 70>, <3967000 65>, <3917000 60>,<3867000 55>, <3817000 50>, <3781000 45>,<3756000 40>, <3733000 35>, <3713000 30>,<3698000 25>, <3683000 20>, <3667000 15>,<3628000 10>, <3548000 5>, <3400000 0>;ocv-capacity-table-3 = <4350000 100>, <4278000 95>, <4218000 90>,<4167000 85>, <4117000 80>, <4067000 75>,<4017000 70>, <3967000 65>, <3917000 60>,<3867000 55>, <3817000 50>, <3781000 45>,<3756000 40>, <3733000 35>, <3713000 30>,<3698000 25>, <3683000 20>, <3667000 15>,<3628000 10>, <3548000 5>, <3400000 0>;ocv-capacity-table-4 = <4350000 100>, <4278000 95>, <4218000 90>,<4167000 85>, <4117000 80>, <4067000 75>,<4017000 70>, <3967000 65>, <3917000 60>,<3867000 55>, <3817000 50>, <3781000 45>,<3756000 40>, <3733000 35>, <3713000 30>,<3698000 25>, <3683000 20>, <3667000 15>,<3628000 10>, <3548000 5>, <3400000 0>;voltage-temp-table = <1215000 700>, <1199000 750>, <1155000 850>,<1046000 1000>, <942000 1100>, <748000 1250>,<547000 1400>, <426000 1500>, <283000 1650>,<212000 1750>;rint-temp-celsius = <(-20) 0 20 40 60>;rint-capacity-celsius = <100 95 90 85 80 75 70 65 60 5550 45 40 35 30 25 20 15 10 5 0>;rint-capacity-table = <365 145 124 124 143>,<543 197 141 136 150>,<574 207 143 138 152>,<567 209 145 140 158>,<557 212 148 142 162>,<547 214 152 144 165>,<537 212 154 145 167>,<528 207 155 147 170>,<520 200 157 149 172>,<514 194 156 150 170>,<509 191 149 144 164>,<504 192 146 141 163>,<503 195 146 142 165>,<507 200 147 143 168>,<513 206 149 146 171>,<523 214 152 146 166>,<538 224 152 143 165>,<558 239 151 144 167>,<588 278 153 146 169>,<632 460 163 149 174>,<689 609 211 162 207>;charge-sdp-current-microamp = <450000 450000>;charge-dcp-current-microamp = <2000000 2000000>;charge-cdp-current-microamp = <2000000 2000000>;charge-unknown-current-microamp = <2000000 2000000>;//电池容量 – 温度补偿表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>;};

4.charger-manager节点

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<T<15 2000 4400
15≤T<45 2000 4400
45≤T<60 700 4200
T≥60 0 4200

linux 电源管理 power supply class相关推荐

  1. Linux电源管理(1)_整体架构 -- wowo

    1. 前言 在这个世界中,任何系统的运转都需要能量.如树木依靠光能生长,如马儿依靠食物奔跑,如计算机系统依靠电能运行.而能量的获取是有成本的,因此如果能在保证系统运转的基础上,尽量节省对能量的消耗,就 ...

  2. Linux电源管理(10)_autosleep

    Linux电源管理(10)_autosleep 作者:wowo 发布于:2014-9-18 23:42 分类:电源管理子系统 1. 前言 Autosleep也是从Android wakelocks补丁 ...

  3. linux 电源管理 regulator,Linux内核电源管理综述

    资料: http://blog.csdn.net/bingqingsuimeng/article/category/1228414 http://os.chinaunix.net/a2006/0519 ...

  4. Linux电源管理(5)_Hibernate和Sleep功能介绍【转】

    本文转载自:http://www.wowotech.net/pm_subsystem/std_str_func.html 1. 前言 Hibernate和Sleep两个功能是Linux Generic ...

  5. linux 电池管理软件,Linux电源管理(2)_Generic PM之基本概念和软件架构

    Linux电源管理(2)_Generic PM之基本概念和软件架构 作者:wowo 发布于:2014-5-13 19:24 分类:电源管理子系统 1. 前言 这里的Generic PM,是蜗蜗自己起的 ...

  6. linux系统电源时钟,linux电源管理的一些梳理

    由于项目产品需要过能源之星3.0,所以最近做了一些电源管理低功耗方面的工作,抽个时间正好梳理一下. 其实Linux 电源管理非常复杂,牵扯到很多方面,比如系统级的待机.频率电压变换.系统空闲时的处理以 ...

  7. Linux电源管理(2)_Generic PM之基本概念和软件架构(蜗窝科技,www.wowotech.net)

    1. 前言 这里的Generic PM,是蜗蜗自己起的名字,指Linux系统中那些常规的电源管理手段,包括关机(Power off).待机(Standby or Hibernate).重启(Reboo ...

  8. linux 电源管理 Generic PM之Suspend功能

    Linux电源管理(6)_Generic PM之Suspend功能 作者:wowo 发布于:2014-8-22 21:40 分类:电源管理子系统 1. 前言 Linux内核提供了三种Suspend: ...

  9. Linux电源管理(一)电源管理系统架构

    概述 Linux 电源管理非常复杂,牵扯到系统级的待机.频率电压变换.系统空闲时的处理以及每个设备驱动对于系统待机的支持和每个设备的运行时电源管理,可以说和系统中的每个设备驱动都息息相关. 对于消费电 ...

  10. Linux电源管理(6)_Generic PM之Suspend功能【重磅文章】-- wowo

    文章目录 1. 前言 2. Suspend功能有关的代码分布 1)PM Core 2)Device PM 3)Platform dependent PM 3. suspend&resume过程 ...

最新文章

  1. 必知必会的微服务面试题
  2. Android性能系列-渲染篇
  3. 再见!人人影视...
  4. (1 LEETCODE)2. Add Two Numbers
  5. 160 - 11 Andrnalin.4
  6. 前端学习(1799):前端调试之清除浮动
  7. 摇一摇 声音 html5,HTML5摇一摇以及音频播放问题优化总结
  8. hive转16进制unhex_Java 进制的转换
  9. vue_cli全局变量使用
  10. nginx之反向代理配置
  11. 怎么查计算机二级证书到没到学校,今年3月份考的全国计算机二级,结果忘记去领证书了,我是在城建学院考的,还会给我留着吗?这证书能补办吗...
  12. 阿里java编程规范试题_阿里java编码规范考试总结
  13. Centos7安装maven
  14. centos7下载安装postgresql 12详细过程
  15. html5 dreamlive,DREAM LIVE 5th Tour Stargazer即将开演
  16. EXCEL中如何让某些行列固定不动
  17. 【NOIP2017提高A组模拟9.5】 NYG的背包
  18. File xxx specified for property 'resourceFile' does not exist.解决方法
  19. Java套接字程序_java – 通过Web套接字进行应用程序到应用程序的通信
  20. 爱尔眼科跌超11%,葛兰管理的中欧医疗健康混合基金产品重仓股

热门文章

  1. 用图层蒙版抠图并合成(每天一个PS小项目)
  2. js 获取字符长度(英文1,中文2)
  3. 微软产品居然出现中文兼容问题
  4. 台式计算机主板接口识别,硬件丨当前台式机主板接口知识普及与主板结构全讲解...
  5. 打开DOSbox时设置指定虚拟路径
  6. eclipse护眼颜色
  7. python中html图片显示不出来,jupyter notebook中图片显示不出来的解决
  8. 企业微信SCRM怎么弄永久群二维码?可以实现社群私域流量裂变吗?
  9. 1.checkpoint防火墙安装以及高可靠性配置
  10. Telink BLE MESH开发|ble mesh开发教程《四》telink_sig_mesh休眠与唤醒