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

Subversion Repositories test-1

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

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

powered by: WebSVN 2.1.0

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