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> 16562a66d4SJason Zhu #include <sysmem.h> 172e192b24SSimon Glass 182e192b24SSimon Glass static int do_fastboot(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) 192e192b24SSimon Glass { 20965eda41SJocelyn Bohr #ifdef CONFIG_USB_FUNCTION_FASTBOOT 212e192b24SSimon Glass int controller_index; 222e192b24SSimon Glass char *usb_controller; 232e192b24SSimon Glass int ret; 24965eda41SJocelyn Bohr #endif 252e192b24SSimon Glass if (argc < 2) 262e192b24SSimon Glass return CMD_RET_USAGE; 272e192b24SSimon Glass 28deebadb7SJoseph Chen printf("Enter fastboot..."); 29deebadb7SJoseph Chen 30965eda41SJocelyn Bohr if (!strcmp(argv[1], "udp")) { 31965eda41SJocelyn Bohr #ifndef CONFIG_UDP_FUNCTION_FASTBOOT 3290aa625cSMasahiro Yamada pr_err("Fastboot UDP not enabled\n"); 33965eda41SJocelyn Bohr return -1; 34965eda41SJocelyn Bohr #else 35965eda41SJocelyn Bohr return do_fastboot_udp(cmdtp, flag, argc, argv); 36965eda41SJocelyn Bohr #endif 37965eda41SJocelyn Bohr } 38965eda41SJocelyn Bohr 39965eda41SJocelyn Bohr if (strcmp(argv[1], "usb") || argc < 3) 40965eda41SJocelyn Bohr return CMD_RET_USAGE; 41965eda41SJocelyn Bohr 42965eda41SJocelyn Bohr #ifndef CONFIG_USB_FUNCTION_FASTBOOT 4390aa625cSMasahiro Yamada pr_err("Fastboot USB not enabled\n"); 44965eda41SJocelyn Bohr return -1; 45965eda41SJocelyn Bohr #else 46deebadb7SJoseph Chen 47965eda41SJocelyn Bohr usb_controller = argv[2]; 482e192b24SSimon Glass controller_index = simple_strtoul(usb_controller, NULL, 0); 492e192b24SSimon Glass 50b95d4446SJean-Jacques Hiblot ret = usb_gadget_initialize(controller_index); 512e192b24SSimon Glass if (ret) { 5290aa625cSMasahiro Yamada pr_err("USB init failed: %d", ret); 532e192b24SSimon Glass return CMD_RET_FAILURE; 542e192b24SSimon Glass } 552e192b24SSimon Glass 562e192b24SSimon Glass g_dnl_clear_detach(); 572e192b24SSimon Glass ret = g_dnl_register("usb_dnl_fastboot"); 582e192b24SSimon Glass if (ret) 592e192b24SSimon Glass return ret; 602e192b24SSimon Glass 612e192b24SSimon Glass if (!g_dnl_board_usb_cable_connected()) { 622e192b24SSimon Glass puts("\rUSB cable not detected.\n" \ 632e192b24SSimon Glass "Command exit.\n"); 642e192b24SSimon Glass ret = CMD_RET_FAILURE; 652e192b24SSimon Glass goto exit; 662e192b24SSimon Glass } 672e192b24SSimon Glass 68*c01d4489SJoseph Chen if (!sysmem_alloc_base(MEM_FASTBOOT, 69562a66d4SJason Zhu CONFIG_FASTBOOT_BUF_ADDR, 70562a66d4SJason Zhu CONFIG_FASTBOOT_BUF_SIZE)) { 71562a66d4SJason Zhu printf("The fastboot memory space is unusable!\n"); 72562a66d4SJason Zhu return CMD_RET_FAILURE; 73562a66d4SJason Zhu } 74562a66d4SJason Zhu 75deebadb7SJoseph Chen printf("OK\n"); 76deebadb7SJoseph Chen 772e192b24SSimon Glass while (1) { 782e192b24SSimon Glass if (g_dnl_detach()) 792e192b24SSimon Glass break; 802e192b24SSimon Glass if (ctrlc()) 812e192b24SSimon Glass break; 822e192b24SSimon Glass usb_gadget_handle_interrupts(controller_index); 832e192b24SSimon Glass } 842e192b24SSimon Glass 852e192b24SSimon Glass ret = CMD_RET_SUCCESS; 862e192b24SSimon Glass 872e192b24SSimon Glass exit: 88562a66d4SJason Zhu sysmem_free(CONFIG_FASTBOOT_BUF_ADDR); 892e192b24SSimon Glass g_dnl_unregister(); 902e192b24SSimon Glass g_dnl_clear_detach(); 91b95d4446SJean-Jacques Hiblot usb_gadget_release(controller_index); 922e192b24SSimon Glass 932e192b24SSimon Glass return ret; 94965eda41SJocelyn Bohr #endif 952e192b24SSimon Glass } 962e192b24SSimon Glass 972e192b24SSimon Glass U_BOOT_CMD( 98965eda41SJocelyn Bohr fastboot, 3, 1, do_fastboot, 99965eda41SJocelyn Bohr "use USB or UDP Fastboot protocol", 100965eda41SJocelyn Bohr "[usb,udp] <USB_controller>\n" 101965eda41SJocelyn Bohr " - run as a fastboot usb or udp device\n" 102965eda41SJocelyn Bohr " usb: specify <USB_controller>\n" 103965eda41SJocelyn Bohr " udp: requires ip_addr set and ethernet initialized\n" 1042e192b24SSimon Glass ); 105