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