uboot/cmd/demo.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0+
   2/*
   3 * Copyright (c) 2013 Google, Inc
   4 *
   5 * (C) Copyright 2012
   6 * Pavel Herrmann <morpheus.ibis@gmail.com>
   7 */
   8
   9#include <common.h>
  10#include <command.h>
  11#include <dm.h>
  12#include <dm-demo.h>
  13#include <mapmem.h>
  14#include <asm/io.h>
  15
  16struct udevice *demo_dev;
  17
  18static int do_demo_hello(struct cmd_tbl *cmdtp, int flag, int argc,
  19                         char *const argv[])
  20{
  21        int ch = 0;
  22
  23        if (argc)
  24                ch = *argv[0];
  25
  26        return demo_hello(demo_dev, ch);
  27}
  28
  29static int do_demo_status(struct cmd_tbl *cmdtp, int flag, int argc,
  30                          char *const argv[])
  31{
  32        int status;
  33        int ret;
  34
  35        ret = demo_status(demo_dev, &status);
  36        if (ret)
  37                return ret;
  38
  39        printf("Status: %d\n", status);
  40
  41        return 0;
  42}
  43
  44static int do_demo_light(struct cmd_tbl *cmdtp, int flag, int argc,
  45                         char *const argv[])
  46{
  47        int light;
  48        int ret;
  49
  50        if (argc) {
  51                light = hextoul(argv[0], NULL);
  52                ret = demo_set_light(demo_dev, light);
  53        } else {
  54                ret = demo_get_light(demo_dev);
  55                if (ret >= 0) {
  56                        printf("Light: %x\n", ret);
  57                        ret = 0;
  58                }
  59        }
  60
  61        return ret;
  62}
  63
  64int do_demo_list(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
  65{
  66        struct udevice *dev;
  67        int i, ret;
  68
  69        puts("Demo uclass entries:\n");
  70
  71        for (i = 0, ret = uclass_first_device(UCLASS_DEMO, &dev);
  72             dev;
  73             ret = uclass_next_device(&dev)) {
  74                printf("entry %d - instance %08x, ops %08x, plat %08x\n",
  75                       i++, (uint)map_to_sysmem(dev),
  76                       (uint)map_to_sysmem(dev->driver->ops),
  77                       (uint)map_to_sysmem(dev_get_plat(dev)));
  78        }
  79
  80        return cmd_process_error(cmdtp, ret);
  81}
  82
  83static struct cmd_tbl demo_commands[] = {
  84        U_BOOT_CMD_MKENT(list, 0, 1, do_demo_list, "", ""),
  85        U_BOOT_CMD_MKENT(hello, 2, 1, do_demo_hello, "", ""),
  86        U_BOOT_CMD_MKENT(light, 2, 1, do_demo_light, "", ""),
  87        U_BOOT_CMD_MKENT(status, 1, 1, do_demo_status, "", ""),
  88};
  89
  90static int do_demo(struct cmd_tbl *cmdtp, int flag, int argc,
  91                   char *const argv[])
  92{
  93        struct cmd_tbl *demo_cmd;
  94        int devnum = 0;
  95        int ret;
  96
  97        if (argc < 2)
  98                return CMD_RET_USAGE;
  99        demo_cmd = find_cmd_tbl(argv[1], demo_commands,
 100                                ARRAY_SIZE(demo_commands));
 101        argc -= 2;
 102        argv += 2;
 103
 104        if ((!demo_cmd || argc > demo_cmd->maxargs) ||
 105            ((demo_cmd->name[0] != 'l') && (argc < 1)))
 106                return CMD_RET_USAGE;
 107
 108        if (argc) {
 109                devnum = dectoul(argv[0], NULL);
 110                ret = uclass_get_device(UCLASS_DEMO, devnum, &demo_dev);
 111                if (ret)
 112                        return cmd_process_error(cmdtp, ret);
 113                argc--;
 114                argv++;
 115        } else {
 116                demo_dev = NULL;
 117                if (demo_cmd->cmd != do_demo_list)
 118                        return CMD_RET_USAGE;
 119        }
 120
 121        ret = demo_cmd->cmd(demo_cmd, flag, argc, argv);
 122
 123        return cmd_process_error(demo_cmd, ret);
 124}
 125
 126U_BOOT_CMD(
 127        demo,   4,      1,      do_demo,
 128        "Driver model (dm) demo operations",
 129        "list                     List available demo devices\n"
 130        "demo hello <num> [<char>]     Say hello\n"
 131        "demo light [<num>]            Set or get the lights\n"
 132        "demo status <num>             Get demo device status\n"
 133);
 134