xref: /rk3399_rockchip-uboot/cmd/fastboot.c (revision 2e192b245ed36a63bab0ef576999a95e23f60ecd)
1*2e192b24SSimon Glass /*
2*2e192b24SSimon Glass  * Copyright 2008 - 2009 Windriver, <www.windriver.com>
3*2e192b24SSimon Glass  * Author: Tom Rix <Tom.Rix@windriver.com>
4*2e192b24SSimon Glass  *
5*2e192b24SSimon Glass  * (C) Copyright 2014 Linaro, Ltd.
6*2e192b24SSimon Glass  * Rob Herring <robh@kernel.org>
7*2e192b24SSimon Glass  *
8*2e192b24SSimon Glass  * SPDX-License-Identifier:	GPL-2.0+
9*2e192b24SSimon Glass  */
10*2e192b24SSimon Glass #include <common.h>
11*2e192b24SSimon Glass #include <command.h>
12*2e192b24SSimon Glass #include <console.h>
13*2e192b24SSimon Glass #include <g_dnl.h>
14*2e192b24SSimon Glass #include <usb.h>
15*2e192b24SSimon Glass 
16*2e192b24SSimon Glass static int do_fastboot(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
17*2e192b24SSimon Glass {
18*2e192b24SSimon Glass 	int controller_index;
19*2e192b24SSimon Glass 	char *usb_controller;
20*2e192b24SSimon Glass 	int ret;
21*2e192b24SSimon Glass 
22*2e192b24SSimon Glass 	if (argc < 2)
23*2e192b24SSimon Glass 		return CMD_RET_USAGE;
24*2e192b24SSimon Glass 
25*2e192b24SSimon Glass 	usb_controller = argv[1];
26*2e192b24SSimon Glass 	controller_index = simple_strtoul(usb_controller, NULL, 0);
27*2e192b24SSimon Glass 
28*2e192b24SSimon Glass 	ret = board_usb_init(controller_index, USB_INIT_DEVICE);
29*2e192b24SSimon Glass 	if (ret) {
30*2e192b24SSimon Glass 		error("USB init failed: %d", ret);
31*2e192b24SSimon Glass 		return CMD_RET_FAILURE;
32*2e192b24SSimon Glass 	}
33*2e192b24SSimon Glass 
34*2e192b24SSimon Glass 	g_dnl_clear_detach();
35*2e192b24SSimon Glass 	ret = g_dnl_register("usb_dnl_fastboot");
36*2e192b24SSimon Glass 	if (ret)
37*2e192b24SSimon Glass 		return ret;
38*2e192b24SSimon Glass 
39*2e192b24SSimon Glass 	if (!g_dnl_board_usb_cable_connected()) {
40*2e192b24SSimon Glass 		puts("\rUSB cable not detected.\n" \
41*2e192b24SSimon Glass 		     "Command exit.\n");
42*2e192b24SSimon Glass 		ret = CMD_RET_FAILURE;
43*2e192b24SSimon Glass 		goto exit;
44*2e192b24SSimon Glass 	}
45*2e192b24SSimon Glass 
46*2e192b24SSimon Glass 	while (1) {
47*2e192b24SSimon Glass 		if (g_dnl_detach())
48*2e192b24SSimon Glass 			break;
49*2e192b24SSimon Glass 		if (ctrlc())
50*2e192b24SSimon Glass 			break;
51*2e192b24SSimon Glass 		usb_gadget_handle_interrupts(controller_index);
52*2e192b24SSimon Glass 	}
53*2e192b24SSimon Glass 
54*2e192b24SSimon Glass 	ret = CMD_RET_SUCCESS;
55*2e192b24SSimon Glass 
56*2e192b24SSimon Glass exit:
57*2e192b24SSimon Glass 	g_dnl_unregister();
58*2e192b24SSimon Glass 	g_dnl_clear_detach();
59*2e192b24SSimon Glass 	board_usb_cleanup(controller_index, USB_INIT_DEVICE);
60*2e192b24SSimon Glass 
61*2e192b24SSimon Glass 	return ret;
62*2e192b24SSimon Glass }
63*2e192b24SSimon Glass 
64*2e192b24SSimon Glass U_BOOT_CMD(
65*2e192b24SSimon Glass 	fastboot, 2, 1, do_fastboot,
66*2e192b24SSimon Glass 	"use USB Fastboot protocol",
67*2e192b24SSimon Glass 	"<USB_controller>\n"
68*2e192b24SSimon Glass 	"    - run as a fastboot usb device"
69*2e192b24SSimon Glass );
70