[U-Boot] [PATCH 1/2] SPL: Add YMODEM over UART load support

Christian Riesch christian.riesch at omicron.at
Wed Feb 1 07:40:42 CET 2012


Hi Tom, Hi Matt,

On Tuesday, January 31, 2012, Tom Rini <trini at ti.com> wrote:
> From: Matt Porter <mporter at ti.com>
>
> 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.

:-) I like this feature!

I tried something similar a few month ago for the da850evm and my own
board, it worked but I never had time to finished it and submit it, it was
just a hack.

For my tests I used the UART loader utility from TI to load the SPL and
then minicom for loading u-boot. Do you have an automated solution for
this? Would be nice to have something like this in tools/.

> Signed-off-by: Matt Porter <mporter at ti.com>
> Signed-off-by: Tom Rini <trini at ti.com>
> ---
>  arch/arm/cpu/armv7/omap-common/Makefile     |    3 +
>  arch/arm/cpu/armv7/omap-common/spl.c        |    5 ++
>  arch/arm/cpu/armv7/omap-common/spl_ymodem.c |   76
+++++++++++++++++++++++++++
>  arch/arm/include/asm/omap_common.h          |    3 +
>  common/Makefile                             |    3 +
>  lib/Makefile                                |    3 +
>  6 files changed, 93 insertions(+), 0 deletions(-)
>  create mode 100644 arch/arm/cpu/armv7/omap-common/spl_ymodem.c
>

[...]


> diff --git a/arch/arm/cpu/armv7/omap-common/spl_ymodem.c
b/arch/arm/cpu/armv7/omap-common/spl_ymodem.c

Could this be somewhere where it's accessible for other SoC families like
davinci? E.g. We have nand_spl_load.c in drivers/mtd/nand and something
similar for SPI flash.

Regards, Christian

> new file mode 100644
> index 0000000..47663f7
> --- /dev/null
> +++ b/arch/arm/cpu/armv7/omap-common/spl_ymodem.c
> @@ -0,0 +1,76 @@
> +/*
> + * (C) Copyright 2000-2004
> + * Wolfgang Denk, DENX Software Engineering, wd at denx.de.
> + *
> + * (C) Copyright 2011
> + * Texas Instruments, <www.ti.com>
> + *
> + * Matt Porter <mporter at 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);
> +}


More information about the U-Boot mailing list