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

Subversion Repositories or1k_old

[/] [or1k_old/] [trunk/] [orpmon/] [common/] [common.c] - Blame information for rev 812

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

powered by: WebSVN 2.1.0

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