#include "common.h"
|
#include "common.h"
|
#include "support.h"
|
#include "support.h"
|
#include "flash.h"
|
#include "flash.h"
|
#include "net.h"
|
#include "net.h"
|
|
|
extern char *tftp_filename;
|
extern char *tftp_filename;
|
|
|
int tftp_cmd (int argc, char *argv[])
|
int tftp_cmd (int argc, char *argv[])
|
{
|
{
|
switch (argc) {
|
switch (argc) {
|
case 0: tftp_filename = "boot.img";
|
case 0: tftp_filename = "boot.img";
|
break;
|
break;
|
case 3: global.src_addr = strtoul (argv[2], 0, 0);
|
case 3: global.src_addr = strtoul (argv[2], 0, 0);
|
case 2: global.srv_ip = parse_ip (argv[1]);
|
case 2: global.srv_ip = parse_ip (argv[1]);
|
case 1: tftp_filename = &argv[0][0];
|
case 1: tftp_filename = &argv[0][0];
|
break;
|
break;
|
}
|
}
|
NetLoop(TFTP);
|
NetLoop(TFTP);
|
return 0;
|
return 0;
|
}
|
}
|
|
|
/* WARNING: stack and non-const globals should not be used in this function -- it may corrupt what have we loaded;
|
/* WARNING: stack and non-const globals should not be used in this function -- it may corrupt what have we loaded;
|
start_addr should be 0xffffffff if only copying should be made
|
start_addr should be 0xffffffff if only copying should be made
|
no return, when start_addr != 0xffffffff, if successful */
|
no return, when start_addr != 0xffffffff, if successful */
|
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)
|
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)
|
{
|
{
|
register int i;
|
register int i;
|
if (dst_addr >= FLASH_BASE_ADDR && dst_addr < FLASH_SIZE) {
|
if (dst_addr >= FLASH_BASE_ADDR && dst_addr < FLASH_SIZE) {
|
if (dst_addr + length >= FLASH_BASE_ADDR && dst_addr + length < FLASH_SIZE) {
|
if (dst_addr + length >= FLASH_BASE_ADDR && dst_addr + length < FLASH_SIZE) {
|
printf ("error: region does not fit into flash.\n");
|
printf ("error: region does not fit into flash.\n");
|
return 1;
|
return 1;
|
}
|
}
|
i = fl_program (src_addr, dst_addr, length, erase, 1 /* do verify */);
|
i = fl_program (src_addr, dst_addr, length, erase, 1 /* do verify */);
|
if (start_addr == 0xffffffff || i) return i;
|
if (start_addr == 0xffffffff || i) return i;
|
} else {
|
} else {
|
if (start_addr == 0xffffffff) {
|
if (start_addr == 0xffffffff) {
|
memmove ((void *)dst_addr, (void *)src_addr, length);
|
memmove ((void *)dst_addr, (void *)src_addr, length);
|
return 0;
|
return 0;
|
} else { /* we need to do the copying inside this function -- stack may be corrupted */
|
} else { /* we need to do the copying inside this function -- stack may be corrupted */
|
register char *dst = (char *) dst_addr;
|
register char *dst = (char *) dst_addr;
|
register const char *src = (const char *) src_addr;
|
register const char *src = (const char *) src_addr;
|
while (length--) *dst++ = *src++;
|
while (length--) *dst++ = *src++;
|
}
|
}
|
}
|
}
|
/* Run the program */
|
/* Run the program */
|
((void (*)(void)) start_addr)();
|
((void (*)(void)) start_addr)();
|
return 0; /* just to satisfy the cc */
|
return 0; /* just to satisfy the cc */
|
}
|
}
|
|
|
int copy_cmd (int argc, char *argv[])
|
int copy_cmd (int argc, char *argv[])
|
{
|
{
|
switch (argc) {
|
switch (argc) {
|
case 3: global.src_addr = strtoul (argv[2], 0, 0);
|
case 3: global.src_addr = strtoul (argv[2], 0, 0);
|
case 2: global.length = strtoul (argv[2], 0, 0);
|
case 2: global.length = strtoul (argv[2], 0, 0);
|
case 1: global.src_addr = strtoul (argv[2], 0, 0);
|
case 1: global.src_addr = strtoul (argv[2], 0, 0);
|
case 0: return copy_memory_run (global.src_addr, global.dst_addr, global.length, global.erase_method, 0xffffffff);
|
case 0: return copy_memory_run (global.src_addr, global.dst_addr, global.length, global.erase_method, 0xffffffff);
|
}
|
}
|
return -1;
|
return -1;
|
}
|
}
|
|
|
int boot_cmd (int argc, char *argv[])
|
int boot_cmd (int argc, char *argv[])
|
{
|
{
|
switch (argc) {
|
switch (argc) {
|
case 3: global.src_addr = strtoul (argv[2], 0, 0);
|
case 3: global.src_addr = strtoul (argv[2], 0, 0);
|
case 2: global.length = strtoul (argv[2], 0, 0);
|
case 2: global.length = strtoul (argv[2], 0, 0);
|
case 1: global.src_addr = strtoul (argv[2], 0, 0);
|
case 1: global.src_addr = strtoul (argv[2], 0, 0);
|
case 0: return copy_memory_run (global.src_addr, global.dst_addr, global.length, global.erase_method, global.start_addr); /* no return, if successful */
|
case 0: return copy_memory_run (global.src_addr, global.dst_addr, global.length, global.erase_method, global.start_addr); /* no return, if successful */
|
}
|
}
|
return -1;
|
return -1;
|
}
|
}
|
|
|
int crc_cmd (int argc, char *argv[])
|
|
{
|
|
|
|
|
|
}
|
|
|
|
void module_load_init (void)
|
void module_load_init (void)
|
{
|
{
|
register_command ("tftp", "[<file> [<srv_ip> [<src_addr>]]]", "TFTP download", tftp_cmd);
|
register_command ("tftp", "[<file> [<srv_ip> [<src_addr>]]]", "TFTP download", tftp_cmd);
|
register_command ("copy", "[<dst_addr> [<src_addr [<length>]]]", "Copy memory", copy_cmd);
|
register_command ("copy", "[<dst_addr> [<src_addr [<length>]]]", "Copy memory", copy_cmd);
|
}
|
}
|
|
|