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

Subversion Repositories or1k

[/] [or1k/] [trunk/] [orpmon/] [common/] [common.c] - Blame information for rev 855

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

Line No. Rev Author Line
1 809 simons
#include "common.h"
2
#include "uart.h"
3
#include "screen.h"
4
#include "support.h"
5 855 markom
#include "keyboard.h"
6 809 simons
 
7
#define MAX_COMMANDS  100
8
 
9 817 simons
extern unsigned long src_addr;
10
 
11 809 simons
bd_t bd;
12
 
13
int num_commands = 0;
14
 
15
struct command_struct {
16
  const char *name;
17
  const char *params;
18
  const char *help;
19
  int (*func)(int argc, char *argv[]);
20
} command[MAX_COMMANDS];
21
 
22
void putc (const char c)
23
{
24
  debug ("getc %i, %i = %c\n", bd.bi_console_type, c, c);
25
  switch (bd.bi_console_type) {
26
  case CT_NONE:
27
    break;
28
  case CT_UART:
29
    uart_putc (c);
30
    break;
31 855 markom
#ifdef CRT_ENABLED
32 809 simons
  case CT_CRT:
33 855 markom
#endif
34 809 simons
    screen_putc (c);
35
    break;
36
  case CT_SIM:
37
    __printf ("%c", c);
38
    break;
39
  }
40
}
41
 
42
int getc ()
43
{
44 855 markom
  int ch = 0;
45 809 simons
  debug ("getc %i\n", bd.bi_console_type);
46
  switch (bd.bi_console_type) {
47 855 markom
#if KBD_ENABLED
48 809 simons
  case CT_CRT:
49 855 markom
    while ((volatile int)kbd_head == (volatile int)kbd_tail);
50
    ch = kbd_buf[kbd_tail];
51
    kbd_tail = (kbd_tail + 1) % KBDBUF_SIZE;
52
    return ch;
53
#endif
54 809 simons
  case CT_UART:
55
    return uart_getc ();
56
  }
57
  return -1;
58
}
59
 
60
int testc ()
61
{
62
  debug ("testc %i\n", bd.bi_console_type);
63
  switch (bd.bi_console_type) {
64 855 markom
#if KBD_ENABLED
65 809 simons
  case CT_CRT:
66 855 markom
    if (kbd_head == kbd_tail) return 0;
67
    else return getc ();
68
#endif
69 809 simons
  case CT_UART:
70
    return uart_testc ();
71
  }
72
  return -1;
73
}
74
 
75
int ctrlc ()
76
{
77
  if (testc ()) {
78
    switch (getc ()) {
79
      case 0x03:    /* ^C - Control C */
80
        return 1;
81
      default:
82
        break;
83
    }
84
  }
85
  return 0;
86
}
87
 
88 812 markom
unsigned long parse_ip (char *ip)
89
{
90
  unsigned long num;
91
  num = strtoul (ip, &ip, 10) & 0xff;
92
  if (*ip++ != '.') return 0;
93
  num = (num << 8) | (strtoul (ip, &ip, 10) & 0xff);
94
  if (*ip++ != '.') return 0;
95
  num = (num << 8) | (strtoul (ip, &ip, 10) & 0xff);
96
  if (*ip++ != '.') return 0;
97
  num = (num << 8) | (strtoul (ip, &ip, 10) & 0xff);
98
  return num;
99
}
100
 
101 809 simons
void change_console_type (enum bi_console_type_t con_type)
102
{
103
  debug ("Console change %i -> %i\n", bd.bi_console_type, con_type);
104
  /* Close previous */
105
  switch (bd.bi_console_type) {
106
  case CT_NONE:
107
  case CT_UART:
108
  case CT_CRT:
109
  case CT_SIM:
110
    break;
111
  }
112
  bd.bi_console_type = con_type;
113
  /* Initialize new */
114
  switch (bd.bi_console_type) {
115
  case CT_NONE:
116
    break;
117
  case CT_UART:
118
    uart_init ();
119
    break;
120
  case CT_CRT:
121 855 markom
#if CRT_ENABLED
122 809 simons
    screen_init ();
123 855 markom
#endif
124
#if KBD_ENABLED
125
    kbd_init ();
126
#endif
127 809 simons
    break;
128
  case CT_SIM:
129
    break;
130
  }
131
}
132
 
133
void register_command_func (const char *name, const char *params, const char *help, int (*func)(int argc, char *argv[]))
134
{
135
  debug ("register_command '%s'\n", name);
136
  if (num_commands < MAX_COMMANDS) {
137
    command[num_commands].name = name;
138
    command[num_commands].params = params;
139
    command[num_commands].help = help;
140
    command[num_commands].func = func;
141
    num_commands++;
142
  } else printf ("Command '%s' ignored; MAX_COMMANDS limit reached\n", name);
143
}
144
 
145
/* Process command and arguments by executing
146
   specific function. */
147
void mon_command(void)
148
{
149
  char c = '\0';
150
  char str[1000];
151
  char *pstr = str;
152
  char *command_str;
153
  char *argv[20];
154
  int argc = 0;
155
 
156
  /* Show prompt */
157
#ifdef XESS
158
  printf ("\norp-xsv> ");
159
#else
160
  printf ("\nbender> ");
161
#endif
162
 
163
  /* Get characters from UART */
164
  c = getc();
165
  while (c != '\r' && c != '\f' && c != '\n')
166
  {
167
    if (c == '\b')
168
      pstr--;
169
    else
170
      *pstr++ = c;
171
    putc(c);
172
    c = getc();
173
  }
174
  *pstr = '\0';
175
  printf ("\n");
176
 
177
  /* Skip leading blanks */
178
  pstr = str;
179
  while (*pstr == ' ' && *pstr != '\0') pstr++;
180
 
181
  /* Get command from the string */
182
  command_str = pstr;
183
 
184 817 simons
  while (1) {
185 809 simons
    /* Go to next argument */
186 817 simons
    while (*pstr != ' ' && *pstr != '\0') pstr++;
187
    if (*pstr) {
188
      *pstr++ = '\0';
189
      while (*pstr == ' ') pstr++;
190
      argv[argc++] = pstr;
191
    }
192
    else
193
      break;
194 809 simons
  }
195
 
196
  {
197
    int i, found = 0;
198
    for (i = 0; i < num_commands; i++)
199
      if (strcmp (command_str, command[i].name) == 0) {
200
        switch (command[i].func (argc, &argv[0])) {
201
        case -1:
202
          printf ("Missing/wrong parameters, usage: %s %s\n", command[i].name, command[i].params);
203
          break;
204
        }
205
        found = 1;
206
        break;
207
      }
208
    if (!found) printf ("Unknown command. Type 'help' for help.\n");
209
  }
210
}
211
 
212
#if HELP_ENABLED
213
/* Displays help screen */
214
int help_cmd (int argc, char *argv[])
215
{
216
  int i;
217
  for (i = 0; i < num_commands; i++)
218
    printf ("%-10s %-20s - %s\n", command[i].name, command[i].params, command[i].help);
219
  return 0;
220
}
221
#endif /* HELP_ENABLED */
222
 
223
void module_cpu_init (void);
224
void module_memory_init (void);
225
void module_eth_init (void);
226 816 markom
void module_dhry_init (void);
227 809 simons
void module_camera_init (void);
228 816 markom
void module_load_init (void);
229 809 simons
void tick_init(void);
230
 
231
/* List of all initializations */
232
void mon_init (void)
233
{
234 816 markom
  /* Set defaults */
235
  global.erase_method = 2; /* as needed */
236 833 simons
  global.src_addr = (unsigned long)&src_addr;
237 816 markom
  global.dst_addr = FLASH_BASE_ADDR;
238 833 simons
  global.eth_add[0] = ETH_MACADDR0;
239
  global.eth_add[1] = ETH_MACADDR1;
240
  global.eth_add[2] = ETH_MACADDR2;
241
  global.eth_add[3] = ETH_MACADDR3;
242
  global.eth_add[4] = ETH_MACADDR4;
243
  global.eth_add[5] = ETH_MACADDR5;
244 817 simons
  global.ip = BOARD_DEF_IP;
245 833 simons
  global.gw_ip = BOARD_DEF_GW;
246
  global.mask = BOARD_DEF_MASK;
247 816 markom
 
248
  /* Init modules */
249 809 simons
  module_cpu_init ();
250
  module_memory_init ();
251
  module_eth_init ();
252 816 markom
  module_dhry_init ();
253 809 simons
  module_camera_init ();
254 816 markom
  module_load_init ();
255 817 simons
 
256 833 simons
  tick_init();
257 809 simons
}
258
 
259
/* Main shell loop */
260
int main(int argc, char **argv)
261
{
262 828 markom
  extern unsigned long calc_mycrc32 (void);
263 822 markom
  unsigned long t;
264 828 markom
#if 0
265 822 markom
  extern unsigned long mycrc32, mysize;
266 828 markom
#endif
267 809 simons
  /* Initialize controller */
268
  change_console_type (CT_UART);
269 829 markom
 
270
#if SELF_CHECK
271 820 markom
  printf ("Self check... ");
272 828 markom
  if ((t = calc_mycrc32 ())) printf ("FAILED!!!\n");
273 820 markom
  else printf ("OK\n");
274 829 markom
#endif /* SELF_CHECK */
275
 
276 809 simons
  mon_init ();
277
 
278
  if (HELP_ENABLED) register_command ("help", "", "shows this help", help_cmd);
279
 
280
#ifdef XESS
281
  printf ("\nORP-XSV Monitor (type 'help' for help)\n");
282
#else
283
  printf ("\nBender Monitor (type 'help' for help)\n");
284
#endif
285
 
286
  while(1) mon_command();
287
}

powered by: WebSVN 2.1.0

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