blob: 4f24e1932d90667ee8f005651e7d91ee600b1cb8 [file] [log] [blame]
/*
* Copyright (c) 2023 Cirrus Logic, Inc.
*
* SPDX-License-Identifier: Apache-2.0
*/
#include "zephyr/sys/printk.h"
#include <zephyr/kernel.h>
#include <zephyr/device.h>
#include <zephyr/devicetree.h>
#include <zephyr/drivers/charger.h>
#include <sys/errno.h>
static const struct device *chgdev = DEVICE_DT_GET(DT_NODELABEL(charger));
int main(void)
{
union charger_propval val;
int ret;
if (chgdev == NULL) {
printk("Error: no charger device found.\n");
return 0;
}
if (!device_is_ready(chgdev)) {
printk("Error: Device \"%s\" is not ready; "
"check the driver initialization logs for errors.\n",
chgdev->name);
return 0;
}
printk("Found device \"%s\", getting charger data\n", chgdev->name);
while (1) {
/* Poll until external power is presented to the charger */
do {
ret = charger_get_prop(chgdev, CHARGER_PROP_ONLINE, &val);
if (ret < 0) {
return ret;
}
k_msleep(100);
} while (val.online == CHARGER_ONLINE_OFFLINE);
val.status = CHARGER_STATUS_CHARGING;
ret = charger_set_prop(chgdev, CHARGER_PROP_STATUS, &val);
if (ret == -ENOTSUP) {
printk("Enabling charge not supported, assuming auto charge enable\n");
continue;
} else if (ret < 0) {
return ret;
}
k_msleep(500);
ret = charger_get_prop(chgdev, CHARGER_PROP_STATUS, &val);
if (ret < 0) {
return ret;
}
switch (val.status) {
case CHARGER_STATUS_CHARGING:
printk("Charging in progress...\n");
ret = charger_get_prop(chgdev, CHARGER_PROP_CHARGE_TYPE, &val);
if (ret < 0) {
return ret;
}
printk("Device \"%s\" charge type is %d\n", chgdev->name, val.charge_type);
break;
case CHARGER_STATUS_NOT_CHARGING:
printk("Charging halted...\n");
ret = charger_get_prop(chgdev, CHARGER_PROP_HEALTH, &val);
if (ret < 0) {
return ret;
}
printk("Device \"%s\" health is %d\n", chgdev->name, val.health);
break;
case CHARGER_STATUS_FULL:
printk("Charging complete!");
return 0;
case CHARGER_STATUS_DISCHARGING:
printk("External power removed, discharging\n");
ret = charger_get_prop(chgdev, CHARGER_PROP_ONLINE, &val);
if (ret < 0) {
return ret;
}
break;
default:
return -EIO;
}
k_msleep(500);
}
}