demo.c 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  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. #include <common.h>
  9. #include <command.h>
  10. #include <dm-demo.h>
  11. #include <mapmem.h>
  12. #include <asm/io.h>
  13. struct udevice *demo_dev;
  14. static int do_demo_hello(struct cmd_tbl *cmdtp, int flag, int argc,
  15. char *const argv[])
  16. {
  17. int ch = 0;
  18. if (argc)
  19. ch = *argv[0];
  20. return demo_hello(demo_dev, ch);
  21. }
  22. static int do_demo_status(struct cmd_tbl *cmdtp, int flag, int argc,
  23. char *const argv[])
  24. {
  25. int status;
  26. int ret;
  27. ret = demo_status(demo_dev, &status);
  28. if (ret)
  29. return ret;
  30. printf("Status: %d\n", status);
  31. return 0;
  32. }
  33. static int do_demo_light(struct cmd_tbl *cmdtp, int flag, int argc,
  34. char *const argv[])
  35. {
  36. int light;
  37. int ret;
  38. if (argc) {
  39. light = simple_strtoul(argv[0], NULL, 16);
  40. ret = demo_set_light(demo_dev, light);
  41. } else {
  42. ret = demo_get_light(demo_dev);
  43. if (ret >= 0) {
  44. printf("Light: %x\n", ret);
  45. ret = 0;
  46. }
  47. }
  48. return ret;
  49. }
  50. int do_demo_list(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
  51. {
  52. struct udevice *dev;
  53. int i, ret;
  54. puts("Demo uclass entries:\n");
  55. for (i = 0, ret = uclass_first_device(UCLASS_DEMO, &dev);
  56. dev;
  57. ret = uclass_next_device(&dev)) {
  58. printf("entry %d - instance %08x, ops %08x, platdata %08x\n",
  59. i++, (uint)map_to_sysmem(dev),
  60. (uint)map_to_sysmem(dev->driver->ops),
  61. (uint)map_to_sysmem(dev_get_platdata(dev)));
  62. }
  63. return cmd_process_error(cmdtp, ret);
  64. }
  65. static struct cmd_tbl demo_commands[] = {
  66. U_BOOT_CMD_MKENT(list, 0, 1, do_demo_list, "", ""),
  67. U_BOOT_CMD_MKENT(hello, 2, 1, do_demo_hello, "", ""),
  68. U_BOOT_CMD_MKENT(light, 2, 1, do_demo_light, "", ""),
  69. U_BOOT_CMD_MKENT(status, 1, 1, do_demo_status, "", ""),
  70. };
  71. static int do_demo(struct cmd_tbl *cmdtp, int flag, int argc,
  72. char *const argv[])
  73. {
  74. struct cmd_tbl *demo_cmd;
  75. int devnum = 0;
  76. int ret;
  77. if (argc < 2)
  78. return CMD_RET_USAGE;
  79. demo_cmd = find_cmd_tbl(argv[1], demo_commands,
  80. ARRAY_SIZE(demo_commands));
  81. argc -= 2;
  82. argv += 2;
  83. if ((!demo_cmd || argc > demo_cmd->maxargs) ||
  84. ((demo_cmd->name[0] != 'l') && (argc < 1)))
  85. return CMD_RET_USAGE;
  86. if (argc) {
  87. devnum = simple_strtoul(argv[0], NULL, 10);
  88. ret = uclass_get_device(UCLASS_DEMO, devnum, &demo_dev);
  89. if (ret)
  90. return cmd_process_error(cmdtp, ret);
  91. argc--;
  92. argv++;
  93. } else {
  94. demo_dev = NULL;
  95. if (demo_cmd->cmd != do_demo_list)
  96. return CMD_RET_USAGE;
  97. }
  98. ret = demo_cmd->cmd(demo_cmd, flag, argc, argv);
  99. return cmd_process_error(demo_cmd, ret);
  100. }
  101. U_BOOT_CMD(
  102. demo, 4, 1, do_demo,
  103. "Driver model (dm) demo operations",
  104. "list List available demo devices\n"
  105. "demo hello <num> [<char>] Say hello\n"
  106. "demo light [<num>] Set or get the lights\n"
  107. "demo status <num> Get demo device status\n"
  108. "demo list List available demo devices"
  109. );