Blame view

cmd/fastboot.c 3.32 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;
8d2f0039f   Paul Kocialkowski   usb: board_usb_in...
46
47
48
49
  	if (argc < 2)
  		return CMD_RET_USAGE;
  
  	usb_controller = argv[1];
aa51579f9   Sam Protsenko   cmd: fastboot: Va...
50
51
52
53
54
55
  	controller_index = simple_strtoul(usb_controller, &endp, 0);
  	if (*endp != '\0') {
  		pr_err("Error: Wrong USB controller index format
  ");
  		return CMD_RET_FAILURE;
  	}
8d2f0039f   Paul Kocialkowski   usb: board_usb_in...
56

a06955ae1   Jean-Jacques Hiblot   usb: gadget: Do n...
57
  	ret = usb_gadget_initialize(controller_index);
8d2f0039f   Paul Kocialkowski   usb: board_usb_in...
58
  	if (ret) {
71002b508   Seung-Woo Kim   cmd: add missing ...
59
60
  		pr_err("USB init failed: %d
  ", ret);
8d2f0039f   Paul Kocialkowski   usb: board_usb_in...
61
62
  		return CMD_RET_FAILURE;
  	}
267abc626   Rob Herring   fastboot: add sup...
63
  	g_dnl_clear_detach();
3aab70afc   Sebastian Siewior   usb/gadget: add t...
64
65
66
  	ret = g_dnl_register("usb_dnl_fastboot");
  	if (ret)
  		return ret;
7c23bcb93   Rob Herring   fastboot: Add USB...
67
68
69
70
71
  	if (!g_dnl_board_usb_cable_connected()) {
  		puts("\rUSB cable not detected.
  " \
  		     "Command exit.
  ");
8d2f0039f   Paul Kocialkowski   usb: board_usb_in...
72
73
  		ret = CMD_RET_FAILURE;
  		goto exit;
7c23bcb93   Rob Herring   fastboot: Add USB...
74
  	}
3aab70afc   Sebastian Siewior   usb/gadget: add t...
75
  	while (1) {
267abc626   Rob Herring   fastboot: add sup...
76
77
  		if (g_dnl_detach())
  			break;
3aab70afc   Sebastian Siewior   usb/gadget: add t...
78
79
  		if (ctrlc())
  			break;
731785df0   Sean Nyekjaer   cmd: fastboot: ha...
80
  		WATCHDOG_RESET();
eca76b742   Paul Kocialkowski   fastboot: Dynamic...
81
  		usb_gadget_handle_interrupts(controller_index);
3aab70afc   Sebastian Siewior   usb/gadget: add t...
82
  	}
8d2f0039f   Paul Kocialkowski   usb: board_usb_in...
83
84
85
  	ret = CMD_RET_SUCCESS;
  
  exit:
3aab70afc   Sebastian Siewior   usb/gadget: add t...
86
  	g_dnl_unregister();
267abc626   Rob Herring   fastboot: add sup...
87
  	g_dnl_clear_detach();
a06955ae1   Jean-Jacques Hiblot   usb: gadget: Do n...
88
  	usb_gadget_release(controller_index);
8d2f0039f   Paul Kocialkowski   usb: board_usb_in...
89
90
  
  	return ret;
f73a7df98   Alex Kiernan   net: fastboot: Me...
91
92
93
94
95
96
97
98
99
100
101
102
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
  #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...
131
132
133
134
135
136
  	/* 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...
137
138
139
140
141
142
143
144
145
146
147
  	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...
148
  }
f73a7df98   Alex Kiernan   net: fastboot: Me...
149
150
151
152
153
154
155
156
157
158
159
  #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...
160
  U_BOOT_CMD(
f73a7df98   Alex Kiernan   net: fastboot: Me...
161
162
  	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...
163
  );