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

Subversion Repositories test-1

[/] [test-1/] [branches/] [jernejp/] [uart.c] - Blame information for rev 39

Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

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