summaryrefslogtreecommitdiff
path: root/common
diff options
context:
space:
mode:
authorStefan Agner <stefan.agner@toradex.com>2016-08-16 10:13:36 -0700
committerMax Krummenacher <max.krummenacher@toradex.com>2017-01-18 09:46:40 +0100
commit6a638b1936026523d6206c3b93066f3386da2937 (patch)
tree5c6626672b0bca4d7fdfebe039cc5865904c46fe /common
parent0b4ddd907a633ca9b5c8407d66e074a31c805336 (diff)
spl: add serial download protocol (SDP) support
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. Signed-off-by: Stefan Agner <stefan.agner@toradex.com> Acked-by: Max Krummenacher <max.krummenacher@toradex.com>
Diffstat (limited to 'common')
-rw-r--r--common/spl/Kconfig6
-rw-r--r--common/spl/Makefile1
-rw-r--r--common/spl/spl.c3
-rw-r--r--common/spl/spl_sdp.c38
4 files changed, 48 insertions, 0 deletions
diff --git a/common/spl/Kconfig b/common/spl/Kconfig
index 3305299721..6cdc31b591 100644
--- a/common/spl/Kconfig
+++ b/common/spl/Kconfig
@@ -530,6 +530,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 ed02635e72..69fe2cacf6 100644
--- a/common/spl/Makefile
+++ b/common/spl/Makefile
@@ -26,4 +26,5 @@ obj-$(CONFIG_SPL_EXT_SUPPORT) += spl_ext.o
obj-$(CONFIG_SPL_SATA_SUPPORT) += spl_sata.o
obj-$(CONFIG_SPL_DFU_SUPPORT) += spl_dfu.o
obj-$(CONFIG_SPL_SPI_LOAD) += spl_spi.o
+obj-$(CONFIG_SPL_USB_SDP_SUPPORT) += spl_sdp.o
endif
diff --git a/common/spl/spl.c b/common/spl/spl.c
index 32b9f1e95c..8d07321784 100644
--- a/common/spl/spl.c
+++ b/common/spl/spl.c
@@ -319,6 +319,9 @@ struct boot_device_name boot_name_table[] = {
#ifdef CONFIG_SPL_DFU_SUPPORT
{ BOOT_DEVICE_DFU, "USB DFU" },
#endif
+#ifdef CONFIG_SPL_USB_SDP_SUPPORT
+ { BOOT_DEVICE_SDP, "USB SDP" },
+#endif
#ifdef CONFIG_SPL_SATA_SUPPORT
{ BOOT_DEVICE_SATA, "SATA" },
#endif
diff --git a/common/spl/spl_sdp.c b/common/spl/spl_sdp.c
new file mode 100644
index 0000000000..6252a452a8
--- /dev/null
+++ b/common/spl/spl_sdp.c
@@ -0,0 +1,38 @@
+/*
+ * (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;
+
+ g_dnl_clear_detach();
+ g_dnl_register("usb_dnl_sdp");
+
+ ret = sdp_init();
+ if (ret) {
+ error("SDP init failed: %d", ret);
+ return -ENODEV;
+ }
+
+ ret = sdp_handle();
+ if (ret) {
+ error("SDP failed: %d", ret);
+ return -ENODEV;
+ }
+
+ return 0;
+}
+SPL_LOAD_IMAGE_METHOD(0, BOOT_DEVICE_SDP, spl_sdp_load_image);