mtk 充电驱动中的bat_thread核心线程中做的主要事情

mtk 充电驱动中的bat_thread核心线程中做的主要事情

 void BAT_thread(void)------------------------------核心线程中做的事情--------------------------
 ////////////////////////////////////////////////////////////////////////////////////////
 
 	static kal_bool battery_meter_initilized = KAL_FALSE;
 	////////////////////////////////////////////////////////////////////////////
   // 0. 第一次执行时运行,获得开机显示电量,初始化电池算法 oam 参数 
  // 开机时就会运行,只会运行一次,对电池算法 oam 方案进行初始化, 并获得开机显示电量百分比 
	if (battery_meter_initilized == KAL_FALSE) {

// 进行的一系列的电池参数与温度对应关系的表格的初始化,并根据电池当前电压,hw ocv 取一个较合适值,
// 取合适值对应容量,再与 RTC 保存容量比较,选择一个合适量,为开机电池容量,最后初始化 oam 算法参数 
		battery_meter_initial();	/* move from battery_probe() to decrease booting time
		 使用battery_probe()中的amove运行以减少启动时间进程内容 */
		 /* 获得要监控的电量,(用这个电量反换出电压来校验?)*/
		BMT_status.nPercent_ZCV = battery_meter_get_battery_nPercent_zcv();
		battery_meter_initilized = KAL_TRUE;
#if defined(CONFIG_POWER_EXT)
#else
				BMT_status.SOC = gFG_capacity_by_c;  //soc 电池容量
				BMT_status.UI_SOC = gFG_capacity_by_c;//soc UI上的电池容量
				BMT_status.ZCV = battery_meter_get_battery_zcv();//开路电压
				BMT_status.temperatureV = battery_meter_get_tempV();/* 这里用来获取电池 NTC 的电压 */
				BMT_status.temperatureR = battery_meter_get_tempR(BMT_status.temperatureV);/* 获得 下拉电阻与 NTC 并并联的电压 */
				BMT_status.bat_vol = battery_meter_get_battery_voltage(KAL_TRUE);// 获得 BATSNS 引脚电压 
				BMT_status.temperature = battery_meter_get_battery_temperature();/* 通过获得当前 NTC 电压,查表并进行线性插值法,得到当前的温度值  */
				battery_update(&battery_main);
				battery_log(BAT_LOG_CRTI,
					"[battery_meter_initilized] uisoc=soc=%d.\n", gFG_capacity_by_c);
#endif
	}
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////
  // 1. 判断是插入的是否充电器还是电脑 USB,看能不能进行充电
  // 如果连接的 USB 线为 USB 充电线,或者电脑 USB 线,则打开 USB,
  // 这里会通过  BC1.1 来判断是电脑 USB 还是 USB 充电器,来决定充电电流 
  // 否则连接的不是充电线或者 USB 作为一个从设备使用,要断开 USB?
	mt_battery_charger_detect_check();
	if (fg_battery_shutdown)
		return;
	/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  // 2. 通过具体的充电芯片来获得电池信息,充电信息, 获得电池电量百分比 
  // 通过 oam 算法,获得电量百分比 
	mt_battery_GetBatteryData();
	if (fg_battery_shutdown)
		return;

	if (BMT_status.charger_exist == KAL_TRUE)
		check_battery_exist();
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	  // 3. 电池温度保护
	 // 电池温度检查,如果温度超过 60 度,关机重启
	mt_battery_thermal_check();
	////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	// 4. 电池状态检查
	//  对电池状态进行检查,如果有问题,则会调用 printk() 进行打印 
	mt_battery_notify_check();
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	 // 5. 调用具本的硬件相关函数进行充电,充电时会进行 CC/CV 之类的状态机切换就是在这里进行的
	 // 如果存在充电线,则调用具体充电芯片相关的函数进行充电 
	if (BMT_status.charger_exist == KAL_TRUE && !fg_battery_shutdown) {
		// 检查电池状态,设置到 BMT_status.bat_charging_state 中 
		mt_battery_CheckBatteryStatus();
		 // 充电策略,这里有两个文件: switch_charging.c 和 linear_charging.c 
         // 他们的关系是,如果定义了任一外部充电 IC,则选择 switch_charging.c 的函数,否则就是 linear_charging.c 的函数
         // 这里就是调用具体的芯片的充电相关函数进行充电 
		mt_battery_charging_algorithm();
			}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 6. 更新电池显示状态 
    // 更新设置节点的内容: 
   //     /sys/class/power_supply/下的文件夹
    //                             wireless_main
     //                             battery_main
     //                             ac_main 
     //                             usb_main

	mt_battery_update_status();
	mt_kpoc_power_off_check();
	}

猜你喜欢

转载自blog.csdn.net/MrDongShiYi/article/details/85113315
MTK