1 |
816 |
markom |
#include "common.h"
|
2 |
|
|
#include "support.h"
|
3 |
|
|
#include "flash.h"
|
4 |
|
|
#include "net.h"
|
5 |
|
|
|
6 |
|
|
extern char *tftp_filename;
|
7 |
|
|
|
8 |
|
|
int tftp_cmd (int argc, char *argv[])
|
9 |
|
|
{
|
10 |
|
|
switch (argc) {
|
11 |
|
|
case 0: tftp_filename = "boot.img";
|
12 |
|
|
break;
|
13 |
|
|
case 3: global.src_addr = strtoul (argv[2], 0, 0);
|
14 |
|
|
case 2: global.srv_ip = parse_ip (argv[1]);
|
15 |
|
|
case 1: tftp_filename = &argv[0][0];
|
16 |
|
|
break;
|
17 |
|
|
}
|
18 |
|
|
NetLoop(TFTP);
|
19 |
|
|
return 0;
|
20 |
|
|
}
|
21 |
|
|
|
22 |
|
|
/* WARNING: stack and non-const globals should not be used in this function -- it may corrupt what have we loaded;
|
23 |
|
|
start_addr should be 0xffffffff if only copying should be made
|
24 |
|
|
no return, when start_addr != 0xffffffff, if successful */
|
25 |
|
|
int copy_memory_run (register unsigned long src_addr, register unsigned long dst_addr, register unsigned long length, register int erase, register unsigned long start_addr)
|
26 |
|
|
{
|
27 |
|
|
register int i;
|
28 |
|
|
if (dst_addr >= FLASH_BASE_ADDR && dst_addr < FLASH_SIZE) {
|
29 |
|
|
if (dst_addr + length >= FLASH_BASE_ADDR && dst_addr + length < FLASH_SIZE) {
|
30 |
|
|
printf ("error: region does not fit into flash.\n");
|
31 |
|
|
return 1;
|
32 |
|
|
}
|
33 |
|
|
i = fl_program (src_addr, dst_addr, length, erase, 1 /* do verify */);
|
34 |
|
|
if (start_addr == 0xffffffff || i) return i;
|
35 |
|
|
} else {
|
36 |
|
|
if (start_addr == 0xffffffff) {
|
37 |
|
|
memmove ((void *)dst_addr, (void *)src_addr, length);
|
38 |
|
|
return 0;
|
39 |
|
|
} else { /* we need to do the copying inside this function -- stack may be corrupted */
|
40 |
|
|
register char *dst = (char *) dst_addr;
|
41 |
|
|
register const char *src = (const char *) src_addr;
|
42 |
|
|
while (length--) *dst++ = *src++;
|
43 |
|
|
}
|
44 |
|
|
}
|
45 |
|
|
/* Run the program */
|
46 |
|
|
((void (*)(void)) start_addr)();
|
47 |
|
|
return 0; /* just to satisfy the cc */
|
48 |
|
|
}
|
49 |
|
|
|
50 |
|
|
int copy_cmd (int argc, char *argv[])
|
51 |
|
|
{
|
52 |
|
|
switch (argc) {
|
53 |
|
|
case 3: global.src_addr = strtoul (argv[2], 0, 0);
|
54 |
|
|
case 2: global.length = strtoul (argv[2], 0, 0);
|
55 |
|
|
case 1: global.src_addr = strtoul (argv[2], 0, 0);
|
56 |
|
|
case 0: return copy_memory_run (global.src_addr, global.dst_addr, global.length, global.erase_method, 0xffffffff);
|
57 |
|
|
}
|
58 |
|
|
return -1;
|
59 |
|
|
}
|
60 |
|
|
|
61 |
|
|
int boot_cmd (int argc, char *argv[])
|
62 |
|
|
{
|
63 |
|
|
switch (argc) {
|
64 |
|
|
case 3: global.src_addr = strtoul (argv[2], 0, 0);
|
65 |
|
|
case 2: global.length = strtoul (argv[2], 0, 0);
|
66 |
|
|
case 1: global.src_addr = strtoul (argv[2], 0, 0);
|
67 |
|
|
case 0: return copy_memory_run (global.src_addr, global.dst_addr, global.length, global.erase_method, global.start_addr); /* no return, if successful */
|
68 |
|
|
}
|
69 |
|
|
return -1;
|
70 |
|
|
}
|
71 |
|
|
|
72 |
|
|
void module_load_init (void)
|
73 |
|
|
{
|
74 |
|
|
register_command ("tftp", "[<file> [<srv_ip> [<src_addr>]]]", "TFTP download", tftp_cmd);
|
75 |
|
|
register_command ("copy", "[<dst_addr> [<src_addr [<length>]]]", "Copy memory", copy_cmd);
|
76 |
|
|
}
|