[PATCH] cmd: add temperature command

Simon Glass sjg at chromium.org
Fri Aug 12 17:11:09 CEST 2022


Hi Robert,

On Fri, 12 Aug 2022 at 06:19, Robert Marko <robert.marko at sartura.hr> wrote:
>
> Currently, there is no way for users to check the readings from thermal
> sensors from U-boot console, only some boards print it during boot.
>
> So, lets add a simple "temperature" command that allows listing thermal
> uclass devices and getting their value.
>
> Note that the thermal devices are intenionally probed if list is used as
> almost always they will not get probed otherwise and there is no way for
> users to manually call probe on a certain device from console.
>
> Assumption is made that temperature is returned in degrees C and not
> milidegrees like in Linux as this is what most drivers seem to return.
>
> Signed-off-by: Robert Marko <robert.marko at sartura.hr>
> ---
>  cmd/Kconfig       |  6 ++++
>  cmd/Makefile      |  1 +
>  cmd/temperature.c | 86 +++++++++++++++++++++++++++++++++++++++++++++++
>  3 files changed, 93 insertions(+)
>  create mode 100644 cmd/temperature.c

Don't forget to add doc/usage/command/.. and a sandbox test in test/cmd/

https://u-boot.readthedocs.io/en/latest/develop/testing.html

>
> diff --git a/cmd/Kconfig b/cmd/Kconfig
> index 3625ff2a50..9bd639c740 100644
> --- a/cmd/Kconfig
> +++ b/cmd/Kconfig
> @@ -1435,6 +1435,12 @@ config DEFAULT_SPI_MODE
>         depends on CMD_SPI
>         default 0
>
> +config CMD_TEMPERATURE
> +       bool "temperature"

How about:

temperature - display the temperature from thermal sensors

> +       depends on DM_THERMAL
> +       help
> +         Provides a way to get the temperature reading from thermal sensors.

It also allows listing.

> +
>  config CMD_TSI148
>         bool "tsi148 - Command to access tsi148 device"
>         help
> diff --git a/cmd/Makefile b/cmd/Makefile
> index 5e43a1e022..8874462f1a 100644
> --- a/cmd/Makefile
> +++ b/cmd/Makefile
> @@ -152,6 +152,7 @@ obj-$(CONFIG_CMD_STRINGS) += strings.o
>  obj-$(CONFIG_CMD_SMC) += smccc.o
>  obj-$(CONFIG_CMD_SYSBOOT) += sysboot.o
>  obj-$(CONFIG_CMD_STACKPROTECTOR_TEST) += stackprot_test.o
> +obj-$(CONFIG_CMD_TEMPERATURE) += temperature.o
>  obj-$(CONFIG_CMD_TERMINAL) += terminal.o
>  obj-$(CONFIG_CMD_TIME) += time.o
>  obj-$(CONFIG_CMD_TIMER) += timer.o
> diff --git a/cmd/temperature.c b/cmd/temperature.c
> new file mode 100644
> index 0000000000..ccf839058e
> --- /dev/null
> +++ b/cmd/temperature.c
> @@ -0,0 +1,86 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later
> +
> +/*
> + * Copyright (c) 2022 Sartura Ltd.
> + * Written by Robert Marko <robert.marko at sartura.hr>
> + */
> +
> +#include <common.h>
> +#include <command.h>
> +#include <dm.h>
> +#include <dm/uclass-internal.h>

I hope you can drop this

> +#include <thermal.h>
> +
> +#define LIMIT_DEVNAME  30
> +
> +static int do_get(struct cmd_tbl *cmdtp, int flag, int argc,
> +                 char *const argv[])
> +{
> +       struct udevice *dev;
> +       int ret, temp;
> +
> +       if (argc < 2) {
> +               printf("thermal device not selected\n");
> +               return CMD_RET_FAILURE;
> +       }
> +
> +       ret = uclass_find_device_by_name(UCLASS_THERMAL, argv[1], &dev);

You should use the get function normally, since it probes the device
and for most devices you should only call their methods when the
device is probed/activated.

> +       if (ret) {
> +               printf("thermal device not found\n");
> +               return CMD_RET_FAILURE;
> +       }
> +
> +       ret = thermal_get_temp(dev, &temp);
> +       if (ret)
> +               return CMD_RET_FAILURE;
> +
> +       printf("%s: %d°C\n", dev->name, temp);
> +
> +       return CMD_RET_SUCCESS;
> +}
> +
> +static int do_list(struct cmd_tbl *cmdtp, int flag, int argc,
> +                  char *const argv[])
> +{
> +       struct udevice *dev;
> +
> +       printf("| %-*.*s| %-*.*s| %s\n",
> +              LIMIT_DEVNAME, LIMIT_DEVNAME, "Device",
> +              LIMIT_DEVNAME, LIMIT_DEVNAME, "Driver",
> +              "Parent");
> +
> +       uclass_foreach_dev_probe(UCLASS_THERMAL, dev) {
> +               printf("| %-*.*s| %-*.*s| %s\n",
> +                      LIMIT_DEVNAME, LIMIT_DEVNAME, dev->name,
> +                      LIMIT_DEVNAME, LIMIT_DEVNAME, dev->driver->name,
> +                      dev->parent->name);
> +       }

BTW as I'm sure you know, this loop probes the device, which is fine.

> +
> +       return CMD_RET_SUCCESS;
> +}
> +
> +static struct cmd_tbl temperature_subcmd[] = {
> +       U_BOOT_CMD_MKENT(list, 1, 1, do_list, "", ""),
> +       U_BOOT_CMD_MKENT(get, 2, 1, do_get, "", ""),
> +};
> +
> +static int do_temperature(struct cmd_tbl *cmdtp, int flag, int argc,
> +                         char *const argv[])
> +{
> +       struct cmd_tbl *cmd;
> +
> +       argc--;
> +       argv++;
> +
> +       cmd = find_cmd_tbl(argv[0], temperature_subcmd, ARRAY_SIZE(temperature_subcmd));
> +       if (!cmd || argc > cmd->maxargs)
> +               return CMD_RET_USAGE;
> +
> +       return cmd->cmd(cmdtp, flag, argc, argv);
> +}
> +
> +U_BOOT_CMD(temperature, CONFIG_SYS_MAXARGS, 1, do_temperature,
> +          "thermal sensor temperature",
> +          "list\t\tshow list of temperature sensors\n"
> +          "get [thermal device name]\tprint temperature"

in degrees C ?

> +);
> --
> 2.37.1
>

Regards,
Simon


More information about the U-Boot mailing list