MTK平台下Battery驱动分析及充电流程

2019-07-14 00:09发布

MTK平台下Battery驱动分析及充电流程


 分类: 转自:http://blog.csdn.net/baidu_34021173/article/details/51105223
主要涉及代码: Kernel: kernel-3.10driverspowermediatek kernel-3.10driversmiscmediatekmachmt6580power
MTK Battery框架结构图
通过上层通过读取创建一系列的设备节点获取电池相关的状态信息


Android电源管理系统
/sys/class/power_supply/ac/online //AC 电源连接状态 交流电 即电源插座


/sys/class/power_supply/usb/online //USB电源连接状态


/sys/class/power_supply/battery/status //充电状态


/sys/class/power_supply/battery/health //电池状态


/sys/class/power_supply/battery/present //使用状态


/sys/class/power_supply/battery/capacity //电池 level


/sys/class/power_supply/battery/batt_vol //电池电压


/sys/class/power_supply/battery/batt_temp //电池温度


/sys/class/power_supply/battery/technology //电池技术

代码框架:
battery_common.c 在Battery驱动模块中,battery_probe函数中会创建一些设备节点,并且运行一个线程bat_thread_kthread获取电池相关的数据信息
battery_kthread_hrtimer_init();//检测电池插入/拔出
kthread_run(bat_thread_kthread, NULL, "bat_thread_kthread");
在bat_thread_kthread线程中 [objc] view plain copy
  1. int bat_thread_kthread(voidvoid *x)  
  2. {  
  3.     ktime_t ktime = ktime_set(30);    /* 10s, 10* 1000 ms */  
  4.   
  5. #ifdef BATTERY_CDP_WORKAROUND  
  6.     if (is_usb_rdy() == KAL_FALSE) {  
  7.         battery_log(BAT_LOG_CRTI, "CDP, block ");  
  8.         wait_event(bat_thread_wq, (is_usb_rdy() == KAL_TRUE));  
  9.         battery_log(BAT_LOG_CRTI, "CDP, free ");  
  10.     } else{  
  11.         battery_log(BAT_LOG_CRTI, "CDP, PASS ");  
  12.     }  
  13. #endif  
  14.   
  15.     /* Run on a process content */  
  16.     while (1) {  
  17.         mutex_lock(&bat_mutex);  
  18.   
  19.         if (((chargin_hw_init_done == KAL_TRUE) && (battery_suspended == KAL_FALSE)) || ((chargin_hw_init_done == KAL_TRUE) && (fg_wake_up_bat == KAL_TRUE)))  
  20.             BAT_thread();  
  21.   
  22.         mutex_unlock(&bat_mutex);  
  23.   
  24. #ifdef FG_BAT_INT  
  25.         if(fg_wake_up_bat==KAL_TRUE)  
  26.         {  
  27.             wake_unlock(&battery_fg_lock);  
  28.             fg_wake_up_bat=KAL_FALSE;  
  29.             battery_log(BAT_LOG_CRTI, "unlock battery_fg_lock  ");  
  30.         }  
  31. #endif //#ifdef FG_BAT_INT  
  32.   
  33.         battery_log(BAT_LOG_FULL, "wait event ");  
  34.   
  35.         wait_event(bat_thread_wq, (bat_thread_timeout == KAL_TRUE));  
  36.   
  37.         bat_thread_timeout = KAL_FALSE;  
  38.         hrtimer_start(&battery_kthread_timer, ktime, HRTIMER_MODE_REL);  
  39.         ktime = ktime_set(BAT_TASK_PERIOD, 0);  /* 10s, 10* 1000 ms 设置时间为10秒*/  
  40.         if (chr_wake_up_bat == KAL_TRUE && g_smartbook_update != 1/* for charger plug in/ out */  
  41.         {  
  42.             #if defined(CONFIG_MTK_DUAL_INPUT_CHARGER_SUPPORT)  
  43.             if (DISO_data.chr_get_diso_state) {  
  44.                 DISO_data.chr_get_diso_state = KAL_FALSE;  
  45.                 battery_charging_control(CHARGING_CMD_GET_DISO_STATE, &DISO_data);  
  46.             }  
  47.             #endif  
  48.   
  49.             g_smartbook_update = 0;  
  50.             #if defined(CUST_CAPACITY_OCV2CV_TRANSFORM)  
  51.             battery_meter_set_reset_soc(KAL_FALSE);  
  52.             #endif  
  53.             battery_meter_reset();  
  54.             chr_wake_up_bat = KAL_FALSE;  
  55.   
  56.             battery_log(BAT_LOG_CRTI,  
  57.                         "[BATTERY] Charger plug in/out, Call battery_meter_reset. (%d) ",  
  58.                         BMT_status.UI_SOC);  
  59.         }  
  60.   
  61.     }  
  62.   
  63.     return 0;  
在这个线程中,每隔10s会去调用函数BAT_Thread去获取电池数据 BAT_Thread [objc] view plain copy
  1. void BAT_thread(void)  
  2. {  
  3.     static kal_bool battery_meter_initilized = KAL_FALSE;  
  4.     if (battery_meter_initilized == KAL_FALSE) {  
  5.         battery_meter_initial();    /* move from battery_probe() to decrease booting time 第一次进该函数会进行一些初始化,如设置D0的值(初始电量,构建电池曲线等) table_init, oam_init*/  
  6.         BMT_status.nPercent_ZCV = battery_meter_get_battery_nPercent_zcv();  
  7.         battery_meter_initilized = KAL_TRUE;  
  8.     }  
  9.   
  10.     mt_battery_charger_detect_check();//充电器型号,是否插入等方面的检测,  
  11.     mt_battery_GetBatteryData();//核心函数获取电池数据  
  12.     if (BMT_status.charger_exist == KAL_TRUE) {  
  13.         check_battery_exist();  
  14.     }  
  15.     mt_battery_thermal_check();//电池温度检测以及开机mode  
  16.     mt_battery_notify_check();//检测电池电压,电流等  
  17.   
  18.     if (BMT_status.charger_exist == KAL_TRUE) {  
  19.         mt_battery_CheckBatteryStatus();//充电异常检测  
  20.         mt_battery_charging_algorithm();//切换充电模式 Pre_CC->CC->CV->Full  
  21.     }  
  22.   
  23.     mt_battery_update_status();//上报电池数据  
  24.     mt_kpoc_power_off_check();  
  25. }  

mt_battery_GetBatteryData: [objc] view plain copy
  1. void mt_battery_GetBatteryData(void)  
  2. {  
  3.     kal_uint32 bat_vol, charger_vol, Vsense, ZCV;  
  4.     kal_int32 ICharging, temperature, temperatureR, temperatureV, SOC;  
  5.     static kal_int32 bat_sum, icharging_sum, temperature_sum;  
  6.     static kal_int32 batteryVoltageBuffer[BATTERY_AVERAGE_SIZE];  
  7.     static kal_int32 batteryCurrentBuffer[BATTERY_AVERAGE_SIZE];  
  8.     static kal_int32 batteryTempBuffer[BATTERY_AVERAGE_SIZE];  
  9.     static kal_uint8 batteryIndex = 0;  
  10.     static kal_int32 previous_SOC = -1