OpenCores
URL https://opencores.org/ocsvn/test-1/test-1/trunk

Subversion Repositories test-1

[/] [test-1/] [trunk/] [uart.c] - Blame information for rev 8

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

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

powered by: WebSVN 2.1.0

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