Blame view

cmd/fastboot.c 3.6 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>
1af3c7f42   Simon Glass   common: Drop linu...
17
  #include <linux/stringify.h>
3aab70afc   Sebastian Siewior   usb/gadget: add t...
18

f73a7df98   Alex Kiernan   net: fastboot: Me...
19
20
  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...
21
  {
f73a7df98   Alex Kiernan   net: fastboot: Me...
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
  #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...
43
44
  	int controller_index;
  	char *usb_controller;
aa51579f9   Sam Protsenko   cmd: fastboot: Va...
45
  	char *endp;
3aab70afc   Sebastian Siewior   usb/gadget: add t...
46
  	int ret;
9517d5997   Sherry Sun   MLK-22357-2 sdp/f...
47
  	int index;
3aab70afc   Sebastian Siewior   usb/gadget: add t...
48

8d2f0039f   Paul Kocialkowski   usb: board_usb_in...
49
50
  	if (argc < 2)
  		return CMD_RET_USAGE;
9517d5997   Sherry Sun   MLK-22357-2 sdp/f...
51
52
53
54
55
56
57
58
59
60
61
62
63
64
  	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;
  		}
83e05a1be   Ye Li   MLK-18591-3 andro...
65
  #ifdef CONFIG_FASTBOOT_USB_DEV
9517d5997   Sherry Sun   MLK-22357-2 sdp/f...
66
  		controller_index = CONFIG_FASTBOOT_USB_DEV;
83e05a1be   Ye Li   MLK-18591-3 andro...
67
  #endif
9517d5997   Sherry Sun   MLK-22357-2 sdp/f...
68
  	}
8d2f0039f   Paul Kocialkowski   usb: board_usb_in...
69

a06955ae1   Jean-Jacques Hiblot   usb: gadget: Do n...
70
  	ret = usb_gadget_initialize(controller_index);
8d2f0039f   Paul Kocialkowski   usb: board_usb_in...
71
  	if (ret) {
71002b508   Seung-Woo Kim   cmd: add missing ...
72
73
  		pr_err("USB init failed: %d
  ", ret);
8d2f0039f   Paul Kocialkowski   usb: board_usb_in...
74
75
  		return CMD_RET_FAILURE;
  	}
267abc626   Rob Herring   fastboot: add sup...
76
  	g_dnl_clear_detach();
3aab70afc   Sebastian Siewior   usb/gadget: add t...
77
78
79
  	ret = g_dnl_register("usb_dnl_fastboot");
  	if (ret)
  		return ret;
7c23bcb93   Rob Herring   fastboot: Add USB...
80
81
82
83
84
  	if (!g_dnl_board_usb_cable_connected()) {
  		puts("\rUSB cable not detected.
  " \
  		     "Command exit.
  ");
8d2f0039f   Paul Kocialkowski   usb: board_usb_in...
85
86
  		ret = CMD_RET_FAILURE;
  		goto exit;
7c23bcb93   Rob Herring   fastboot: Add USB...
87
  	}
3aab70afc   Sebastian Siewior   usb/gadget: add t...
88
  	while (1) {
267abc626   Rob Herring   fastboot: add sup...
89
90
  		if (g_dnl_detach())
  			break;
3aab70afc   Sebastian Siewior   usb/gadget: add t...
91
92
  		if (ctrlc())
  			break;
731785df0   Sean Nyekjaer   cmd: fastboot: ha...
93
  		WATCHDOG_RESET();
eca76b742   Paul Kocialkowski   fastboot: Dynamic...
94
  		usb_gadget_handle_interrupts(controller_index);
3aab70afc   Sebastian Siewior   usb/gadget: add t...
95
  	}
8d2f0039f   Paul Kocialkowski   usb: board_usb_in...
96
97
98
  	ret = CMD_RET_SUCCESS;
  
  exit:
3aab70afc   Sebastian Siewior   usb/gadget: add t...
99
  	g_dnl_unregister();
267abc626   Rob Herring   fastboot: add sup...
100
  	g_dnl_clear_detach();
a06955ae1   Jean-Jacques Hiblot   usb: gadget: Do n...
101
  	usb_gadget_release(controller_index);
8d2f0039f   Paul Kocialkowski   usb: board_usb_in...
102
103
  
  	return ret;
f73a7df98   Alex Kiernan   net: fastboot: Me...
104
105
106
107
108
109
  #else
  	pr_err("Fastboot USB not enabled
  ");
  	return CMD_RET_FAILURE;
  #endif
  }
091401131   Simon Glass   command: Remove t...
110
111
  static int do_fastboot(struct cmd_tbl *cmdtp, int flag, int argc,
  		       char *const argv[])
f73a7df98   Alex Kiernan   net: fastboot: Me...
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
  {
  	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;
7e5f460ec   Simon Glass   global: Convert s...
128
  				buf_addr = hextoul(*++argv, NULL);
f73a7df98   Alex Kiernan   net: fastboot: Me...
129
130
131
132
133
  				goto NXTARG;
  
  			case 's':
  				if (--argc <= 0)
  					return CMD_RET_USAGE;
7e5f460ec   Simon Glass   global: Convert s...
134
  				buf_size = hextoul(*++argv, NULL);
f73a7df98   Alex Kiernan   net: fastboot: Me...
135
136
137
138
139
140
141
142
143
  				goto NXTARG;
  
  			default:
  				return CMD_RET_USAGE;
  			}
  		}
  NXTARG:
  		;
  	}
aa51579f9   Sam Protsenko   cmd: fastboot: Va...
144
145
146
147
148
149
  	/* 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...
150
151
152
153
154
155
156
157
158
159
160
  	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...
161
  }
f73a7df98   Alex Kiernan   net: fastboot: Me...
162
163
164
165
166
167
168
169
170
171
172
  #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...
173
  U_BOOT_CMD(
f73a7df98   Alex Kiernan   net: fastboot: Me...
174
175
  	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...
176
  );