sdk-hwV1.3/lichee/xr806/appos/project/common/cmd/cmd_axp.c

421 lines
13 KiB
C
Raw Normal View History

2024-05-07 10:09:20 +00:00
/*
* Copyright (C) 2017 XRADIO TECHNOLOGY CO., LTD. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the
* distribution.
* 3. Neither the name of XRADIO TECHNOLOGY CO., LTD. nor the names of
* its contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "common/cmd/cmd_util.h"
#include "cmd_axp.h"
#include "pm/pm.h"
#include "driver/component/axp/axp.h"
#include "driver/component/axp/axp_common.h"
#include "driver/component/axp/axp_power_supply.h"
#include "driver/chip/hal_gpio.h"
#ifdef CONFIG_AXP_CORE
#ifndef ARRAY_SIZE
#define ARRAY_SIZE(array) (sizeof(array) / sizeof((array)[0]))
#endif
static enum cmd_status cmd_axp_write_reg_exec(char *cmd)
{
uint32_t cnt, reg, val;
int ret = 0;
cnt = cmd_sscanf(cmd, "%x %x", &reg, &val);
if (cnt != 2) {
CMD_AXP_ERR("invalid param number %d\r\n", cnt);
return CMD_STATUS_INVALID_ARG;
}
CMD_AXP_DBG("r=%d v=%d\r\n", reg, val);
ret = axp_write_reg(reg, val);
if (ret < 0) {
CMD_AXP_ERR("axp write reg error\r\n");
return CMD_STATUS_FAIL;
}
return CMD_STATUS_OK;
}
static enum cmd_status cmd_axp_read_reg_exec(char *cmd)
{
uint32_t reg, cnt;
uint8_t val;
int ret = 0;
cnt = cmd_sscanf(cmd, "%x", &reg);
if (cnt != 1) {
CMD_AXP_ERR("invalid param number %d\r\n", cnt);
return CMD_STATUS_INVALID_ARG;
}
ret = axp_read_reg((uint8_t)reg, &val);
if (ret < 0) {
CMD_AXP_ERR("axp read reg error\r\n");
return CMD_STATUS_FAIL;
}
CMD_AXP_DBG("val = 0x%x\r\n", val);
return CMD_STATUS_OK;
}
static enum cmd_status cmd_axp_set_voltage_exec(char *cmd)
{
char name[64];
uint32_t cnt;
int ret = 0;
int voltage = 0, onoff = 0;
cnt = cmd_sscanf(cmd, "%s %d %d", name, &voltage, &onoff);
if (cnt != 3) {
CMD_AXP_ERR("invalid param number %d\r\n", cnt);
return CMD_STATUS_INVALID_ARG;
}
CMD_AXP_DBG("name %s,voltage %d,onoff %d\r\n", name, voltage, onoff);
ret = axp_set_voltage(name, voltage, onoff);
if (ret < 0) {
CMD_AXP_ERR("axp set voltage error\r\n");
return CMD_STATUS_FAIL;
}
return CMD_STATUS_OK;
}
static enum cmd_status cmd_axp_get_voltage_exec(char *cmd)
{
char name[64];
uint32_t cnt;
int voltage = 0;
int ret = 0;
cnt = cmd_sscanf(cmd, "%s", name);
if (cnt != 1) {
CMD_AXP_ERR("invalid param number %d\r\n", cnt);
return CMD_STATUS_INVALID_ARG;
}
ret = axp_get_voltage(name, &voltage);
if (ret < 0) {
CMD_AXP_ERR("axp get voltage error\r\n");
return CMD_STATUS_FAIL;
}
CMD_AXP_DBG("name %s,voltage %d\r\n", name, voltage);
return CMD_STATUS_OK;
}
static enum cmd_status cmd_axp_close_all_power_exec(char *cmd)
{
int ret = 0;
ret = axp_poweroff();
if (ret < 0) {
CMD_AXP_ERR("axp poweroff error\r\n");
return CMD_STATUS_FAIL;
}
return CMD_STATUS_OK;
}
static enum cmd_status cmd_axp_open_all_power_exec(char *cmd)
{
int ret = 0;
ret = axp_poweron(false);
if (ret < 0) {
CMD_AXP_ERR("axp poweron error\r\n");
return CMD_STATUS_FAIL;
}
return CMD_STATUS_OK;
}
static enum cmd_status cmd_axp_get_poweron_source_exec(char *cmd)
{
enum axp_boot_source poweron_source = axp_get_poweron_source();
switch (poweron_source) {
case AXP_BOOT_SOURCE_BUTTON:
CMD_AXP_DBG("poweron source is button\r\n");
break;
case AXP_BOOT_SOURCE_IRQ_LOW:
CMD_AXP_DBG("poweron source is irq\r\n");
break;
case AXP_BOOT_SOURCE_VBUS_USB:
CMD_AXP_DBG("poweron source is vbus\r\n");
break;
case AXP_BOOT_SOURCE_CHARGER:
CMD_AXP_DBG("poweron source is charger\r\n");
break;
case AXP_BOOT_SOURCE_BATTERY:
CMD_AXP_DBG("poweron source is battery\r\n");
break;
case AXP_BOOT_SOURCE_UNKOWN:
CMD_AXP_DBG("poweron source is unknow\r\n");
break;
}
return CMD_STATUS_OK;
}
static enum cmd_status cmd_axp_set_vbus_voltage_exec(char *cmd)
{
uint32_t cnt;
int ret = 0;
int voltage = 0;
cnt = cmd_sscanf(cmd, "%d", &voltage);
if (cnt != 1) {
CMD_AXP_ERR("invalid param number %d\r\n", cnt);
return CMD_STATUS_INVALID_ARG;
}
ret = axp_set_vbus_vol_limit(voltage);
if (ret < 0) {
CMD_AXP_ERR("axp set voltage limit error\r\n");
return CMD_STATUS_FAIL;
}
CMD_AXP_DBG("voltage %d\r\n", voltage);
return CMD_STATUS_OK;
}
static enum cmd_status cmd_axp_get_vbus_voltage_exec(char *cmd)
{
int ret = 0;
int voltage = 0;
ret = axp_get_vbus_vol_limit(&voltage);
if (ret < 0) {
CMD_AXP_ERR("axp get vbus voltage limit error\r\n");
return CMD_STATUS_FAIL;
}
CMD_AXP_DBG("get vbus voltage limit %d mv\r\n", voltage);
return CMD_STATUS_OK;
}
static enum cmd_status cmd_axp_dump_whole_reg(char *cmd)
{
axp_dump_whole_reg();
return CMD_STATUS_OK;
}
static enum cmd_status cmd_axp_get_bat_property(char *cmd)
{
int ret;
union power_supply_propval *val = malloc(128);
if (NULL == val) {
CMD_AXP_ERR("%s, malloc memory error\r\n", __func__);
return -1;
}
memset(val, 0x00, 128);
/* 获取电池状态返回值int1电池存在0电池不存在 */
ret = axp_get_battery_property(POWER_SUPPLY_PROP_PRESENT, val);
if (ret < 0) {
CMD_AXP_ERR("axp get Battery preset failed\r\n");
return CMD_STATUS_FAIL;
}
CMD_AXP_INF("Battery present: %d\r\n", val->intval);
/* 获取电池电压返回值int: unit uV;*/
ret = axp_get_battery_property(POWER_SUPPLY_PROP_VOLTAGE_NOW, val);
if (ret < 0) {
CMD_AXP_ERR("axp get Battery voltage failed\r\n");
return CMD_STATUS_FAIL;
}
CMD_AXP_INF("Battery voltage: %d\r\n", val->intval);
/* 获取电池的容量返回值int */
ret = axp_get_battery_property(POWER_SUPPLY_PROP_ENERGY_FULL_DESIGN, val);
if (ret < 0) {
CMD_AXP_ERR("axp get Battery energy_full_design failed\r\n");
return CMD_STATUS_FAIL;
}
CMD_AXP_INF("Battery energy_full_design: %d\r\n", val->intval);
/* 获取电池充电状态返回值str
* charging
* discharging
* not_charging
* charged_full
* */
ret = axp_get_battery_property(POWER_SUPPLY_PROP_STATUS, val);
if (ret < 0) {
CMD_AXP_ERR("axp get Battery charger status failed\r\n");
return CMD_STATUS_FAIL;
}
CMD_AXP_INF("Battery charger status: %s\r\n", val->strval);
/* 获取电池设置的低电量警告值返回值int unit%*/
ret = axp_get_battery_property(POWER_SUPPLY_PROP_CAPACITY_ALERT_MIN, val);
if (ret < 0) {
CMD_AXP_ERR("axp get Battery capacity_alert min failed\r\n");
return CMD_STATUS_FAIL;
}
CMD_AXP_INF("Battery capacity_alert min: %d\r\n", val->intval);
/* 获取电池温度,返回值:int --unit degree celsius*/
ret = axp_get_battery_property(POWER_SUPPLY_PROP_TEMP, val);
if (ret < 0) {
CMD_AXP_ERR("axp get Battery temp failed\r\n");
return CMD_STATUS_FAIL;
}
CMD_AXP_INF("Battery temp: %d\r\n", val->intval);
/* 获取电池当前剩余容量返回值int */
ret = axp_get_battery_property(POWER_SUPPLY_PROP_CAPACITY, val);
if (ret < 0) {
CMD_AXP_ERR("axp get Battery status failed\r\n");
return CMD_STATUS_FAIL;
}
CMD_AXP_INF("Battery capacity: %d\r\n", val->intval);
/* 获取设置电池的低温关机返回值int --得到的值要除于10
* POWER_SUPPLY_PROP_TEMP_AMBIENT_MIN一样 */
ret = axp_get_battery_property(POWER_SUPPLY_PROP_TEMP_ALERT_MIN, val);
if (ret < 0) {
CMD_AXP_ERR("axp get Battery status failed\r\n");
return CMD_STATUS_FAIL;
}
CMD_AXP_INF("Battery TEMP_ALERT_MIN: %d\r\n", val->intval);
/* 获取设置电池的高温关机值返回值int --除于10为度
* POWER_SUPPLY_PROP_TEMP_AMBIENT_ALERT_MAX一样 */
ret = axp_get_battery_property(POWER_SUPPLY_PROP_TEMP_ALERT_MAX, val);
if (ret < 0) {
CMD_AXP_ERR("axp get Battery status failed\r\n");
return CMD_STATUS_FAIL;
}
CMD_AXP_INF("Battery TEMP_ALERT_MAX: %d\r\n", val->intval);
/* 获取设置电池的低温停冲值返回值int -- 除于10为度
* POWER_SUPPLY_PROP_TEMP_MIN一样 */
ret = axp_get_battery_property(POWER_SUPPLY_PROP_TEMP_AMBIENT_ALERT_MIN, val);
if (ret < 0) {
CMD_AXP_ERR("axp get Battery TEMP_AMBIENT_ALERT_MIN failed\r\n");
return CMD_STATUS_FAIL;
}
CMD_AXP_INF("Battery TEMP_AMBIENT_ALERT_MIN: %d\r\n", val->intval);
/* 获取设置电池的高温停冲值返回值int --除于10为度
* POWER_SUPPLY_PROP_TEMP_ALERT_MAX一样 */
ret = axp_get_battery_property(POWER_SUPPLY_PROP_TEMP_AMBIENT_ALERT_MAX, val);
if (ret < 0) {
CMD_AXP_ERR("axp get Battery TEMP_AMBIENT_ALERT_MAX failed\r\n");
return CMD_STATUS_FAIL;
}
CMD_AXP_INF("Battery TEMP_AMBIENT_ALERT_MAX: %d\r\n", val->intval);
/* 获取电池的放电时间返回int --unit second */
ret = axp_get_battery_property(POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW, val);
if (ret < 0) {
CMD_AXP_ERR("axp get Battery TIME_TO_EMPTY failed\r\n");
return CMD_STATUS_FAIL;
}
CMD_AXP_INF("Battery TIME_TO_EMPTY: %d\r\n", val->intval);
/* 获取还有多少时间充满电返回int --unit second*/
ret = axp_get_battery_property(POWER_SUPPLY_PROP_TIME_TO_FULL_NOW, val);
if (ret < 0) {
CMD_AXP_ERR("axp get Battery T2F failed\r\n");
return CMD_STATUS_FAIL;
}
CMD_AXP_INF("Battery chargering T2F: %d\r\n", val->intval);
/* 获取目前使用哪款BMU的名字返回str */
ret = axp_get_battery_property(POWER_SUPPLY_PROP_MANUFACTURER, val);
if (ret < 0) {
CMD_AXP_ERR("axp get Battery nmu name failed\r\n");
return CMD_STATUS_FAIL;
}
CMD_AXP_INF("Battery bmu name: %s\r\n", val->strval);
/* 获取电池目前的电流电量等级返回str
* full
* 80high
* warning_level1为normal
* warning_level2为low
* warning_level2为严重返回:critical
* */
ret = axp_get_battery_property(POWER_SUPPLY_PROP_CAPACITY_LEVEL, val);
if (ret < 0) {
CMD_AXP_ERR("axp get Battery capacity_level failed\r\n");
return CMD_STATUS_FAIL;
}
CMD_AXP_INF("Battery capacity_level: %s\r\n", val->strval);
/* 获取VBUS的状态,返回值int 1:online 0: not online */
ret = axp_get_battery_property(POWER_SUPPLY_PROP_ONLINE, val);
if (ret < 0) {
CMD_AXP_ERR("axp get Battery VBUS status failed\r\n");
return CMD_STATUS_FAIL;
}
CMD_AXP_INF("Battery VBUS STATUS: %d\r\n", val->intval);
return CMD_STATUS_OK;
}
/* axp cmd_axp_set_charger_cur cur_val
* cur_val step:25mv or 100mv
* */
static enum cmd_status cmd_axp_set_charger_cur(char *cmd)
{
int val, cnt;
int ret = 0;
cnt = cmd_sscanf(cmd, "%d", &val);
if (cnt != 1) {
CMD_AXP_ERR("invalid param number %d\r\n", cnt);
return CMD_STATUS_INVALID_ARG;
}
ret = axp_set_charger_cur(val);
if (ret < 0) {
CMD_AXP_ERR("set charger current error\r\n");
}
return CMD_STATUS_OK;
}
static enum cmd_status cmd_axp_get_charger_cur(char *cmd)
{
int val;
val = axp_get_charger_cur();
if (val < 0) {
CMD_AXP_ERR("get charger current error\r\n");
} else {
CMD_AXP_INF("get charger current limit %d\r\n", val);
}
return CMD_STATUS_OK;
}
static const struct cmd_data g_axp_cmds[] = {
{ "poweron", cmd_axp_open_all_power_exec},
{ "poweroff", cmd_axp_close_all_power_exec},
{ "read_reg", cmd_axp_read_reg_exec},
{ "write_reg", cmd_axp_write_reg_exec},
{ "set_voltage", cmd_axp_set_voltage_exec},
{ "get_voltage", cmd_axp_get_voltage_exec},
{ "get_poweron_source", cmd_axp_get_poweron_source_exec},
{ "set_vbus_voltage_limit", cmd_axp_set_vbus_voltage_exec},
{ "get_vbus_voltage_limit", cmd_axp_get_vbus_voltage_exec},
{ "dump_reg", cmd_axp_dump_whole_reg},
{ "get_bat_status", cmd_axp_get_bat_property},
{ "set_charger_cur", cmd_axp_set_charger_cur},
{ "get_charger_cur", cmd_axp_get_charger_cur},
};
enum cmd_status cmd_axp_exec(char *cmd)
{
return cmd_exec(cmd, g_axp_cmds, cmd_nitems(g_axp_cmds));
}
#endif /* CONFIG_AXP_CORE */