power: charge animation: clean up code

Change-Id: I0d76d7ad28ef3683bbc78f36d4a0f00d5517e2fa
Signed-off-by: Joseph Chen <chenjh@rock-chips.com>
This commit is contained in:
Joseph Chen 2019-02-13 15:12:41 +08:00
parent 1b3009debe
commit ebe3d004b5
2 changed files with 46 additions and 49 deletions

View File

@ -32,7 +32,10 @@
DECLARE_GLOBAL_DATA_PTR;
#define IMAGE_SHOW_RESET -1
#define IMAGE_RESET_IDX -1
#define IMAGE_SOC_100_IDX(n) ((n) - 2)
#define IMAGE_LOWPOWER_IDX(n) ((n) - 1)
#define FUEL_GAUGE_POLL_MS 1000
#define LED_CHARGING_NAME "battery_charging"
@ -216,6 +219,7 @@ static int system_suspend_enter(struct charge_animation_pdata *pdata)
return 0;
}
static void timer_irq_handler(int irq, void *data)
{
struct udevice *dev = data;
@ -387,7 +391,7 @@ static int charge_animation_show(struct udevice *dev)
ulong show_start = 0, charge_start = 0, debug_start = 0;
ulong delta;
ulong ms = 0, sec = 0;
int start_idx = 0, show_idx = -1, old_show_idx = IMAGE_SHOW_RESET;
int start_idx = 0, show_idx = -1, old_show_idx = IMAGE_RESET_IDX;
int soc, voltage, current, key_state;
int i, charging = 1, ret;
int boot_mode;
@ -496,8 +500,8 @@ static int charge_animation_show(struct udevice *dev)
/*
* Most fuel gauge is I2C interface, it shouldn't be interrupted
* during tansfer. The power key event depends on interrupt, so
* so we should disable local irq when update fuel gauge.
* during transfer. The power key event depends on interrupt, so
* we should disable local irq when update fuel gauge.
*/
local_irq_disable();
@ -537,8 +541,8 @@ static int charge_animation_show(struct udevice *dev)
printf("get current failed: %d\n", current);
continue;
}
first_poll_fg = 0;
first_poll_fg = 0;
local_irq_enable();
show_images:
@ -550,7 +554,8 @@ show_images:
debug_start = get_timer(0);
if (get_timer(debug_start) > 20000) {
debug_start = get_timer(0);
printf("[%8ld]: soc=%d%%, vol=%dmv, c=%dma, online=%d, screen_on=%d\n",
printf("[%8ld]: soc=%d%%, vol=%dmv, c=%dma, "
"online=%d, screen_on=%d\n",
get_timer(0)/1000, soc, voltage,
current, charging, screen_on);
}
@ -570,24 +575,24 @@ show_images:
/*
* Auto turn on screen when voltage higher than Vol screen on.
* 'ever_lowpower_screen_off' means enter while loop with
* 'ever_lowpower_screen_off' means enter the while(1) loop with
* screen off.
*/
if ((ever_lowpower_screen_off) &&
(voltage > pdata->screen_on_voltage)) {
ever_lowpower_screen_off = false;
screen_on = true;
show_idx = IMAGE_SHOW_RESET;
show_idx = IMAGE_RESET_IDX;
}
/*
* IMAGE_SHOW_RESET means show_idx show be update by start_idx.
* IMAGE_RESET_IDX means show_idx show be update by start_idx.
* When short key pressed event trigged, we will set show_idx
* as IMAGE_SHOW_RESET which updates images index from start_idx
* as IMAGE_RESET_IDX which updates images index from start_idx
* that calculate by current soc.
*/
if (show_idx == IMAGE_SHOW_RESET) {
for (i = 0; i < image_num - 2; i++) {
if (show_idx == IMAGE_RESET_IDX) {
for (i = 0; i < IMAGE_SOC_100_IDX(image_num); i++) {
/* Find out which image we start to show */
if ((soc >= image[i].soc) &&
(soc < image[i + 1].soc)) {
@ -596,7 +601,7 @@ show_images:
}
if (soc >= 100) {
start_idx = image_num - 2;
start_idx = IMAGE_SOC_100_IDX(image_num);
break;
}
}
@ -619,7 +624,7 @@ show_images:
debug("SHOW: %s\n", image[show_idx].name);
charge_show_bmp(image[show_idx].name);
}
/* Re calculate timeout to off screen */
/* Re-calculate timeout to off screen */
if (priv->auto_screen_off_timeout == 0)
priv->auto_screen_off_timeout = get_timer(0);
} else {
@ -635,8 +640,8 @@ show_images:
show_start = get_timer(0);
/* Update to next image */
show_idx++;
if (show_idx > (image_num - 2))
show_idx = IMAGE_SHOW_RESET;
if (show_idx > IMAGE_SOC_100_IDX(image_num))
show_idx = IMAGE_RESET_IDX;
}
debug("step4 (%d)... \n", screen_on);
@ -649,21 +654,15 @@ show_images:
*/
key_state = check_key_press(dev);
if (key_state == KEY_PRESS_DOWN) {
old_show_idx = IMAGE_SHOW_RESET;
/* NULL means show nothing, ie. turn off screen */
if (screen_on)
charge_show_bmp(NULL);
/*
* Clear current image index, and show image
* from start_idx
*/
show_idx = IMAGE_SHOW_RESET;
old_show_idx = IMAGE_RESET_IDX;
show_idx = IMAGE_RESET_IDX;
/*
* We turn off screen by charge_show_bmp(NULL), so we
* should tell while loop to stop show images any more.
* Reverse the screen state
*
* If screen_on=false, means this short key pressed
* event turn on the screen and we need show images.
@ -671,12 +670,14 @@ show_images:
* If screen_on=true, means this short key pressed
* event turn off the screen and we never show images.
*/
if (screen_on)
if (screen_on) {
charge_show_bmp(NULL); /* Turn off screen */
screen_on = false;
else
} else {
screen_on = true;
}
} else if (key_state == KEY_PRESS_LONG_DOWN) {
/* Only long pressed while screen off needs screen_on true */
/* Set screen_on=true anyway when key long pressed */
if (!screen_on)
screen_on = true;
@ -685,7 +686,7 @@ show_images:
printf("soc=%d%%, threshold soc=%d%%\n",
soc, pdata->exit_charge_level);
printf("Low power, unable to boot, charging...\n");
show_idx = image_num - 1;
show_idx = IMAGE_LOWPOWER_IDX(image_num);
continue;
}
@ -693,7 +694,7 @@ show_images:
printf("voltage=%dmv, threshold voltage=%dmv\n",
voltage, pdata->exit_charge_voltage);
printf("Low power, unable to boot, charging...\n");
show_idx = image_num - 1;
show_idx = IMAGE_LOWPOWER_IDX(image_num);
continue;
}
@ -738,11 +739,10 @@ static const struct dm_charge_display_ops charge_animation_ops = {
static int charge_animation_probe(struct udevice *dev)
{
struct charge_animation_priv *priv = dev_get_priv(dev);
struct udevice *fg, *pmic, *rtc;
int ret, soc;
/* Get PMIC: used for power off system */
ret = uclass_get_device(UCLASS_PMIC, 0, &pmic);
ret = uclass_get_device(UCLASS_PMIC, 0, &priv->pmic);
if (ret) {
if (ret == -ENODEV)
printf("Can't find PMIC\n");
@ -750,10 +750,9 @@ static int charge_animation_probe(struct udevice *dev)
printf("Get UCLASS PMIC failed: %d\n", ret);
return ret;
}
priv->pmic = pmic;
/* Get fuel gauge: used for charging */
ret = uclass_get_device(UCLASS_FG, 0, &fg);
ret = uclass_get_device(UCLASS_FG, 0, &priv->fg);
if (ret) {
if (ret == -ENODEV)
debug("Can't find FG\n");
@ -761,17 +760,15 @@ static int charge_animation_probe(struct udevice *dev)
debug("Get UCLASS FG failed: %d\n", ret);
return ret;
}
priv->fg = fg;
/* Get rtc: used for power on */
ret = uclass_get_device(UCLASS_RTC, 0, &rtc);
ret = uclass_get_device(UCLASS_RTC, 0, &priv->rtc);
if (ret) {
if (ret == -ENODEV)
debug("Can't find RTC\n");
else
debug("Get UCLASS RTC failed: %d\n", ret);
}
priv->rtc = rtc;
/* Get PWRKEY: used for wakeup and turn off/on LCD */
if (key_read(KEY_POWER) == KEY_NOT_EXIST) {
@ -780,7 +777,7 @@ static int charge_animation_probe(struct udevice *dev)
}
/* Initialize charge current */
soc = fuel_gauge_get_soc(fg);
soc = fuel_gauge_get_soc(priv->fg);
if (soc < 0 || soc > 100) {
debug("get soc failed: %d\n", soc);
return -EINVAL;

View File

@ -8,18 +8,18 @@
#define _CHARGE_ANIMATION_H_
struct charge_animation_pdata {
int android_charge;
int uboot_charge;
int android_charge; /* android charge, 1: enable, 0: disable */
int uboot_charge; /* u-boot charge, 1: enable, 0: disable */
int exit_charge_voltage;
int exit_charge_level;
int low_power_voltage;
int screen_on_voltage;
int exit_charge_voltage;/* lowest voltage allowed to exit charging */
int exit_charge_level; /* lowest soc level allowed to exit charging */
int low_power_voltage; /* below this voltage, force system into charge mode anyway */
int screen_on_voltage; /* lowest voltage allowed to turn on screen */
int system_suspend;
int auto_wakeup_interval;
int auto_wakeup_screen_invert;
int auto_off_screen_interval;
int system_suspend; /* enter ATF system suspend, 1: enable, 0: disable */
int auto_wakeup_interval;/* timeout seconds to auto wakeup system */
int auto_wakeup_screen_invert;/* auto wakeup system, 1: enable, 0: disable */
int auto_off_screen_interval;/* timeout seconds to auto turn off screen */
};
#endif