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

Subversion Repositories vapi

[/] [vapi/] [tags/] [initial/] [uart.c] - Blame information for rev 13

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 markom
/* uart.c -- test for uart, by using VAPI
2
   Copyright (C) 2001, Marko Mlinar, markom@opencores.org
3
 
4
This file is part of OpenRISC 1000 Architectural Simulator.
5
 
6
This program is free software; you can redistribute it and/or modify
7
it under the terms of the GNU General Public License as published by
8
the Free Software Foundation; either version 2 of the License, or
9
(at your option) any later version.
10
 
11
This program is distributed in the hope that it will be useful,
12
but WITHOUT ANY WARRANTY; without even the implied warranty of
13
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
GNU General Public License for more details.
15
 
16
You should have received a copy of the GNU General Public License
17
along with this program; if not, write to the Free Software
18
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
19
 
20
/* UART messages */
21
#define TX_CMD      0xff000000
22
#define TX_CMD0     0x00000000
23
#define TX_CHAR     0x000000ff
24
#define TX_NBITS    0x00000300
25
#define TX_STOPLEN  0x00000400
26
#define TX_PARITY   0x00000800
27
#define TX_EVENP    0x00001000
28
#define TX_STICK    0x00002000
29
#define TX_BREAK    0x00004000
30
 
31
/* Send speed */
32
#define TX_CMD1     0x01000000
33
#define TX_SPEED    0x0000ffff
34
 
35
/* Send receive LCR reg */
36
#define TX_CMD2     0x02000000
37
 
38
/* Send skew */
39
#define TX_CMD3     0x03000000
40
 
41
/* Set break */
42
#define TX_CMD4     0x04000000
43
#define TX_CMD4_BREAK 0x00010000
44
#define TX_CMD4_DELAY 0x0000ffff
45
 
46
/* Check FIFO */
47
#define TX_CMD5     0x05000000
48
#define TX_CMD5_FIFOFULL 0x0000001
49
 
50
#define RX_CMD0     0x00000000
51
#define RX_PARERR   0x00010000
52
#define RX_FRAERR   0x00020000
53
 
54
/* fails if x is false */
55
#define ASSERT(x) ((x)?1:fail (__FUNCTION__, __LINE__))
56
#define MARK() printf ("Passed line %i\n", __LINE__)
57
#define VAPI_READ(x) {unsigned long r = vapi_read (); printf ("expected 0x%08x, read 0x%08x\n", r, (x)); ASSERT(r == (x));}
58
 
59
#ifndef __LINE__
60
#define __LINE__  0
61
#endif
62
 
63
void fail (char *func, int line)
64
{
65
#ifndef __FUNCTION__
66
#define __FUNCTION__ "?"
67
#endif
68
  printf ("Test failed in %s:%i\n", func, line);
69
  exit (1);
70
}
71
char str[5000];
72
 
73
/* current comm. control bits */
74
int control, control_rx;
75
 
76
void recv_char (char c)
77
{
78
  unsigned long tmp = vapi_read ();
79
  printf ("expected %08x, read %08x\n", control_rx | c, tmp);
80
  /* test if something is wrong */
81
  ASSERT ((tmp & 0xffffff00) == control_rx);
82
  tmp &= 0xff;
83
  if (tmp) printf ("'%c'\n", (char)tmp);
84
  else printf ("\\0\n");
85
  printf ("expected %02x, read %02x\n", c, tmp);
86
  ASSERT (c == (char)tmp);
87
}
88
 
89
void send_char (char c)
90
{
91
  vapi_write (c | (control & 0xffffff00));
92
}
93
 
94
char *read_string (char *s)
95
{
96
  char *t = s;
97
  unsigned long tmp = 1;
98
  while (tmp) {
99
    tmp = vapi_read ();
100
    printf ("%08x, %08x\n", tmp, control_rx);
101
    /* test if something is wrong */
102
    ASSERT ((tmp & 0xffffff00) == control_rx);
103
    tmp &= 0xff;
104
    if (tmp) printf ("'%c'\n", (char)tmp);
105
    else printf ("\\0\n");
106
    *(t++) = (char)tmp;
107
  }
108
  return s;
109
}
110
 
111
 
112
void compare_string (char *s) {
113
  while (*s) {
114
    unsigned long tmp = vapi_read ();
115
    /* test if something is wrong */
116
    ASSERT (tmp == (control_rx | *s));
117
    tmp &= 0xff;
118
    if (tmp) printf ("'%c'\n", (char)tmp);
119
    else printf ("\\0\n");
120
    s++;
121
  }
122
}
123
 
124
void send_string (char *s)
125
{
126
  while (*s)
127
    vapi_write (*(s++) | (control & 0xffffff00));
128
}
129
 
130
void init_8n1 ()
131
{
132
  vapi_write(TX_CMD1 | 2); /* Set tx/rx speed */
133
  control = control_rx = TX_CMD0 | TX_NBITS;
134
  vapi_write(TX_CMD2 | control_rx); /* Set rx mode */
135
}
136
 
137
void test_registers ()
138
{
139
  /* This test is performed just by cpu, if it is not stopped, we have an error.  */
140
  printf ("Testing registers... ");
141
  MARK();
142
}
143
 
144
void send_recv_test ()
145
{
146
  printf ("send_recv_test\n");
147
  MARK();
148
  read_string (str);
149
  MARK();
150
  printf ("OK\nread: %s\n",str);
151
  ASSERT (strcmp (str, "send_test_is_running") == 0);
152
  send_string ("recv");
153
  MARK();
154
  printf ("OK\n");
155
}
156
 
157
void break_test ()
158
{
159
  printf ("break_test\n");
160
  /* receive a break */
161
  VAPI_READ (TX_BREAK);
162
  MARK();
163
  vapi_write (control | '*');
164
  MARK();
165
  VAPI_READ (control | '!');
166
  MARK();
167
 
168
  /* send a break */
169
  vapi_write (TX_CMD4 | TX_CMD4_BREAK | (0) & TX_CMD4_DELAY);
170
  vapi_write (control | 'b');
171
  MARK();
172
  VAPI_READ (control | '#');
173
  MARK();
174
  vapi_write (TX_CMD4 | (0) & TX_CMD4_DELAY);
175
  vapi_write (control | '$');
176
  MARK();
177
 
178
  /* Receive a breaked string "ns<brk>*", only "ns" should be received.  */
179
  compare_string ("ns");
180
  VAPI_READ (TX_BREAK);
181
  send_string ("?");
182
  MARK();
183
 
184
  /* Send a break */
185
  VAPI_READ (control | '#');
186
  vapi_write(TX_CMD4 | TX_CMD4_BREAK | (5 & TX_CMD4_DELAY));
187
  vapi_write (control | 0);
188
  /* Wait four chars */
189
  send_string ("234");
190
  MARK();
191
  /* FIFO should be empty */
192
  vapi_write(TX_CMD5);
193
  send_string ("5");
194
  /* FIFO should be nonempty and */
195
  vapi_write(TX_CMD5 | TX_CMD5_FIFOFULL);
196
  MARK();
197
  /* it should contain '?' */
198
  VAPI_READ ('?' | control);
199
  /* Reset break signal*/
200
  vapi_write(TX_CMD4 | (0) & TX_CMD4_DELAY);
201
  MARK();
202
  vapi_write ('!' | control);
203
  printf ("OK\n");
204
}
205
 
206
/* Tries to send data in different modes in both directions */
207
 
208
/* Utility function, that tests current configuration */
209
void test_mode (int nbits)
210
{
211
  unsigned mask = (1 << nbits) - 1;
212
  recv_char ('U' & mask); //0x55
213
#if DETAILED
214
  recv_char ('U' & mask); //0x55
215
  send_char ('U');        //0x55  
216
#endif
217
  send_char ('U');        //0x55
218
  recv_char ('a' & mask); //0x61
219
#if DETAILED
220
  recv_char ('a' & mask); //0x61
221
  send_char ('a');        //0x61
222
#endif
223
  send_char ('a');        //0x61
224
}
225
 
226
void different_modes_test ()
227
{
228
  int speed, length, parity;
229
  printf ("different modes test\n");
230
  /* Init */
231
  /* Test different speeds */
232
  for (speed = 1; speed < 5; speed++) {
233
    vapi_write(TX_CMD1 | speed); /* Set tx/rx speed */
234
    control_rx = control = 0x03 << 8;    /* 8N1 */
235
    vapi_write(TX_CMD2 | control_rx); /* Set rx mode */
236
    test_mode (8);
237
    MARK();
238
  }
239
  MARK();
240
 
241
  vapi_write(TX_CMD1 | 1); /* Set tx/rx speed */
242
  MARK();
243
 
244
  /* Test all parity modes with different char lengths */
245
  for (parity = 0; parity < 8; parity++)
246
    for (length = 0; length < 4; length++) {
247
      control_rx = control = (length | (0 << 2) | (parity << 3)) << 8;
248
      vapi_write(TX_CMD2 | control_rx);
249
      test_mode (5 + length);
250
      MARK();
251
    }
252
  MARK();
253
 
254
  /* Test configuration, if we have >1 stop bits */
255
  for (length = 0; length < 4; length++) {
256
    control_rx = control = (length | (1 << 2) | (0 << 3)) << 8;
257
    vapi_write(TX_CMD2 | control_rx);
258
    test_mode (5 + length);
259
    MARK();
260
  }
261
  MARK();
262
 
263
  /* Restore normal mode */
264
  recv_char ('T'); /* Wait for acknowledge */
265
  vapi_write(TX_CMD1 | 2); /* Set tx/rx speed */
266
  control_rx = control = 0x03 << 8;    /* 8N1 @ 2*/
267
  vapi_write(TX_CMD2 | control_rx); /* Set rx mode */
268
  recv_char ('T'); /* Wait for acknowledge before ending the test */
269
  MARK();
270
  printf ("OK\n");
271
}
272
 
273
/* Test various FIFO levels, break and framing error interrupt, etc */
274
 
275
void interrupt_test ()
276
{
277
  int i;
278
  vapi_write(TX_CMD1 | 6); /* Set tx/rx speed */
279
  printf ("interrupt_test\n");
280
  /* start interrupt test */
281
  recv_char ('I'); /* Test trigger level 1 */
282
  send_char ('0');
283
 
284
  recv_char ('I'); /* Test trigger level 4 */
285
  send_char ('1');
286
  send_char ('2');
287
  send_char ('3');
288
  send_char ('4');
289
 
290
  recv_char ('I'); /* Test trigger level 8 */
291
  send_char ('5');
292
  send_char ('6');
293
  send_char ('7');
294
  send_char ('8');
295
  send_char ('9');
296
 
297
  recv_char ('I'); /* Test trigger level 14 */
298
  send_char ('a');
299
  send_char ('b');
300
  send_char ('c');
301
  send_char ('d');
302
  send_char ('e');
303
  send_char ('f');
304
  send_char ('g');
305
 
306
  recv_char ('I'); /* Test OE */
307
  send_char ('h');
308
  send_char ('i');
309
  send_char ('j');
310
  send_char ('*'); /* should not be put in the fifo */
311
 
312
  recv_char ('I'); /* test break interrupt */
313
  /* send a break */
314
  vapi_write (TX_CMD4 | TX_CMD4_BREAK | (0) & TX_CMD4_DELAY);
315
  vapi_write (control | 'b');
316
  MARK();
317
  recv_char ('B'); /* Release break */
318
  MARK();
319
  vapi_write (TX_CMD4 | (0) & TX_CMD4_DELAY);
320
  vapi_write (control | '$');
321
  MARK();
322
 
323
  /* TODO: Check for parity error */
324
  /* TODO: Check for frame error */
325
 
326
  /* Check for timeout */
327
  recv_char ('I');
328
  send_char ('T'); /* Send char -> timeout should occur */
329
  recv_char ('T'); /* Wait for acknowledge before changing configuration */
330
  MARK ();
331
 
332
  /* Restore previous mode */
333
  vapi_write(TX_CMD1 | 2); /* Set tx/rx speed */
334
  control = control_rx = TX_CMD0 | TX_NBITS;
335
  vapi_write(TX_CMD2 | control_rx); /* Set rx mode */
336
  recv_char ('T'); /* Wait for acknowledge before ending the test */
337
  printf ("OK\n");
338
}
339
 
340
/* Test if all control bits are set correctly.  Lot of this was already tested
341
   elsewhere and tests are not duplicated.  */
342
 
343
void control_register_test ()
344
{
345
  printf ("control_register_test\n");
346
  recv_char ('*');
347
  send_char ('*');
348
  MARK ();
349
  recv_char ('!');
350
  send_char ('!');
351
  MARK ();
352
 
353
  recv_char ('1');
354
  recv_char ('*');
355
  send_char ('*');
356
  printf ("OK\n");
357
}
358
 
359
void line_error_test ()
360
{
361
  vapi_write(TX_CMD2 | control_rx); /* Set rx mode */
362
  recv_char ('c');
363
  vapi_write(TX_CMD1 | 3); /* Set incorrect tx/rx speed */
364
  send_char ('a');
365
  vapi_write(TX_CMD1 | 2); /* Set correct tx/rx speed */
366
  send_char ('b');
367
  MARK ();
368
 
369
#if COMPLETE
370
  recv_char ('*');
371
  control = TX_CMD0 | TX_NBITS;
372
  control_rx = TX_CMD0 | TX_NBITS | TX_STOPLEN;
373
  vapi_write(TX_CMD2 | control_rx); /* Set rx mode */
374
  recv_char ('*');
375
  MARK ();
376
#endif
377
}
378
 
379
int vapi_main ()
380
{
381
 
382
  /* Test section area */
383
  test_registers ();
384
  init_8n1 ();
385
/*  send_recv_test ();
386
  break_test();
387
  different_modes_test ();
388
  interrupt_test ();
389
  control_register_test ();*/
390
  line_error_test ();
391
  /* End of test section area */
392
 
393
  send_char ('@');
394
  return 0;
395
}

powered by: WebSVN 2.1.0

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