linear_charging.c 42 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393
  1. /*****************************************************************************
  2. *
  3. * Filename:
  4. * ---------
  5. * linear_charging.c
  6. *
  7. * Project:
  8. * --------
  9. * ALPS_Software
  10. *
  11. * Description:
  12. * ------------
  13. * This file implements the interface between BMT and ADC scheduler.
  14. *
  15. * Author:
  16. * -------
  17. * Oscar Liu
  18. *
  19. *============================================================================
  20. * Revision: 1.0
  21. * Modtime: 11 Aug 2005 10:28:16
  22. * Log: //mtkvs01/vmdata/Maui_sw/archives/mcu/hal/peripheral/inc/bmt_chr_setting.h-arc
  23. *
  24. * 04 24 2015 wy.chuang
  25. * [ALPS02047356] [Blocking][Rainier][L-MR1][Pump Express] Fast charging doesn't work on user load.
  26. *
  27. * .
  28. *
  29. * 04 23 2015 wy.chuang
  30. * [ALPS02047356] [Blocking][Rainier][L-MR1][Pump Express] Fast charging doesn't work on user load.
  31. *
  32. * .
  33. *
  34. * 03 28 2015 wy.chuang
  35. * [ALPS01990538] [MP Feature Patch Back]MT6312 driver & MT6328 init setting & charging setting
  36. *
  37. * .
  38. *
  39. * 03 12 2015 wy.chuang
  40. * [ALPS01921641] [L1_merge] for PMIC and charging
  41. * .
  42. *
  43. * 03 10 2015 wy.chuang
  44. * [ALPS01974124] Device keep popup Power off charging mode notify
  45. * while using USB cable and connect with Specify USB port
  46. * .
  47. *
  48. * 03 05 2015 wy.chuang
  49. * [ALPS01921641] [L1_merge] for PMIC and charging
  50. * .
  51. *
  52. * 01 20 2015 wy.chuang
  53. * [ALPS01814017] MT6328 check in
  54. * .
  55. *
  56. * 01 18 2015 wy.chuang
  57. * [ALPS01814017] MT6328 check in
  58. * .
  59. * HISTORY
  60. * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
  61. *------------------------------------------------------------------------------
  62. *------------------------------------------------------------------------------
  63. * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
  64. *============================================================================
  65. ****************************************************************************/
  66. #include <linux/types.h>
  67. #include <linux/kernel.h>
  68. #include <mt-plat/battery_meter.h>
  69. #include <mt-plat/battery_common.h>
  70. #include <mt-plat/charging.h>
  71. #include <mach/mt_charging.h>
  72. #include <mt-plat/mt_boot.h>
  73. #include <linux/delay.h>
  74. #include <linux/mutex.h>
  75. #include <linux/wakelock.h>
  76. /* ============================================================ // */
  77. /* define */
  78. /* ============================================================ // */
  79. /* cut off to full */
  80. #define POST_CHARGING_TIME (30 * 60) /* 30mins */
  81. #define CV_CHECK_DELAT_FOR_BANDGAP 80 /* 80mV */
  82. #if defined(CONFIG_MTK_PUMP_EXPRESS_SUPPORT)
  83. #define BJT_LIMIT 1200000 /* 1.2W */
  84. #ifndef TA_START_VCHR_TUNUNG_VOLTAG
  85. #define TA_START_VCHR_TUNUNG_VOLTAGE 3700 /* for isink blink issue */
  86. #define TA_CHARGING_CURRENT CHARGE_CURRENT_1500_00_MA
  87. #endif /* TA_START_VCHR_TUNUNG_VOLTAG */
  88. #endif /* MTK_PUMP_EXPRESS_SUPPORT */
  89. /* ============================================================ // */
  90. /* global variable */
  91. /* ============================================================ // */
  92. unsigned int g_bcct_flag = 0;
  93. CHR_CURRENT_ENUM g_temp_CC_value = CHARGE_CURRENT_0_00_MA;
  94. unsigned int g_usb_state = USB_UNCONFIGURED;
  95. unsigned int charging_full_current; /* = CHARGING_FULL_CURRENT; *//* mA */
  96. unsigned int v_cc2topoff_threshold; /* = V_CC2TOPOFF_THRES; */
  97. CHR_CURRENT_ENUM ulc_cv_charging_current; /* = AC_CHARGER_CURRENT; */
  98. kal_bool ulc_cv_charging_current_flag = KAL_FALSE;
  99. static bool usb_unlimited;
  100. #if defined(CONFIG_MTK_HAFG_20)
  101. BATTERY_VOLTAGE_ENUM g_cv_voltage = BATTERY_VOLT_04_200000_V;
  102. #endif
  103. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  104. /* // JEITA */
  105. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  106. #if defined(CONFIG_MTK_JEITA_STANDARD_SUPPORT)
  107. int g_jeita_recharging_voltage = JEITA_RECHARGE_VOLTAGE;
  108. int g_temp_status = TEMP_POS_10_TO_POS_45;
  109. kal_bool temp_error_recovery_chr_flag = KAL_TRUE;
  110. #endif
  111. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  112. /* // PUMP EXPRESS */
  113. /* ///////////////////////////////////////////////////////////////////////////////////////// */
  114. #if defined(CONFIG_MTK_PUMP_EXPRESS_SUPPORT)
  115. struct wake_lock TA_charger_suspend_lock;
  116. CHR_CURRENT_ENUM ta_charging_current = TA_CHARGING_CURRENT;
  117. int ta_current_level = 5000;
  118. int ta_pre_vbat = 0;
  119. kal_bool ta_check_chr_type = KAL_TRUE;
  120. kal_bool ta_check_ta_control = KAL_FALSE;
  121. kal_bool ta_vchr_tuning = KAL_FALSE;
  122. kal_bool first_vchr_det = KAL_TRUE;
  123. kal_bool ta_cable_out_occur = KAL_FALSE;
  124. kal_bool is_ta_connect = KAL_FALSE;
  125. #endif
  126. /* ============================================================ // */
  127. static void __init_charging_varaibles(void)
  128. {
  129. static int init_flag;
  130. if (init_flag == 0) {
  131. init_flag = 1;
  132. charging_full_current = batt_cust_data.charging_full_current;
  133. v_cc2topoff_threshold = batt_cust_data.v_cc2topoff_thres;
  134. ulc_cv_charging_current = batt_cust_data.ac_charger_current;
  135. }
  136. }
  137. void BATTERY_SetUSBState(int usb_state_value)
  138. {
  139. #if defined(CONFIG_POWER_EXT)
  140. battery_log(BAT_LOG_CRTI, "[BATTERY_SetUSBState] in FPGA/EVB, no service\r\n");
  141. #else
  142. if ((usb_state_value < USB_SUSPEND) || ((usb_state_value > USB_CONFIGURED))) {
  143. battery_log(BAT_LOG_CRTI,
  144. "[BATTERY] BAT_SetUSBState Fail! Restore to default value\r\n");
  145. usb_state_value = USB_UNCONFIGURED;
  146. } else {
  147. battery_log(BAT_LOG_CRTI, "[BATTERY] BAT_SetUSBState Success! Set %d\r\n",
  148. usb_state_value);
  149. g_usb_state = usb_state_value;
  150. }
  151. #endif
  152. }
  153. /* EXPORT_SYMBOL(BATTERY_SetUSBState); */
  154. /* EXPORT_SYMBOL(BATTERY_SetUSBState); */
  155. #if defined(CONFIG_MTK_HAFG_20)
  156. unsigned int get_cv_voltage(void)
  157. {
  158. return g_cv_voltage;
  159. }
  160. #endif
  161. unsigned int get_charging_setting_current(void)
  162. {
  163. return g_temp_CC_value;
  164. }
  165. #if defined(CONFIG_MTK_PUMP_EXPRESS_SUPPORT)
  166. static DEFINE_MUTEX(ta_mutex);
  167. static void mtk_ta_decrease(void)
  168. {
  169. kal_bool ta_current_pattern = KAL_FALSE; /* FALSE = decrease */
  170. /* if(BMT_status.charger_exist == KAL_TRUE) */
  171. if (ta_cable_out_occur == KAL_FALSE) {
  172. battery_charging_control(CHARGING_CMD_SET_TA_CURRENT_PATTERN, &ta_current_pattern);
  173. ta_current_level -= 200;
  174. } else {
  175. ta_check_chr_type = KAL_TRUE;
  176. /* is_ta_connect = KAL_FALSE; */
  177. battery_log(BAT_LOG_CRTI, "mtk_ta_decrease() Cable out\n");
  178. }
  179. }
  180. static void mtk_ta_increase(void)
  181. {
  182. kal_bool ta_current_pattern = KAL_TRUE; /* TRUE = increase */
  183. /* if(BMT_status.charger_exist == KAL_TRUE) */
  184. if (ta_cable_out_occur == KAL_FALSE) {
  185. battery_charging_control(CHARGING_CMD_SET_TA_CURRENT_PATTERN, &ta_current_pattern);
  186. ta_current_level += 200;
  187. } else {
  188. ta_check_chr_type = KAL_TRUE;
  189. /* is_ta_connect = KAL_FALSE; */
  190. battery_log(BAT_LOG_CRTI, "mtk_ta_increase() Cable out\n");
  191. }
  192. }
  193. static void mtk_ta_reset_vchr(void)
  194. {
  195. CHR_CURRENT_ENUM chr_current = CHARGE_CURRENT_70_00_MA;
  196. battery_charging_control(CHARGING_CMD_SET_CURRENT, &chr_current);
  197. msleep(250); /* reset Vchr to 5V */
  198. ta_current_level = 5000;
  199. battery_log(BAT_LOG_CRTI, "mtk_ta_reset_vchr(): reset Vchr to 5V\n");
  200. }
  201. static void mtk_ta_init(void)
  202. {
  203. ta_current_level = 5000;
  204. is_ta_connect = KAL_FALSE;
  205. ta_pre_vbat = 0;
  206. ta_vchr_tuning = KAL_FALSE;
  207. ta_check_ta_control = KAL_FALSE;
  208. ta_cable_out_occur = KAL_FALSE;
  209. battery_charging_control(CHARGING_CMD_RESET_WATCH_DOG_TIMER, NULL);
  210. battery_charging_control(CHARGING_CMD_INIT, NULL);
  211. }
  212. int ta_get_charger_voltage(void)
  213. {
  214. int voltage = 0;
  215. int i;
  216. for (i = 0; i < 10; i++)
  217. voltage = voltage + battery_meter_get_charger_voltage();
  218. return voltage / 10;
  219. }
  220. static void mtk_ta_detector(void)
  221. {
  222. int real_v_chrA;
  223. int real_v_chrB;
  224. kal_bool retransmit = KAL_TRUE;
  225. unsigned int retransmit_count = 0;
  226. unsigned int charging_enable = true;
  227. battery_log(BAT_LOG_CRTI, "mtk_ta_detector() start\n");
  228. battery_charging_control(CHARGING_CMD_ENABLE, &charging_enable);
  229. do {
  230. real_v_chrA = ta_get_charger_voltage();
  231. mtk_ta_decrease();
  232. mtk_ta_decrease();
  233. real_v_chrB = ta_get_charger_voltage();
  234. if (real_v_chrA - real_v_chrB >= 300) { /* 0.3V */
  235. retransmit = KAL_FALSE;
  236. is_ta_connect = KAL_TRUE;
  237. } else {
  238. retransmit_count++;
  239. battery_log(BAT_LOG_CRTI,
  240. "mtk_ta_detector(): retransmit_count =%d, chrA=%d, chrB=%d\n",
  241. retransmit_count, real_v_chrA, real_v_chrB);
  242. mtk_ta_reset_vchr();
  243. }
  244. if ((retransmit_count == 3) || (BMT_status.charger_exist == KAL_FALSE)) {
  245. retransmit = KAL_FALSE;
  246. is_ta_connect = KAL_FALSE;
  247. }
  248. } while ((retransmit == KAL_TRUE) && (ta_cable_out_occur == KAL_FALSE));
  249. battery_log(BAT_LOG_CRTI,
  250. "mtk_ta_detector() ta_current_level=%d, real_v_chrA=%d, real_v_chrB=%d, is_ta_connect=%d\n",
  251. ta_current_level, real_v_chrA, real_v_chrB, is_ta_connect);
  252. battery_log(BAT_LOG_CRTI, "mtk_ta_detector() end, retry_count=%d, ta_cable_out_occur=%d\n",
  253. retransmit_count, ta_cable_out_occur);
  254. }
  255. static void mtk_tuning_voltage(int curr_level, int target_level)
  256. {
  257. int is_increase = 0;
  258. int exec_level = 0;
  259. CHR_CURRENT_ENUM chr_current = CHARGE_CURRENT_70_00_MA;
  260. /* if(BMT_status.charger_exist == KAL_TRUE) */
  261. if (ta_cable_out_occur == KAL_FALSE) {
  262. battery_log(BAT_LOG_CRTI, "mtk_tuning_voltage() start\n");
  263. if (curr_level >= target_level) {
  264. exec_level = (curr_level - target_level) / 200;
  265. is_increase = 0;
  266. } else {
  267. exec_level = (target_level - curr_level) / 200;
  268. is_increase = 1;
  269. }
  270. if (exec_level == 0) { /* curr_level == target_level */
  271. battery_charging_control(CHARGING_CMD_SET_CURRENT, &chr_current);
  272. msleep(50); /* for VChr reading to check error occur or not */
  273. }
  274. battery_log(BAT_LOG_CRTI,
  275. "mtk_tuning_voltage() before : ta_current_level=%d, real_v_chr=%d, is_ta_connect=%d, is_increase=%d, exec_level=%d\n",
  276. ta_current_level, battery_meter_get_charger_voltage(), is_ta_connect,
  277. is_increase, exec_level);
  278. while ((exec_level > 0) && (ta_cable_out_occur == KAL_FALSE)) {
  279. if (is_increase == 1)
  280. mtk_ta_increase();
  281. else
  282. mtk_ta_decrease();
  283. battery_log(BAT_LOG_CRTI,
  284. "mtk_tuning_voltage() after ta_current_level=%d, real_v_chr=%d, is_ta_connect=%d, is_increase=%d, exec_level=%d\n",
  285. ta_current_level, battery_meter_get_charger_voltage(),
  286. is_ta_connect, is_increase, exec_level);
  287. exec_level--;
  288. }
  289. battery_log(BAT_LOG_CRTI, "mtk_tuning_voltage() end\n");
  290. } else {
  291. ta_check_chr_type = KAL_TRUE;
  292. /* is_ta_connect = KAL_FALSE; */
  293. battery_log(BAT_LOG_CRTI, "mtk_tuning_voltage(), Cable Out\n");
  294. }
  295. }
  296. static void select_v_chr_candidate(int curr_vbat, int ta_v_chr_candidate[])
  297. {
  298. battery_log(BAT_LOG_CRTI, "select_v_chr_candidate() start\n");
  299. if (curr_vbat > 4200)
  300. ta_v_chr_candidate[0] = 4600;
  301. else if (curr_vbat > 4000)
  302. ta_v_chr_candidate[0] = 4400;
  303. else if (curr_vbat > 3800)
  304. ta_v_chr_candidate[0] = 4200;
  305. else if (curr_vbat > 3600)
  306. ta_v_chr_candidate[0] = 4000;
  307. else
  308. ta_v_chr_candidate[0] = 3800;
  309. ta_v_chr_candidate[1] = ta_v_chr_candidate[0] + 200;
  310. ta_v_chr_candidate[2] = ta_v_chr_candidate[0] + 400;
  311. ta_v_chr_candidate[3] = ta_v_chr_candidate[0] + 600;
  312. battery_log(BAT_LOG_CRTI, "select_v_chr_candidate() vbat=%d, candidate=%d,%d,%d\n",
  313. curr_vbat, ta_v_chr_candidate[1], ta_v_chr_candidate[2], ta_v_chr_candidate[3]);
  314. battery_log(BAT_LOG_CRTI, "select_v_chr_candidate() end\n");
  315. }
  316. static void mtk_ta_vchr_select(int i, int ta_v_chr_candidate[], int ta_charging_current_candidate[],
  317. int *max_charging_current, int *max_charging_current_i)
  318. {
  319. int current_vchr;
  320. kal_bool retransmit = KAL_TRUE;
  321. unsigned int retransmit_count = 0;
  322. current_vchr = battery_meter_get_charger_voltage();
  323. if (ta_current_level != 5000 && current_vchr >= 4900) { /* pattern error before, so reset vchr to 5V */
  324. battery_log(BAT_LOG_CRTI,
  325. "mtk_ta_vchr_select() : curr_VChr=%d, ta_current_level=%d\n",
  326. current_vchr, ta_current_level);
  327. mtk_ta_reset_vchr();
  328. }
  329. do {
  330. mtk_tuning_voltage(ta_current_level, ta_v_chr_candidate[i]);
  331. current_vchr = battery_meter_get_charger_voltage();
  332. if ((abs(current_vchr - ta_current_level) > 300) && (ta_cable_out_occur == KAL_FALSE)) {
  333. /* variation > 0.3V, error occur */
  334. retransmit_count++;
  335. battery_log(BAT_LOG_CRTI,
  336. "mtk_ta_vchr_select(): retransmit_count =%d, cur_chr=%d, ta_current_level=%d\n",
  337. retransmit_count, current_vchr, ta_current_level);
  338. mtk_ta_reset_vchr();
  339. } else
  340. retransmit = KAL_FALSE;
  341. if ((retransmit_count == 2) || (ta_cable_out_occur == KAL_TRUE))
  342. retransmit = KAL_FALSE;
  343. } while ((retransmit == KAL_TRUE) && (ta_cable_out_occur == KAL_FALSE));
  344. battery_charging_control(CHARGING_CMD_SET_CURRENT, &ta_charging_current); /* 1.5A */
  345. battery_log(BAT_LOG_CRTI, "mtk_ta_vchr_select() : use 1.5A for select max current\n");
  346. msleep(900); /* over 800ms to avoid interference pattern */
  347. ta_charging_current_candidate[i] =
  348. battery_meter_get_charging_current_imm();
  349. /* we hope to choose the less VChr if the current difference between 2 step
  350. * is not large, so we add weighting for different VChr step */
  351. if (i == 1)
  352. ta_charging_current_candidate[i] += 100; /* weighting, plus 120mA for Vbat+0.4V */
  353. else if (i == 2)
  354. ta_charging_current_candidate[i] += 50; /* weighting, plug 60mA for Vbat+0.6V */
  355. if (ta_charging_current_candidate[i] > *max_charging_current) {
  356. *max_charging_current = ta_charging_current_candidate[i];
  357. *max_charging_current_i = i;
  358. }
  359. }
  360. static void mtk_ta_BJT_check(void)
  361. {
  362. int curr_vbat = 0;
  363. int curr_current = 0;
  364. int vchr = 0;
  365. int watt = 0;
  366. int i = 0, cnt = 0;
  367. for (i = 0; i < 3; i++) {
  368. vchr = battery_meter_get_charger_voltage();
  369. curr_vbat = battery_meter_get_battery_voltage(KAL_TRUE);
  370. curr_current = battery_meter_get_charging_current_imm();
  371. watt = ((vchr - curr_vbat) * curr_current);
  372. battery_log(BAT_LOG_CRTI,
  373. "mtk_ta_BJT_check() vchr=%d, vbat=%d, current=%d, Watt=%d, ta_current_level=%d\n",
  374. vchr, curr_vbat, curr_current, watt, ta_current_level);
  375. if (watt > BJT_LIMIT) /* 1.2W */
  376. cnt++;
  377. else
  378. break;
  379. msleep(200);
  380. }
  381. if (cnt >= 3)
  382. is_ta_connect = KAL_FALSE;
  383. battery_log(BAT_LOG_CRTI,
  384. "mtk_ta_BJT_check() vchr=%d, vbat=%d, current=%d, Watt=%d, ta_current_level=%d cnt=%d\n",
  385. vchr, curr_vbat, curr_current, watt, ta_current_level, cnt);
  386. }
  387. static void battery_pump_express_charger_check(void)
  388. {
  389. if (ta_check_chr_type == KAL_TRUE && BMT_status.charger_type == STANDARD_CHARGER) {
  390. mutex_lock(&ta_mutex);
  391. wake_lock(&TA_charger_suspend_lock);
  392. mtk_ta_reset_vchr();
  393. mtk_ta_init();
  394. mtk_ta_detector();
  395. first_vchr_det = KAL_TRUE;
  396. if (ta_cable_out_occur == KAL_FALSE) {
  397. ta_check_chr_type = KAL_FALSE;
  398. } else {
  399. /* need to re-check if the charger plug out during ta detector */
  400. ta_check_chr_type = KAL_TRUE;
  401. }
  402. wake_unlock(&TA_charger_suspend_lock);
  403. mutex_unlock(&ta_mutex);
  404. }
  405. }
  406. static void battery_pump_express_algorithm_start(void)
  407. {
  408. int ta_v_chr_candidate[4] = { 0, 0, 0, 0 };
  409. int ta_charging_current_candidate[4] = { 0, 0, 0, 0 };
  410. int max_charging_current = 0;
  411. int max_charging_current_i = 0;
  412. int curr_vbat = 0;
  413. int i = 0;
  414. int ta_cv_vchr;
  415. unsigned int cv_voltage;
  416. if (batt_cust_data.high_battery_voltage_support)
  417. cv_voltage = 4350;
  418. else
  419. cv_voltage = 4200;
  420. mutex_lock(&ta_mutex);
  421. wake_lock(&TA_charger_suspend_lock);
  422. if (is_ta_connect == KAL_TRUE) {
  423. battery_log(BAT_LOG_CRTI, "mtk_ta_algorithm() start\n");
  424. curr_vbat = battery_meter_get_battery_voltage(KAL_TRUE);
  425. if (((curr_vbat - ta_pre_vbat) > 100) &&
  426. (curr_vbat < (cv_voltage - (CV_CHECK_DELAT_FOR_BANDGAP + 20))) &&
  427. (curr_vbat > TA_START_VCHR_TUNUNG_VOLTAGE)) {
  428. /*cv -0.12V && to avoid screen flash( VBAT less than 3.7V) */
  429. ta_pre_vbat = curr_vbat;
  430. select_v_chr_candidate(curr_vbat, ta_v_chr_candidate);
  431. if (first_vchr_det == KAL_TRUE) {
  432. for (i = 3; i >= 1; i--) { /* measure VBAT+0.8V, VBAT+0.6V then VBAT+0.4V */
  433. if (ta_cable_out_occur == KAL_FALSE)
  434. mtk_ta_vchr_select(i, ta_v_chr_candidate,
  435. ta_charging_current_candidate,
  436. &max_charging_current,
  437. &max_charging_current_i);
  438. }
  439. first_vchr_det = KAL_FALSE;
  440. } else {
  441. for (i = 1; i <= 3; i++) { /* measure VBAT+0.4V,VBAT+0.6V then VBAT+0.8V */
  442. if (ta_cable_out_occur == KAL_FALSE)
  443. mtk_ta_vchr_select(i, ta_v_chr_candidate,
  444. ta_charging_current_candidate,
  445. &max_charging_current,
  446. &max_charging_current_i);
  447. }
  448. }
  449. battery_log(BAT_LOG_CRTI,
  450. "mtk_ta_algorithm() candidate=%d,%d,%d,%d ; i=%d,%d,%d,%d ; max_charging_current_i=%d\n",
  451. ta_v_chr_candidate[0], ta_v_chr_candidate[1],
  452. ta_v_chr_candidate[2], ta_v_chr_candidate[3],
  453. ta_charging_current_candidate[0],
  454. ta_charging_current_candidate[1],
  455. ta_charging_current_candidate[2],
  456. ta_charging_current_candidate[3], max_charging_current_i);
  457. mtk_tuning_voltage(ta_current_level,
  458. ta_v_chr_candidate[max_charging_current_i]);
  459. ta_vchr_tuning = KAL_TRUE;
  460. ta_check_ta_control = KAL_TRUE;
  461. } else if (curr_vbat >= (cv_voltage - (CV_CHECK_DELAT_FOR_BANDGAP + 20))) {
  462. if (cv_voltage == 4200)
  463. ta_cv_vchr = 4800;
  464. else /* cv 4.35V */
  465. ta_cv_vchr = 5000;
  466. if (ta_current_level != ta_cv_vchr)
  467. mtk_tuning_voltage(ta_current_level, ta_cv_vchr);
  468. ta_vchr_tuning = KAL_TRUE;
  469. ta_check_ta_control = KAL_FALSE;
  470. battery_log(BAT_LOG_CRTI,
  471. "mtk_ta_algorithm(),curr_vbat > cv_voltage, ta_current_level=%d, cv_voltage=%d, ta_cv_vchr=%d,",
  472. ta_current_level, cv_voltage, ta_cv_vchr);
  473. }
  474. /* --for normal charging */
  475. if ((is_ta_connect == KAL_TRUE) && (curr_vbat > TA_START_VCHR_TUNUNG_VOLTAGE) &&
  476. (ta_check_ta_control == KAL_TRUE)) {
  477. /* to avoid screen flash( VBAT less than 3.7V) */
  478. battery_charging_control(CHARGING_CMD_SET_CURRENT, &ta_charging_current); /* 1.5A */
  479. battery_log(BAT_LOG_CRTI,
  480. "mtk_ta_algorithm() : detect TA, use 1.5A for normal charging, curr_vbat=%d, ta_pre_vbat=%d, ta_current_level=%d\n",
  481. curr_vbat, ta_pre_vbat, ta_current_level);
  482. /* msleep(1500); */
  483. }
  484. /* ------------------------ */
  485. mtk_ta_BJT_check();
  486. battery_log(BAT_LOG_CRTI, "mtk_ta_algorithm() end\n");
  487. } else {
  488. battery_log(BAT_LOG_CRTI, "It's not a TA charger, bypass TA algorithm\n");
  489. }
  490. wake_unlock(&TA_charger_suspend_lock);
  491. mutex_unlock(&ta_mutex);
  492. }
  493. #endif
  494. #if defined(CONFIG_MTK_JEITA_STANDARD_SUPPORT)
  495. static BATTERY_VOLTAGE_ENUM select_jeita_cv(void)
  496. {
  497. BATTERY_VOLTAGE_ENUM cv_voltage;
  498. if (g_temp_status == TEMP_ABOVE_POS_60) {
  499. cv_voltage = JEITA_TEMP_ABOVE_POS_60_CV_VOLTAGE;
  500. } else if (g_temp_status == TEMP_POS_45_TO_POS_60) {
  501. cv_voltage = JEITA_TEMP_POS_45_TO_POS_60_CV_VOLTAGE;
  502. } else if (g_temp_status == TEMP_POS_10_TO_POS_45) {
  503. if (batt_cust_data.high_battery_voltage_support)
  504. cv_voltage = BATTERY_VOLT_04_350000_V;
  505. else
  506. cv_voltage = JEITA_TEMP_POS_10_TO_POS_45_CV_VOLTAGE;
  507. } else if (g_temp_status == TEMP_POS_0_TO_POS_10) {
  508. cv_voltage = JEITA_TEMP_POS_0_TO_POS_10_CV_VOLTAGE;
  509. } else if (g_temp_status == TEMP_NEG_10_TO_POS_0) {
  510. cv_voltage = JEITA_TEMP_NEG_10_TO_POS_0_CV_VOLTAGE;
  511. } else if (g_temp_status == TEMP_BELOW_NEG_10) {
  512. cv_voltage = JEITA_TEMP_BELOW_NEG_10_CV_VOLTAGE;
  513. } else {
  514. cv_voltage = BATTERY_VOLT_04_200000_V;
  515. }
  516. return cv_voltage;
  517. }
  518. PMU_STATUS do_jeita_state_machine(void)
  519. {
  520. BATTERY_VOLTAGE_ENUM cv_voltage;
  521. /* JEITA battery temp Standard */
  522. if (BMT_status.temperature >= TEMP_POS_60_THRESHOLD) {
  523. battery_log(BAT_LOG_CRTI,
  524. "[BATTERY] Battery Over high Temperature(%d) !!\n\r",
  525. TEMP_POS_60_THRESHOLD);
  526. g_temp_status = TEMP_ABOVE_POS_60;
  527. return PMU_STATUS_FAIL;
  528. } else if (BMT_status.temperature > TEMP_POS_45_THRESHOLD) {
  529. if ((g_temp_status == TEMP_ABOVE_POS_60)
  530. && (BMT_status.temperature >= TEMP_POS_60_THRES_MINUS_X_DEGREE)) {
  531. battery_log(BAT_LOG_CRTI,
  532. "[BATTERY] Battery Temperature between %d and %d,not allow charging yet!!\n\r",
  533. TEMP_POS_60_THRES_MINUS_X_DEGREE, TEMP_POS_60_THRESHOLD);
  534. return PMU_STATUS_FAIL;
  535. } /*else {*/
  536. battery_log(BAT_LOG_CRTI,
  537. "[BATTERY] Battery Temperature between %d and %d !!\n\r",
  538. TEMP_POS_45_THRESHOLD, TEMP_POS_60_THRESHOLD);
  539. g_temp_status = TEMP_POS_45_TO_POS_60;
  540. g_jeita_recharging_voltage = JEITA_TEMP_POS_45_TO_POS_60_RECHARGE_VOLTAGE;
  541. v_cc2topoff_threshold = JEITA_TEMP_POS_45_TO_POS_60_CC2TOPOFF_THRESHOLD;
  542. charging_full_current = batt_cust_data.charging_full_current;
  543. /*}*/
  544. } else if (BMT_status.temperature >= TEMP_POS_10_THRESHOLD) {
  545. if (((g_temp_status == TEMP_POS_45_TO_POS_60)
  546. && (BMT_status.temperature >= TEMP_POS_45_THRES_MINUS_X_DEGREE))
  547. || ((g_temp_status == TEMP_POS_0_TO_POS_10)
  548. && (BMT_status.temperature <= TEMP_POS_10_THRES_PLUS_X_DEGREE))) {
  549. battery_log(BAT_LOG_CRTI,
  550. "[BATTERY] Battery Temperature not recovery to normal temperature charging mode yet!!\n\r");
  551. } else {
  552. battery_log(BAT_LOG_CRTI,
  553. "[BATTERY] Battery Normal Temperature between %d and %d !!\n\r",
  554. TEMP_POS_10_THRESHOLD, TEMP_POS_45_THRESHOLD);
  555. g_temp_status = TEMP_POS_10_TO_POS_45;
  556. if (batt_cust_data.high_battery_voltage_support)
  557. g_jeita_recharging_voltage = 4200;
  558. else
  559. g_jeita_recharging_voltage =
  560. JEITA_TEMP_POS_10_TO_POS_45_RECHARGE_VOLTAGE;
  561. v_cc2topoff_threshold = JEITA_TEMP_POS_10_TO_POS_45_CC2TOPOFF_THRESHOLD;
  562. charging_full_current = batt_cust_data.charging_full_current;
  563. }
  564. } else if (BMT_status.temperature >= TEMP_POS_0_THRESHOLD) {
  565. if ((g_temp_status == TEMP_NEG_10_TO_POS_0 || g_temp_status == TEMP_BELOW_NEG_10)
  566. && (BMT_status.temperature <= TEMP_POS_0_THRES_PLUS_X_DEGREE)) {
  567. if (g_temp_status == TEMP_NEG_10_TO_POS_0) {
  568. battery_log(BAT_LOG_CRTI,
  569. "[BATTERY] Battery Temperature between %d and %d !!\n\r",
  570. TEMP_POS_0_THRES_PLUS_X_DEGREE, TEMP_POS_10_THRESHOLD);
  571. }
  572. if (g_temp_status == TEMP_BELOW_NEG_10) {
  573. battery_log(BAT_LOG_CRTI,
  574. "[BATTERY] Battery Temperature between %d and %d,not allow charging yet!!\n\r",
  575. TEMP_POS_0_THRESHOLD, TEMP_POS_0_THRES_PLUS_X_DEGREE);
  576. return PMU_STATUS_FAIL;
  577. }
  578. } else {
  579. battery_log(BAT_LOG_CRTI,
  580. "[BATTERY] Battery Temperature between %d and %d !!\n\r",
  581. TEMP_POS_0_THRESHOLD, TEMP_POS_10_THRESHOLD);
  582. g_temp_status = TEMP_POS_0_TO_POS_10;
  583. g_jeita_recharging_voltage = JEITA_TEMP_POS_0_TO_POS_10_RECHARGE_VOLTAGE;
  584. v_cc2topoff_threshold = JEITA_TEMP_POS_0_TO_POS_10_CC2TOPOFF_THRESHOLD;
  585. charging_full_current = batt_cust_data.charging_full_current;
  586. }
  587. } else if (BMT_status.temperature >= TEMP_NEG_10_THRESHOLD) {
  588. if ((g_temp_status == TEMP_BELOW_NEG_10)
  589. && (BMT_status.temperature <= TEMP_NEG_10_THRES_PLUS_X_DEGREE)) {
  590. battery_log(BAT_LOG_CRTI,
  591. "[BATTERY] Battery Temperature between %d and %d,not allow charging yet!!\n\r",
  592. TEMP_NEG_10_THRESHOLD, TEMP_NEG_10_THRES_PLUS_X_DEGREE);
  593. return PMU_STATUS_FAIL;
  594. } /*else {*/
  595. battery_log(BAT_LOG_CRTI,
  596. "[BATTERY] Battery Temperature between %d and %d !!\n\r",
  597. TEMP_NEG_10_THRESHOLD, TEMP_POS_0_THRESHOLD);
  598. g_temp_status = TEMP_NEG_10_TO_POS_0;
  599. g_jeita_recharging_voltage = JEITA_TEMP_NEG_10_TO_POS_0_RECHARGE_VOLTAGE;
  600. v_cc2topoff_threshold = JEITA_TEMP_NEG_10_TO_POS_0_CC2TOPOFF_THRESHOLD;
  601. charging_full_current = JEITA_NEG_10_TO_POS_0_FULL_CURRENT;
  602. /*}*/
  603. } else {
  604. battery_log(BAT_LOG_CRTI,
  605. "[BATTERY] Battery below low Temperature(%d) !!\n\r",
  606. TEMP_NEG_10_THRESHOLD);
  607. g_temp_status = TEMP_BELOW_NEG_10;
  608. return PMU_STATUS_FAIL;
  609. }
  610. cv_voltage = select_jeita_cv();
  611. battery_charging_control(CHARGING_CMD_SET_CV_VOLTAGE, &cv_voltage);
  612. #if defined(CONFIG_MTK_HAFG_20)
  613. g_cv_voltage = cv_voltage;
  614. #endif
  615. return PMU_STATUS_OK;
  616. }
  617. static void set_jeita_charging_current(void)
  618. {
  619. #ifdef CONFIG_USB_IF
  620. if (BMT_status.charger_type == STANDARD_HOST)
  621. return;
  622. #endif
  623. if (g_temp_status == TEMP_NEG_10_TO_POS_0) {
  624. g_temp_CC_value = CHARGE_CURRENT_200_00_MA; /* for low temp */
  625. battery_log(BAT_LOG_CRTI, "[BATTERY] JEITA set charging current : %d\r\n",
  626. g_temp_CC_value);
  627. }
  628. }
  629. #endif
  630. bool get_usb_current_unlimited(void)
  631. {
  632. if (BMT_status.charger_type == STANDARD_HOST || BMT_status.charger_type == CHARGING_HOST)
  633. return usb_unlimited;
  634. else
  635. return false;
  636. }
  637. void set_usb_current_unlimited(bool enable)
  638. {
  639. usb_unlimited = enable;
  640. }
  641. void select_charging_curret_bcct(void)
  642. {
  643. /* done on set_bat_charging_current_limit */
  644. }
  645. unsigned int set_bat_charging_current_limit(int current_limit)
  646. {
  647. battery_log(BAT_LOG_CRTI, "[BATTERY] set_bat_charging_current_limit (%d)\r\n",
  648. current_limit);
  649. if (current_limit != -1) {
  650. g_bcct_flag = 1;
  651. if (current_limit < 70)
  652. g_temp_CC_value = CHARGE_CURRENT_0_00_MA;
  653. else if (current_limit < 200)
  654. g_temp_CC_value = CHARGE_CURRENT_70_00_MA;
  655. else if (current_limit < 300)
  656. g_temp_CC_value = CHARGE_CURRENT_200_00_MA;
  657. else if (current_limit < 400)
  658. g_temp_CC_value = CHARGE_CURRENT_300_00_MA;
  659. else if (current_limit < 450)
  660. g_temp_CC_value = CHARGE_CURRENT_400_00_MA;
  661. else if (current_limit < 550)
  662. g_temp_CC_value = CHARGE_CURRENT_450_00_MA;
  663. else if (current_limit < 650)
  664. g_temp_CC_value = CHARGE_CURRENT_550_00_MA;
  665. else if (current_limit < 700)
  666. g_temp_CC_value = CHARGE_CURRENT_650_00_MA;
  667. else if (current_limit < 800)
  668. g_temp_CC_value = CHARGE_CURRENT_700_00_MA;
  669. else if (current_limit < 900)
  670. g_temp_CC_value = CHARGE_CURRENT_800_00_MA;
  671. else if (current_limit < 1000)
  672. g_temp_CC_value = CHARGE_CURRENT_900_00_MA;
  673. else if (current_limit < 1100)
  674. g_temp_CC_value = CHARGE_CURRENT_1000_00_MA;
  675. else if (current_limit < 1200)
  676. g_temp_CC_value = CHARGE_CURRENT_1100_00_MA;
  677. else if (current_limit < 1300)
  678. g_temp_CC_value = CHARGE_CURRENT_1200_00_MA;
  679. else if (current_limit < 1400)
  680. g_temp_CC_value = CHARGE_CURRENT_1300_00_MA;
  681. else if (current_limit < 1500)
  682. g_temp_CC_value = CHARGE_CURRENT_1400_00_MA;
  683. else if (current_limit < 1600)
  684. g_temp_CC_value = CHARGE_CURRENT_1500_00_MA;
  685. else if (current_limit == 1600)
  686. g_temp_CC_value = CHARGE_CURRENT_1600_00_MA;
  687. else
  688. g_temp_CC_value = CHARGE_CURRENT_450_00_MA;
  689. if (BMT_status.charger_type == STANDARD_HOST)
  690. if ((current_limit * 100) >= CHARGE_CURRENT_500_00_MA) {
  691. g_temp_CC_value = USB_CHARGER_CURRENT;
  692. battery_log(BAT_LOG_CRTI,
  693. "[BATTERY] set_bat_charging_current_limit over usb spec(%d,%d)\r\n",
  694. current_limit * 100, g_temp_CC_value);
  695. }
  696. } else {
  697. /* change to default current setting */
  698. g_bcct_flag = 0;
  699. }
  700. wake_up_bat3();
  701. return g_bcct_flag;
  702. }
  703. void set_bat_sw_cv_charging_current_limit(int current_limit)
  704. {
  705. battery_log(BAT_LOG_CRTI, "[BATTERY] set_bat_sw_cv_charging_current_limit (%d)\r\n",
  706. current_limit);
  707. if (current_limit <= CHARGE_CURRENT_70_00_MA)
  708. ulc_cv_charging_current = CHARGE_CURRENT_0_00_MA;
  709. else if (current_limit <= CHARGE_CURRENT_200_00_MA)
  710. ulc_cv_charging_current = CHARGE_CURRENT_70_00_MA;
  711. else if (current_limit <= CHARGE_CURRENT_300_00_MA)
  712. ulc_cv_charging_current = CHARGE_CURRENT_200_00_MA;
  713. else if (current_limit <= CHARGE_CURRENT_400_00_MA)
  714. ulc_cv_charging_current = CHARGE_CURRENT_300_00_MA;
  715. else if (current_limit <= CHARGE_CURRENT_450_00_MA)
  716. ulc_cv_charging_current = CHARGE_CURRENT_400_00_MA;
  717. else if (current_limit <= CHARGE_CURRENT_550_00_MA)
  718. ulc_cv_charging_current = CHARGE_CURRENT_450_00_MA;
  719. else if (current_limit <= CHARGE_CURRENT_650_00_MA)
  720. ulc_cv_charging_current = CHARGE_CURRENT_550_00_MA;
  721. else if (current_limit <= CHARGE_CURRENT_700_00_MA)
  722. ulc_cv_charging_current = CHARGE_CURRENT_650_00_MA;
  723. else if (current_limit <= CHARGE_CURRENT_800_00_MA)
  724. ulc_cv_charging_current = CHARGE_CURRENT_700_00_MA;
  725. else if (current_limit <= CHARGE_CURRENT_900_00_MA)
  726. ulc_cv_charging_current = CHARGE_CURRENT_800_00_MA;
  727. else if (current_limit <= CHARGE_CURRENT_1000_00_MA)
  728. ulc_cv_charging_current = CHARGE_CURRENT_900_00_MA;
  729. else if (current_limit <= CHARGE_CURRENT_1100_00_MA)
  730. ulc_cv_charging_current = CHARGE_CURRENT_1000_00_MA;
  731. else if (current_limit <= CHARGE_CURRENT_1200_00_MA)
  732. ulc_cv_charging_current = CHARGE_CURRENT_1100_00_MA;
  733. else if (current_limit <= CHARGE_CURRENT_1300_00_MA)
  734. ulc_cv_charging_current = CHARGE_CURRENT_1200_00_MA;
  735. else if (current_limit <= CHARGE_CURRENT_1400_00_MA)
  736. ulc_cv_charging_current = CHARGE_CURRENT_1300_00_MA;
  737. else if (current_limit <= CHARGE_CURRENT_1500_00_MA)
  738. ulc_cv_charging_current = CHARGE_CURRENT_1400_00_MA;
  739. else if (current_limit <= CHARGE_CURRENT_1600_00_MA)
  740. ulc_cv_charging_current = CHARGE_CURRENT_1500_00_MA;
  741. else
  742. ulc_cv_charging_current = CHARGE_CURRENT_450_00_MA;
  743. }
  744. void select_charging_curret(void)
  745. {
  746. if (g_ftm_battery_flag) {
  747. battery_log(BAT_LOG_CRTI, "[BATTERY] FTM charging : %d\r\n",
  748. charging_level_data[0]);
  749. g_temp_CC_value = charging_level_data[0];
  750. } else {
  751. if (BMT_status.charger_type == STANDARD_HOST) {
  752. #ifdef CONFIG_USB_IF
  753. {
  754. if (g_usb_state == USB_SUSPEND) {
  755. g_temp_CC_value =
  756. batt_cust_data.usb_charger_current_suspend;
  757. } else if (g_usb_state == USB_UNCONFIGURED) {
  758. g_temp_CC_value =
  759. batt_cust_data.usb_charger_current_unconfigured;
  760. } else if (g_usb_state == USB_CONFIGURED) {
  761. g_temp_CC_value =
  762. batt_cust_data.usb_charger_current_configured;
  763. } else {
  764. g_temp_CC_value =
  765. batt_cust_data.usb_charger_current_unconfigured;
  766. }
  767. battery_log(BAT_LOG_CRTI,
  768. "[BATTERY] STANDARD_HOST CC mode charging : %d on %d state\r\n",
  769. g_temp_CC_value, g_usb_state);
  770. }
  771. #else
  772. {
  773. g_temp_CC_value = batt_cust_data.usb_charger_current;
  774. }
  775. #endif
  776. } else if (BMT_status.charger_type == NONSTANDARD_CHARGER) {
  777. g_temp_CC_value = batt_cust_data.non_std_ac_charger_current;
  778. } else if (BMT_status.charger_type == STANDARD_CHARGER) {
  779. g_temp_CC_value = batt_cust_data.ac_charger_current;
  780. #if defined(CONFIG_MTK_PUMP_EXPRESS_SUPPORT)
  781. if (is_ta_connect == KAL_TRUE && ta_vchr_tuning == KAL_TRUE)
  782. g_temp_CC_value = CHARGE_CURRENT_1500_00_MA;
  783. #endif
  784. } else if (BMT_status.charger_type == CHARGING_HOST) {
  785. g_temp_CC_value = batt_cust_data.charging_host_charger_current;
  786. } else if (BMT_status.charger_type == APPLE_2_1A_CHARGER) {
  787. g_temp_CC_value = batt_cust_data.apple_2_1a_charger_current;
  788. } else if (BMT_status.charger_type == APPLE_1_0A_CHARGER) {
  789. g_temp_CC_value = batt_cust_data.apple_1_0a_charger_current;
  790. } else if (BMT_status.charger_type == APPLE_0_5A_CHARGER) {
  791. g_temp_CC_value = batt_cust_data.apple_0_5a_charger_current;
  792. } else {
  793. g_temp_CC_value = CHARGE_CURRENT_70_00_MA;
  794. }
  795. battery_log(BAT_LOG_CRTI, "[BATTERY] Default CC mode charging : %d\r\n",
  796. g_temp_CC_value);
  797. #if defined(CONFIG_MTK_JEITA_STANDARD_SUPPORT)
  798. set_jeita_charging_current();
  799. #endif
  800. }
  801. }
  802. static unsigned int charging_full_check(void)
  803. {
  804. unsigned int status = KAL_FALSE;
  805. #if defined(POST_TIME_ENABLE)
  806. static unsigned int post_charging_time;
  807. if (post_charging_time >= POST_CHARGING_TIME) {
  808. status = KAL_TRUE;
  809. post_charging_time = 0;
  810. battery_log(BAT_LOG_CRTI,
  811. "[BATTERY] Battery real full and disable charging on %d mA\n",
  812. BMT_status.ICharging);
  813. } else if (post_charging_time > 0) {
  814. post_charging_time += BAT_TASK_PERIOD;
  815. battery_log(BAT_LOG_CRTI,
  816. "[BATTERY] post_charging_time=%d,POST_CHARGING_TIME=%d\n",
  817. post_charging_time, POST_CHARGING_TIME);
  818. } else if ((BMT_status.TOPOFF_charging_time > 60)
  819. && (BMT_status.ICharging <= charging_full_current)) {
  820. post_charging_time = BAT_TASK_PERIOD;
  821. battery_log(BAT_LOG_CRTI,
  822. "[BATTERY] Enter Post charge, post_charging_time=%d,POST_CHARGING_TIME=%d\n",
  823. post_charging_time, POST_CHARGING_TIME);
  824. } else {
  825. post_charging_time = 0;
  826. }
  827. #else
  828. static unsigned char full_check_count;
  829. if (BMT_status.ICharging <= charging_full_current) {
  830. full_check_count++;
  831. if (6 == full_check_count) {
  832. status = KAL_TRUE;
  833. full_check_count = 0;
  834. battery_log(BAT_LOG_CRTI,
  835. "[BATTERY] Battery full and disable charging on %d mA\n",
  836. BMT_status.ICharging);
  837. }
  838. } else {
  839. full_check_count = 0;
  840. }
  841. #endif
  842. return status;
  843. }
  844. static void charging_current_calibration(void)
  845. {
  846. signed int bat_isense_offset;
  847. #if 0
  848. signed int bat_vol = battery_meter_get_battery_voltage();
  849. signed int Vsense = battery_meter_get_VSense();
  850. bat_isense_offset = bat_vol - Vsense;
  851. battery_log(BAT_LOG_CRTI, "[BATTERY] bat_vol=%d, Vsense=%d, offset=%d \r\n",
  852. bat_vol, Vsense, bat_isense_offset);
  853. #else
  854. bat_isense_offset = 0;
  855. #endif
  856. battery_meter_sync(bat_isense_offset);
  857. }
  858. static void pchr_sw_cv_charing_current_check(void)
  859. {
  860. kal_bool charging_enable = KAL_TRUE;
  861. unsigned int csdac_full_flag = KAL_TRUE;
  862. battery_charging_control(CHARGING_CMD_SET_CURRENT, &ulc_cv_charging_current);
  863. battery_charging_control(CHARGING_CMD_ENABLE, &charging_enable);
  864. msleep(192);
  865. battery_charging_control(CHARGING_CMD_GET_CSDAC_FALL_FLAG, &csdac_full_flag);
  866. if (csdac_full_flag == KAL_TRUE)
  867. ulc_cv_charging_current = battery_meter_get_charging_current() * 100;
  868. /* get immedeate charging current and align to enum value */
  869. while (csdac_full_flag == KAL_TRUE && ulc_cv_charging_current != CHARGE_CURRENT_0_00_MA) {
  870. set_bat_sw_cv_charging_current_limit(ulc_cv_charging_current);
  871. battery_charging_control(CHARGING_CMD_SET_CURRENT, &ulc_cv_charging_current);
  872. ulc_cv_charging_current_flag = KAL_TRUE;
  873. msleep(192); /* large than 512 code x 0.25ms */
  874. battery_charging_control(CHARGING_CMD_GET_CSDAC_FALL_FLAG, &csdac_full_flag);
  875. battery_log(BAT_LOG_CRTI,
  876. "[BATTERY] Sw CV set charging current, csdac_full_flag=%d, current=%d !\n",
  877. csdac_full_flag, ulc_cv_charging_current);
  878. }
  879. if (ulc_cv_charging_current == CHARGE_CURRENT_0_00_MA)
  880. battery_log(BAT_LOG_CRTI, "[BATTERY] Sw CV set charging current Error!\n");
  881. }
  882. static void pchr_turn_on_charging(void)
  883. {
  884. #if !defined(CONFIG_MTK_JEITA_STANDARD_SUPPORT)
  885. BATTERY_VOLTAGE_ENUM cv_voltage;
  886. #endif
  887. unsigned int charging_enable = KAL_TRUE;
  888. battery_log(BAT_LOG_FULL, "[BATTERY] pchr_turn_on_charging()!\r\n");
  889. if (BMT_status.bat_charging_state == CHR_ERROR) {
  890. battery_log(BAT_LOG_CRTI, "[BATTERY] Charger Error, turn OFF charging !\n");
  891. charging_enable = KAL_FALSE;
  892. } else if ((g_platform_boot_mode == META_BOOT) || (g_platform_boot_mode == ADVMETA_BOOT)) {
  893. battery_log(BAT_LOG_CRTI,
  894. "[BATTERY] In meta or advanced meta mode, disable charging.\n");
  895. charging_enable = KAL_FALSE;
  896. } else {
  897. /*HW initialization */
  898. battery_log(BAT_LOG_FULL, "charging_hw_init\n");
  899. battery_charging_control(CHARGING_CMD_INIT, NULL);
  900. #if defined(CONFIG_MTK_PUMP_EXPRESS_SUPPORT)
  901. battery_pump_express_algorithm_start();
  902. #endif
  903. /* Set Charging Current*/
  904. if (get_usb_current_unlimited()) {
  905. g_temp_CC_value = batt_cust_data.ac_charger_current;
  906. battery_log(BAT_LOG_FULL,
  907. "USB_CURRENT_UNLIMITED, use AC_CHARGER_CURRENT\n");
  908. } else {
  909. if (g_bcct_flag == 1) {
  910. battery_log(BAT_LOG_FULL,
  911. "[BATTERY] select_charging_curret_bcct !\n");
  912. select_charging_curret_bcct();
  913. } else {
  914. battery_log(BAT_LOG_FULL, "[BATTERY] select_charging_current !\n");
  915. select_charging_curret();
  916. }
  917. }
  918. /* Set Charging Current
  919. if (g_bcct_flag == 1) {
  920. battery_log(BAT_LOG_FULL,
  921. "[BATTERY] select_charging_curret_bcct !\n");
  922. select_charging_curret_bcct();
  923. } else {
  924. if (get_usb_current_unlimited()) {
  925. g_temp_CC_value = batt_cust_data.ac_charger_current;
  926. battery_log(BAT_LOG_FULL,
  927. "USB_CURRENT_UNLIMITED, use AC_CHARGER_CURRENT\n");
  928. } else {
  929. battery_log(BAT_LOG_FULL, "[BATTERY] select_charging_current !\n");
  930. select_charging_curret();
  931. }
  932. }*/
  933. if (g_temp_CC_value == CHARGE_CURRENT_0_00_MA) {
  934. charging_enable = KAL_FALSE;
  935. battery_log(BAT_LOG_CRTI,
  936. "[BATTERY] charging current is set 0mA, turn off charging !\r\n");
  937. } else {
  938. #if defined(CONFIG_MTK_PUMP_EXPRESS_SUPPORT)
  939. if (ta_check_ta_control == KAL_FALSE)
  940. #endif
  941. {
  942. if (ulc_cv_charging_current_flag == KAL_TRUE)
  943. battery_charging_control(CHARGING_CMD_SET_CURRENT,
  944. &ulc_cv_charging_current);
  945. else
  946. battery_charging_control(CHARGING_CMD_SET_CURRENT,
  947. &g_temp_CC_value);
  948. }
  949. /* Set CV */
  950. #if !defined(CONFIG_MTK_JEITA_STANDARD_SUPPORT)
  951. if (batt_cust_data.high_battery_voltage_support)
  952. cv_voltage = BATTERY_VOLT_04_350000_V;
  953. else
  954. cv_voltage = BATTERY_VOLT_04_200000_V;
  955. battery_charging_control(CHARGING_CMD_SET_CV_VOLTAGE, &cv_voltage);
  956. #if defined(CONFIG_MTK_HAFG_20)
  957. g_cv_voltage = cv_voltage;
  958. #endif
  959. #endif
  960. }
  961. }
  962. /* enable/disable charging */
  963. battery_log(BAT_LOG_CRTI, "[BATTERY] pchr_turn_on_charging(), enable =%d \r\n",
  964. charging_enable);
  965. battery_charging_control(CHARGING_CMD_ENABLE, &charging_enable);
  966. }
  967. PMU_STATUS BAT_PreChargeModeAction(void)
  968. {
  969. battery_log(BAT_LOG_CRTI, "[BATTERY] Pre-CC mode charge, timer=%d on %d !!\n\r",
  970. BMT_status.PRE_charging_time, BMT_status.total_charging_time);
  971. BMT_status.PRE_charging_time += BAT_TASK_PERIOD;
  972. BMT_status.CC_charging_time = 0;
  973. BMT_status.TOPOFF_charging_time = 0;
  974. BMT_status.total_charging_time += BAT_TASK_PERIOD;
  975. select_charging_curret();
  976. ulc_cv_charging_current = g_temp_CC_value;
  977. ulc_cv_charging_current_flag = KAL_FALSE;
  978. if (BMT_status.UI_SOC == 100) {
  979. BMT_status.bat_charging_state = CHR_BATFULL;
  980. BMT_status.bat_full = KAL_TRUE;
  981. g_charging_full_reset_bat_meter = KAL_TRUE;
  982. } else if (BMT_status.bat_vol > batt_cust_data.v_pre2cc_thres) {
  983. BMT_status.bat_charging_state = CHR_CC;
  984. }
  985. #if defined(CONFIG_MTK_PUMP_EXPRESS_SUPPORT) /* defined(MTK_LINEAR_CHARGER_NO_DISCHARGE) */
  986. /* no disable charging */
  987. #else
  988. {
  989. kal_bool charging_enable = KAL_FALSE;
  990. /*Charging 9s and discharging 1s : start */
  991. battery_charging_control(CHARGING_CMD_ENABLE, &charging_enable);
  992. msleep(1000);
  993. }
  994. #endif
  995. charging_current_calibration();
  996. pchr_turn_on_charging();
  997. return PMU_STATUS_OK;
  998. }
  999. PMU_STATUS BAT_ConstantCurrentModeAction(void)
  1000. {
  1001. battery_log(BAT_LOG_CRTI, "[BATTERY] CC mode charge, timer=%d on %d !!\n\r",
  1002. BMT_status.CC_charging_time, BMT_status.total_charging_time);
  1003. BMT_status.PRE_charging_time = 0;
  1004. BMT_status.CC_charging_time += BAT_TASK_PERIOD;
  1005. BMT_status.TOPOFF_charging_time = 0;
  1006. BMT_status.total_charging_time += BAT_TASK_PERIOD;
  1007. ulc_cv_charging_current_flag = KAL_FALSE;
  1008. ulc_cv_charging_current = g_temp_CC_value;
  1009. if (BMT_status.bat_vol > v_cc2topoff_threshold)
  1010. BMT_status.bat_charging_state = CHR_TOP_OFF;
  1011. #if defined(CONFIG_MTK_PUMP_EXPRESS_SUPPORT) /* defined(MTK_LINEAR_CHARGER_NO_DISCHARGE) */
  1012. /* no disable charging#else */
  1013. #else
  1014. {
  1015. kal_bool charging_enable = KAL_FALSE;
  1016. /* Charging 9s and discharging 1s : start */
  1017. battery_charging_control(CHARGING_CMD_ENABLE, &charging_enable);
  1018. msleep(1000);
  1019. }
  1020. #endif
  1021. charging_current_calibration();
  1022. pchr_turn_on_charging();
  1023. return PMU_STATUS_OK;
  1024. }
  1025. PMU_STATUS BAT_TopOffModeAction(void)
  1026. {
  1027. unsigned int charging_enable = KAL_FALSE;
  1028. unsigned int cv_voltage;
  1029. if (batt_cust_data.high_battery_voltage_support)
  1030. cv_voltage = 4350;
  1031. else
  1032. cv_voltage = 4200;
  1033. battery_log(BAT_LOG_CRTI, "[BATTERY] Top Off mode charge, timer=%d on %d !!\n\r",
  1034. BMT_status.TOPOFF_charging_time, BMT_status.total_charging_time);
  1035. BMT_status.PRE_charging_time = 0;
  1036. BMT_status.CC_charging_time = 0;
  1037. BMT_status.TOPOFF_charging_time += BAT_TASK_PERIOD;
  1038. BMT_status.total_charging_time += BAT_TASK_PERIOD;
  1039. if (BMT_status.bat_vol > (cv_voltage - CV_CHECK_DELAT_FOR_BANDGAP)) { /* CV - 0.08V */
  1040. pchr_sw_cv_charing_current_check();
  1041. }
  1042. pchr_turn_on_charging();
  1043. if ((BMT_status.TOPOFF_charging_time >= MAX_CV_CHARGING_TIME)
  1044. || (charging_full_check() == KAL_TRUE)) {
  1045. BMT_status.bat_charging_state = CHR_BATFULL;
  1046. BMT_status.bat_full = KAL_TRUE;
  1047. g_charging_full_reset_bat_meter = KAL_TRUE;
  1048. /* Disable charging */
  1049. battery_charging_control(CHARGING_CMD_ENABLE, &charging_enable);
  1050. }
  1051. return PMU_STATUS_OK;
  1052. }
  1053. PMU_STATUS BAT_BatteryFullAction(void)
  1054. {
  1055. unsigned int charging_enable = KAL_FALSE;
  1056. battery_log(BAT_LOG_CRTI, "[BATTERY] Battery full !!\n\r");
  1057. BMT_status.bat_full = KAL_TRUE;
  1058. BMT_status.total_charging_time = 0;
  1059. BMT_status.PRE_charging_time = 0;
  1060. BMT_status.CC_charging_time = 0;
  1061. BMT_status.TOPOFF_charging_time = 0;
  1062. BMT_status.POSTFULL_charging_time = 0;
  1063. BMT_status.bat_in_recharging_state = KAL_FALSE;
  1064. #if defined(CONFIG_MTK_JEITA_STANDARD_SUPPORT)
  1065. if (BMT_status.bat_vol < g_jeita_recharging_voltage)
  1066. #else
  1067. if (BMT_status.bat_vol < batt_cust_data.recharging_voltage)
  1068. #endif
  1069. {
  1070. battery_log(BAT_LOG_CRTI,
  1071. "[BATTERY] Battery Enter Re-charging!! , vbat=(%d)\n\r",
  1072. BMT_status.bat_vol);
  1073. BMT_status.bat_in_recharging_state = KAL_TRUE;
  1074. BMT_status.bat_charging_state = CHR_CC;
  1075. ulc_cv_charging_current = g_temp_CC_value;
  1076. ulc_cv_charging_current_flag = KAL_FALSE;
  1077. }
  1078. /* Disable charging */
  1079. battery_charging_control(CHARGING_CMD_ENABLE, &charging_enable);
  1080. return PMU_STATUS_OK;
  1081. }
  1082. PMU_STATUS BAT_BatteryHoldAction(void)
  1083. {
  1084. unsigned int charging_enable;
  1085. battery_log(BAT_LOG_CRTI, "[BATTERY] Hold mode !!\n\r");
  1086. if (BMT_status.bat_vol < batt_cust_data.talking_recharge_voltage
  1087. || g_call_state == CALL_IDLE) {
  1088. BMT_status.bat_charging_state = CHR_CC;
  1089. battery_log(BAT_LOG_CRTI, "[BATTERY] Exit Hold mode and Enter CC mode !!\n\r");
  1090. }
  1091. /* Disable charger */
  1092. charging_enable = KAL_FALSE;
  1093. battery_charging_control(CHARGING_CMD_ENABLE, &charging_enable);
  1094. return PMU_STATUS_OK;
  1095. }
  1096. PMU_STATUS BAT_BatteryStatusFailAction(void)
  1097. {
  1098. unsigned int charging_enable;
  1099. battery_log(BAT_LOG_CRTI, "[BATTERY] BAD Battery status... Charging Stop !!\n\r");
  1100. #if defined(CONFIG_MTK_JEITA_STANDARD_SUPPORT)
  1101. if ((g_temp_status == TEMP_ABOVE_POS_60) || (g_temp_status == TEMP_BELOW_NEG_10))
  1102. temp_error_recovery_chr_flag = KAL_FALSE;
  1103. if ((temp_error_recovery_chr_flag == KAL_FALSE) && (g_temp_status != TEMP_ABOVE_POS_60)
  1104. && (g_temp_status != TEMP_BELOW_NEG_10)) {
  1105. temp_error_recovery_chr_flag = KAL_TRUE;
  1106. BMT_status.bat_charging_state = CHR_PRE;
  1107. }
  1108. #endif
  1109. BMT_status.total_charging_time = 0;
  1110. BMT_status.PRE_charging_time = 0;
  1111. BMT_status.CC_charging_time = 0;
  1112. BMT_status.TOPOFF_charging_time = 0;
  1113. BMT_status.POSTFULL_charging_time = 0;
  1114. /* Disable charger */
  1115. charging_enable = KAL_FALSE;
  1116. battery_charging_control(CHARGING_CMD_ENABLE, &charging_enable);
  1117. return PMU_STATUS_OK;
  1118. }
  1119. void mt_battery_charging_algorithm(void)
  1120. {
  1121. __init_charging_varaibles();
  1122. #if defined(CONFIG_MTK_PUMP_EXPRESS_SUPPORT)
  1123. battery_pump_express_charger_check();
  1124. #endif
  1125. switch (BMT_status.bat_charging_state) {
  1126. case CHR_PRE:
  1127. BAT_PreChargeModeAction();
  1128. break;
  1129. case CHR_CC:
  1130. BAT_ConstantCurrentModeAction();
  1131. break;
  1132. case CHR_TOP_OFF:
  1133. BAT_TopOffModeAction();
  1134. break;
  1135. case CHR_BATFULL:
  1136. BAT_BatteryFullAction();
  1137. break;
  1138. case CHR_HOLD:
  1139. BAT_BatteryHoldAction();
  1140. break;
  1141. case CHR_ERROR:
  1142. BAT_BatteryStatusFailAction();
  1143. break;
  1144. }
  1145. }