demo.c 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. /*
  2. * Copyright (c) 2013 Google, Inc
  3. *
  4. * (C) Copyright 2012
  5. * Pavel Herrmann <morpheus.ibis@gmail.com>
  6. *
  7. * SPDX-License-Identifier: GPL-2.0+
  8. */
  9. #include <common.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(cmd_tbl_t *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(cmd_tbl_t *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(cmd_tbl_t *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(cmd_tbl_t *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++, map_to_sysmem(dev),
  60. map_to_sysmem(dev->driver->ops),
  61. map_to_sysmem(dev_get_platdata(dev)));
  62. }
  63. return cmd_process_error(cmdtp, ret);
  64. }
  65. static cmd_tbl_t 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(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
  72. {
  73. cmd_tbl_t *demo_cmd;
  74. int devnum = 0;
  75. int ret;
  76. if (argc < 2)
  77. return CMD_RET_USAGE;
  78. demo_cmd = find_cmd_tbl(argv[1], demo_commands,
  79. ARRAY_SIZE(demo_commands));
  80. argc -= 2;
  81. argv += 2;
  82. if ((!demo_cmd || argc > demo_cmd->maxargs) ||
  83. ((demo_cmd->name[0] != 'l') && (argc < 1)))
  84. return CMD_RET_USAGE;
  85. if (argc) {
  86. devnum = simple_strtoul(argv[0], NULL, 10);
  87. ret = uclass_get_device(UCLASS_DEMO, devnum, &demo_dev);
  88. if (ret)
  89. return cmd_process_error(cmdtp, ret);
  90. argc--;
  91. argv++;
  92. } else {
  93. demo_dev = NULL;
  94. if (demo_cmd->cmd != do_demo_list)
  95. return CMD_RET_USAGE;
  96. }
  97. ret = demo_cmd->cmd(demo_cmd, flag, argc, argv);
  98. return cmd_process_error(demo_cmd, ret);
  99. }
  100. U_BOOT_CMD(
  101. demo, 4, 1, do_demo,
  102. "Driver model (dm) demo operations",
  103. "list List available demo devices\n"
  104. "demo hello <num> [<char>] Say hello\n"
  105. "demo light [<num>] Set or get the lights\n"
  106. "demo status <num> Get demo device status\n"
  107. "demo list List available demo devices"
  108. );