cmd_dfu.c 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. /*
  2. * cmd_dfu.c -- dfu command
  3. *
  4. * Copyright (C) 2012 Samsung Electronics
  5. * authors: Andrzej Pietrasiewicz <andrzej.p@samsung.com>
  6. * Lukasz Majewski <l.majewski@samsung.com>
  7. *
  8. * SPDX-License-Identifier: GPL-2.0+
  9. */
  10. #include <common.h>
  11. #include <dfu.h>
  12. #include <g_dnl.h>
  13. static int do_dfu(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
  14. {
  15. char *s = "dfu";
  16. int ret, i = 0;
  17. if (argc < 3)
  18. return CMD_RET_USAGE;
  19. ret = dfu_init_env_entities(argv[1], simple_strtoul(argv[2], NULL, 10));
  20. if (ret)
  21. return ret;
  22. if (argc > 3 && strcmp(argv[3], "list") == 0) {
  23. dfu_show_entities();
  24. goto done;
  25. }
  26. #ifdef CONFIG_TRATS
  27. board_usb_init();
  28. #endif
  29. g_dnl_register(s);
  30. while (1) {
  31. if (dfu_reset())
  32. /*
  33. * This extra number of usb_gadget_handle_interrupts()
  34. * calls is necessary to assure correct transmission
  35. * completion with dfu-util
  36. */
  37. if (++i == 10)
  38. goto exit;
  39. if (ctrlc())
  40. goto exit;
  41. usb_gadget_handle_interrupts();
  42. }
  43. exit:
  44. g_dnl_unregister();
  45. done:
  46. dfu_free_entities();
  47. if (dfu_reset())
  48. run_command("reset", 0);
  49. return CMD_RET_SUCCESS;
  50. }
  51. U_BOOT_CMD(dfu, CONFIG_SYS_MAXARGS, 1, do_dfu,
  52. "Device Firmware Upgrade",
  53. "<interface> <dev> [list]\n"
  54. " - device firmware upgrade on a device <dev>\n"
  55. " attached to interface <interface>\n"
  56. " [list] - list available alt settings"
  57. );