Blame view

cmd/fastboot.c 3.58 KB
83d290c56   Tom Rini   SPDX: Convert all...
1
  // SPDX-License-Identifier: GPL-2.0+
3aab70afc   Sebastian Siewior   usb/gadget: add t...
2
3
4
5
6
7
  /*
   * Copyright 2008 - 2009 Windriver, <www.windriver.com>
   * Author: Tom Rix <Tom.Rix@windriver.com>
   *
   * (C) Copyright 2014 Linaro, Ltd.
   * Rob Herring <robh@kernel.org>
3aab70afc   Sebastian Siewior   usb/gadget: add t...
8
9
10
   */
  #include <common.h>
  #include <command.h>
24b852a7a   Simon Glass   Move console defi...
11
  #include <console.h>
3aab70afc   Sebastian Siewior   usb/gadget: add t...
12
  #include <g_dnl.h>
f73a7df98   Alex Kiernan   net: fastboot: Me...
13
14
  #include <fastboot.h>
  #include <net.h>
8d2f0039f   Paul Kocialkowski   usb: board_usb_in...
15
  #include <usb.h>
731785df0   Sean Nyekjaer   cmd: fastboot: ha...
16
  #include <watchdog.h>
3aab70afc   Sebastian Siewior   usb/gadget: add t...
17

f73a7df98   Alex Kiernan   net: fastboot: Me...
18
19
  static int do_fastboot_udp(int argc, char *const argv[],
  			   uintptr_t buf_addr, size_t buf_size)
3aab70afc   Sebastian Siewior   usb/gadget: add t...
20
  {
f73a7df98   Alex Kiernan   net: fastboot: Me...
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
  #if CONFIG_IS_ENABLED(UDP_FUNCTION_FASTBOOT)
  	int err = net_loop(FASTBOOT);
  
  	if (err < 0) {
  		printf("fastboot udp error: %d
  ", err);
  		return CMD_RET_FAILURE;
  	}
  
  	return CMD_RET_SUCCESS;
  #else
  	pr_err("Fastboot UDP not enabled
  ");
  	return CMD_RET_FAILURE;
  #endif
  }
  
  static int do_fastboot_usb(int argc, char *const argv[],
  			   uintptr_t buf_addr, size_t buf_size)
  {
  #if CONFIG_IS_ENABLED(USB_FUNCTION_FASTBOOT)
8d2f0039f   Paul Kocialkowski   usb: board_usb_in...
42
43
  	int controller_index;
  	char *usb_controller;
aa51579f9   Sam Protsenko   cmd: fastboot: Va...
44
  	char *endp;
3aab70afc   Sebastian Siewior   usb/gadget: add t...
45
  	int ret;
2b6fd3da6   Sherry Sun   MLK-22357-2 sdp/f...
46
  	int index;
3aab70afc   Sebastian Siewior   usb/gadget: add t...
47

8d2f0039f   Paul Kocialkowski   usb: board_usb_in...
48
49
  	if (argc < 2)
  		return CMD_RET_USAGE;
2b6fd3da6   Sherry Sun   MLK-22357-2 sdp/f...
50
51
52
53
54
55
56
57
58
59
60
61
62
63
  	if (!strcmp(argv[1], "auto")) {
  		index = board_usb_gadget_port_auto();
  		if (index >= 0)
  			controller_index = index;
  		else
  			return CMD_RET_USAGE;
  	} else {
  		usb_controller = argv[1];
  		controller_index = simple_strtoul(usb_controller, &endp, 0);
  		if (*endp != '\0') {
  			pr_err("Error: Wrong USB controller index format
  ");
  			return CMD_RET_FAILURE;
  		}
9b149c2a2   Ye Li   MLK-18591-3 andro...
64
  #ifdef CONFIG_FASTBOOT_USB_DEV
2b6fd3da6   Sherry Sun   MLK-22357-2 sdp/f...
65
  		controller_index = CONFIG_FASTBOOT_USB_DEV;
9b149c2a2   Ye Li   MLK-18591-3 andro...
66
  #endif
2b6fd3da6   Sherry Sun   MLK-22357-2 sdp/f...
67
  	}
8d2f0039f   Paul Kocialkowski   usb: board_usb_in...
68

a06955ae1   Jean-Jacques Hiblot   usb: gadget: Do n...
69
  	ret = usb_gadget_initialize(controller_index);
8d2f0039f   Paul Kocialkowski   usb: board_usb_in...
70
  	if (ret) {
71002b508   Seung-Woo Kim   cmd: add missing ...
71
72
  		pr_err("USB init failed: %d
  ", ret);
8d2f0039f   Paul Kocialkowski   usb: board_usb_in...
73
74
  		return CMD_RET_FAILURE;
  	}
267abc626   Rob Herring   fastboot: add sup...
75
  	g_dnl_clear_detach();
3aab70afc   Sebastian Siewior   usb/gadget: add t...
76
77
78
  	ret = g_dnl_register("usb_dnl_fastboot");
  	if (ret)
  		return ret;
7c23bcb93   Rob Herring   fastboot: Add USB...
79
80
81
82
83
  	if (!g_dnl_board_usb_cable_connected()) {
  		puts("\rUSB cable not detected.
  " \
  		     "Command exit.
  ");
8d2f0039f   Paul Kocialkowski   usb: board_usb_in...
84
85
  		ret = CMD_RET_FAILURE;
  		goto exit;
7c23bcb93   Rob Herring   fastboot: Add USB...
86
  	}
3aab70afc   Sebastian Siewior   usb/gadget: add t...
87
  	while (1) {
267abc626   Rob Herring   fastboot: add sup...
88
89
  		if (g_dnl_detach())
  			break;
3aab70afc   Sebastian Siewior   usb/gadget: add t...
90
91
  		if (ctrlc())
  			break;
731785df0   Sean Nyekjaer   cmd: fastboot: ha...
92
  		WATCHDOG_RESET();
eca76b742   Paul Kocialkowski   fastboot: Dynamic...
93
  		usb_gadget_handle_interrupts(controller_index);
3aab70afc   Sebastian Siewior   usb/gadget: add t...
94
  	}
8d2f0039f   Paul Kocialkowski   usb: board_usb_in...
95
96
97
  	ret = CMD_RET_SUCCESS;
  
  exit:
3aab70afc   Sebastian Siewior   usb/gadget: add t...
98
  	g_dnl_unregister();
267abc626   Rob Herring   fastboot: add sup...
99
  	g_dnl_clear_detach();
a06955ae1   Jean-Jacques Hiblot   usb: gadget: Do n...
100
  	usb_gadget_release(controller_index);
8d2f0039f   Paul Kocialkowski   usb: board_usb_in...
101
102
  
  	return ret;
f73a7df98   Alex Kiernan   net: fastboot: Me...
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
  #else
  	pr_err("Fastboot USB not enabled
  ");
  	return CMD_RET_FAILURE;
  #endif
  }
  
  static int do_fastboot(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
  {
  	uintptr_t buf_addr = (uintptr_t)NULL;
  	size_t buf_size = 0;
  
  	if (argc < 2)
  		return CMD_RET_USAGE;
  
  	while (argc > 1 && **(argv + 1) == '-') {
  		char *arg = *++argv;
  
  		--argc;
  		while (*++arg) {
  			switch (*arg) {
  			case 'l':
  				if (--argc <= 0)
  					return CMD_RET_USAGE;
  				buf_addr = simple_strtoul(*++argv, NULL, 16);
  				goto NXTARG;
  
  			case 's':
  				if (--argc <= 0)
  					return CMD_RET_USAGE;
  				buf_size = simple_strtoul(*++argv, NULL, 16);
  				goto NXTARG;
  
  			default:
  				return CMD_RET_USAGE;
  			}
  		}
  NXTARG:
  		;
  	}
aa51579f9   Sam Protsenko   cmd: fastboot: Va...
143
144
145
146
147
148
  	/* Handle case when USB controller param is just '-' */
  	if (argc == 1) {
  		pr_err("Error: Incorrect USB controller index
  ");
  		return CMD_RET_USAGE;
  	}
f73a7df98   Alex Kiernan   net: fastboot: Me...
149
150
151
152
153
154
155
156
157
158
159
  	fastboot_init((void *)buf_addr, buf_size);
  
  	if (!strcmp(argv[1], "udp"))
  		return do_fastboot_udp(argc, argv, buf_addr, buf_size);
  
  	if (!strcmp(argv[1], "usb")) {
  		argv++;
  		argc--;
  	}
  
  	return do_fastboot_usb(argc, argv, buf_addr, buf_size);
3aab70afc   Sebastian Siewior   usb/gadget: add t...
160
  }
f73a7df98   Alex Kiernan   net: fastboot: Me...
161
162
163
164
165
166
167
168
169
170
171
  #ifdef CONFIG_SYS_LONGHELP
  static char fastboot_help_text[] =
  	"[-l addr] [-s size] usb <controller> | udp
  "
  	"\taddr - address of buffer used during data transfers ("
  	__stringify(CONFIG_FASTBOOT_BUF_ADDR) ")
  "
  	"\tsize - size of buffer used during data transfers ("
  	__stringify(CONFIG_FASTBOOT_BUF_SIZE) ")"
  	;
  #endif
3aab70afc   Sebastian Siewior   usb/gadget: add t...
172
  U_BOOT_CMD(
f73a7df98   Alex Kiernan   net: fastboot: Me...
173
174
  	fastboot, CONFIG_SYS_MAXARGS, 1, do_fastboot,
  	"run as a fastboot usb or udp device", fastboot_help_text
3aab70afc   Sebastian Siewior   usb/gadget: add t...
175
  );