]> git.sur5r.net Git - u-boot/blob - common/spl/spl_ymodem.c
Merge branch 'master' of git://git.denx.de/u-boot-mpc85xx
[u-boot] / 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                                 ret = spl_parse_image_header((struct image_header *)buf);
45                                 if (ret)
46                                         return ret;
47                         }
48                         store_addr = addr + spl_image.load_addr;
49                         size += res;
50                         addr += res;
51                         memcpy((char *)(store_addr), buf, res);
52                 }
53         } else {
54                 printf("spl: ymodem err - %s\n", xyzModem_error(err));
55                 return ret;
56         }
57
58         xyzModem_stream_close(&err);
59         xyzModem_stream_terminate(false, &getcymodem);
60
61         printf("Loaded %d bytes\n", size);
62         return 0;
63 }