diff --git a/cmd/Kconfig b/cmd/Kconfig index 760993f0732..4358ec209bd 100644 --- a/cmd/Kconfig +++ b/cmd/Kconfig @@ -762,6 +762,13 @@ config CMD_ADC Shows ADC device info and permit printing one-shot analog converted data from a named Analog to Digital Converter. +config CMD_AXP + bool "axp - Read information from AXP813 PMIC" + depends on AXP818_POWER + help + Shows A/D voltage, battery presence, battery capacity, charger + presence based on register values inside AXP813. + config CMD_BCB bool "bcb" depends on MMC diff --git a/cmd/Makefile b/cmd/Makefile index dea643666e4..667b7fac6e6 100644 --- a/cmd/Makefile +++ b/cmd/Makefile @@ -11,6 +11,7 @@ obj-y += help.o obj-y += version.o # command +obj-$(CONFIG_CMD_AXP) += axp.o obj-$(CONFIG_CMD_AES) += aes.o obj-$(CONFIG_CMD_AB_SELECT) += ab_select.o obj-$(CONFIG_CMD_ADC) += adc.o diff --git a/cmd/axp.c b/cmd/axp.c new file mode 100644 index 00000000000..501d83727fa --- /dev/null +++ b/cmd/axp.c @@ -0,0 +1,164 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright (C) 2018 Ondrej Jirman + */ +#include +#include +#include +#include + +static int do_axp(cmd_tbl_t *cmdtp, int flag, int argc, + char *const argv[]) +{ + int ret = 0, val; + bool val_bool; + char buf[64]; + + if (argc < 2) + return CMD_RET_USAGE; + + if (!strcmp(argv[1], "dump")) { + printf("AXP status:\n"); + + ret = axp_is_charging(&val_bool); + if (!ret) + printf(" charging: %s\n", val_bool ? "yes" : "no"); + + ret = axp_is_vbus_present(&val_bool); + if (!ret) + printf(" vbus_ok: %s\n", val_bool ? "yes" : "no"); + + ret = axp_is_battery_present(&val_bool); + if (!ret) + printf(" bat_ok: %s\n", val_bool ? "yes" : "no"); + + ret = axp_get_battery_voltage(&val); + if (!ret) + printf(" bat_voltage: %d uV\n", val); + + ret = axp_get_battery_current(&val); + if (!ret) + printf(" bat_current: %d uA\n", val); + + ret = axp_battery_get_capacity(&val); + if (!ret) + printf(" bat_capacity: %d %%\n", val); + + ret = axp_usb_get_max_current(&val); + if (!ret) + printf(" vbus_imax: %d mA\n", val); + } else if (!strcmp(argv[1], "charging")) { + ret = axp_is_charging(&val_bool); + if (ret) + return CMD_RET_FAILURE; + + snprintf(buf, sizeof buf, "ret=%d", !!val_bool); + set_local_var(buf, 1); + + //int axp_usb_set_max_current(int mA); + } else if (!strcmp(argv[1], "vbus_ok")) { + ret = axp_is_vbus_present(&val_bool); + if (ret) + return CMD_RET_FAILURE; + + snprintf(buf, sizeof buf, "ret=%d", !!val_bool); + set_local_var(buf, 1); + } else if (!strcmp(argv[1], "bat_ok")) { + ret = axp_is_battery_present(&val_bool); + if (ret) + return CMD_RET_FAILURE; + + snprintf(buf, sizeof buf, "ret=%d", !!val_bool); + set_local_var(buf, 1); + } else if (!strcmp(argv[1], "bat_voltage")) { + ret = axp_get_battery_voltage(&val); + if (ret) + return CMD_RET_FAILURE; + + snprintf(buf, sizeof buf, "ret=%d", val); + set_local_var(buf, 1); + } else if (!strcmp(argv[1], "bat_current")) { + ret = axp_get_battery_current(&val); + if (ret) + return CMD_RET_FAILURE; + + snprintf(buf, sizeof buf, "ret=%d", val); + set_local_var(buf, 1); + } else if (!strcmp(argv[1], "bat_capacity") + || !strcmp(argv[1], "bat_capacity5")) { + ret = axp_battery_get_capacity(&val); + if (ret) + return CMD_RET_FAILURE; + + if (!strcmp(argv[1], "bat_capacity5")) { + // round to multiple of 5 + int rem = val % 5; + if (rem > 2) + val += (5 - rem); + else + val -= rem; + } + + snprintf(buf, sizeof buf, "ret=%d", val); + set_local_var(buf, 1); + } else if (!strcmp(argv[1], "vbus_imax")) { + if (argc == 3) { + val = simple_strtoul(argv[2], NULL, 10); + if (val == 0) + return CMD_RET_USAGE; + + ret = axp_usb_set_max_current(val); + if (ret) + return CMD_RET_FAILURE; + } else if (argc == 2) { + ret = axp_usb_get_max_current(&val); + if (ret) + return CMD_RET_FAILURE; + + snprintf(buf, sizeof buf, "ret=%d", val); + set_local_var(buf, 1); + } else + return CMD_RET_USAGE; + } else if (!strcmp(argv[1], "led_set")) { + if (argc < 3) + return CMD_RET_USAGE; + + ret = axp_led_set(!strcmp(argv[2], "1")); + if (ret) + return CMD_RET_FAILURE; + } else if (!strcmp(argv[1], "led_chgctl")) { + ret = axp_led_set_charger_controlled(); + if (ret) + return CMD_RET_FAILURE; + } else if (!strcmp(argv[1], "clr_reason")) { + ret = axp_clear_startup_reason(); + if (ret) + return CMD_RET_FAILURE; + } else if (!strcmp(argv[1], "pok_fast")) { + ret = axp_pok_set_quick(); + if (ret) + return CMD_RET_FAILURE; + } else + return CMD_RET_USAGE; + + return CMD_RET_SUCCESS; +} + +static char axp_help_text[] = + "dump - dump AXP device info\n" + "axp charging - Check if battery is charging\n" + "axp vbus_ok - Check if connected to USB charger\n" + "axp bat_ok - Check if battery is present/OK\n" + "axp bat_voltage - Return battery voltage in uV\n" + "axp bat_current - Return battery current in uA\n" + "axp bat_capacity - Return battery capacity in %\n" + "axp bat_capacity5 - As above rounded to multiples of 5\n" + "axp vbus_imax - Return max USB current in mA\n" + "axp vbus_imax - Set max USB current to value\n" + "axp led_set 1|0 - Turn charger led on/off\n" + "axp led_chgctl - Defer LED control to the charger\n" + // Especially useful for escaping UV lockout + "axp clr_reason - Clear startup/shutdown reason register\n" + "axp pok_fast - Set power on/off key to low latency mode"; + +U_BOOT_CMD(axp, 4, 1, do_axp, "AXP813 PMIC access", axp_help_text);