Merge branch 'next' of https://source.denx.de/u-boot/custodians/u-boot-sh into next
[platform/kernel/u-boot.git] / cmd / rockusb.c
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * Copyright (C) 2017 Eddie Cai <eddie.cai.linux@gmail.com>
4  */
5
6 #include <common.h>
7 #include <command.h>
8 #include <console.h>
9 #include <g_dnl.h>
10 #include <usb.h>
11 #include <asm/arch-rockchip/f_rockusb.h>
12
13 static int do_rockusb(struct cmd_tbl *cmdtp, int flag, int argc,
14                       char *const argv[])
15 {
16         int controller_index, dev_index;
17         char *usb_controller;
18         char *devtype;
19         char *devnum;
20         int ret;
21
22         if (argc < 2)
23                 return CMD_RET_USAGE;
24
25         usb_controller = argv[1];
26         controller_index = simple_strtoul(usb_controller, NULL, 0);
27
28         if (argc >= 4) {
29                 devtype = argv[2];
30                 devnum  = argv[3];
31         } else {
32                 return CMD_RET_USAGE;
33         }
34         dev_index = simple_strtoul(devnum, NULL, 0);
35         rockusb_dev_init(devtype, dev_index);
36
37         ret = usb_gadget_initialize(controller_index);
38         if (ret) {
39                 printf("USB init failed: %d\n", ret);
40                 return CMD_RET_FAILURE;
41         }
42
43         g_dnl_clear_detach();
44         ret = g_dnl_register("usb_dnl_rockusb");
45         if (ret)
46                 return CMD_RET_FAILURE;
47
48         if (!g_dnl_board_usb_cable_connected()) {
49                 puts("\rUSB cable not detected, Command exit.\n");
50                 ret = CMD_RET_FAILURE;
51                 goto exit;
52         }
53
54         while (1) {
55                 if (g_dnl_detach())
56                         break;
57                 if (ctrlc())
58                         break;
59                 usb_gadget_handle_interrupts(controller_index);
60         }
61         ret = CMD_RET_SUCCESS;
62
63 exit:
64         g_dnl_unregister();
65         g_dnl_clear_detach();
66         usb_gadget_release(controller_index);
67
68         return ret;
69 }
70
71 U_BOOT_CMD(rockusb, 4, 1, do_rockusb,
72            "use the rockusb protocol",
73            "<USB_controller> <devtype> <dev[:part]>  e.g. rockusb 0 mmc 0\n"
74 );