cmd_usb_mass_storage.c 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. /*
  2. * Copyright (C) 2011 Samsung Electronics
  3. * Lukasz Majewski <l.majewski@samsung.com>
  4. *
  5. * SPDX-License-Identifier: GPL-2.0+
  6. */
  7. #include <errno.h>
  8. #include <common.h>
  9. #include <command.h>
  10. #include <g_dnl.h>
  11. #include <usb.h>
  12. #include <usb_mass_storage.h>
  13. int do_usb_mass_storage(cmd_tbl_t *cmdtp, int flag,
  14. int argc, char * const argv[])
  15. {
  16. if (argc < 3)
  17. return CMD_RET_USAGE;
  18. const char *usb_controller = argv[1];
  19. const char *mmc_devstring = argv[2];
  20. unsigned int dev_num = simple_strtoul(mmc_devstring, NULL, 0);
  21. struct ums *ums = ums_init(dev_num);
  22. if (!ums)
  23. return CMD_RET_FAILURE;
  24. unsigned int controller_index = (unsigned int)(simple_strtoul(
  25. usb_controller, NULL, 0));
  26. if (board_usb_init(controller_index, USB_INIT_DEVICE)) {
  27. error("Couldn't init USB controller.");
  28. return CMD_RET_FAILURE;
  29. }
  30. int rc = fsg_init(ums);
  31. if (rc) {
  32. error("fsg_init failed");
  33. return CMD_RET_FAILURE;
  34. }
  35. g_dnl_register("ums");
  36. /* Timeout unit: seconds */
  37. int cable_ready_timeout = UMS_CABLE_READY_TIMEOUT;
  38. if (!usb_cable_connected()) {
  39. puts("Please connect USB cable.\n");
  40. while (!usb_cable_connected()) {
  41. if (ctrlc()) {
  42. puts("\rCTRL+C - Operation aborted.\n");
  43. goto exit;
  44. }
  45. if (!cable_ready_timeout) {
  46. puts("\rUSB cable not detected.\n" \
  47. "Command exit.\n");
  48. goto exit;
  49. }
  50. printf("\rAuto exit in: %.2d s.", cable_ready_timeout);
  51. mdelay(1000);
  52. cable_ready_timeout--;
  53. }
  54. puts("\r\n");
  55. }
  56. while (1) {
  57. usb_gadget_handle_interrupts();
  58. rc = fsg_main_thread(NULL);
  59. if (rc) {
  60. /* Check I/O error */
  61. if (rc == -EIO)
  62. printf("\rCheck USB cable connection\n");
  63. /* Check CTRL+C */
  64. if (rc == -EPIPE)
  65. printf("\rCTRL+C - Operation aborted\n");
  66. goto exit;
  67. }
  68. }
  69. exit:
  70. g_dnl_unregister();
  71. return CMD_RET_SUCCESS;
  72. }
  73. U_BOOT_CMD(ums, CONFIG_SYS_MAXARGS, 1, do_usb_mass_storage,
  74. "Use the UMS [User Mass Storage]",
  75. "ums <USB_controller> <mmc_dev> e.g. ums 0 0"
  76. );