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

Subversion Repositories or1k

[/] [or1k/] [trunk/] [orpmon/] [cmds/] [load.c] - Blame information for rev 818

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
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 818 markom
int crc_cmd (int argc, char *argv[])
73
{
74
 
75
 
76
}
77
 
78 816 markom
void module_load_init (void)
79
{
80
  register_command ("tftp", "[<file> [<srv_ip> [<src_addr>]]]",  "TFTP download", tftp_cmd);
81
  register_command ("copy", "[<dst_addr> [<src_addr [<length>]]]", "Copy memory", copy_cmd);
82
}

powered by: WebSVN 2.1.0

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