huangcm
2025-09-01 53d8e046ac1bf2ebe94f671983e3d3be059df91a
feat(bat): fix real cap & add bat 8000mA 2.0A charge config
3 files modified
64 ■■■■ changed files
longan/device/config/chips/a133/configs/c3/kickpi-k5c.dts 18 ●●●●● patch | view | raw | blame | history
longan/kernel/linux-4.9/arch/arm64/boot/dts/sunxi/a133-kickpi-axp707-bat-8000mA.dtsi 3 ●●●● patch | view | raw | blame | history
longan/kernel/linux-4.9/drivers/power/supply/axp803_battery.c 43 ●●●● patch | view | raw | blame | history
longan/device/config/chips/a133/configs/c3/kickpi-k5c.dts
....@@ -410,9 +410,9 @@
410410 status = "okay";
411411
412412 pmu_usbpc_vol = <4600>;
413
- pmu_usbpc_cur = <2500>;
413
+ pmu_usbpc_cur = <3000>;
414414 pmu_usbad_vol = <4600>;
415
- pmu_usbad_cur = <2500>;
415
+ pmu_usbad_cur = <3000>;
416416
417417 wakeup_usb_in;
418418 wakeup_usb_out;
....@@ -425,9 +425,9 @@
425425 pmu_chg_ic_temp = <0>;
426426 pmu_battery_rdc= <50>;
427427 pmu_battery_cap = <8000>;
428
- pmu_runtime_chgcur = <1000>;
429
- pmu_suspend_chgcur = <2000>;
430
- pmu_shutdown_chgcur = <2000>;
428
+ pmu_runtime_chgcur = <2800>;
429
+ pmu_suspend_chgcur = <2800>;
430
+ pmu_shutdown_chgcur = <2800>;
431431 pmu_init_chgvol = <4280>;
432432 pmu_battery_warning_level1 = <15>;
433433 pmu_battery_warning_level2 = <0>;
....@@ -1457,8 +1457,10 @@
14571457 //#include "lcd-lvds-7-1024-600.dtsi"
14581458 //#include "lcd-lvds-21-1920-1080.dtsi"
14591459 //#include "lcd-mipi-10-800-1280-v1.dtsi"
1460
-#include "lcd-mipi-10-800-1280-v2.dtsi"
1460
+//#include "lcd-mipi-10-800-1280-v2.dtsi"
14611461 //#include "lcd-mipi-8-800-1280.dtsi"
1462
-//#include "lcd-mipi-5-720-1280.dtsi"
1462
+#include "lcd-mipi-5-720-1280.dtsi"
14631463
1464
-#include "a133-kickpi-axp707-bat-5000mA.dtsi"
1464
+//#include "a133-kickpi-axp707-bat-5000mA.dtsi"
1465
+#include "a133-kickpi-axp707-bat-8000mA.dtsi"
1466
+
longan/kernel/linux-4.9/arch/arm64/boot/dts/sunxi/a133-kickpi-axp707-bat-8000mA.dtsi
....@@ -3,7 +3,7 @@
33 status = "okay";
44
55 pmu_chg_ic_temp = <0>;
6
- pmu_battery_rdc= <10>;
6
+ pmu_battery_rdc= <60>;
77 pmu_battery_cap = <8000>;
88 pmu_runtime_chgcur = <2800>;
99 pmu_suspend_chgcur = <2800>;
....@@ -14,6 +14,7 @@
1414 pmu_chgled_func = <1>;
1515 pmu_chgled_type = <0>;
1616 ocv_coulumb_100 = <1>;
17
+ pmu_vol_min = <3400>;
1718
1819 /* 3.1328 */
1920 pmu_bat_para1 = <0>;
longan/kernel/linux-4.9/drivers/power/supply/axp803_battery.c
....@@ -134,17 +134,23 @@
134134 int rdc = 0;
135135 int ret = 0;
136136
137
+ int vbat = 0;
137138 int charging = 0;
138139 int ocv_pct = 0;
139140 int coul_pct = 0;
140141 int ac_valid = 0;
141142 int usb_valid = 0;
143
+ int bat_cur_dir = 0;
144
+ static int low_power_cnt = 0;
142145 static int pre_rest_vol, invalid_count;
143146
144147 struct axp_config_info *axp_config = &bat_power->dts_info;
145148
146149 regmap_bulk_read(bat_power->regmap, AXP803_OCVBATH_RES, temp_val, 2);
147150 ocv_vol = ((temp_val[0] << 4) | (temp_val[1] & 0xF)) * 1100 / 1000;
151
+
152
+ regmap_read(bat_power->regmap, AXP803_STATUS, &reg_value);
153
+ bat_cur_dir = (reg_value & 0x04) ? 1 : 0;
148154
149155 ret = regmap_read(bat_power->regmap, AXP803_CAP, &reg_value);
150156 if (ret)
....@@ -163,9 +169,18 @@
163169 rest_vol = 100;
164170 }
165171
166
- if (ocv_vol < axp_config->pmu_vol_min) {
167
- // pr_err("kickpi: ocv_vol %d < min %d, rest_vol %d -> 0\n", ocv_vol, axp_config->pmu_vol_min, rest_vol);
168
- rest_vol = 0;
172
+ /* read ocv percentage */
173
+ regmap_read(bat_power->regmap, AXP803_OCV_PERCENT, &reg_value);
174
+ ocv_pct = (int)(reg_value & 0x7F);
175
+
176
+ /* read vol */
177
+ vbat = axp803_get_vbat(bat_power);
178
+ if (unlikely(axp_debug_mask & AXP_CHG)) {
179
+ pr_err("kickpi: v1 ocv_pct = %d rest_vol = %d vbat = %d !\n", ocv_pct, rest_vol, vbat);
180
+ }
181
+
182
+ if ((ocv_pct == 0 && vbat > 0) || (rest_vol == 0 && vbat > 0) ) {
183
+ return 77;
169184 }
170185
171186 return rest_vol;
....@@ -243,12 +258,26 @@
243258 ocv_vol, rdc, coulumb_counter, batt_max_cap);
244259 }
245260
246
- if (ocv_vol < axp_config->pmu_vol_min) {
247
- // pr_err("kickpi: ocv_vol %d < min %d, rest_vol %d -> 0\n", ocv_vol, axp_config->pmu_vol_min, rest_vol);
248
- rest_vol = 0;
261
+ /*
262
+ 1. vol < low_power_protect when not charge
263
+ 2. need power down
264
+ */
265
+ if (bat_cur_dir == 0 && ocv_vol < axp_config->pmu_vol_min) {
266
+ low_power_cnt++;
267
+ if (low_power_cnt >= 6) {
268
+ return 0;
269
+ }
270
+ } else {
271
+ low_power_cnt = 0;
249272 }
250273
251
- return rest_vol;
274
+ if (unlikely(axp_debug_mask & AXP_CHG)) {
275
+ vbat = axp803_get_vbat(bat_power);
276
+ pr_err("kickpi: v2 ocv_pct = %d rest_vol = %d vbat = %d !\n", ocv_pct, rest_vol, vbat);
277
+ }
278
+
279
+ return ocv_pct;
280
+ // return rest_vol;
252281 }
253282
254283 static inline int axp_vts_to_mV(u16 reg)