
On 08/16/2017 08:00 PM, Stefan Agner wrote:
From: Stefan Agner stefan.agner@toradex.com
Add USB serial download protocol support to SPL. If the SoC started in recovery mode the SPL will immediately switch to SDP and wait for further downloads/commands from the host side.
Reviewed-by: Łukasz Majewski lukma@denx.de
Signed-off-by: Stefan Agner stefan.agner@toradex.com Reviewed-by: Stefano Babic sbabic@denx.de
Changes in v2:
- Changed function signature of sdp_init/sdp_handle
- Use BOOT_DEVICE_BOARD
common/spl/Kconfig | 6 ++++++ common/spl/Makefile | 1 + common/spl/spl_sdp.c | 37 +++++++++++++++++++++++++++++++++++++ drivers/usb/gadget/Makefile | 1 + 4 files changed, 45 insertions(+) create mode 100644 common/spl/spl_sdp.c
diff --git a/common/spl/Kconfig b/common/spl/Kconfig index 5176857506..b3436b3c28 100644 --- a/common/spl/Kconfig +++ b/common/spl/Kconfig @@ -668,6 +668,12 @@ config SPL_DFU_RAM
endchoice
+config SPL_USB_SDP_SUPPORT
- bool "Support SDP (Serial Download Protocol)"
- help
Enable Serial Download Protocol (SDP) device support in SPL. This
allows to download images into memory and execute (jump to) them
using the same protocol as implemented by the i.MX family's boot ROM.
endif
config SPL_WATCHDOG_SUPPORT diff --git a/common/spl/Makefile b/common/spl/Makefile index 112b3e6022..6255d4f73c 100644 --- a/common/spl/Makefile +++ b/common/spl/Makefile @@ -30,4 +30,5 @@ obj-$(CONFIG_$(SPL_TPL_)SATA_SUPPORT) += spl_sata.o obj-$(CONFIG_$(SPL_TPL_)DFU_SUPPORT) += spl_dfu.o obj-$(CONFIG_$(SPL_TPL_)SPI_LOAD) += spl_spi.o obj-$(CONFIG_$(SPL_TPL_)RAM_SUPPORT) += spl_ram.o +obj-$(CONFIG_$(SPL_TPL_)USB_SDP_SUPPORT) += spl_sdp.o endif diff --git a/common/spl/spl_sdp.c b/common/spl/spl_sdp.c new file mode 100644 index 0000000000..350bcdb056 --- /dev/null +++ b/common/spl/spl_sdp.c @@ -0,0 +1,37 @@ +/*
- (C) Copyright 2016 Toradex
- Author: Stefan Agner stefan.agner@toradex.com
- SPDX-License-Identifier: GPL-2.0+
- */
+#include <common.h> +#include <spl.h> +#include <usb.h> +#include <g_dnl.h> +#include <sdp.h>
+DECLARE_GLOBAL_DATA_PTR;
+static int spl_sdp_load_image(struct spl_image_info *spl_image,
struct spl_boot_device *bootdev)
+{
- int ret;
- const int controller_index = 0;
- g_dnl_clear_detach();
- g_dnl_register("usb_dnl_sdp");
- ret = sdp_init(controller_index);
- if (ret) {
error("SDP init failed: %d", ret);
return -ENODEV;
- }
- /* This command typically does not return but jumps to an image */
- sdp_handle(controller_index);
- error("SDP ended");
- return -EINVAL;
+} +SPL_LOAD_IMAGE_METHOD("USB SDP", 0, BOOT_DEVICE_BOARD, spl_sdp_load_image); diff --git a/drivers/usb/gadget/Makefile b/drivers/usb/gadget/Makefile index 6a007d1bcb..7258099c1c 100644 --- a/drivers/usb/gadget/Makefile +++ b/drivers/usb/gadget/Makefile @@ -11,6 +11,7 @@ obj-$(CONFIG_USB_ETHER) += epautoconf.o config.o usbstring.o ifdef CONFIG_SPL_BUILD obj-$(CONFIG_SPL_USB_GADGET_SUPPORT) += g_dnl.o obj-$(CONFIG_SPL_DFU_SUPPORT) += f_dfu.o +obj-$(CONFIG_SPL_USB_SDP_SUPPORT) += f_sdp.o endif
# new USB gadget layer dependencies