1. 程式人生 > >mtk 充電驅動中的bat_thread核心執行緒中做的主要事情

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();
	}