blob: f6ceba7e85aee0c90e9a26800f8ed7a63f29816f [file] [log] [blame]
Lukasz Majewskib528f712013-03-05 12:10:17 +01001/*
2 * Copyright (C) 2011 Samsung Electronics
3 * Lukasz Majewski <l.majewski@samsung.com>
4 *
Wolfgang Denk1a459662013-07-08 09:37:19 +02005 * SPDX-License-Identifier: GPL-2.0+
Lukasz Majewskib528f712013-03-05 12:10:17 +01006 */
7
Lukasz Majewskib528f712013-03-05 12:10:17 +01008#include <common.h>
9#include <command.h>
10#include <g_dnl.h>
Mateusz Zalega16297cf2013-10-04 19:22:26 +020011#include <usb.h>
Lukasz Majewskib528f712013-03-05 12:10:17 +010012#include <usb_mass_storage.h>
13
14int do_usb_mass_storage(cmd_tbl_t *cmdtp, int flag,
15 int argc, char * const argv[])
16{
Mateusz Zalega16297cf2013-10-04 19:22:26 +020017 if (argc < 3)
18 return CMD_RET_USAGE;
Lukasz Majewskib528f712013-03-05 12:10:17 +010019
Mateusz Zalega16297cf2013-10-04 19:22:26 +020020 const char *usb_controller = argv[1];
21 const char *mmc_devstring = argv[2];
Lukasz Majewskib528f712013-03-05 12:10:17 +010022
Mateusz Zalega16297cf2013-10-04 19:22:26 +020023 unsigned int dev_num = (unsigned int)(simple_strtoul(mmc_devstring,
24 NULL, 0));
Przemyslaw Marczak93c813b2013-10-23 14:30:42 +020025 if (dev_num)
26 return CMD_RET_USAGE;
Lukasz Majewskib528f712013-03-05 12:10:17 +010027
Mateusz Zalega16297cf2013-10-04 19:22:26 +020028 unsigned int controller_index = (unsigned int)(simple_strtoul(
29 usb_controller, NULL, 0));
30 if (board_usb_init(controller_index, USB_INIT_DEVICE)) {
31 error("Couldn't init USB controller.");
Przemyslaw Marczak93c813b2013-10-23 14:30:42 +020032 return CMD_RET_FAILURE;
Mateusz Zalega16297cf2013-10-04 19:22:26 +020033 }
Lukasz Majewskib528f712013-03-05 12:10:17 +010034
Przemyslaw Marczak93c813b2013-10-23 14:30:42 +020035 struct ums *ums = ums_init(dev_num);
36 if (!ums) {
37 printf("MMC: %u no such device\n", dev_num);
38 return CMD_RET_FAILURE;
Lukasz Majewskib528f712013-03-05 12:10:17 +010039 }
40
Przemyslaw Marczak93c813b2013-10-23 14:30:42 +020041 int rc = fsg_init(ums);
Mateusz Zalega16297cf2013-10-04 19:22:26 +020042 if (rc) {
43 error("fsg_init failed");
Przemyslaw Marczak93c813b2013-10-23 14:30:42 +020044 return CMD_RET_FAILURE;
Mateusz Zalega16297cf2013-10-04 19:22:26 +020045 }
46
47 g_dnl_register("ums");
Lukasz Majewskib528f712013-03-05 12:10:17 +010048
49 while (1) {
50 /* Handle control-c and timeouts */
51 if (ctrlc()) {
Mateusz Zalega16297cf2013-10-04 19:22:26 +020052 error("The remote end did not respond in time.");
Lukasz Majewskib528f712013-03-05 12:10:17 +010053 goto exit;
54 }
Mateusz Zalega16297cf2013-10-04 19:22:26 +020055
Lukasz Majewskib528f712013-03-05 12:10:17 +010056 usb_gadget_handle_interrupts();
57 /* Check if USB cable has been detached */
58 if (fsg_main_thread(NULL) == EIO)
59 goto exit;
60 }
61exit:
62 g_dnl_unregister();
Przemyslaw Marczak93c813b2013-10-23 14:30:42 +020063 return CMD_RET_SUCCESS;
Lukasz Majewskib528f712013-03-05 12:10:17 +010064}
65
66U_BOOT_CMD(ums, CONFIG_SYS_MAXARGS, 1, do_usb_mass_storage,
67 "Use the UMS [User Mass Storage]",
Przemyslaw Marczak93c813b2013-10-23 14:30:42 +020068 "ums <USB_controller> <mmc_dev> e.g. ums 0 0"
Lukasz Majewskib528f712013-03-05 12:10:17 +010069);