OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [orpmon/] [cmds/] [load.c] - Rev 820

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;
}
 
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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.