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