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