Merge git://git.denx.de/u-boot-usb

This commit is contained in:
Tom Rini 2018-02-23 13:04:48 -05:00
commit 1c124d379d
15 changed files with 75 additions and 35 deletions

2
README
View file

@ -1198,7 +1198,7 @@ The following options need to be configured:
key for the Replay Protection Memory Block partition in eMMC. key for the Replay Protection Memory Block partition in eMMC.
- USB Device Firmware Update (DFU) class support: - USB Device Firmware Update (DFU) class support:
CONFIG_USB_FUNCTION_DFU CONFIG_DFU_OVER_USB
This enables the USB portion of the DFU USB class This enables the USB portion of the DFU USB class
CONFIG_DFU_MMC CONFIG_DFU_MMC

View file

@ -144,7 +144,7 @@ int factoryset_read_eeprom(int i2c_addr)
unsigned char eeprom_buf[0x3c00], hdr[4], buf[MAX_STRING_LENGTH]; unsigned char eeprom_buf[0x3c00], hdr[4], buf[MAX_STRING_LENGTH];
unsigned char *cp, *cp1; unsigned char *cp, *cp1;
#if defined(CONFIG_USB_FUNCTION_DFU) #if defined(CONFIG_DFU_OVER_USB)
factory_dat.usb_vendor_id = CONFIG_USB_GADGET_VENDOR_NUM; factory_dat.usb_vendor_id = CONFIG_USB_GADGET_VENDOR_NUM;
factory_dat.usb_product_id = CONFIG_USB_GADGET_PRODUCT_NUM; factory_dat.usb_product_id = CONFIG_USB_GADGET_PRODUCT_NUM;
#endif #endif
@ -202,7 +202,7 @@ int factoryset_read_eeprom(int i2c_addr)
cp1 += 3; cp1 += 3;
} }
#if defined(CONFIG_USB_FUNCTION_DFU) #if defined(CONFIG_DFU_OVER_USB)
/* read vid and pid for dfu mode */ /* read vid and pid for dfu mode */
if (0 <= get_factory_record_val(cp, size, (uchar *)"USBD1", if (0 <= get_factory_record_val(cp, size, (uchar *)"USBD1",
(uchar *)"vid", buf, (uchar *)"vid", buf,

View file

@ -588,7 +588,7 @@ config CMD_DEMO
config CMD_DFU config CMD_DFU
bool "dfu" bool "dfu"
select USB_FUNCTION_DFU select DFU
help help
Enables the command "dfu" which is used to have U-Boot create a DFU Enables the command "dfu" which is used to have U-Boot create a DFU
class device via USB. This command requires that the "dfu_alt_info" class device via USB. This command requires that the "dfu_alt_info"

View file

@ -25,12 +25,14 @@ static int do_dfu(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
if (argc < 4) if (argc < 4)
return CMD_RET_USAGE; return CMD_RET_USAGE;
#ifdef CONFIG_DFU_OVER_USB
char *usb_controller = argv[1]; char *usb_controller = argv[1];
#endif
char *interface = argv[2]; char *interface = argv[2];
char *devstring = argv[3]; char *devstring = argv[3];
int ret; int ret = 0;
#ifdef CONFIG_DFU_TFTP #ifdef CONFIG_DFU_OVER_TFTP
unsigned long addr = 0; unsigned long addr = 0;
if (!strcmp(argv[1], "tftp")) { if (!strcmp(argv[1], "tftp")) {
if (argc == 5) if (argc == 5)
@ -39,7 +41,7 @@ static int do_dfu(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
return update_tftp(addr, interface, devstring); return update_tftp(addr, interface, devstring);
} }
#endif #endif
#ifdef CONFIG_DFU_OVER_USB
ret = dfu_init_env_entities(interface, devstring); ret = dfu_init_env_entities(interface, devstring);
if (ret) if (ret)
goto done; goto done;
@ -56,18 +58,24 @@ static int do_dfu(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
done: done:
dfu_free_entities(); dfu_free_entities();
#endif
return ret; return ret;
} }
U_BOOT_CMD(dfu, CONFIG_SYS_MAXARGS, 1, do_dfu, U_BOOT_CMD(dfu, CONFIG_SYS_MAXARGS, 1, do_dfu,
"Device Firmware Upgrade", "Device Firmware Upgrade",
#ifdef CONFIG_DFU_OVER_USB
"<USB_controller> <interface> <dev> [list]\n" "<USB_controller> <interface> <dev> [list]\n"
" - device firmware upgrade via <USB_controller>\n" " - device firmware upgrade via <USB_controller>\n"
" on device <dev>, attached to interface\n" " on device <dev>, attached to interface\n"
" <interface>\n" " <interface>\n"
" [list] - list available alt settings\n" " [list] - list available alt settings\n"
#ifdef CONFIG_DFU_TFTP #endif
"dfu tftp <interface> <dev> [<addr>]\n" #ifdef CONFIG_DFU_OVER_TFTP
#ifdef CONFIG_DFU_OVER_USB
"dfu "
#endif
"tftp <interface> <dev> [<addr>]\n"
" - device firmware upgrade via TFTP\n" " - device firmware upgrade via TFTP\n"
" on device <dev>, attached to interface\n" " on device <dev>, attached to interface\n"
" <interface>\n" " <interface>\n"

View file

@ -72,9 +72,23 @@ config FASTBOOT_FLASH
the downloaded image to a non-volatile storage device. Define the downloaded image to a non-volatile storage device. Define
this to enable the "fastboot flash" command. this to enable the "fastboot flash" command.
choice
prompt "Flash provider for FASTBOOT"
depends on FASTBOOT_FLASH
config FASTBOOT_FLASH_MMC
bool "FASTBOOT on MMC"
depends on MMC
config FASTBOOT_FLASH_NAND
bool "FASTBOOT on NAND"
depends on NAND
endchoice
config FASTBOOT_FLASH_MMC_DEV config FASTBOOT_FLASH_MMC_DEV
int "Define FASTBOOT MMC FLASH default device" int "Define FASTBOOT MMC FLASH default device"
depends on FASTBOOT_FLASH && MMC depends on FASTBOOT_FLASH_MMC
default 0 if ARCH_SUNXI && MMC_SUNXI_SLOT_EXTRA = -1 default 0 if ARCH_SUNXI && MMC_SUNXI_SLOT_EXTRA = -1
default 1 if ARCH_SUNXI && MMC_SUNXI_SLOT_EXTRA != -1 default 1 if ARCH_SUNXI && MMC_SUNXI_SLOT_EXTRA != -1
help help
@ -84,7 +98,7 @@ config FASTBOOT_FLASH_MMC_DEV
config FASTBOOT_FLASH_NAND_DEV config FASTBOOT_FLASH_NAND_DEV
int "Define FASTBOOT NAND FLASH default device" int "Define FASTBOOT NAND FLASH default device"
depends on FASTBOOT_FLASH && NAND depends on FASTBOOT_FLASH_NAND
depends on CMD_MTDPARTS depends on CMD_MTDPARTS
default 0 if ARCH_SUNXI && NAND_SUNXI default 0 if ARCH_SUNXI && NAND_SUNXI
help help

View file

@ -28,13 +28,13 @@ static int do_sdp(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
ret = sdp_init(controller_index); ret = sdp_init(controller_index);
if (ret) { if (ret) {
pr_err("SDP init failed: %d", ret); pr_err("SDP init failed: %d\n", ret);
goto exit; goto exit;
} }
/* This command typically does not return but jumps to an image */ /* This command typically does not return but jumps to an image */
sdp_handle(controller_index); sdp_handle(controller_index);
pr_err("SDP ended"); pr_err("SDP ended\n");
exit: exit:
g_dnl_unregister(); g_dnl_unregister();

View file

@ -66,7 +66,9 @@ endif # !CONFIG_SPL_BUILD
obj-$(CONFIG_$(SPL_TPL_)BOOTSTAGE) += bootstage.o obj-$(CONFIG_$(SPL_TPL_)BOOTSTAGE) += bootstage.o
ifdef CONFIG_SPL_BUILD ifdef CONFIG_SPL_BUILD
obj-$(CONFIG_SPL_DFU_SUPPORT) += dfu.o ifdef CONFIG_SPL_DFU_SUPPORT
obj-$(CONFIG_DFU_OVER_USB) += dfu.o
endif
obj-$(CONFIG_SPL_DFU_SUPPORT) += cli_hush.o obj-$(CONFIG_SPL_DFU_SUPPORT) += cli_hush.o
obj-$(CONFIG_SPL_HASH_SUPPORT) += hash.o obj-$(CONFIG_SPL_HASH_SUPPORT) += hash.o
obj-$(CONFIG_SPL_YMODEM_SUPPORT) += xyzModem.o obj-$(CONFIG_SPL_YMODEM_SUPPORT) += xyzModem.o
@ -128,7 +130,7 @@ endif
obj-y += cli.o obj-y += cli.o
obj-$(CONFIG_FSL_DDR_INTERACTIVE) += cli_simple.o cli_readline.o obj-$(CONFIG_FSL_DDR_INTERACTIVE) += cli_simple.o cli_readline.o
obj-$(CONFIG_CMD_DFU) += dfu.o obj-$(CONFIG_DFU_OVER_USB) += dfu.o
obj-y += command.o obj-y += command.o
obj-$(CONFIG_$(SPL_)LOG) += log.o obj-$(CONFIG_$(SPL_)LOG) += log.o
obj-$(CONFIG_$(SPL_)LOG_CONSOLE) += log_console.o obj-$(CONFIG_$(SPL_)LOG_CONSOLE) += log_console.o

View file

@ -24,13 +24,13 @@ static int spl_sdp_load_image(struct spl_image_info *spl_image,
ret = sdp_init(controller_index); ret = sdp_init(controller_index);
if (ret) { if (ret) {
pr_err("SDP init failed: %d", ret); pr_err("SDP init failed: %d\n", ret);
return -ENODEV; return -ENODEV;
} }
/* This command typically does not return but jumps to an image */ /* This command typically does not return but jumps to an image */
sdp_handle(controller_index); sdp_handle(controller_index);
pr_err("SDP ended"); pr_err("SDP ended\n");
return -EINVAL; return -EINVAL;
} }

View file

@ -1,12 +1,22 @@
menu "DFU support" menu "DFU support"
config USB_FUNCTION_DFU config DFU
bool
imply DFU_OVER_USB if USB_GADGET
config DFU_OVER_USB
bool bool
select HASH select HASH
depends on USB_GADGET
if CMD_DFU config DFU_OVER_TFTP
bool
depends on NET
if DFU
config DFU_TFTP config DFU_TFTP
bool "DFU via TFTP" bool "DFU via TFTP"
select DFU_OVER_TFTP
help help
This option allows performing update of DFU-managed medium with data This option allows performing update of DFU-managed medium with data
sent via TFTP boot. sent via TFTP boot.

View file

@ -5,7 +5,7 @@
# SPDX-License-Identifier: GPL-2.0+ # SPDX-License-Identifier: GPL-2.0+
# #
obj-$(CONFIG_USB_FUNCTION_DFU) += dfu.o obj-$(CONFIG_DFU) += dfu.o
obj-$(CONFIG_DFU_MMC) += dfu_mmc.o obj-$(CONFIG_DFU_MMC) += dfu_mmc.o
obj-$(CONFIG_DFU_NAND) += dfu_nand.o obj-$(CONFIG_DFU_NAND) += dfu_nand.o
obj-$(CONFIG_DFU_RAM) += dfu_ram.o obj-$(CONFIG_DFU_RAM) += dfu_ram.o

View file

@ -38,7 +38,7 @@ int dfu_tftp_write(char *dfu_entity_name, unsigned int addr, unsigned int len,
} }
strsep(&s, "@"); strsep(&s, "@");
debug("%s: image name: %s strlen: %d\n", __func__, sb, strlen(sb)); debug("%s: image name: %s strlen: %zd\n", __func__, sb, strlen(sb));
alt_setting_num = dfu_get_alt(sb); alt_setting_num = dfu_get_alt(sb);
free(sb); free(sb);
@ -56,7 +56,7 @@ int dfu_tftp_write(char *dfu_entity_name, unsigned int addr, unsigned int len,
goto done; goto done;
} }
ret = dfu_write_from_mem_addr(dfu, (void *)addr, len); ret = dfu_write_from_mem_addr(dfu, (void *)(uintptr_t)addr, len);
done: done:
dfu_free_entities(); dfu_free_entities();

View file

@ -71,6 +71,7 @@ config USB_STORAGE
config USB_KEYBOARD config USB_KEYBOARD
bool "USB Keyboard support" bool "USB Keyboard support"
select SYS_STDIO_DEREGISTER
---help--- ---help---
Say Y here if you want to use a USB keyboard for U-Boot command line Say Y here if you want to use a USB keyboard for U-Boot command line
input. input.

View file

@ -26,7 +26,7 @@ obj-$(CONFIG_CI_UDC) += ci_udc.o
ifndef CONFIG_SPL_BUILD ifndef CONFIG_SPL_BUILD
obj-$(CONFIG_USB_GADGET_DOWNLOAD) += g_dnl.o obj-$(CONFIG_USB_GADGET_DOWNLOAD) += g_dnl.o
obj-$(CONFIG_USB_FUNCTION_THOR) += f_thor.o obj-$(CONFIG_USB_FUNCTION_THOR) += f_thor.o
obj-$(CONFIG_USB_FUNCTION_DFU) += f_dfu.o obj-$(CONFIG_DFU_OVER_USB) += f_dfu.o
obj-$(CONFIG_USB_FUNCTION_MASS_STORAGE) += f_mass_storage.o obj-$(CONFIG_USB_FUNCTION_MASS_STORAGE) += f_mass_storage.o
obj-$(CONFIG_USB_FUNCTION_FASTBOOT) += f_fastboot.o obj-$(CONFIG_USB_FUNCTION_FASTBOOT) += f_fastboot.o
obj-$(CONFIG_USB_FUNCTION_SDP) += f_sdp.o obj-$(CONFIG_USB_FUNCTION_SDP) += f_sdp.o

View file

@ -230,6 +230,11 @@ static struct usb_gadget_strings *sdp_generic_strings[] = {
NULL, NULL,
}; };
static inline void *sdp_ptr(u32 val)
{
return (void *)(uintptr_t)val;
}
static void sdp_rx_command_complete(struct usb_ep *ep, struct usb_request *req) static void sdp_rx_command_complete(struct usb_ep *ep, struct usb_request *req)
{ {
struct f_sdp *sdp = req->context; struct f_sdp *sdp = req->context;
@ -238,12 +243,12 @@ static void sdp_rx_command_complete(struct usb_ep *ep, struct usb_request *req)
u8 report = data[0]; u8 report = data[0];
if (status != 0) { if (status != 0) {
pr_err("Status: %d", status); pr_err("Status: %d\n", status);
return; return;
} }
if (report != 1) { if (report != 1) {
pr_err("Unexpected report %d", report); pr_err("Unexpected report %d\n", report);
return; return;
} }
@ -323,12 +328,12 @@ static void sdp_rx_data_complete(struct usb_ep *ep, struct usb_request *req)
int datalen = req->length - 1; int datalen = req->length - 1;
if (status != 0) { if (status != 0) {
pr_err("Status: %d", status); pr_err("Status: %d\n", status);
return; return;
} }
if (report != 2) { if (report != 2) {
pr_err("Unexpected report %d", report); pr_err("Unexpected report %d\n", report);
return; return;
} }
@ -344,7 +349,7 @@ static void sdp_rx_data_complete(struct usb_ep *ep, struct usb_request *req)
} }
if (sdp->state == SDP_STATE_RX_FILE_DATA) { if (sdp->state == SDP_STATE_RX_FILE_DATA) {
memcpy((void *)sdp->dnl_address, req->buf + 1, datalen); memcpy(sdp_ptr(sdp->dnl_address), req->buf + 1, datalen);
sdp->dnl_address += datalen; sdp->dnl_address += datalen;
} }
@ -361,7 +366,7 @@ static void sdp_rx_data_complete(struct usb_ep *ep, struct usb_request *req)
sdp->state = SDP_STATE_TX_SEC_CONF; sdp->state = SDP_STATE_TX_SEC_CONF;
break; break;
default: default:
pr_err("Invalid state: %d", sdp->state); pr_err("Invalid state: %d\n", sdp->state);
} }
} }
@ -371,7 +376,7 @@ static void sdp_tx_complete(struct usb_ep *ep, struct usb_request *req)
int status = req->status; int status = req->status;
if (status != 0) { if (status != 0) {
pr_err("Status: %d", status); pr_err("Status: %d\n", status);
return; return;
} }
@ -394,7 +399,7 @@ static void sdp_tx_complete(struct usb_ep *ep, struct usb_request *req)
sdp->state = SDP_STATE_IDLE; sdp->state = SDP_STATE_IDLE;
break; break;
default: default:
pr_err("Wrong State: %d", sdp->state); pr_err("Wrong State: %d\n", sdp->state);
sdp->state = SDP_STATE_IDLE; sdp->state = SDP_STATE_IDLE;
break; break;
} }
@ -622,7 +627,7 @@ static u32 sdp_jump_imxheader(void *address)
} }
printf("Jumping to 0x%08x\n", headerv2->entry); printf("Jumping to 0x%08x\n", headerv2->entry);
entry = (void *)headerv2->entry; entry = sdp_ptr(headerv2->entry);
entry(); entry();
/* The image probably never returns hence we won't reach that point */ /* The image probably never returns hence we won't reach that point */
@ -665,7 +670,7 @@ static void sdp_handle_in_ep(void)
if (datalen > 64) if (datalen > 64)
datalen = 64; datalen = 64;
memcpy(&data[1], (void *)sdp_func->dnl_address, datalen); memcpy(&data[1], sdp_ptr(sdp_func->dnl_address), datalen);
sdp_func->in_req->length = 65; sdp_func->in_req->length = 65;
sdp_func->dnl_bytes_remaining -= datalen; sdp_func->dnl_bytes_remaining -= datalen;
@ -676,7 +681,7 @@ static void sdp_handle_in_ep(void)
break; break;
case SDP_STATE_JUMP: case SDP_STATE_JUMP:
printf("Jumping to header at 0x%08x\n", sdp_func->jmp_address); printf("Jumping to header at 0x%08x\n", sdp_func->jmp_address);
status = sdp_jump_imxheader((void *)sdp_func->jmp_address); status = sdp_jump_imxheader(sdp_ptr(sdp_func->jmp_address));
/* If imx header fails, try some U-Boot specific headers */ /* If imx header fails, try some U-Boot specific headers */
if (status) { if (status) {

View file

@ -11,7 +11,7 @@
/* /*
* Size of malloc() pool * Size of malloc() pool
*/ */
#ifdef CONFIG_USB_FUNCTION_DFU #ifdef CONFIG_DFU_OVER_USB
#define CONFIG_SYS_MALLOC_LEN (SZ_4M + \ #define CONFIG_SYS_MALLOC_LEN (SZ_4M + \
CONFIG_SYS_DFU_DATA_BUF_SIZE + \ CONFIG_SYS_DFU_DATA_BUF_SIZE + \
CONFIG_SYS_DFU_MAX_FILE_SIZE) CONFIG_SYS_DFU_MAX_FILE_SIZE)