mtk battery_common代码分析

来源:互联网 发布:淘宝怎么发布话题 编辑:程序博客网 时间:2024/04/27 13:30
static int __init battery_init(void)   //drivers\power\mediatek\battery_common.cret = platform_driver_register(&battery_driver);  //注册battert driver驱动static struct platform_driver battery_driver = {.probe = battery_probe,.remove = battery_remove,.shutdown = battery_shutdown,.driver = {   .name = "battery",.pm = &battery_pm_ops,},};ret = platform_driver_register(&mt_batteryNotify_driver);static struct platform_driver mt_batteryNotify_driver = {.probe = mt_batteryNotify_probe,.driver = {   .name = "mt-battery",   },};ret = platform_driver_register(&battery_dts_driver);static struct platform_driver battery_dts_driver = {.probe = battery_dts_probe,.remove = NULL,.shutdown = NULL,.driver = {   .name = "battery-dts",#ifdef CONFIG_OF .of_match_table = mt_battery_of_match,#endif},};//mt6735.dtsi中定义如下设备信息BATTERY {compatible = "mediatek,battery";};BAT_NOTIFY {            compatible = "mediatek,bat_notify";        };ret = platform_driver_register(&mt_batteryNotify_dts_driver);static struct platform_driver mt_batteryNotify_dts_driver = {.probe = mt_batteryNotify_dts_probe,.driver = {   .name = "mt-dts-battery",#ifdef CONFIG_OF.of_match_table = mt_bat_notify_of_match,    #endif},};ret = register_pm_notifier(&battery_pm_notifier_block);  //注册pm通知项,系统休眠唤醒时会回调static struct notifier_block battery_pm_notifier_block = {.notifier_call = battery_pm_event,.priority = 0,};static int battery_pm_event(struct notifier_block *notifier, unsigned long pm_event, void *unused)switch(pm_event) {//根据休眠唤醒的通知类型,对模块做休眠唤醒case PM_HIBERNATION_PREPARE: /* Going to hibernate */case PM_RESTORE_PREPARE: /* Going to restore a saved image */case PM_SUSPEND_PREPARE: /* Going to suspend the system */pr_warn("[%s] pm_event %lu\n", __func__, pm_event);battery_timer_pause();return NOTIFY_DONE;case PM_POST_HIBERNATION: /* Hibernation finished */case PM_POST_SUSPEND: /* Suspend finished */case PM_POST_RESTORE: /* Restore failed */pr_warn("[%s] pm_event %lu\n", __func__, pm_event);battery_timer_resume();static int battery_dts_probe(struct platform_device *dev) //mt6735.dtsi中定义了mediatek,battery和mediatek,bat_notify,所以回调对应的probe函数battery_device.dev.of_node = dev->dev.of_node;   //初始化设备节点ret = platform_device_register(&battery_device);  //注册battery device设备,这里会触发battery的probe被调用static int mt_batteryNotify_dts_probe(struct platform_device *dev)MT_batteryNotify_device.dev.of_node = dev->dev.of_node; //初始化设备节点ret = platform_device_register(&MT_batteryNotify_device); //注册batteryNotify设备,会触发mt-battery的probe被调用static int mt_batteryNotify_probe(struct platform_device *dev)//创建设备文件ret_device_file = device_create_file(&(dev->dev), &dev_attr_BatteryNotify);ret_device_file = device_create_file(&(dev->dev), &dev_attr_BN_TestMode);//proc文件系统创建mtk_battery_cmd目录battery_dir = proc_mkdir("mtk_battery_cmd", NULL);//mtk_battery_cmd目录下创建相关设备文件信息proc_create("battery_cmd", S_IRUGO | S_IWUSR, battery_dir, &battery_cmd_proc_fops);proc_create("current_cmd", S_IRUGO | S_IWUSR, battery_dir, ¤t_cmd_proc_fops);proc_create("discharging_cmd", S_IRUGO | S_IWUSR, battery_dir, &discharging_cmd_proc_fops);static const struct file_operations discharging_cmd_proc_fops = { .open  = proc_utilization_open, .read  = seq_read,.write = discharging_cmd_write,};static const struct file_operations current_cmd_proc_fops = {.open = proc_utilization_open_cur_stop,.read = seq_read,.write = current_cmd_write,};static const struct file_operations battery_cmd_proc_fops = {.open = proc_utilization_open,.read = seq_read,.write = battery_cmd_write,};static int battery_probe(struct platform_device *dev)//创建字符设备MT_pmic_adc_caliret = alloc_chrdev_region(&adc_cali_devno, 0, 1, ADC_CALI_DEVNAME);//字符设备初始化adc_cali_cdev = cdev_alloc();adc_cali_cdev->owner = THIS_MODULE;adc_cali_cdev->ops = &adc_cali_fops;//字符设备操作集//创建类、设备文件adc_cali_major = MAJOR(adc_cali_devno);adc_cali_class = class_create(THIS_MODULE, ADC_CALI_DEVNAME);class_dev = (struct class_device *)device_create(adc_cali_class,NULL,adc_cali_devno, NULL, ADC_CALI_DEVNAME);get_charging_control();//获取电池相关的操作接口battery_charging_control = chr_control_interface;//这里管理fan5405.cbattery_charging_control(CHARGING_CMD_GET_PLATFORM_BOOT_MODE, &g_platform_boot_mode);//获取平台启动模式static kal_uint32 charging_get_platfrom_boot_mode(void *data)//drivers\power\mediatek\power\mt6735\fan5405.c*(kal_uint32*)(data) = get_boot_mode();init_boot_common(__LINE__);return g_boot_mode;wake_lock_init(&battery_fg_lock, WAKE_LOCK_SUSPEND, "battery fg wakelock");//初始化wake_lock锁wake_lock_init(&battery_suspend_lock, WAKE_LOCK_SUSPEND, "battery suspend wakelock");ret = power_supply_register(&(dev->dev), &ac_main.psy);//注册ac_main的power_supplyret = power_supply_register(&(dev->dev), &usb_main.psy);//注册usb_main的power_supplyret = power_supply_register(&(dev->dev), &wireless_main.psy);//注册battery_main的power_supply//创建各种设备文件接口.......//初始化PMU_ChargerStruct结构BMT_status.bat_exist = KAL_TRUE;//电池状态,是否存在BMT_status.charger_exist = KAL_FALSE;//充电状态,是否在冲BMT_status.bat_vol = 0;  //电池平均电压BMT_status.ICharging = 0;   //充电电流BMT_status.temperature = 0;  //电池温度BMT_status.charger_vol = 0;   //charger电压BMT_status.total_charging_time = 0;   //总的充电时间BMT_status.PRE_charging_time = 0;   //pre  cc充电时间BMT_status.CC_charging_time = 0;  //cc充电时间BMT_status.TOPOFF_charging_time = 0;  //top off充电时间BMT_status.POSTFULL_charging_time = 0; //post full充电时间BMT_status.SOC = 0;  //底层的电量BMT_status.UI_SOC = 0;  //上层ui的电量BMT_status.bat_charging_state = CHR_PRE;   //判断充电状态BMT_status.bat_in_recharging_state = KAL_FALSE;  //电池是否在回充BMT_status.bat_full = KAL_FALSE;  //电池是否充满BMT_status.nPercent_ZCV = 0;BMT_status.nPrecent_UI_SOC_check_point = battery_meter_get_battery_nPercent_UI_SOC();//battery线程定时器初始化,10s轮训一次battery_kthread_hrtimer_init();ktime = ktime_set(1, 0);/* 3s, 10* 1000 ms */hrtimer_init(&battery_kthread_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);battery_kthread_timer.function = battery_kthread_hrtimer_func;hrtimer_start(&battery_kthread_timer, ktime, HRTIMER_MODE_REL);enum hrtimer_restart battery_kthread_hrtimer_func(struct hrtimer *timer)bat_thread_wakeup();bat_thread_timeout = KAL_TRUE;bat_meter_timeout = KAL_TRUE;suspend_time = 0;_g_bat_sleep_total_time = 0;wake_up(&bat_thread_wq);//唤醒等待队列static DECLARE_WAIT_QUEUE_HEAD(bat_thread_wq);//初始化bat_thread_wq等待队列//创建内核线程kthread_run(bat_thread_kthread, NULL, "bat_thread_kthread");int bat_thread_kthread(void *x)charger_hv_detect_sw_workaround_init();//创建一个定时器ktime = ktime_set(0, BAT_MS_TO_NS(2000));hrtimer_init(&charger_hv_detect_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);charger_hv_detect_timer.function = charger_hv_detect_sw_workaround;hrtimer_start(&charger_hv_detect_timer, ktime, HRTIMER_MODE_REL);enum hrtimer_restart charger_hv_detect_sw_workaround(struct hrtimer *timer)charger_hv_detect_flag = KAL_TRUE;wake_up_interruptible(&charger_hv_detect_waiter);//唤醒等待队列static DECLARE_WAIT_QUEUE_HEAD(charger_hv_detect_waiter);//创建电池hv检测线程charger_hv_detect_thread =kthread_run(charger_hv_detect_sw_thread_handler, 0,"mtk charger_hv_detect_sw_workaround");check_battery_exist(); //检测电池是否存在battery_charging_control(CHARGING_CMD_GET_BATTERY_STATUS, &battery_status);//获取电池状态init_proc_log();//初始化proc文件系统log信息文件g_bat_init_flag = KAL_TRUE;***************************************************************************int charger_hv_detect_sw_thread_handler(void *unused)//hv检测线程分析kal_uint32 hv_voltage = V_CHARGER_MAX*1000;do{if (BMT_status.charger_exist == KAL_TRUE){//是否在充电ktime = ktime_set(0, BAT_MS_TO_NS(200)); //200ms}else{ktime = ktime_set(0, BAT_MS_TO_NS(1000));//1s}if (chargin_hw_init_done)battery_charging_control(CHARGING_CMD_SET_HV_THRESHOLD, &hv_voltage);//此处调用fan5405.c对应接口设备hv_threshold//加入charger_hv_detect_waiter等待队列,只到charger_hv_detect_flag == KAL_TRUEwait_event_interruptible(charger_hv_detect_waiter,(charger_hv_detect_flag == KAL_TRUE));if(BMT_status.charger_exist == KAL_TRUE){if(cnt>=5){hv_sw_mode();cnt=0;}else{cnt++;}charger_plug_out_sw_mode();}else{hv_sw_mode();}charger_hv_detect_flag = KAL_FALSE; //设置charger_hv_detect_flag为falsehrtimer_start(&charger_hv_detect_timer, ktime, HRTIMER_MODE_REL);//重启启动定时器} while (!kthread_should_stop());************************************int bat_thread_kthread(void *x)//battery线程分析void BAT_thread(void)mt_battery_charger_detect_check();//检测充电状态if (upmu_is_chr_det() == KAL_TRUE) {wake_lock(&battery_suspend_lock);//充电上锁BMT_status.charger_exist = KAL_TRUE;//正在充电if (BMT_status.charger_type == CHARGER_UNKNOWN) {//如果充电类型不明确mt_charger_type_detection();//检测充电类型//获取充电类型battery_charging_control(CHARGING_CMD_GET_CHARGER_TYPE, &CHR_Type_num);BMT_status.charger_type = CHR_Type_num;if ((BMT_status.charger_type == STANDARD_HOST)|| (BMT_status.charger_type == CHARGING_HOST)) {mt_usb_connect();//如果是USB,做一些设置}}}else {wake_unlock(&battery_suspend_lock);//解锁//参数初始化BMT_status.charger_exist = KAL_FALSE;BMT_status.charger_type = CHARGER_UNKNOWN;BMT_status.bat_full = KAL_FALSE;BMT_status.bat_in_recharging_state = KAL_FALSE;BMT_status.bat_charging_state = CHR_PRE;BMT_status.total_charging_time = 0;BMT_status.PRE_charging_time = 0;BMT_status.CC_charging_time = 0;BMT_status.TOPOFF_charging_time = 0;BMT_status.POSTFULL_charging_time = 0;mt_usb_disconnect();//断开usb配置}//获取电池相关数据mt_battery_GetBatteryData();bat_vol = battery_meter_get_battery_voltage(KAL_TRUE);//获取电池电压Vsense = battery_meter_get_VSense();if( upmu_is_chr_det() == KAL_TRUE ) {//是否在充电ICharging = battery_meter_get_charging_current();//获取充电电流} else {ICharging = 0;}charger_vol = battery_meter_get_charger_voltage();temperature = battery_meter_get_battery_temperature();temperatureV = battery_meter_get_tempV();temperatureR = battery_meter_get_tempR(temperatureV);SOC = battery_meter_get_battery_percentage();//获取电池电量#if defined(SOC_BY_HW_FG)//通过硬件ADC获取电量if (g_auxadc_solution == 1) {return auxadc_algo_run();} else {fgauge_algo_run();#if !defined(CUST_CAPACITY_OCV2CV_TRANSFORM)return gFG_capacity_by_c;/* hw fg, //return gfg_percent_check_point; // voltage mode */#else/* We keep gFG_capacity_by_c as capacity before compensation *//* Compensated capacity is returned for UI SOC tracking */return 100 - battery_meter_trans_battery_percentage(100 - gFG_capacity_by_c);#endif}#endifZCV = battery_meter_get_battery_zcv();BMT_status.ICharging =mt_battery_average_method(BATTERY_AVG_CURRENT, &batteryCurrentBuffer[0], ICharging, &icharging_sum,batteryIndex);if (BMT_status.charger_exist == KAL_TRUE) {check_battery_exist();}mt_battery_thermal_check();//电池温度检测及开机modemt_battery_notify_check();//检测电池电压、电流等if (BMT_status.charger_exist == KAL_TRUE) {mt_battery_CheckBatteryStatus();//充电异常检测mt_battery_charging_algorithm();  //切换充电模式  pre cc ->cc->dc}static void mt_battery_update_status(void) //上报电池数据usb_update(&usb_main); //更新usb状态ac_update(&ac_main);   //更新ac状态wireless_update(&wireless_main);  //无线充电不支持battery_update(&battery_main);   //上报电池数据bat_data->BAT_TECHNOLOGY = POWER_SUPPLY_TECHNOLOGY_LION;bat_data->BAT_HEALTH = POWER_SUPPLY_HEALTH_GOOD;bat_data->BAT_batt_vol = BMT_status.bat_vol;bat_data->BAT_batt_temp = BMT_status.temperature * 10;bat_data->BAT_PRESENT = BMT_status.bat_exist;if ((BMT_status.charger_exist == KAL_TRUE) && (BMT_status.bat_charging_state != CHR_ERROR)) {if (BMT_status.bat_exist) {/* charging */  //电池在,并且在充电if (BMT_status.bat_vol <= V_0PERCENT_TRACKING) {  //电池电压小于3.45VresetBatteryMeter = mt_battery_0Percent_tracking_check();/**if (BMT_status.UI_SOC <= 0) {BMT_status.UI_SOC = 0;  //soc小于0,则显示0#ifndef DISABLE_DLPT_FEATUREif (BMT_status.bat_vol <= SYSTEM_OFF_VOLTAGE) //电压小于关机电压{reboot_cnt++;if(reboot_cnt>=2){battery_log(BAT_LOG_CRTI, "0Percent, shutdown ,VBAT < %d UI_SOC=%d reboot_cnt:%d \r\n", SYSTEM_OFF_VOLTAGE,BMT_status.UI_SOC,reboot_cnt);kernel_restart("battery 0% reboot system");//重启内核}}#endif // #ifndef DISABLE_DLPT_FEATURE} else {//电池电压大于关机电压,soc大于1,soc递减if (BMT_status.bat_vol > SYSTEM_OFF_VOLTAGE && BMT_status.UI_SOC > 1) {BMT_status.UI_SOC--;} else if (BMT_status.bat_vol <= SYSTEM_OFF_VOLTAGE) {BMT_status.UI_SOC--;} reboot_cnt=0;}**/} else {//电池电压大于3.45VresetBatteryMeter = mt_battery_100Percent_tracking_check();//如果电池充满了,则显示100%;如果充满了,但是soc小于100,则每个10s,soc加1;//如果没充满,但是UI_SOC大于99,则显示99%,}bat_data->BAT_STATUS = POWER_SUPPLY_STATUS_CHARGING; //正在充电} else {/* No Battery, Only Charger */  无电池bat_data->BAT_STATUS = POWER_SUPPLY_STATUS_UNKNOWN;  //电源类型未知BMT_status.UI_SOC = 0;  //显示0%}} else {/* Only Battery *///没充电,电池供电bat_data->BAT_STATUS = POWER_SUPPLY_STATUS_NOT_CHARGING;if (BMT_status.bat_vol <= V_0PERCENT_TRACKING)//电压小于3.45V//UI_SOC小于0,则显示0,电池电压小于关机电压,则重启;如果UI_SOC大于0,则UI_SOC递减resetBatteryMeter = mt_battery_0Percent_tracking_check();elseresetBatteryMeter = mt_battery_nPercent_tracking_check();}//更新电池相关参数mt_battery_update_EM(bat_data);bat_data->BAT_CAPACITY = BMT_status.UI_SOC;bat_data->BAT_TemperatureR = BMT_status.temperatureR;/* API */bat_data->BAT_TempBattVoltage = BMT_status.temperatureV;/* API */bat_data->BAT_InstatVolt = BMT_status.bat_vol;/* VBAT */bat_data->BAT_BatteryAverageCurrent = BMT_status.ICharging;bat_data->BAT_BatterySenseVoltage = BMT_status.bat_vol;bat_data->BAT_ISenseVoltage = BMT_status.Vsense;/* API */bat_data->BAT_ChargerVoltage = BMT_status.charger_vol;/* Dual battery */bat_data->status_smb = g_status_smb;bat_data->capacity_smb = g_capacity_smb;bat_data->present_smb = g_present_smb;//如果在充电,并且UI_SOC等于100,则设置充满标志if ((BMT_status.UI_SOC == 100) && (BMT_status.charger_exist == KAL_TRUE))bat_data->BAT_STATUS = POWER_SUPPLY_STATUS_FULL;power_supply_changed(bat_psy);//更新状态,发送uevent(KOBJ_CHANGE),告诉batteryServicemt_kpoc_power_off_check();  //关机充电


1 0
原创粉丝点击