12e192b24SSimon Glass /* 22e192b24SSimon Glass * Copyright 2008 - 2009 Windriver, <www.windriver.com> 32e192b24SSimon Glass * Author: Tom Rix <Tom.Rix@windriver.com> 42e192b24SSimon Glass * 52e192b24SSimon Glass * (C) Copyright 2014 Linaro, Ltd. 62e192b24SSimon Glass * Rob Herring <robh@kernel.org> 72e192b24SSimon Glass * 82e192b24SSimon Glass * SPDX-License-Identifier: GPL-2.0+ 92e192b24SSimon Glass */ 102e192b24SSimon Glass #include <common.h> 112e192b24SSimon Glass #include <command.h> 122e192b24SSimon Glass #include <console.h> 132e192b24SSimon Glass #include <g_dnl.h> 14965eda41SJocelyn Bohr #include <net.h> 152e192b24SSimon Glass #include <usb.h> 162e192b24SSimon Glass 172e192b24SSimon Glass static int do_fastboot(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) 182e192b24SSimon Glass { 19965eda41SJocelyn Bohr #ifdef CONFIG_USB_FUNCTION_FASTBOOT 202e192b24SSimon Glass int controller_index; 212e192b24SSimon Glass char *usb_controller; 222e192b24SSimon Glass int ret; 23965eda41SJocelyn Bohr #endif 242e192b24SSimon Glass 252e192b24SSimon Glass if (argc < 2) 262e192b24SSimon Glass return CMD_RET_USAGE; 272e192b24SSimon Glass 28965eda41SJocelyn Bohr if (!strcmp(argv[1], "udp")) { 29965eda41SJocelyn Bohr #ifndef CONFIG_UDP_FUNCTION_FASTBOOT 30*90aa625cSMasahiro Yamada pr_err("Fastboot UDP not enabled\n"); 31965eda41SJocelyn Bohr return -1; 32965eda41SJocelyn Bohr #else 33965eda41SJocelyn Bohr return do_fastboot_udp(cmdtp, flag, argc, argv); 34965eda41SJocelyn Bohr #endif 35965eda41SJocelyn Bohr } 36965eda41SJocelyn Bohr 37965eda41SJocelyn Bohr if (strcmp(argv[1], "usb") || argc < 3) 38965eda41SJocelyn Bohr return CMD_RET_USAGE; 39965eda41SJocelyn Bohr 40965eda41SJocelyn Bohr #ifndef CONFIG_USB_FUNCTION_FASTBOOT 41*90aa625cSMasahiro Yamada pr_err("Fastboot USB not enabled\n"); 42965eda41SJocelyn Bohr return -1; 43965eda41SJocelyn Bohr #else 44965eda41SJocelyn Bohr usb_controller = argv[2]; 452e192b24SSimon Glass controller_index = simple_strtoul(usb_controller, NULL, 0); 462e192b24SSimon Glass 472e192b24SSimon Glass ret = board_usb_init(controller_index, USB_INIT_DEVICE); 482e192b24SSimon Glass if (ret) { 49*90aa625cSMasahiro Yamada pr_err("USB init failed: %d", ret); 502e192b24SSimon Glass return CMD_RET_FAILURE; 512e192b24SSimon Glass } 522e192b24SSimon Glass 532e192b24SSimon Glass g_dnl_clear_detach(); 542e192b24SSimon Glass ret = g_dnl_register("usb_dnl_fastboot"); 552e192b24SSimon Glass if (ret) 562e192b24SSimon Glass return ret; 572e192b24SSimon Glass 582e192b24SSimon Glass if (!g_dnl_board_usb_cable_connected()) { 592e192b24SSimon Glass puts("\rUSB cable not detected.\n" \ 602e192b24SSimon Glass "Command exit.\n"); 612e192b24SSimon Glass ret = CMD_RET_FAILURE; 622e192b24SSimon Glass goto exit; 632e192b24SSimon Glass } 642e192b24SSimon Glass 652e192b24SSimon Glass while (1) { 662e192b24SSimon Glass if (g_dnl_detach()) 672e192b24SSimon Glass break; 682e192b24SSimon Glass if (ctrlc()) 692e192b24SSimon Glass break; 702e192b24SSimon Glass usb_gadget_handle_interrupts(controller_index); 712e192b24SSimon Glass } 722e192b24SSimon Glass 732e192b24SSimon Glass ret = CMD_RET_SUCCESS; 742e192b24SSimon Glass 752e192b24SSimon Glass exit: 762e192b24SSimon Glass g_dnl_unregister(); 772e192b24SSimon Glass g_dnl_clear_detach(); 782e192b24SSimon Glass board_usb_cleanup(controller_index, USB_INIT_DEVICE); 792e192b24SSimon Glass 802e192b24SSimon Glass return ret; 81965eda41SJocelyn Bohr #endif 822e192b24SSimon Glass } 832e192b24SSimon Glass 842e192b24SSimon Glass U_BOOT_CMD( 85965eda41SJocelyn Bohr fastboot, 3, 1, do_fastboot, 86965eda41SJocelyn Bohr "use USB or UDP Fastboot protocol", 87965eda41SJocelyn Bohr "[usb,udp] <USB_controller>\n" 88965eda41SJocelyn Bohr " - run as a fastboot usb or udp device\n" 89965eda41SJocelyn Bohr " usb: specify <USB_controller>\n" 90965eda41SJocelyn Bohr " udp: requires ip_addr set and ethernet initialized\n" 912e192b24SSimon Glass ); 92