MTK 方案电池保护机制设计

本文详细介绍了MTK方案的电池保护机制,从驱动层的电池温度监测,到HAL层的实时监控进程batteryWarning,再到上层APP如何接收并处理电池警告。驱动层在电池初始化时设置最大充电温度,并在温度过高时更新g_BatteryNotifyCode。HAL层的batteryWarning进程监控/sys/devices/platform/charger/BatteryNotify文件,读取并响应电池状态。上层APP通过BroadcastReceiver监听电池警告,根据接收到的类型展示警告对话框。
摘要由CSDN通过智能技术生成

我们分Driver 、HAL 、APP 三层来分别说明

 

驱动层:

 

在"kernel-4.4/drivers/power/mediatek/battery_common.c" 文件中

电池初始化时会设置电池的最大充电温度:
#if defined(MAX_CHARGE_TEMPERATURE)
         batt_cust_data.max_charge_temperature = MAX_CHARGE_TEMPERATURE;
#endif

MAX_CHARGE_TEMPERATURE   在文件中设置的值是50度
drivers/misc/mediatek/include/mt-plat/mt6771/include/mach/mtk_charging.h
#define MAX_CHARGE_TEMPERATURE  50

在函数 mt_battery_notify_VBatTemp_check 中,当 检查到 电池的温度超过MAX_CHARGE_TEMPERATURE这个设置时,就会将g_BatteryNotifyCode值设置为2,我们记住这个数字2,这个数字会在后续的应用中用到

static void mt_battery_notify_VBatTemp_check(void)
{
......

        if (BMT_status.temperature >= batt_cust_data.max_charge_temperature) {
                g_BatteryNotifyCode |= 0x0002;
                battery_log(BAT_LOG_CRTI, "[BATTERY] bat_temp(%d) out of range(too high)\n",
                            BMT_status.temperature);
        }
......
BMT_status.temperature 的值通过读取电池的热感寄存器的值来获取的。

同时对g_BatteryNotifyCode 这个变量进行赋值的还有mt_battery_notify_VBat_check、mt_battery_notify_ICharging_check、mt_battery_notify_TotalChargingTime_check等函数。

g_BatteryNotifyCode 这个变量的值会存到sys文件系统下的一个属性文件中:"/sys/devices/platform/charger/BatteryNotify"

在驱动中对这个文件的读写操作进行实现:

static ssize_t show_BatteryNotify(struct device *dev, struct device_attribute *attr, char *buf)
{
        battery_log(BAT_LOG_CRTI, "[Battery] show_BatteryNotify : %x\n", g_BatteryNotifyCode);

        return sprintf(buf, "%u\n", g_BatteryNotifyCode);
}

static ssize_t store_BatteryNotify(struct device *dev, struct device_attribute *attr,
                                   const char *buf, size_t size)
{
        /*char *pvalue = NULL;*/
        int rv;
        unsigned long reg_BatteryNotifyCode = 0;

        battery_log(BAT_LOG_CRTI, "[Battery] store_BatteryNotify\n");
        if (buf != NULL && size != 0) {
                battery_log(BAT_LOG_CRTI, "[Battery] buf is %s and size is %Zu\n", buf, size);
                rv = kstrtoul(buf, 0, &reg_BatteryNotifyCode);
                if (rv != 0)
                        return -EINVAL;
                g_BatteryNotifyCode = reg_BatteryNotifyCode;
                battery_log(BAT_LOG_CRTI, "[Battery] store code : %x\n", g_BatteryNotifyCode);
        }
        return size;
}

static DEVICE_ATTR(BatteryNotify, 0664, show_BatteryNotify, store_BatteryNotify);

 

HAL 层:

这里有一个进程叫做batteryWarning 的进程对电池的情况进行实时监控,其实这个进程监控的就是上面讲解的驱动里面写好的文件

"vendor/mediatek/proprietary/frameworks/opt/batterywarning/batterywarning.cpp"

#define FILE_NAME "/sys/devices/platform/charger/BatteryNotify"

void readType(char* buffer) {

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值