SPL: Add YMODEM over UART load support
authorMatt Porter <mporter@ti.com>
Tue, 31 Jan 2012 12:03:57 +0000 (12:03 +0000)
committerAlbert ARIBAUD <albert.u.boot@aribaud.net>
Mon, 26 Mar 2012 21:09:25 +0000 (23:09 +0200)
Adds support for loading U-Boot from UART using YMODEM protocol.
If YMODEM support is enabled in SPL and the romcode indicates
that SPL loaded via UART then SPL will wait for start of a
YMODEM transfer via the console port.

Signed-off-by: Matt Porter <mporter@ti.com>
Signed-off-by: Tom Rini <trini@ti.com>
arch/arm/cpu/armv7/omap-common/Makefile
arch/arm/cpu/armv7/omap-common/spl.c
arch/arm/cpu/armv7/omap-common/spl_ymodem.c [new file with mode: 0644]
arch/arm/include/asm/omap_common.h
common/Makefile
lib/Makefile

index 3f7a0b25f0d39db46c0b8ff9263066e792adfd1f..447fcd5eff12316e97a0162dab2ac6038b0e1924 100644 (file)
@@ -52,6 +52,9 @@ endif
 ifdef CONFIG_SPL_MMC_SUPPORT
 COBJS  += spl_mmc.o
 endif
+ifdef CONFIG_SPL_YMODEM_SUPPORT
+COBJS  += spl_ymodem.o
+endif
 endif
 
 ifndef CONFIG_SPL_BUILD
index 3a2d957731040c487523d9b77ad89820b5442d58..99bb382750ea402d7ef4595b596621dee110dbdd 100644 (file)
@@ -132,6 +132,11 @@ void board_init_r(gd_t *id, ulong dummy)
        case BOOT_DEVICE_NAND:
                spl_nand_load_image();
                break;
+#endif
+#ifdef CONFIG_SPL_YMODEM_SUPPORT
+       case BOOT_DEVICE_UART:
+               spl_ymodem_load_image();
+               break;
 #endif
        default:
                printf("SPL: Un-supported Boot Device - %d!!!\n", boot_device);
diff --git a/arch/arm/cpu/armv7/omap-common/spl_ymodem.c b/arch/arm/cpu/armv7/omap-common/spl_ymodem.c
new file mode 100644 (file)
index 0000000..47663f7
--- /dev/null
@@ -0,0 +1,76 @@
+/*
+ * (C) Copyright 2000-2004
+ * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+ *
+ * (C) Copyright 2011
+ * Texas Instruments, <www.ti.com>
+ *
+ * Matt Porter <mporter@ti.com>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+#include <common.h>
+#include <xyzModem.h>
+#include <asm/u-boot.h>
+#include <asm/utils.h>
+#include <asm/arch/sys_proto.h>
+#include <asm/omap_common.h>
+
+#define BUF_SIZE 1024
+
+static int getcymodem(void) {
+       if (tstc())
+               return (getc());
+       return -1;
+}
+
+void spl_ymodem_load_image(void)
+{
+       int size = 0;
+       int err;
+       int res;
+       int ret;
+       connection_info_t info;
+       char buf[BUF_SIZE];
+       ulong store_addr = ~0;
+       ulong addr = 0;
+
+       info.mode = xyzModem_ymodem;
+       ret = xyzModem_stream_open(&info, &err);
+
+       if (!ret) {
+               while ((res =
+                       xyzModem_stream_read(buf, BUF_SIZE, &err)) > 0) {
+                       if (addr == 0)
+                               spl_parse_image_header((struct image_header *)buf);
+                       store_addr = addr + spl_image.load_addr;
+                       size += res;
+                       addr += res;
+                       memcpy((char *)(store_addr), buf, res);
+               }
+       } else {
+               printf("spl: ymodem err - %s\n", xyzModem_error(err));
+               hang();
+       }
+
+       xyzModem_stream_close(&err);
+       xyzModem_stream_terminate(false, &getcymodem);
+
+       printf("Loaded %d bytes\n", size);
+}
index 34bec4568dac0ce43bc4232c111ee3cef0ce6bf0..25f95b4bcdac974faae7120b7c0cbfd2d4f56e1a 100644 (file)
@@ -99,6 +99,9 @@ void spl_nand_load_image(void);
 /* MMC SPL functions */
 void spl_mmc_load_image(void);
 
+/* YMODEM SPL functions */
+void spl_ymodem_load_image(void);
+
 #ifdef CONFIG_SPL_BOARD_INIT
 void spl_board_init(void);
 #endif
index fd9b3b053d72c6c05bd7b59bc9e988a00db8baed..04faa0b1de33845db66a8cdc812e7afd5dc5a449 100644 (file)
@@ -185,6 +185,9 @@ COBJS-$(CONFIG_UPDATE_TFTP) += update.o
 COBJS-$(CONFIG_USB_KEYBOARD) += usb_kbd.o
 endif
 
+ifdef CONFIG_SPL_BUILD
+COBJS-$(CONFIG_SPL_YMODEM_SUPPORT) += xyzModem.o
+endif
 COBJS-y += console.o
 COBJS-y += dlmalloc.o
 COBJS-y += memsize.o
index e6e6ec63779be056942565c0bc515e35e8528285..4b5734a21d34749ca18bbcb33d14923e392823ff 100644 (file)
@@ -55,6 +55,9 @@ else
 COBJS-$(CONFIG_SPL_SPI_FLASH_SUPPORT) += display_options.o
 endif
 
+ifdef CONFIG_SPL_BUILD
+COBJS-$(CONFIG_SPL_YMODEM_SUPPORT) += crc16.o
+endif
 COBJS-y += ctype.o
 COBJS-y += div64.o
 COBJS-y += string.o