【MTK驱动模块_5】battery2--代码架构和流程

本文主要介绍了MT6580平台上的电池驱动模块,包括battery_common.c中对设备和驱动的注册、battery_meter.c中的电量算法以及linear_charging.c中的PMIC充电控制。MTK电池系统通过硬件ADC读取电池信息,经过算法分析后在Kernel层更新电量信息,并通过UEVENT通知上层。上层Service监听UEVENT,读取电池文件节点并更新数据,再通过Broadcast通知Activities。文章还提到了电池驱动的重要结构体PMU_ChargerStruct以及代码流程。
摘要由CSDN通过智能技术生成

power的代码如下:
在这里插入图片描述
不同的内核代码和cpu架构位置会稍微有点差异,项目上暂时接触较多的是MT6580平台,使用的GM1.0电量的算法。
主要跑的各个文件的作用
battery_common.c ----对battery的device和driver进行platform平台总线注册、匹配,充电控制主线程
battery_meter.c ---- SW FG和HW FG 算法
linear_charging.c ---- PMIC充电控制。

battery架构分析
参考博客:MTK Battery系统
MTK文档:Customer_Training_Battery_Charging.pdf download

MTK电池显示的具体过程为:硬件ADC读取Battery的各路信息:包括温度,电压等。然后利用MTK开发的电量算法分析得到的数据。Kernel层将电量信息通过写文件节点的方式更新,并通过UEVENT通知上层。上层Service开启UEVENT LISTENER,监听到UEVENT后,读取battery相关文件节点,获取电量信息。Service更新数据后,通过Broadcast通知所有开启了相关listener的activities。
在这里插入图片描述
MTK电池驱动分析
先介绍几个重要的结构体:PMU_ChargerStruct,

 typedef struct
 {
         kal_bool                        bat_exist;  // 判断电池是否存在
         kal_bool                        bat_full;  //判断电池是否充满
         INT32                   bat_charging_state; //判断充电状态
         UINT32                  bat_vol; //电池平均电压
         kal_bool                        bat_in_recharging_state; //电池是否在回充
         kal_uint32              Vsense; // 电池瞬间电压
         kal_bool                        charger_exist; // Charger是否存在Charger电压
         UINT32                  charger_vol;  // Charger电压
         INT32                   charger_protect_status; //充电保护状态,过流或者过压保护状态
         INT32                   ICharging; // 充电电流
         INT32                   IBattery;
         INT32                   temperature; // 电池温度
         INT32                   temperatureR;
         INT32                   temperatureV;
         UINT32                  total_charging_time; //总的充电时间
         UINT32                  PRE_charging_time; // Pre cc充电时间
         UINT32                  CC_charging_time; //cc充电时间
         UINT32                  TOPOFF_charging_time; //TOPOFF充电时间
         UINT32                  POSTFULL_charging_time; //Postfull充电时间
         UINT32                  charger_type; //充电器类型
         INT32                   SOC; //底层的电量
         INT32                   UI_SOC; // 上层的电量
         UINT32                  nPercent_ZCV; 
         UINT32                  nPrecent_UI_SOC_check_point; //N%同步点对应的开路电压以及UI电量
         UINT32                  ZCV; //电池当前开路电压
 } PMU_ChargerStruct;


/* battery_data initialization *///到时会在线程中重新赋值,更新到相应的节点供上层调用
static struct battery_data battery_main = {
	.psy = {
		.name = "battery",
		.type = POWER_SUPPLY_TYPE_BATTERY,
		.properties = battery_props,
		.num_properties = ARRAY_SIZE(battery_props),
		.get_property = battery_get_property,
		},
/* CC: modify to have a full power supply status */
#if defined(CONFIG_POWER_EXT)
	.BAT_STATUS = POWER_SUPPLY_STATUS_FULL,
	.BAT_HEALTH = POWER_SUPPLY_HEALTH_GOOD,
	.BAT_PRESENT = 1,
	.BAT_TECHNOLOGY = POWER_SUPPLY_TECHNOLOGY_LION,
	.BAT_CAPACITY = 100,
	.BAT_batt_vol = 4200,
	.BAT_batt_temp = 22,
	/* Dual battery */
	.status_smb = POWER_SUPPLY_STATUS_DISCHARGING,
	.capacity_smb = 50,
	.present_smb = 0,
	/* ADB CMD discharging */
	.adjust_power = -1,
#else
	.BAT_STATUS = POWER_SUPPLY_STATUS_DISCHARGING,
	.BAT_HEALTH = POWER_SUPPLY_HEALTH_GOOD,
	.BAT_PRESENT = 1,
	.BAT_TECHNOLOGY = POWER_SUPPLY_TECHNOLOGY_LION,
#if defined(PUMP_EXPRESS_SERIES)
	.BAT_CAPACITY = -1,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值