URL
https://opencores.org/ocsvn/or1k/or1k/trunk
Subversion Repositories or1k
[/] [or1k/] [trunk/] [orpmon/] [cmds/] [load.c] - Rev 818
Go to most recent revision | Compare with Previous | Blame | View Log
#include "common.h" #include "support.h" #include "flash.h" #include "net.h" extern char *tftp_filename; int tftp_cmd (int argc, char *argv[]) { switch (argc) { case 0: tftp_filename = "boot.img"; break; case 3: global.src_addr = strtoul (argv[2], 0, 0); case 2: global.srv_ip = parse_ip (argv[1]); case 1: tftp_filename = &argv[0][0]; break; } NetLoop(TFTP); return 0; } /* 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 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) { register int i; if (dst_addr >= FLASH_BASE_ADDR && dst_addr < FLASH_SIZE) { if (dst_addr + length >= FLASH_BASE_ADDR && dst_addr + length < FLASH_SIZE) { printf ("error: region does not fit into flash.\n"); return 1; } i = fl_program (src_addr, dst_addr, length, erase, 1 /* do verify */); if (start_addr == 0xffffffff || i) return i; } else { if (start_addr == 0xffffffff) { memmove ((void *)dst_addr, (void *)src_addr, length); return 0; } else { /* we need to do the copying inside this function -- stack may be corrupted */ register char *dst = (char *) dst_addr; register const char *src = (const char *) src_addr; while (length--) *dst++ = *src++; } } /* Run the program */ ((void (*)(void)) start_addr)(); return 0; /* just to satisfy the cc */ } int copy_cmd (int argc, char *argv[]) { switch (argc) { case 3: global.src_addr = 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 0: return copy_memory_run (global.src_addr, global.dst_addr, global.length, global.erase_method, 0xffffffff); } return -1; } int boot_cmd (int argc, char *argv[]) { switch (argc) { case 3: global.src_addr = 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 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; } int crc_cmd (int argc, char *argv[]) { } void module_load_init (void) { register_command ("tftp", "[<file> [<srv_ip> [<src_addr>]]]", "TFTP download", tftp_cmd); register_command ("copy", "[<dst_addr> [<src_addr [<length>]]]", "Copy memory", copy_cmd); }
Go to most recent revision | Compare with Previous | Blame | View Log