mtk 充電驅動中的bat_thread核心執行緒中做的主要事情
阿新 • • 發佈:2018-12-24
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(); }