1 /*****************************************************************************
13 * This file implements the interface between BMT and ADC scheduler.
19 *============================================================================
21 * $Modtime: 11 Aug 2005 10:28:16 $
22 * $Log: //mtkvs01/vmdata/Maui_sw/archives/mcu/hal/peripheral/inc/bmt_chr_setting.h-arc $
24 * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
25 *------------------------------------------------------------------------------
26 *------------------------------------------------------------------------------
27 * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
28 *============================================================================
29 ****************************************************************************/
30 #include <linux/kernel.h>
31 #include <mach/battery_common.h>
32 #include <mach/charging.h>
33 #include "cust_charging.h"
34 #include <mach/mt_boot.h>
35 #include <linux/delay.h>
36 #include <mach/battery_meter.h>
37 #include <linux/mutex.h>
38 #include <linux/wakelock.h>
40 /* ============================================================ // */
42 /* ============================================================ // */
44 #define POST_CHARGING_TIME 30 * 60 /* 30mins */
45 #define CV_CHECK_DELAT_FOR_BANDGAP 80 /* 80mV */
46 #if defined(CONFIG_MTK_PUMP_EXPRESS_SUPPORT)
47 #define BJT_LIMIT 1200000 /* 1.2W */
48 #ifndef TA_START_VCHR_TUNUNG_VOLTAG
49 #define TA_START_VCHR_TUNUNG_VOLTAGE 3700 /* for isink blink issue */
50 #define TA_CHARGING_CURRENT CHARGE_CURRENT_1500_00_MA
51 #endif /* TA_START_VCHR_TUNUNG_VOLTAG */
52 #endif /* MTK_PUMP_EXPRESS_SUPPORT */
54 #define FULL_CHECK_TIMES 6
56 /* ============================================================ // */
58 /* ============================================================ // */
59 kal_uint32 g_bcct_flag
= 0;
60 CHR_CURRENT_ENUM g_temp_CC_value
= CHARGE_CURRENT_0_00_MA
;
61 kal_uint32 g_usb_state
= USB_UNCONFIGURED
;
62 kal_uint32 charging_full_current
= CHARGING_FULL_CURRENT
; /* mA */
63 kal_uint32 v_cc2topoff_threshold
= V_CC2TOPOFF_THRES
;
64 CHR_CURRENT_ENUM ulc_cv_charging_current
= AC_CHARGER_CURRENT
;
65 kal_bool ulc_cv_charging_current_flag
= KAL_FALSE
;
66 static bool usb_unlimited
=false;
68 /* [PLATFORM]-Add-BEGIN by TCTSZ.leo.guo, 04/15/2015, modify ntc temperature function */
69 #ifdef MTK_BATTERY_PROTECT_FEATURE
70 kal_bool high_temp_stop_charge
= KAL_FALSE
;
72 /* [PLATFORM]-Add-END by TCTSZ.leo.guo */
74 /* ///////////////////////////////////////////////////////////////////////////////////////// */
76 /* ///////////////////////////////////////////////////////////////////////////////////////// */
77 #if defined(CONFIG_MTK_JEITA_STANDARD_SUPPORT)
78 int g_jeita_recharging_voltage
= JEITA_RECHARGE_VOLTAGE
;
79 int g_temp_status
= TEMP_POS_10_TO_POS_45
;
80 kal_bool temp_error_recovery_chr_flag
= KAL_TRUE
;
83 /* ///////////////////////////////////////////////////////////////////////////////////////// */
85 /* ///////////////////////////////////////////////////////////////////////////////////////// */
86 #if defined(CONFIG_MTK_PUMP_EXPRESS_SUPPORT)
87 struct wake_lock TA_charger_suspend_lock
;
88 CHR_CURRENT_ENUM ta_charging_current
= TA_CHARGING_CURRENT
;
89 int ta_current_level
= 5000;
91 kal_bool ta_check_chr_type
= KAL_TRUE
;
92 kal_bool ta_check_ta_control
= KAL_FALSE
;
93 kal_bool ta_vchr_tuning
= KAL_FALSE
;
94 kal_bool first_vchr_det
= KAL_TRUE
;
95 kal_bool ta_cable_out_occur
= KAL_FALSE
;
96 kal_bool is_ta_connect
= KAL_FALSE
;
100 /* ============================================================ // */
101 /* function prototype */
102 /* ============================================================ // */
105 /* ============================================================ // */
106 /* extern variable */
107 /* ============================================================ // */
108 extern int g_platform_boot_mode
;
110 /* ============================================================ // */
111 /* extern function */
112 /* ============================================================ // */
115 /* ============================================================ // */
116 void BATTERY_SetUSBState(int usb_state_value
)
118 #if defined(CONFIG_POWER_EXT)
119 battery_xlog_printk(BAT_LOG_CRTI
, "[BATTERY_SetUSBState] in FPGA/EVB, no service\r\n");
121 if ((usb_state_value
< USB_SUSPEND
) || ((usb_state_value
> USB_CONFIGURED
))) {
122 battery_xlog_printk(BAT_LOG_CRTI
,
123 "[BATTERY] BAT_SetUSBState Fail! Restore to default value\r\n");
124 usb_state_value
= USB_UNCONFIGURED
;
126 battery_xlog_printk(BAT_LOG_CRTI
, "[BATTERY] BAT_SetUSBState Success! Set %d\r\n",
128 g_usb_state
= usb_state_value
;
133 /* EXPORT_SYMBOL(BATTERY_SetUSBState); */
136 //EXPORT_SYMBOL(BATTERY_SetUSBState);
139 kal_uint32
get_charging_setting_current()
141 return g_temp_CC_value
;
145 #if defined(CONFIG_MTK_PUMP_EXPRESS_SUPPORT)
147 static DEFINE_MUTEX(ta_mutex
);
150 static void mtk_ta_decrease(void)
152 kal_bool ta_current_pattern
= KAL_FALSE
; // FALSE = decrease
154 //if(BMT_status.charger_exist == KAL_TRUE)
155 if(ta_cable_out_occur
== KAL_FALSE
) {
156 battery_charging_control(CHARGING_CMD_SET_TA_CURRENT_PATTERN
,&ta_current_pattern
);
157 ta_current_level
-= 200;
159 ta_check_chr_type
= KAL_TRUE
;
160 //is_ta_connect = KAL_FALSE;
161 battery_xlog_printk(BAT_LOG_CRTI
, "mtk_ta_decrease() Cable out \n");
165 static void mtk_ta_increase(void)
167 kal_bool ta_current_pattern
= KAL_TRUE
; // TRUE = increase
169 //if(BMT_status.charger_exist == KAL_TRUE)
170 if(ta_cable_out_occur
== KAL_FALSE
) {
171 battery_charging_control(CHARGING_CMD_SET_TA_CURRENT_PATTERN
,&ta_current_pattern
);
172 ta_current_level
+= 200;
174 ta_check_chr_type
= KAL_TRUE
;
175 //is_ta_connect = KAL_FALSE;
176 battery_xlog_printk(BAT_LOG_CRTI
, "mtk_ta_increase() Cable out \n");
180 static void mtk_ta_reset_vchr(void)
182 CHR_CURRENT_ENUM chr_current
= CHARGE_CURRENT_70_00_MA
;
184 battery_charging_control(CHARGING_CMD_SET_CURRENT
,&chr_current
);
185 msleep(250); // reset Vchr to 5V
187 ta_current_level
= 5000;
189 battery_xlog_printk(BAT_LOG_CRTI
, "mtk_ta_reset_vchr(): reset Vchr to 5V \n");
192 static void mtk_ta_init(void)
194 ta_current_level
= 5000;
195 is_ta_connect
= KAL_FALSE
;
197 ta_vchr_tuning
= KAL_FALSE
;
198 ta_check_ta_control
= KAL_FALSE
;
199 ta_cable_out_occur
= KAL_FALSE
;
201 battery_charging_control(CHARGING_CMD_INIT
,NULL
);
205 static void mtk_ta_detector(void)
209 kal_bool retransmit
= KAL_TRUE
;
210 kal_uint32 retransmit_count
=0;
212 battery_xlog_printk(BAT_LOG_CRTI
, "mtk_ta_detector() start\n");
214 real_v_chrA
= battery_meter_get_charger_voltage();
217 real_v_chrB
= battery_meter_get_charger_voltage();
219 if(real_v_chrA
- real_v_chrB
>= 300) { /* 0.3V */
220 retransmit
= KAL_FALSE
;
221 is_ta_connect
= KAL_TRUE
;
225 battery_xlog_printk(BAT_LOG_CRTI
, "mtk_ta_detector(): retransmit_count =%d, chrA=%d, chrB=%d\n",
226 retransmit_count
, real_v_chrA
, real_v_chrB
);
231 if((retransmit_count
== 3) || (BMT_status
.charger_exist
== KAL_FALSE
)) {
232 retransmit
= KAL_FALSE
;
233 is_ta_connect
= KAL_FALSE
;
236 } while((retransmit
== KAL_TRUE
) && (ta_cable_out_occur
== KAL_FALSE
));
239 battery_xlog_printk(BAT_LOG_CRTI
, "mtk_ta_detector() ta_current_level=%d, real_v_chrA=%d, real_v_chrB=%d, is_ta_connect=%d\n",
240 ta_current_level
, real_v_chrA
, real_v_chrB
,is_ta_connect
);
242 battery_xlog_printk(BAT_LOG_CRTI
, "mtk_ta_detector() end, retry_count=%d, ta_cable_out_occur=%d \n",retransmit_count
,ta_cable_out_occur
);
245 static void mtk_tuning_voltage(int curr_level
, int target_level
)
249 CHR_CURRENT_ENUM chr_current
= CHARGE_CURRENT_70_00_MA
;
251 /* if(BMT_status.charger_exist == KAL_TRUE) */
252 if(ta_cable_out_occur
== KAL_FALSE
) {
253 battery_xlog_printk(BAT_LOG_CRTI
, "mtk_tuning_voltage() start\n");
255 if(curr_level
>= target_level
) {
256 exec_level
= (curr_level
-target_level
)/200;
259 exec_level
= (target_level
-curr_level
)/200;
263 if(exec_level
== 0) { /* curr_level == target_level */
264 battery_charging_control(CHARGING_CMD_SET_CURRENT
,&chr_current
);
265 msleep(50); // for VChr reading to check error occur or not
269 battery_xlog_printk(BAT_LOG_CRTI
, "mtk_tuning_voltage() before : ta_current_level=%d, real_v_chr=%d, is_ta_connect=%d, is_increase=%d, exec_level=%d\n",
270 ta_current_level
, battery_meter_get_charger_voltage(), is_ta_connect
, is_increase
, exec_level
);
272 while((exec_level
> 0) && (ta_cable_out_occur
== KAL_FALSE
)) {
277 battery_xlog_printk(BAT_LOG_CRTI
, "mtk_tuning_voltage() after ta_current_level=%d, real_v_chr=%d, is_ta_connect=%d, is_increase=%d, exec_level=%d\n",
278 ta_current_level
, battery_meter_get_charger_voltage(), is_ta_connect
, is_increase
, exec_level
);
283 battery_xlog_printk(BAT_LOG_CRTI
, "mtk_tuning_voltage() end\n");
285 ta_check_chr_type
= KAL_TRUE
;
286 //is_ta_connect = KAL_FALSE;
287 battery_xlog_printk(BAT_LOG_CRTI
, "mtk_tuning_voltage(), Cable Out\n");
291 static void select_v_chr_candidate(int curr_vbat
, int ta_v_chr_candidate
[])
293 battery_xlog_printk(BAT_LOG_CRTI
, "select_v_chr_candidate() start\n");
295 if(curr_vbat
> 4200) ta_v_chr_candidate
[0]=4600;
296 else if(curr_vbat
> 4000) ta_v_chr_candidate
[0]=4400;
297 else if(curr_vbat
> 3800) ta_v_chr_candidate
[0]=4200;
298 else if(curr_vbat
> 3600) ta_v_chr_candidate
[0]=4000;
299 else ta_v_chr_candidate
[0]=3800;
301 ta_v_chr_candidate
[1]=ta_v_chr_candidate
[0]+200;
302 ta_v_chr_candidate
[2]=ta_v_chr_candidate
[0]+400;
303 ta_v_chr_candidate
[3]=ta_v_chr_candidate
[0]+600;
305 battery_xlog_printk(BAT_LOG_CRTI
, "select_v_chr_candidate() vbat=%d, candidate=%d,%d,%d\n",
306 curr_vbat
, ta_v_chr_candidate
[1], ta_v_chr_candidate
[2], ta_v_chr_candidate
[3]);
308 battery_xlog_printk(BAT_LOG_CRTI
, "select_v_chr_candidate() end\n");
312 static void mtk_ta_vchr_select(int i
,int ta_v_chr_candidate
[], int ta_charging_current_candidate
[], int *max_charging_current
, int *max_charging_current_i
)
315 kal_bool retransmit
= KAL_TRUE
;
316 kal_uint32 retransmit_count
=0;
318 current_vchr
= battery_meter_get_charger_voltage();
319 if(ta_current_level
!= 5000 && current_vchr
>= 4900) { /* pattern error before, so reset vchr to 5V */
320 battery_xlog_printk(BAT_LOG_CRTI
, "mtk_ta_vchr_select() : curr_VChr=%d, ta_current_level=%d\n",current_vchr
,ta_current_level
);
326 mtk_tuning_voltage(ta_current_level
, ta_v_chr_candidate
[i
]);
328 current_vchr
= battery_meter_get_charger_voltage();
329 if((abs(current_vchr
- ta_current_level
) > 300) && (ta_cable_out_occur
== KAL_FALSE
)) { /* variation > 0.3V, error occur */
332 battery_xlog_printk(BAT_LOG_CRTI
, "mtk_ta_vchr_select(): retransmit_count =%d, cur_chr=%d, ta_current_level=%d\n",
333 retransmit_count
, current_vchr
, ta_current_level
);
337 retransmit
= KAL_FALSE
;
340 if((retransmit_count
== 2) || (ta_cable_out_occur
== KAL_TRUE
)) {
341 retransmit
= KAL_FALSE
;
344 } while((retransmit
== KAL_TRUE
) && (ta_cable_out_occur
== KAL_FALSE
));
346 battery_charging_control(CHARGING_CMD_SET_CURRENT
,&ta_charging_current
); //1.5A
348 battery_xlog_printk(BAT_LOG_CRTI
, "mtk_ta_vchr_select() : use 1.5A for select max current\n");
349 msleep(900); // over 800ms to avoid interference pattern
351 ta_charging_current_candidate
[i
] = battery_meter_get_charging_current_imm();
353 /* we hope to choose the less VChr if the current difference between 2 step is not large, so we add weighting for different VChr step */
355 ta_charging_current_candidate
[i
] += 100; // weighting, plus 120mA for Vbat+0.4V
357 ta_charging_current_candidate
[i
] += 50; // weighting, plug 60mA for Vbat+0.6V
359 if(ta_charging_current_candidate
[i
] > *max_charging_current
) {
360 *max_charging_current
= ta_charging_current_candidate
[i
];
361 *max_charging_current_i
= i
;
366 static void mtk_ta_BJT_check(void)
369 int curr_current
= 0;
373 vchr
= battery_meter_get_charger_voltage();
374 curr_vbat
= battery_meter_get_battery_voltage(KAL_TRUE
);
375 curr_current
= battery_meter_get_charging_current_imm();
377 watt
= ((vchr
- curr_vbat
)*curr_current
);
378 if(watt
> BJT_LIMIT
) //1.2W
379 is_ta_connect
= KAL_FALSE
;
381 battery_xlog_printk(BAT_LOG_CRTI
, "mtk_ta_BJT_check() vchr=%d, vbat=%d, current=%d, Watt=%d, ta_current_level=%d\n",
382 vchr
,curr_vbat
,curr_current
,watt
, ta_current_level
);
385 static void battery_pump_express_charger_check(void)
387 if (ta_check_chr_type
== KAL_TRUE
&& BMT_status
.charger_type
== STANDARD_CHARGER
) {
388 mutex_lock(&ta_mutex
);
389 wake_lock(&TA_charger_suspend_lock
);
395 first_vchr_det
= KAL_TRUE
;
397 if(ta_cable_out_occur
== KAL_FALSE
) {
398 ta_check_chr_type
= KAL_FALSE
;
400 /* need to re-check if the charger plug out during ta detector */
401 ta_check_chr_type
= KAL_TRUE
;
404 wake_unlock(&TA_charger_suspend_lock
);
405 mutex_unlock(&ta_mutex
);
410 static void battery_pump_express_algorithm_start(void)
412 int ta_v_chr_candidate
[4]={0,0,0,0};
413 int ta_charging_current_candidate
[4]={0,0,0,0};
414 int max_charging_current
= 0;
415 int max_charging_current_i
= 0;
419 #ifdef HIGH_BATTERY_VOLTAGE_SUPPORT
420 kal_uint32 cv_voltage
= 4350;
422 kal_uint32 cv_voltage
= 4200;
425 mutex_lock(&ta_mutex
);
426 wake_lock(&TA_charger_suspend_lock
);
428 if(is_ta_connect
== KAL_TRUE
) {
429 battery_xlog_printk(BAT_LOG_CRTI
, "mtk_ta_algorithm() start\n");
431 curr_vbat
= battery_meter_get_battery_voltage(KAL_TRUE
);
432 if( ((curr_vbat
-ta_pre_vbat
)>100) && (curr_vbat
< (cv_voltage
- (CV_CHECK_DELAT_FOR_BANDGAP
+20))) && (curr_vbat
> TA_START_VCHR_TUNUNG_VOLTAGE
) ) { /*cv -0.12V && to avoid screen flash( VBAT less than 3.7V) */
433 ta_pre_vbat
= curr_vbat
;
435 select_v_chr_candidate(curr_vbat
, ta_v_chr_candidate
);
437 if(first_vchr_det
== KAL_TRUE
) {
438 for(i
=3 ; i
>=1 ; i
--) { /* measure VBAT+0.8V, VBAT+0.6V then VBAT+0.4V */
439 if(ta_cable_out_occur
== KAL_FALSE
)
440 mtk_ta_vchr_select(i
,ta_v_chr_candidate
,ta_charging_current_candidate
,&max_charging_current
,&max_charging_current_i
);
443 first_vchr_det
= KAL_FALSE
;
445 for(i
=1 ; i
<=3 ; i
++) { /* measure VBAT+0.4V,VBAT+0.6V then VBAT+0.8V */
446 if(ta_cable_out_occur
== KAL_FALSE
)
447 mtk_ta_vchr_select(i
,ta_v_chr_candidate
,ta_charging_current_candidate
,&max_charging_current
,&max_charging_current_i
);
451 battery_xlog_printk(BAT_LOG_CRTI
, "mtk_ta_algorithm() candidate=%d,%d,%d,%d ; i=%d,%d,%d,%d ; max_charging_current_i=%d\n",
452 ta_v_chr_candidate
[0], ta_v_chr_candidate
[1], ta_v_chr_candidate
[2], ta_v_chr_candidate
[3],
453 ta_charging_current_candidate
[0], ta_charging_current_candidate
[1], ta_charging_current_candidate
[2],ta_charging_current_candidate
[3],
454 max_charging_current_i
457 mtk_tuning_voltage(ta_current_level
, 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)
467 if(ta_current_level
!= ta_cv_vchr
) {
468 mtk_tuning_voltage(ta_current_level
, ta_cv_vchr
);
471 ta_vchr_tuning
= KAL_TRUE
;
472 ta_check_ta_control
= KAL_FALSE
;
474 battery_xlog_printk(BAT_LOG_CRTI
, "mtk_ta_algorithm(),curr_vbat > cv_voltage, ta_current_level=%d, cv_voltage=%d, ta_cv_vchr=%d,",ta_current_level
,cv_voltage
,ta_cv_vchr
);
477 /* --for normal charging */
478 if((is_ta_connect
== KAL_TRUE
) && (curr_vbat
> TA_START_VCHR_TUNUNG_VOLTAGE
) &&(ta_check_ta_control
== KAL_TRUE
)) { /* to avoid screen flash( VBAT less than 3.7V) */
479 battery_charging_control(CHARGING_CMD_SET_CURRENT
,&ta_charging_current
); /* 1.5A */
480 battery_xlog_printk(BAT_LOG_CRTI
, "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
);
484 //------------------------
487 battery_xlog_printk(BAT_LOG_CRTI
, "mtk_ta_algorithm() end\n");
489 battery_xlog_printk(BAT_LOG_CRTI
, "It's not a TA charger, bypass TA algorithm\n");
492 wake_unlock(&TA_charger_suspend_lock
);
493 mutex_unlock(&ta_mutex
);
498 #if defined(CONFIG_MTK_JEITA_STANDARD_SUPPORT)
500 static BATTERY_VOLTAGE_ENUM
select_jeita_cv(void)
502 BATTERY_VOLTAGE_ENUM cv_voltage
;
504 if (g_temp_status
== TEMP_ABOVE_POS_60
) {
505 cv_voltage
= JEITA_TEMP_ABOVE_POS_60_CV_VOLTAGE
;
506 } else if (g_temp_status
== TEMP_POS_45_TO_POS_60
) {
507 cv_voltage
= JEITA_TEMP_POS_45_TO_POS_60_CV_VOLTAGE
;
508 } else if (g_temp_status
== TEMP_POS_10_TO_POS_45
) {
509 #ifdef HIGH_BATTERY_VOLTAGE_SUPPORT
510 cv_voltage
= BATTERY_VOLT_04_350000_V
;
512 cv_voltage
= JEITA_TEMP_POS_10_TO_POS_45_CV_VOLTAGE
;
514 } else if (g_temp_status
== TEMP_POS_0_TO_POS_10
) {
515 cv_voltage
= JEITA_TEMP_POS_0_TO_POS_10_CV_VOLTAGE
;
516 } else if (g_temp_status
== TEMP_NEG_10_TO_POS_0
) {
517 cv_voltage
= JEITA_TEMP_NEG_10_TO_POS_0_CV_VOLTAGE
;
518 } else if (g_temp_status
== TEMP_BELOW_NEG_10
) {
519 cv_voltage
= JEITA_TEMP_BELOW_NEG_10_CV_VOLTAGE
;
521 cv_voltage
= BATTERY_VOLT_04_200000_V
;
527 PMU_STATUS
do_jeita_state_machine(void)
529 int previous_g_temp_status
;
530 BATTERY_VOLTAGE_ENUM cv_voltage
;
532 previous_g_temp_status
= g_temp_status
;
533 /* JEITA battery temp Standard */
534 if (BMT_status
.temperature
>= TEMP_POS_60_THRESHOLD
) {
535 battery_xlog_printk(BAT_LOG_CRTI
,
536 "[BATTERY] Battery Over high Temperature(%d) !!\n\r",
537 TEMP_POS_60_THRESHOLD
);
538 g_temp_status
= TEMP_ABOVE_POS_60
;
539 return PMU_STATUS_FAIL
;
540 } else if (BMT_status
.temperature
> TEMP_POS_45_THRESHOLD
) {
541 if ((g_temp_status
== TEMP_ABOVE_POS_60
)
542 && (BMT_status
.temperature
>= TEMP_POS_60_THRES_MINUS_X_DEGREE
)) {
543 battery_xlog_printk(BAT_LOG_CRTI
,
544 "[BATTERY] Battery Temperature between %d and %d,not allow charging yet!!\n\r",
545 TEMP_POS_60_THRES_MINUS_X_DEGREE
,
546 TEMP_POS_60_THRESHOLD
);
547 return PMU_STATUS_FAIL
;
549 battery_xlog_printk(BAT_LOG_CRTI
,
550 "[BATTERY] Battery Temperature between %d and %d !!\n\r",
551 TEMP_POS_45_THRESHOLD
, TEMP_POS_60_THRESHOLD
);
552 g_temp_status
= TEMP_POS_45_TO_POS_60
;
553 g_jeita_recharging_voltage
= JEITA_TEMP_POS_45_TO_POS_60_RECHARGE_VOLTAGE
;
554 v_cc2topoff_threshold
= JEITA_TEMP_POS_45_TO_POS_60_CC2TOPOFF_THRESHOLD
;
555 charging_full_current
= CHARGING_FULL_CURRENT
;
557 } else if (BMT_status
.temperature
>= TEMP_POS_10_THRESHOLD
) {
558 if (((g_temp_status
== TEMP_POS_45_TO_POS_60
)
559 && (BMT_status
.temperature
>= TEMP_POS_45_THRES_MINUS_X_DEGREE
))
560 || ((g_temp_status
== TEMP_POS_0_TO_POS_10
)
561 && (BMT_status
.temperature
<= TEMP_POS_10_THRES_PLUS_X_DEGREE
))) {
562 battery_xlog_printk(BAT_LOG_CRTI
,
563 "[BATTERY] Battery Temperature not recovery to normal temperature charging mode yet!!\n\r");
565 battery_xlog_printk(BAT_LOG_CRTI
,
566 "[BATTERY] Battery Normal Temperature between %d and %d !!\n\r",
567 TEMP_POS_10_THRESHOLD
, TEMP_POS_45_THRESHOLD
);
569 g_temp_status
= TEMP_POS_10_TO_POS_45
;
570 #ifdef HIGH_BATTERY_VOLTAGE_SUPPORT
571 g_jeita_recharging_voltage
= 4200;
573 g_jeita_recharging_voltage
= JEITA_TEMP_POS_10_TO_POS_45_RECHARGE_VOLTAGE
;
575 v_cc2topoff_threshold
= JEITA_TEMP_POS_10_TO_POS_45_CC2TOPOFF_THRESHOLD
;
576 charging_full_current
= CHARGING_FULL_CURRENT
;
578 } else if (BMT_status
.temperature
>= TEMP_POS_0_THRESHOLD
) {
579 if ((g_temp_status
== TEMP_NEG_10_TO_POS_0
|| g_temp_status
== TEMP_BELOW_NEG_10
)
580 && (BMT_status
.temperature
<= TEMP_POS_0_THRES_PLUS_X_DEGREE
)) {
581 if (g_temp_status
== TEMP_NEG_10_TO_POS_0
) {
582 battery_xlog_printk(BAT_LOG_CRTI
,
583 "[BATTERY] Battery Temperature between %d and %d !!\n\r",
584 TEMP_POS_0_THRES_PLUS_X_DEGREE
,
585 TEMP_POS_10_THRESHOLD
);
587 if (g_temp_status
== TEMP_BELOW_NEG_10
) {
588 battery_xlog_printk(BAT_LOG_CRTI
,
589 "[BATTERY] Battery Temperature between %d and %d,not allow charging yet!!\n\r",
590 TEMP_POS_0_THRESHOLD
,
591 TEMP_POS_0_THRES_PLUS_X_DEGREE
);
592 return PMU_STATUS_FAIL
;
595 battery_xlog_printk(BAT_LOG_CRTI
,
596 "[BATTERY] Battery Temperature between %d and %d !!\n\r",
597 TEMP_POS_0_THRESHOLD
, TEMP_POS_10_THRESHOLD
);
598 g_temp_status
= TEMP_POS_0_TO_POS_10
;
599 g_jeita_recharging_voltage
= JEITA_TEMP_POS_0_TO_POS_10_RECHARGE_VOLTAGE
;
600 v_cc2topoff_threshold
= JEITA_TEMP_POS_0_TO_POS_10_CC2TOPOFF_THRESHOLD
;
601 charging_full_current
= CHARGING_FULL_CURRENT
;
603 } else if (BMT_status
.temperature
>= TEMP_NEG_10_THRESHOLD
) {
604 if ((g_temp_status
== TEMP_BELOW_NEG_10
)
605 && (BMT_status
.temperature
<= TEMP_NEG_10_THRES_PLUS_X_DEGREE
)) {
606 battery_xlog_printk(BAT_LOG_CRTI
,
607 "[BATTERY] Battery Temperature between %d and %d,not allow charging yet!!\n\r",
608 TEMP_NEG_10_THRESHOLD
, TEMP_NEG_10_THRES_PLUS_X_DEGREE
);
609 return PMU_STATUS_FAIL
;
611 battery_xlog_printk(BAT_LOG_CRTI
,
612 "[BATTERY] Battery Temperature between %d and %d !!\n\r",
613 TEMP_NEG_10_THRESHOLD
, TEMP_POS_0_THRESHOLD
);
614 g_temp_status
= TEMP_NEG_10_TO_POS_0
;
615 g_jeita_recharging_voltage
= JEITA_TEMP_NEG_10_TO_POS_0_RECHARGE_VOLTAGE
;
616 v_cc2topoff_threshold
= JEITA_TEMP_NEG_10_TO_POS_0_CC2TOPOFF_THRESHOLD
;
617 charging_full_current
= JEITA_NEG_10_TO_POS_0_FULL_CURRENT
;
620 battery_xlog_printk(BAT_LOG_CRTI
,
621 "[BATTERY] Battery below low Temperature(%d) !!\n\r",
622 TEMP_NEG_10_THRESHOLD
);
623 g_temp_status
= TEMP_BELOW_NEG_10
;
624 return PMU_STATUS_FAIL
;
627 /* set CV after temperature changed */
628 if (g_temp_status
!= previous_g_temp_status
) {
629 cv_voltage
= select_jeita_cv();
630 battery_charging_control(CHARGING_CMD_SET_CV_VOLTAGE
, &cv_voltage
);
633 return PMU_STATUS_OK
;
637 static void set_jeita_charging_current(void)
640 if (BMT_status
.charger_type
== STANDARD_HOST
)
644 if (g_temp_status
== TEMP_NEG_10_TO_POS_0
) {
645 g_temp_CC_value
= CHARGE_CURRENT_200_00_MA
; /* for low temp */
646 battery_xlog_printk(BAT_LOG_CRTI
, "[BATTERY] JEITA set charging current : %d\r\n",
653 bool get_usb_current_unlimited(void)
655 if (BMT_status
.charger_type
== STANDARD_HOST
|| BMT_status
.charger_type
== CHARGING_HOST
)
656 return usb_unlimited
;
661 void set_usb_current_unlimited(bool enable
)
663 usb_unlimited
= enable
;
666 void select_charging_curret_bcct(void)
668 /* done on set_bat_charging_current_limit */
672 kal_uint32
set_bat_charging_current_limit(int current_limit
)
674 battery_xlog_printk(BAT_LOG_CRTI
, "[BATTERY] set_bat_charging_current_limit (%d)\r\n",
677 if (current_limit
!= -1) {
680 if (current_limit
< 70)
681 g_temp_CC_value
= CHARGE_CURRENT_0_00_MA
;
682 else if (current_limit
< 200)
683 g_temp_CC_value
= CHARGE_CURRENT_70_00_MA
;
684 else if (current_limit
< 300)
685 g_temp_CC_value
= CHARGE_CURRENT_200_00_MA
;
686 else if (current_limit
< 400)
687 g_temp_CC_value
= CHARGE_CURRENT_300_00_MA
;
688 else if (current_limit
< 450)
689 g_temp_CC_value
= CHARGE_CURRENT_400_00_MA
;
690 else if (current_limit
< 550)
691 g_temp_CC_value
= CHARGE_CURRENT_450_00_MA
;
692 else if (current_limit
< 650)
693 g_temp_CC_value
= CHARGE_CURRENT_550_00_MA
;
694 else if (current_limit
< 700)
695 g_temp_CC_value
= CHARGE_CURRENT_650_00_MA
;
696 else if (current_limit
< 800)
697 g_temp_CC_value
= CHARGE_CURRENT_700_00_MA
;
698 else if (current_limit
< 900)
699 g_temp_CC_value
= CHARGE_CURRENT_800_00_MA
;
700 else if (current_limit
< 1000)
701 g_temp_CC_value
= CHARGE_CURRENT_900_00_MA
;
702 else if (current_limit
< 1100)
703 g_temp_CC_value
= CHARGE_CURRENT_1000_00_MA
;
704 else if (current_limit
< 1200)
705 g_temp_CC_value
= CHARGE_CURRENT_1100_00_MA
;
706 else if (current_limit
< 1300)
707 g_temp_CC_value
= CHARGE_CURRENT_1200_00_MA
;
708 else if (current_limit
< 1400)
709 g_temp_CC_value
= CHARGE_CURRENT_1300_00_MA
;
710 else if (current_limit
< 1500)
711 g_temp_CC_value
= CHARGE_CURRENT_1400_00_MA
;
712 else if (current_limit
< 1600)
713 g_temp_CC_value
= CHARGE_CURRENT_1500_00_MA
;
714 else if (current_limit
== 1600)
715 g_temp_CC_value
= CHARGE_CURRENT_1600_00_MA
;
717 g_temp_CC_value
= CHARGE_CURRENT_450_00_MA
;
719 /* change to default current setting */
728 void set_bat_sw_cv_charging_current_limit(int current_limit
)
730 battery_xlog_printk(BAT_LOG_CRTI
, "[BATTERY] set_bat_sw_cv_charging_current_limit (%d)\r\n", current_limit
);
732 if(current_limit
<= CHARGE_CURRENT_70_00_MA
) ulc_cv_charging_current
=CHARGE_CURRENT_0_00_MA
;
733 else if(current_limit
<= CHARGE_CURRENT_200_00_MA
) ulc_cv_charging_current
=CHARGE_CURRENT_70_00_MA
;
734 else if(current_limit
<= CHARGE_CURRENT_300_00_MA
) ulc_cv_charging_current
=CHARGE_CURRENT_200_00_MA
;
735 else if(current_limit
<= CHARGE_CURRENT_400_00_MA
) ulc_cv_charging_current
=CHARGE_CURRENT_300_00_MA
;
736 else if(current_limit
<= CHARGE_CURRENT_450_00_MA
) ulc_cv_charging_current
=CHARGE_CURRENT_400_00_MA
;
737 else if(current_limit
<= CHARGE_CURRENT_550_00_MA
) ulc_cv_charging_current
=CHARGE_CURRENT_450_00_MA
;
738 else if(current_limit
<= CHARGE_CURRENT_650_00_MA
) ulc_cv_charging_current
=CHARGE_CURRENT_550_00_MA
;
739 else if(current_limit
<= CHARGE_CURRENT_700_00_MA
) ulc_cv_charging_current
=CHARGE_CURRENT_650_00_MA
;
740 else if(current_limit
<= CHARGE_CURRENT_800_00_MA
) ulc_cv_charging_current
=CHARGE_CURRENT_700_00_MA
;
741 else if(current_limit
<= CHARGE_CURRENT_900_00_MA
) ulc_cv_charging_current
=CHARGE_CURRENT_800_00_MA
;
742 else if(current_limit
<= CHARGE_CURRENT_1000_00_MA
) ulc_cv_charging_current
=CHARGE_CURRENT_900_00_MA
;
743 else if(current_limit
<= CHARGE_CURRENT_1100_00_MA
) ulc_cv_charging_current
=CHARGE_CURRENT_1000_00_MA
;
744 else if(current_limit
<= CHARGE_CURRENT_1200_00_MA
) ulc_cv_charging_current
=CHARGE_CURRENT_1100_00_MA
;
745 else if(current_limit
<= CHARGE_CURRENT_1300_00_MA
) ulc_cv_charging_current
=CHARGE_CURRENT_1200_00_MA
;
746 else if(current_limit
<= CHARGE_CURRENT_1400_00_MA
) ulc_cv_charging_current
=CHARGE_CURRENT_1300_00_MA
;
747 else if(current_limit
<= CHARGE_CURRENT_1500_00_MA
) ulc_cv_charging_current
=CHARGE_CURRENT_1400_00_MA
;
748 else if(current_limit
<= CHARGE_CURRENT_1600_00_MA
) ulc_cv_charging_current
=CHARGE_CURRENT_1500_00_MA
;
749 else ulc_cv_charging_current
=CHARGE_CURRENT_450_00_MA
;
752 void select_charging_curret(void)
754 if (g_ftm_battery_flag
) {
755 battery_xlog_printk(BAT_LOG_CRTI
, "[BATTERY] FTM charging : %d\r\n",
756 charging_level_data
[0]);
757 g_temp_CC_value
= charging_level_data
[0];
759 if (BMT_status
.charger_type
== STANDARD_HOST
) {
762 if (g_usb_state
== USB_SUSPEND
) {
763 g_temp_CC_value
= USB_CHARGER_CURRENT_SUSPEND
;
764 } else if (g_usb_state
== USB_UNCONFIGURED
) {
765 g_temp_CC_value
= USB_CHARGER_CURRENT_UNCONFIGURED
;
766 } else if (g_usb_state
== USB_CONFIGURED
) {
767 g_temp_CC_value
= USB_CHARGER_CURRENT_CONFIGURED
;
769 g_temp_CC_value
= USB_CHARGER_CURRENT_UNCONFIGURED
;
772 battery_xlog_printk(BAT_LOG_CRTI
,
773 "[BATTERY] STANDARD_HOST CC mode charging : %d on %d state\r\n",
774 g_temp_CC_value
, g_usb_state
);
778 g_temp_CC_value
= USB_CHARGER_CURRENT
;
781 } else if (BMT_status
.charger_type
== NONSTANDARD_CHARGER
) {
782 g_temp_CC_value
= NON_STD_AC_CHARGER_CURRENT
;
783 } else if (BMT_status
.charger_type
== STANDARD_CHARGER
) {
784 g_temp_CC_value
= AC_CHARGER_CURRENT
;
785 #if defined(CONFIG_MTK_PUMP_EXPRESS_SUPPORT)
786 if(is_ta_connect
== KAL_TRUE
&& ta_vchr_tuning
== KAL_TRUE
)
787 g_temp_CC_value
= CHARGE_CURRENT_1500_00_MA
;
789 } else if (BMT_status
.charger_type
== CHARGING_HOST
) {
790 g_temp_CC_value
= CHARGING_HOST_CHARGER_CURRENT
;
791 } else if (BMT_status
.charger_type
== APPLE_2_1A_CHARGER
) {
792 g_temp_CC_value
= APPLE_2_1A_CHARGER_CURRENT
;
793 } else if (BMT_status
.charger_type
== APPLE_1_0A_CHARGER
) {
794 g_temp_CC_value
= APPLE_1_0A_CHARGER_CURRENT
;
795 } else if (BMT_status
.charger_type
== APPLE_0_5A_CHARGER
) {
796 g_temp_CC_value
= APPLE_0_5A_CHARGER_CURRENT
;
798 g_temp_CC_value
= CHARGE_CURRENT_70_00_MA
;
801 battery_xlog_printk(BAT_LOG_CRTI
, "[BATTERY] Default CC mode charging : %d\r\n",
804 #if defined(CONFIG_MTK_JEITA_STANDARD_SUPPORT)
805 set_jeita_charging_current();
813 static kal_uint32
charging_full_check(void)
815 kal_uint32 status
= KAL_FALSE
;
817 #if defined(POST_TIME_ENABLE)
818 static kal_uint32 post_charging_time
= 0;
820 if (post_charging_time
>= POST_CHARGING_TIME
) {
822 post_charging_time
= 0;
824 battery_xlog_printk(BAT_LOG_CRTI
,
825 "[BATTERY] Battery real full and disable charging on %d mA\n",
826 BMT_status
.ICharging
);
827 } else if (post_charging_time
> 0) {
828 post_charging_time
+= BAT_TASK_PERIOD
;
829 battery_xlog_printk(BAT_LOG_CRTI
,
830 "[BATTERY] post_charging_time=%d,POST_CHARGING_TIME=%d\n",
831 post_charging_time
, POST_CHARGING_TIME
);
832 } else if ((BMT_status
.TOPOFF_charging_time
> 60)
833 && (BMT_status
.ICharging
<= charging_full_current
)) {
834 post_charging_time
= BAT_TASK_PERIOD
;
835 battery_xlog_printk(BAT_LOG_CRTI
,
836 "[BATTERY] Enter Post charge, post_charging_time=%d,POST_CHARGING_TIME=%d\n",
837 post_charging_time
, POST_CHARGING_TIME
);
839 post_charging_time
= 0;
842 static kal_uint8 full_check_count
= 0;
844 if (BMT_status
.ICharging
<= charging_full_current
) {
846 if (full_check_count
>= FULL_CHECK_TIMES
) {
847 /* [PLATFORM]-Add-BEGIN by TCTSZ.leo.guo, 04/15/2015, modify ntc temperature function */
848 #ifdef MTK_BATTERY_PROTECT_FEATURE
849 if (BMT_status
.temperature
< MAX_LIMIT_CHARGE_TEMPERATURE
) {
853 high_temp_stop_charge
= KAL_TRUE
;
858 /* [PLATFORM]-Add-END by TCTSZ.leo.guo */
859 full_check_count
= 0;
860 battery_xlog_printk(BAT_LOG_CRTI
,
861 "[BATTERY] Battery full and disable charging on %d mA\n",
862 BMT_status
.ICharging
);
865 full_check_count
= 0;
873 static void charging_current_calibration(void)
875 kal_int32 bat_isense_offset
;
877 kal_int32 bat_vol
= battery_meter_get_battery_voltage();
878 kal_int32 Vsense
= battery_meter_get_VSense();
880 bat_isense_offset
= bat_vol
- Vsense
;
882 battery_xlog_printk(BAT_LOG_CRTI
, "[BATTERY] bat_vol=%d, Vsense=%d, offset=%d \r\n",
883 bat_vol
, Vsense
, bat_isense_offset
);
885 bat_isense_offset
= 0;
888 battery_meter_sync(bat_isense_offset
);
891 static void pchr_sw_cv_charing_current_check(void)
893 kal_bool charging_enable
= KAL_TRUE
;
894 kal_uint32 csdac_full_flag
= KAL_TRUE
;
896 battery_charging_control(CHARGING_CMD_SET_CURRENT
,&ulc_cv_charging_current
);
897 battery_charging_control(CHARGING_CMD_ENABLE
,&charging_enable
);
901 battery_charging_control(CHARGING_CMD_GET_CSDAC_FALL_FLAG
,&csdac_full_flag
);
903 if(csdac_full_flag
== KAL_TRUE
) {
904 ulc_cv_charging_current
= battery_meter_get_charging_current() * 100; /* get immedeate charging current and align to enum value */
907 while(csdac_full_flag
== KAL_TRUE
&& ulc_cv_charging_current
!=CHARGE_CURRENT_0_00_MA
) {
908 set_bat_sw_cv_charging_current_limit(ulc_cv_charging_current
);
909 battery_charging_control(CHARGING_CMD_SET_CURRENT
,&ulc_cv_charging_current
);
910 ulc_cv_charging_current_flag
= KAL_TRUE
;
912 msleep(192); /* large than 512 code x 0.25ms */
914 battery_charging_control(CHARGING_CMD_GET_CSDAC_FALL_FLAG
,&csdac_full_flag
);
916 battery_xlog_printk(BAT_LOG_CRTI
, "[BATTERY] Sw CV set charging current, csdac_full_flag=%d, current=%d !\n",csdac_full_flag
,ulc_cv_charging_current
);
919 if(ulc_cv_charging_current
== CHARGE_CURRENT_0_00_MA
)
920 battery_xlog_printk(BAT_LOG_CRTI
, "[BATTERY] Sw CV set charging current Error!\n");
923 static void pchr_turn_on_charging(void)
925 #if !defined(CONFIG_MTK_JEITA_STANDARD_SUPPORT)
926 BATTERY_VOLTAGE_ENUM cv_voltage
;
928 kal_uint32 charging_enable
= KAL_TRUE
;
930 battery_xlog_printk(BAT_LOG_FULL
, "[BATTERY] pchr_turn_on_charging()!\r\n");
932 if (BMT_status
.bat_charging_state
== CHR_ERROR
) {
933 battery_xlog_printk(BAT_LOG_CRTI
, "[BATTERY] Charger Error, turn OFF charging !\n");
935 charging_enable
= KAL_FALSE
;
936 } else if ((g_platform_boot_mode
== META_BOOT
) || (g_platform_boot_mode
== ADVMETA_BOOT
)) {
937 battery_xlog_printk(BAT_LOG_CRTI
,
938 "[BATTERY] In meta or advanced meta mode, disable charging.\n");
939 charging_enable
= KAL_FALSE
;
941 /*HW initialization */
942 battery_xlog_printk(BAT_LOG_FULL
, "charging_hw_init\n");
943 battery_charging_control(CHARGING_CMD_INIT
, NULL
);
945 #if defined(CONFIG_MTK_PUMP_EXPRESS_SUPPORT)
946 battery_pump_express_algorithm_start();
949 /* Set Charging Current */
950 if (get_usb_current_unlimited()) {
951 g_temp_CC_value
= AC_CHARGER_CURRENT
;
952 battery_xlog_printk(BAT_LOG_FULL
, "USB_CURRENT_UNLIMITED, use AC_CHARGER_CURRENT\n" );
954 if (g_bcct_flag
== 1) {
955 battery_xlog_printk(BAT_LOG_FULL
,
956 "[BATTERY] select_charging_curret_bcct !\n");
957 select_charging_curret_bcct();
959 battery_xlog_printk(BAT_LOG_FULL
, "[BATTERY] select_charging_current !\n");
960 select_charging_curret();
964 if (g_temp_CC_value
== CHARGE_CURRENT_0_00_MA
) {
965 charging_enable
= KAL_FALSE
;
966 battery_xlog_printk(BAT_LOG_CRTI
,
967 "[BATTERY] charging current is set 0mA, turn off charging !\r\n");
969 #if defined(CONFIG_MTK_PUMP_EXPRESS_SUPPORT)
970 if(ta_check_ta_control
== KAL_FALSE
)
973 if(ulc_cv_charging_current_flag
== KAL_TRUE
)
974 battery_charging_control(CHARGING_CMD_SET_CURRENT
,&ulc_cv_charging_current
);
976 battery_charging_control(CHARGING_CMD_SET_CURRENT
,&g_temp_CC_value
);
980 #if !defined(CONFIG_MTK_JEITA_STANDARD_SUPPORT)
981 #ifdef HIGH_BATTERY_VOLTAGE_SUPPORT
982 cv_voltage
= BATTERY_VOLT_04_350000_V
;
984 cv_voltage
= BATTERY_VOLT_04_200000_V
;
986 /* [PLATFORM]-Add-BEGIN by TCTSZ.leo.guo, 04/15/2015, modify ntc temperature function */
987 #ifdef MTK_BATTERY_PROTECT_FEATURE
988 /*Battery temperature more than 45 degree or less than 55 degree, try to limit max voltage*/
989 if((BMT_status
.temperature
>= MAX_LIMIT_CHARGE_TEMPERATURE
) && (BMT_status
.temperature
<= MAX_CHARGE_TEMPERATURE
) )
991 cv_voltage
= BATTERY_VOLT_04_100000_V
;
992 battery_xlog_printk(BAT_LOG_CRTI
,
993 "[BATTERY] temperature more than 45 degree or less than 55 degree, try to limit max voltage !\r\n");
996 /* [PLATFORM]-Add-END by TCTSZ.leo.guo */
997 battery_charging_control(CHARGING_CMD_SET_CV_VOLTAGE
, &cv_voltage
);
1002 /* enable/disable charging */
1003 battery_xlog_printk(BAT_LOG_CRTI
, "[BATTERY] pchr_turn_on_charging(), enable =%d \r\n",
1005 battery_charging_control(CHARGING_CMD_ENABLE
, &charging_enable
);
1011 PMU_STATUS
BAT_PreChargeModeAction(void)
1013 battery_xlog_printk(BAT_LOG_CRTI
, "[BATTERY] Pre-CC mode charge, timer=%d on %d !!\n\r",
1014 BMT_status
.PRE_charging_time
, BMT_status
.total_charging_time
);
1016 BMT_status
.PRE_charging_time
+= BAT_TASK_PERIOD
;
1017 BMT_status
.CC_charging_time
= 0;
1018 BMT_status
.TOPOFF_charging_time
= 0;
1019 BMT_status
.total_charging_time
+= BAT_TASK_PERIOD
;
1021 select_charging_curret();
1022 ulc_cv_charging_current
= g_temp_CC_value
;
1023 ulc_cv_charging_current_flag
= KAL_FALSE
;
1025 if (BMT_status
.UI_SOC
== 100) {
1026 BMT_status
.bat_charging_state
= CHR_BATFULL
;
1027 BMT_status
.bat_full
= KAL_TRUE
;
1028 g_charging_full_reset_bat_meter
= KAL_TRUE
;
1029 } else if (BMT_status
.bat_vol
> V_PRE2CC_THRES
) {
1030 BMT_status
.bat_charging_state
= CHR_CC
;
1033 #if defined(CONFIG_MTK_PUMP_EXPRESS_SUPPORT)//defined(MTK_LINEAR_CHARGER_NO_DISCHARGE)
1034 // no disable charging
1037 kal_bool charging_enable
= KAL_FALSE
;
1039 /*Charging 9s and discharging 1s : start */
1040 battery_charging_control(CHARGING_CMD_ENABLE
, &charging_enable
);
1045 charging_current_calibration();
1046 pchr_turn_on_charging();
1048 return PMU_STATUS_OK
;
1052 PMU_STATUS
BAT_ConstantCurrentModeAction(void)
1054 battery_xlog_printk(BAT_LOG_CRTI
, "[BATTERY] CC mode charge, timer=%d on %d !!\n\r",
1055 BMT_status
.CC_charging_time
, BMT_status
.total_charging_time
);
1057 BMT_status
.PRE_charging_time
= 0;
1058 BMT_status
.CC_charging_time
+= BAT_TASK_PERIOD
;
1059 BMT_status
.TOPOFF_charging_time
= 0;
1060 BMT_status
.total_charging_time
+= BAT_TASK_PERIOD
;
1062 ulc_cv_charging_current_flag
= KAL_FALSE
;
1063 ulc_cv_charging_current
= g_temp_CC_value
;
1065 if (BMT_status
.bat_vol
> v_cc2topoff_threshold
) {
1066 BMT_status
.bat_charging_state
= CHR_TOP_OFF
;
1069 #if defined(CONFIG_MTK_PUMP_EXPRESS_SUPPORT)//defined(MTK_LINEAR_CHARGER_NO_DISCHARGE)
1070 // no disable charging#else
1073 kal_bool charging_enable
= KAL_FALSE
;
1075 /* Charging 9s and discharging 1s : start */
1076 battery_charging_control(CHARGING_CMD_ENABLE
, &charging_enable
);
1081 charging_current_calibration();
1083 pchr_turn_on_charging();
1085 return PMU_STATUS_OK
;
1089 PMU_STATUS
BAT_TopOffModeAction(void)
1091 kal_uint32 charging_enable
= KAL_FALSE
;
1092 #ifdef HIGH_BATTERY_VOLTAGE_SUPPORT
1093 kal_uint32 cv_voltage
= 4350;
1095 kal_uint32 cv_voltage
= 4200;
1098 battery_xlog_printk(BAT_LOG_CRTI
, "[BATTERY] Top Off mode charge, timer=%d on %d !!\n\r",
1099 BMT_status
.TOPOFF_charging_time
, BMT_status
.total_charging_time
);
1101 BMT_status
.PRE_charging_time
= 0;
1102 BMT_status
.CC_charging_time
= 0;
1103 BMT_status
.TOPOFF_charging_time
+= BAT_TASK_PERIOD
;
1104 BMT_status
.total_charging_time
+= BAT_TASK_PERIOD
;
1107 if(BMT_status
.bat_vol
> (cv_voltage
-CV_CHECK_DELAT_FOR_BANDGAP
)) { /* CV - 0.08V */
1108 pchr_sw_cv_charing_current_check();
1110 pchr_turn_on_charging();
1112 if ((BMT_status
.TOPOFF_charging_time
>= MAX_CV_CHARGING_TIME
)
1113 || (charging_full_check() == KAL_TRUE
)) {
1114 BMT_status
.bat_charging_state
= CHR_BATFULL
;
1115 BMT_status
.bat_full
= KAL_TRUE
;
1116 g_charging_full_reset_bat_meter
= KAL_TRUE
;
1118 /* Disable charging */
1119 battery_charging_control(CHARGING_CMD_ENABLE
, &charging_enable
);
1122 return PMU_STATUS_OK
;
1126 PMU_STATUS
BAT_BatteryFullAction(void)
1128 kal_uint32 charging_enable
= KAL_FALSE
;
1130 battery_xlog_printk(BAT_LOG_CRTI
, "[BATTERY] Battery full !!\n\r");
1132 BMT_status
.bat_full
= KAL_TRUE
;
1133 BMT_status
.total_charging_time
= 0;
1134 BMT_status
.PRE_charging_time
= 0;
1135 BMT_status
.CC_charging_time
= 0;
1136 BMT_status
.TOPOFF_charging_time
= 0;
1137 BMT_status
.POSTFULL_charging_time
= 0;
1138 BMT_status
.bat_in_recharging_state
= KAL_FALSE
;
1141 #if defined(CONFIG_MTK_JEITA_STANDARD_SUPPORT)
1142 if (BMT_status
.bat_vol
< g_jeita_recharging_voltage
)
1144 if (BMT_status
.bat_vol
< RECHARGING_VOLTAGE
)
1147 battery_xlog_printk(BAT_LOG_CRTI
,
1148 "[BATTERY] Battery Enter Re-charging!! , vbat=(%d)\n\r",
1149 BMT_status
.bat_vol
);
1151 BMT_status
.bat_in_recharging_state
= KAL_TRUE
;
1152 BMT_status
.bat_charging_state
= CHR_CC
;
1153 ulc_cv_charging_current
= g_temp_CC_value
;
1154 ulc_cv_charging_current_flag
= KAL_FALSE
;
1157 /* Disable charging */
1158 battery_charging_control(CHARGING_CMD_ENABLE
, &charging_enable
);
1160 return PMU_STATUS_OK
;
1164 PMU_STATUS
BAT_BatteryHoldAction(void)
1166 kal_uint32 charging_enable
;
1168 battery_xlog_printk(BAT_LOG_CRTI
, "[BATTERY] Hold mode !!\n\r");
1170 if (BMT_status
.bat_vol
< TALKING_RECHARGE_VOLTAGE
|| g_call_state
== CALL_IDLE
) {
1171 BMT_status
.bat_charging_state
= CHR_CC
;
1172 battery_xlog_printk(BAT_LOG_CRTI
,
1173 "[BATTERY] Exit Hold mode and Enter CC mode !!\n\r");
1176 /* Disable charger */
1177 charging_enable
= KAL_FALSE
;
1178 battery_charging_control(CHARGING_CMD_ENABLE
, &charging_enable
);
1180 return PMU_STATUS_OK
;
1184 PMU_STATUS
BAT_BatteryStatusFailAction(void)
1186 kal_uint32 charging_enable
;
1188 battery_xlog_printk(BAT_LOG_CRTI
, "[BATTERY] BAD Battery status... Charging Stop !!\n\r");
1190 #if defined(CONFIG_MTK_JEITA_STANDARD_SUPPORT)
1191 if ((g_temp_status
== TEMP_ABOVE_POS_60
) || (g_temp_status
== TEMP_BELOW_NEG_10
)) {
1192 temp_error_recovery_chr_flag
= KAL_FALSE
;
1194 if ((temp_error_recovery_chr_flag
== KAL_FALSE
) && (g_temp_status
!= TEMP_ABOVE_POS_60
)
1195 && (g_temp_status
!= TEMP_BELOW_NEG_10
)) {
1196 temp_error_recovery_chr_flag
= KAL_TRUE
;
1197 BMT_status
.bat_charging_state
= CHR_PRE
;
1201 BMT_status
.total_charging_time
= 0;
1202 BMT_status
.PRE_charging_time
= 0;
1203 BMT_status
.CC_charging_time
= 0;
1204 BMT_status
.TOPOFF_charging_time
= 0;
1205 BMT_status
.POSTFULL_charging_time
= 0;
1207 /* Disable charger */
1208 charging_enable
= KAL_FALSE
;
1209 battery_charging_control(CHARGING_CMD_ENABLE
, &charging_enable
);
1211 return PMU_STATUS_OK
;
1215 void mt_battery_charging_algorithm(void)
1217 #if defined(CONFIG_MTK_PUMP_EXPRESS_SUPPORT)
1218 battery_pump_express_charger_check();
1220 switch (BMT_status
.bat_charging_state
) {
1222 BAT_PreChargeModeAction();
1226 BAT_ConstantCurrentModeAction();
1230 BAT_TopOffModeAction();
1234 BAT_BatteryFullAction();
1238 BAT_BatteryHoldAction();
1242 BAT_BatteryStatusFailAction();