1 // SPDX-License-Identifier: GPL-2.0+
3 * Copyright 2008 - 2009 Windriver, <www.windriver.com>
4 * Author: Tom Rix <Tom.Rix@windriver.com>
6 * (C) Copyright 2014 Linaro, Ltd.
7 * Rob Herring <robh@kernel.org>
17 #include <linux/printk.h>
18 #include <linux/stringify.h>
20 static int do_fastboot_udp(int argc
, char *const argv
[],
21 uintptr_t buf_addr
, size_t buf_size
)
25 if (!IS_ENABLED(CONFIG_UDP_FUNCTION_FASTBOOT
)) {
26 pr_err("Fastboot UDP not enabled\n");
27 return CMD_RET_FAILURE
;
30 err
= net_loop(FASTBOOT_UDP
);
33 printf("fastboot udp error: %d\n", err
);
34 return CMD_RET_FAILURE
;
37 return CMD_RET_SUCCESS
;
40 static int do_fastboot_tcp(int argc
, char *const argv
[],
41 uintptr_t buf_addr
, size_t buf_size
)
45 if (!IS_ENABLED(CONFIG_TCP_FUNCTION_FASTBOOT
)) {
46 pr_err("Fastboot TCP not enabled\n");
47 return CMD_RET_FAILURE
;
50 err
= net_loop(FASTBOOT_TCP
);
53 printf("fastboot tcp error: %d\n", err
);
54 return CMD_RET_FAILURE
;
57 return CMD_RET_SUCCESS
;
60 static int do_fastboot_usb(int argc
, char *const argv
[],
61 uintptr_t buf_addr
, size_t buf_size
)
69 if (!IS_ENABLED(CONFIG_USB_FUNCTION_FASTBOOT
)) {
70 pr_err("Fastboot USB not enabled\n");
71 return CMD_RET_FAILURE
;
77 usb_controller
= argv
[1];
78 controller_index
= simple_strtoul(usb_controller
, &endp
, 0);
80 pr_err("Error: Wrong USB controller index format\n");
81 return CMD_RET_FAILURE
;
84 ret
= udc_device_get_by_index(controller_index
, &udc
);
86 pr_err("USB init failed: %d\n", ret
);
87 return CMD_RET_FAILURE
;
91 ret
= g_dnl_register("usb_dnl_fastboot");
95 if (!g_dnl_board_usb_cable_connected()) {
96 puts("\rUSB cable not detected.\n" \
98 ret
= CMD_RET_FAILURE
;
108 dm_usb_gadget_handle_interrupts(udc
);
111 ret
= CMD_RET_SUCCESS
;
116 g_dnl_clear_detach();
121 static int do_fastboot(struct cmd_tbl
*cmdtp
, int flag
, int argc
,
124 uintptr_t buf_addr
= (uintptr_t)NULL
;
128 return CMD_RET_USAGE
;
130 while (argc
> 1 && **(argv
+ 1) == '-') {
138 return CMD_RET_USAGE
;
139 buf_addr
= hextoul(*++argv
, NULL
);
144 return CMD_RET_USAGE
;
145 buf_size
= hextoul(*++argv
, NULL
);
149 return CMD_RET_USAGE
;
156 /* Handle case when USB controller param is just '-' */
158 pr_err("Error: Incorrect USB controller index\n");
159 return CMD_RET_USAGE
;
162 fastboot_init((void *)buf_addr
, buf_size
);
164 if (!strcmp(argv
[1], "udp"))
165 return do_fastboot_udp(argc
, argv
, buf_addr
, buf_size
);
166 if (!strcmp(argv
[1], "tcp"))
167 return do_fastboot_tcp(argc
, argv
, buf_addr
, buf_size
);
168 if (!strcmp(argv
[1], "usb")) {
173 return do_fastboot_usb(argc
, argv
, buf_addr
, buf_size
);
177 fastboot
, CONFIG_SYS_MAXARGS
, 1, do_fastboot
,
178 "run as a fastboot usb or udp device",
179 "[-l addr] [-s size] usb <controller> | udp\n"
180 "\taddr - address of buffer used during data transfers ("
181 __stringify(CONFIG_FASTBOOT_BUF_ADDR
) ")\n"
182 "\tsize - size of buffer used during data transfers ("
183 __stringify(CONFIG_FASTBOOT_BUF_SIZE
) ")"