Merge branch 'master' of git://git.denx.de/u-boot-fsl-qoriq
[oweals/u-boot.git] / common / spl / spl_ymodem.c
1 /*
2  * (C) Copyright 2000-2004
3  * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
4  *
5  * (C) Copyright 2011
6  * Texas Instruments, <www.ti.com>
7  *
8  * Matt Porter <mporter@ti.com>
9  *
10  * SPDX-License-Identifier:     GPL-2.0+
11  */
12 #include <common.h>
13 #include <spl.h>
14 #include <xyzModem.h>
15 #include <asm/u-boot.h>
16 #include <asm/utils.h>
17
18 #define BUF_SIZE 1024
19
20 static int getcymodem(void) {
21         if (tstc())
22                 return (getc());
23         return -1;
24 }
25
26 int spl_ymodem_load_image(void)
27 {
28         int size = 0;
29         int err;
30         int res;
31         int ret;
32         connection_info_t info;
33         char buf[BUF_SIZE];
34         ulong store_addr = ~0;
35         ulong addr = 0;
36
37         info.mode = xyzModem_ymodem;
38         ret = xyzModem_stream_open(&info, &err);
39
40         if (!ret) {
41                 while ((res =
42                         xyzModem_stream_read(buf, BUF_SIZE, &err)) > 0) {
43                         if (addr == 0)
44                                 spl_parse_image_header((struct image_header *)buf);
45                         store_addr = addr + spl_image.load_addr;
46                         size += res;
47                         addr += res;
48                         memcpy((char *)(store_addr), buf, res);
49                 }
50         } else {
51                 printf("spl: ymodem err - %s\n", xyzModem_error(err));
52                 return ret;
53         }
54
55         xyzModem_stream_close(&err);
56         xyzModem_stream_terminate(false, &getcymodem);
57
58         printf("Loaded %d bytes\n", size);
59         return 0;
60 }