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

Subversion Repositories or1k

[/] [or1k/] [tags/] [nog_patch_47/] [or1ksim/] [testbench/] [acv_uart.c] - Blame information for rev 423

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

Line No. Rev Author Line
1 344 markom
/* UART test using ACV */
2
 
3
#include "spr_defs.h"
4
#include "support.h"
5
 
6 396 markom
/* use this macro to comment out nonworking parts */
7
#define COMPLETE    0
8
 
9 409 markom
/* Whether to do test in more detail */
10
#define DETAILED    0
11
 
12 344 markom
#define UART_ADDR   (0x9c000000)
13
#define UART_RBR    (UART_ADDR + 0)
14
#define UART_THR    (UART_ADDR + 0)
15
#define UART_IER    (UART_ADDR + 1)
16
#define UART_IIR    (UART_ADDR + 2)
17
#define UART_FCR    (UART_ADDR + 2)
18
#define UART_LCR    (UART_ADDR + 3)
19
#define UART_MCR    (UART_ADDR + 4)
20
#define UART_LSR    (UART_ADDR + 5)
21
#define UART_MSR    (UART_ADDR + 6)
22 411 markom
#define UART_SCR    (UART_ADDR + 7)
23 344 markom
 
24
#define UART_DLL    (UART_ADDR + 0)
25
#define UART_DLH    (UART_ADDR + 1)
26
 
27 355 markom
#define LCR_DIVL    (0x80)
28
#define LCR_BREAK   (0x40)
29
#define LCR_STICK   (0x20)
30
#define LCR_EVENP   (0x10)
31
#define LCR_PAREN   (0x08)
32
#define LCR_NSTOP   (0x04)
33
#define LCR_NBITS   (0x03)
34 344 markom
 
35 355 markom
#define LSR_DR      (0x01)
36
#define LSR_OE      (0x02)
37
#define LSR_PE      (0x04)
38
#define LSR_FE      (0x08)
39
#define LSR_BREAK   (0x10)
40
#define LSR_TXFE    (0x20)
41
#define LSR_TXE     (0x40)
42
#define LSR_ERR     (0x80)
43
 
44 423 markom
#define UART_INT_LINE 15 /* To which interrupt is uart connected */
45 409 markom
 
46 344 markom
/* fails if x is false */
47
#define ASSERT(x) ((x)?1: fail (__FUNCTION__, __LINE__))
48
/* Waits a few cycles that uart can prepare its data */
49
#define WAIT() {asm ("l.nop");asm ("l.nop");asm ("l.nop");asm ("l.nop");}
50
/* fails if there is an error */
51 355 markom
#define NO_ERROR() { unsigned x = getreg (UART_LSR); if ((x & (LSR_BREAK|LSR_FE|LSR_PE|LSR_OE)) && !(x & LSR_ERR)) \
52 411 markom
printf ("LSR7 (0x%02x) ERR @ %i\n", x, __LINE__); ASSERT(!(x & LSR_ERR) && ((x & 0x60) != 0x40));}
53 409 markom
#define MARK() printf ("Passed line %i\n", __LINE__)
54 344 markom
 
55 355 markom
#ifndef __LINE__
56
#define __LINE__  0
57
#endif
58
 
59 344 markom
void fail (char *func, int line)
60
{
61
#ifndef __FUNCTION__
62
#define __FUNCTION__ "?"
63
#endif
64
  printf ("Test failed in %s:%i\n", func, line);
65 376 markom
  report(0xeeeeeeee);
66 344 markom
  exit (1);
67
}
68
 
69
inline void setreg (unsigned long addr, unsigned char value)
70
{
71
  *((volatile unsigned char *)addr) = value;
72
}
73
 
74
inline unsigned long getreg (unsigned long addr)
75
{
76
  return *((volatile unsigned char *)addr);
77
}
78
 
79 409 markom
static volatile int int_cnt = 0;
80
static volatile unsigned int_iir = 0;
81
static volatile unsigned int_lsr = 0;
82
static int int_rbr = 0;
83
 
84 344 markom
void interrupt_handler ()
85
{
86 409 markom
  unsigned x;
87 344 markom
  printf ("Int\n");
88 409 markom
  report(0xdeaddead);
89
  report(int_iir = getreg (UART_IIR));
90
  report(int_lsr = getreg (UART_LSR));
91
  int_cnt++;
92
  ASSERT (int_iir != 1);
93
  switch (int_iir & 0xf) {
94
    case 0x6: printf ("Receiver LS int.\n"); break;
95
    case 0x4: printf ("Received Data available. Expecting %02x, received %02x\n",
96
                        int_rbr, x = getreg(UART_RBR));
97
              ASSERT (x == int_rbr);
98
              report (x);
99
              report (int_rbr);
100
              break;
101
    case 0xc: printf ("Character timeout. Expecting %02x, received %02x\n",
102
                        int_rbr, x = getreg(UART_RBR));
103
              ASSERT (x == int_rbr);
104
              report (x);
105
              report (int_rbr);
106
              break;
107
    case 0x2: printf ("THR empty.\n"); break;
108
    case 0x0: printf ("Modem Status.\n"); break;
109
    default:
110
      printf ("Invalid iir @ %i\n", __LINE__);
111
      exit (1);
112
  }
113
  mtspr(SPR_PICSR, 0);
114 344 markom
}
115
 
116 409 markom
/* Receives a char and checks for errors */
117
 
118
void recv_char (int ch)
119
{
120
  unsigned x;
121
  char r;
122
  report (ch);
123
  /* Wait for rx fifo to be  */
124
  while (!((x = getreg (UART_LSR)) & LSR_DR));
125
  if ((x & (LSR_BREAK|LSR_FE|LSR_PE|LSR_OE)) && !(x & LSR_ERR)) printf ("LSR7 (0x%02x) ERR @ recv_char\n", x);
126
  ASSERT(!(x & LSR_ERR));
127
 
128
  printf ("expected %02x, read %02x\n", ch, r = getreg (UART_RBR));
129
  ASSERT (r == ch); /* compare character */
130
}
131
 
132
/* Sends a char and checks for errors */
133
 
134
void send_char (int ch)
135
{
136
  report (ch);
137
  while (!(getreg (UART_LSR) & LSR_TXFE));
138
  NO_ERROR();
139
  setreg (UART_THR, ch); /* send character */
140
  NO_ERROR();
141
}
142
 
143
void init_8n1 ()
144
{
145
  setreg (UART_IER, 0x00); /* disable interrupts */
146
  WAIT();
147
  ASSERT(getreg (UART_IIR) == 0xc1); /* nothing should be happening */
148
  setreg (UART_FCR, 0x07);      /* clear RX and TX FIFOs */
149
  setreg (UART_LCR, LCR_DIVL);
150
  setreg (UART_DLH, 2 >> 8);
151
  setreg (UART_DLL, 2 & 0xff);
152
  setreg (UART_LCR, 0x03);    /* 8N1 @ 2 */
153
  ASSERT(getreg (UART_LCR) == 0x03);
154
  ASSERT (!(getreg (UART_LSR) & 0x1f));
155
}
156
 
157 344 markom
/* Test reset values and r/w properties of some registers */
158
 
159
void register_test ()
160
{
161
  printf ("register test\n");
162 409 markom
  MARK();
163 344 markom
  { /* test reset values */
164
    ASSERT(getreg (UART_RBR) == 0x00); //0
165
    ASSERT(getreg (UART_IER) == 0x00); //1
166
    ASSERT(getreg (UART_IIR) == 0xc1); //2
167
    ASSERT(getreg (UART_LCR) == 0x03); //3
168
    ASSERT(getreg (UART_MCR) == 0x00); //4
169 396 markom
#if COMPLETE
170
    ASSERT(getreg (UART_LSR) == 0x60); //5
171
    ASSERT(getreg (UART_MSR) == 0x00); //6
172
#endif
173 411 markom
    ASSERT(getreg (UART_SCR) == 0x00); //7
174 344 markom
 
175 355 markom
    setreg(UART_LCR, LCR_DIVL); //enable latches
176 344 markom
    ASSERT(getreg (UART_DLL) == 0x00); //0
177
    ASSERT(getreg (UART_DLH) == 0x00); //1
178
    setreg(UART_LCR, 0x00); //disable latches
179
  }
180
 
181 396 markom
#if COMPLETE
182 409 markom
  MARK();
183 344 markom
  { /* test if status registers are read only */
184 396 markom
    unsigned long tmp;
185 344 markom
    int i;
186
    tmp = getreg (UART_LSR);
187
    setreg (UART_LSR, ~tmp);
188
    ASSERT(getreg (UART_LSR) == tmp);
189
 
190
    for (i = 0; i < 9; i++) {
191 371 markom
      setreg (UART_LSR, 1 << i);
192 344 markom
      ASSERT(getreg (UART_LSR) == tmp);
193
    }
194 396 markom
 
195
    tmp = getreg (UART_MSR);
196 344 markom
    setreg (UART_MSR, ~tmp);
197
    ASSERT(getreg (UART_MSR) == tmp);
198
 
199
    for (i = 0; i < 9; i++) {
200 371 markom
      setreg (UART_MSR, 1 << i);
201 344 markom
      ASSERT(getreg (UART_MSR) == tmp);
202 396 markom
    }
203 344 markom
  }
204 396 markom
#endif
205
 
206 409 markom
  MARK();
207 344 markom
  { /* test whether MCR is write only, be careful not to set the loopback bit */
208 396 markom
#if COMPLETE
209
    ASSERT(getreg (UART_MCR) == 0x00);
210 344 markom
    setreg (UART_MCR, 0x45);
211
    ASSERT(getreg (UART_MCR) == 0x00);
212
    setreg (UART_MCR, 0xaa);
213 396 markom
    ASSERT(getreg (UART_MCR) == 0x00);
214
#endif
215 344 markom
  }
216
  ASSERT (!(getreg (UART_LSR) & 0x1f));
217 409 markom
  MARK();
218 344 markom
  { /* Test if Divisor latch byte holds the data */
219
    int i;
220 355 markom
    setreg(UART_LCR, LCR_DIVL); //enable latches
221
    ASSERT(getreg (UART_LCR) == LCR_DIVL);
222 344 markom
    for (i = 0; i < 16; i++) {
223
      unsigned short tmp = 0xdead << i;
224
      setreg (UART_DLH, tmp >> 8);
225
      setreg (UART_DLL, tmp & 0xff);
226
      ASSERT(getreg (UART_DLL) == (tmp & 0xff)); //0
227
      ASSERT(getreg (UART_DLH) == (tmp >> 8)); //1
228
    }
229
    ASSERT (!(getreg (UART_LSR) & 0x1f));
230
    for (i = 0; i < 16; i++) {
231
      unsigned short tmp = 0xdead << i;
232
      setreg (UART_DLL, tmp >> 8);
233
      setreg (UART_DLH, tmp & 0xff);
234
      ASSERT(getreg (UART_DLL) == (tmp >> 8)); //1
235
      ASSERT(getreg (UART_DLH) == (tmp & 0xff)); //0
236
    }
237
    setreg(UART_LCR, 0x00); //disable latches
238
    ASSERT(getreg (UART_LCR) == 0x00);
239
    ASSERT (!(getreg (UART_LSR) & 0x1f));
240
  }
241 409 markom
  MARK();
242 344 markom
  { /* Test LCR, if it holds our data */
243
    int i;
244
    for (i = 0; i < 6; i++) {
245
      unsigned short tmp = (0xde << i) & 0x3f;
246
      setreg (UART_LCR, tmp);
247
      ASSERT(getreg (UART_LCR) == tmp);
248
    }
249
    ASSERT (!(getreg (UART_LSR) & 0x1f));
250
  }
251 411 markom
  MARK ();
252
 
253
  { /* SCR Test :))) */
254
    int i;
255
    setreg (UART_SCR, 0);
256
    ASSERT (getreg (UART_SCR) == 0);
257
    setreg (UART_SCR, 0xff);
258
    ASSERT (getreg (UART_SCR) == 0xff);
259
    for (i = 0; i < 16; i++) {
260
      unsigned char tmp = 0xdead << i;
261
      setreg (UART_SCR, tmp);
262
      ASSERT (getreg (UART_SCR) == tmp);
263
    }
264
  }
265 409 markom
  MARK();
266 344 markom
  /* Other registers will be tested later, if they function correctly,
267
     since we cannot test them now, without destroying anything.  */
268
}
269
 
270
/* Initializes uart and sends a few bytes to VAPI. It is then activated and send something back. */
271
 
272
void send_recv_test ()
273
{
274
  char *s;
275 411 markom
  printf ("send_recv_test\n");
276 344 markom
  /* Init */
277 409 markom
  MARK();
278 344 markom
 
279 355 markom
  //printf ("basic\n");
280
  ASSERT (!(getreg (UART_LSR) & LSR_DR));
281 409 markom
  MARK();
282 344 markom
 
283
  /* Send a string */
284
  s = "send_";
285
  while (*s) {
286
    /* Wait for tx fifo to be empty */
287 409 markom
    send_char (*s);
288 371 markom
    report((unsigned long)*s);
289 344 markom
    s++;
290
  }
291 355 markom
  ASSERT (!(getreg (UART_LSR) & LSR_DR));
292 344 markom
  s = "test_";
293
  while (*s) {
294
    /* Wait for tx fifo and tx to be empty */
295 355 markom
    while (!(getreg (UART_LSR) & LSR_TXE));
296 344 markom
    NO_ERROR();
297
    setreg (UART_THR, *s); /* send character */
298
    NO_ERROR();
299
    s++;
300
  }
301 355 markom
  ASSERT (!(getreg (UART_LSR) & LSR_DR));
302 409 markom
  MARK();
303 344 markom
 
304
  /* Send characters with delay inbetween */
305
  s = "is_running";
306
  while (*s) {
307
    int i;
308 409 markom
    send_char (*s);
309 371 markom
// igor   for (i = 0; i < 1600; i++) /* wait at least ten chars before sending next one */
310 396 markom
    for (i = 0; i < 16; i++) /* wait at few chars before sending next one */
311 344 markom
      asm volatile ("l.nop");
312
    s++;
313
  }
314
 
315 409 markom
  send_char (0); /* send terminate char */
316
  MARK();
317 355 markom
 
318 344 markom
  /* Receives and compares the string */
319 409 markom
  s = "recv";
320
  while (*s) recv_char (*s++);
321
  MARK();
322 355 markom
  printf ("OK\n");
323 344 markom
}
324
 
325 355 markom
/* sends break in both directions */
326
 
327
void break_test ()
328
{
329 409 markom
  unsigned x;
330 355 markom
  char *s;
331 411 markom
  printf ("break_test\n");
332 355 markom
 
333 409 markom
  MARK();
334
  /* Send a break */
335 355 markom
  NO_ERROR();
336 409 markom
  MARK();
337
  setreg (UART_LCR, 0x03 | LCR_BREAK); /* 8N1 */
338
  MARK();
339
  send_char ('b'); /* make sure it is recognised as a break */
340
  send_char ('b');
341
  send_char ('b');
342
  send_char ('b');
343
  MARK();
344
  recv_char ('*');
345
  setreg (UART_LCR, 0x03); /* deleting break bit, 8N1 */
346
  MARK();
347
 
348
  /* Receive a break */
349
  send_char ('!');
350
  MARK();
351
  while (!((x = getreg (UART_LSR)) & LSR_DR));
352
  /* we should receive zero character with broken frame and break bit should be set */
353 423 markom
  printf("[%x]\n", (LSR_DR | LSR_BREAK | LSR_ERR | LSR_TXFE | LSR_TXE));
354
  ASSERT (x == (LSR_DR | LSR_BREAK | LSR_ERR | LSR_TXFE | LSR_TXE));
355 409 markom
  ASSERT (getreg (UART_RBR) == 0);
356
  MARK();
357
 
358
  /* Send a # to release break */
359
  setreg (UART_THR, '#');
360
  while (!(getreg (UART_LSR) & LSR_DR));
361
  NO_ERROR(); /* BREAK bit should be cleared now  */
362
  ASSERT (getreg (UART_RBR) == '$');
363
  MARK();
364 355 markom
 
365
  /* Break while sending characters */
366 409 markom
  s = "ns";
367
  while (*s) send_char (*s++);
368 355 markom
  ASSERT (!(getreg (UART_LSR) & LSR_DR));
369 409 markom
  while (!(getreg (UART_LSR) & LSR_TXE)); /* Wait till we send everything */
370 361 markom
  /* this should break the * char, so it should not be received */
371 355 markom
  setreg (UART_THR, '*');
372 409 markom
  setreg (UART_LCR, 0x3 | LCR_BREAK);
373
  MARK();
374
 
375
  /* Drop the break, when we get acknowledge */
376
  recv_char ('?');
377
  setreg (UART_LCR, 0x3);
378 355 markom
  NO_ERROR();
379 409 markom
  MARK();
380 355 markom
 
381 409 markom
  /* Receive a break */
382
  send_char ('#');
383
  while (!((x = getreg (UART_LSR)) & LSR_DR));
384
  /* we should receive zero character with broken frame and break bit
385
     should not be set, because we cleared it */
386 423 markom
  printf("[%x:%x]\n", x, (LSR_DR | LSR_BREAK |LSR_ERR | LSR_TXFE | LSR_TXE));
387
  ASSERT (x == (LSR_DR | LSR_BREAK |LSR_ERR | LSR_TXFE | LSR_TXE));
388 409 markom
  ASSERT (getreg (UART_RBR) == 0);
389
  MARK();
390
  send_char ('?');
391
  MARK();
392
  while (!(getreg (UART_LSR) & LSR_DR));
393
  recv_char ('!');
394
  printf ("OK\n");
395
}
396
 
397
/* Tries to send data in different modes in both directions */
398
 
399
/* Utility function, that tests current configuration */
400
void test_mode (int nbits)
401
{
402
  unsigned mask = (1 << nbits) - 1;
403
  send_char (0x55);
404
#if DETAILED
405
  send_char (0x55);
406
  recv_char (0x55 & mask);
407
#endif
408
  recv_char (0x55 & mask);
409
  send_char ('a');                  // 0x61
410
#if DETAILED
411
  send_char ('a');                  // 0x61
412
  recv_char ('a' & mask);
413
#endif
414
  recv_char ('a' & mask);
415
}
416
 
417
void different_modes_test ()
418
{
419
  int speed, parity, length;
420 411 markom
  printf ("different modes test\n");
421 409 markom
  init_8n1();
422
 
423
  /* Init */
424
  MARK();
425
  ASSERT(getreg (UART_IIR) == 0xc1); /* nothing should be happening */
426
  MARK();
427
 
428
  /* Test different speeds */
429
  for (speed = 1; speed < 5; speed++) {
430
    setreg (UART_LCR, LCR_DIVL);
431
    setreg (UART_DLH, speed >> 8);
432
    setreg (UART_DLL, speed & 0xff);
433
    setreg (UART_LCR, 0x03);    /* 8N1 @ 10 => 160 instructions for one cycle */
434
    test_mode (8);
435
    MARK();
436 355 markom
  }
437 409 markom
  MARK();
438
 
439
  setreg (UART_LCR, LCR_DIVL);
440
  setreg (UART_DLH, 1 >> 8);
441
  setreg (UART_DLL, 1 & 0xff);
442
  MARK();
443
 
444
  /* Test all parity modes with different char lengths */
445
  for (parity = 0; parity < 8; parity++)
446
    for (length = 0; length < 4; length++) {
447
      setreg (UART_LCR, length | (0 << 2) | (parity << 3));
448
      test_mode (5 + length);
449
      MARK();
450
    }
451
  MARK();
452
 
453
  /* Test configuration, if we have >1 stop bits */
454
  for (length = 0; length < 4; length++) {
455
    setreg (UART_LCR, length | (1 << 2) | (0 << 3));
456
    test_mode (5 + length);
457
    MARK();
458
  }
459
  MARK();
460
 
461
  /* Restore normal mode */
462 411 markom
  send_char ('T');
463
  while (getreg (UART_LSR) != 0x60); /* Wait for THR to be empty */
464 409 markom
  setreg (UART_LCR, LCR_DIVL);
465
  setreg (UART_DLH, 2 >> 8);
466
  setreg (UART_DLL, 2 & 0xff);
467
  setreg (UART_LCR, 0x03);    /* 8N1 @ 2 */
468
  MARK();
469 423 markom
  while (!(getreg (UART_LSR) & 1));  /* Receive 'x' char */
470
  getreg (UART_RBR);
471
  MARK();
472 411 markom
 
473
  send_char ('T');
474
  while (getreg (UART_LSR) != 0x60); /* Wait for THR to be empty */
475
  MARK();
476 355 markom
  printf ("OK\n");
477
}
478
 
479 409 markom
/* Test various FIFO levels, break and framing error interrupt, etc */
480
 
481
void interrupt_test ()
482 344 markom
{
483 409 markom
  int i;
484 411 markom
  printf ("interrupt_test\n");
485 409 markom
  /* Configure UART for interrupt mode */
486
  ASSERT(getreg (UART_IIR) == 0xc1); /* nothing should be happening */
487
  setreg (UART_LCR, LCR_DIVL);
488
  setreg (UART_DLH, 6 >> 8);            /* Set relatively slow speed, so we can hanlde interrupts properly */
489
  setreg (UART_DLL, 6 & 0xff);
490 411 markom
  setreg (UART_LCR, 0x03);    /* 8N1 @ 6 */
491 409 markom
 
492 423 markom
  ASSERT (int_cnt == 0);   /* We should not have got any interrupts before this test */
493 409 markom
  setreg (UART_IER, 0x07); /* Enable interrupts: line status, THR empty, data ready */
494
  setreg (UART_FCR, 0x01); /* Set trigger level = 1 char, fifo should not be reset */
495
  MARK();
496 423 markom
 
497
#if 0  
498
  while (!int_cnt); /* Clear previous THR interrupt */
499
  ASSERT (--int_cnt == 0);
500
  ASSERT (int_iir == 0xc2);
501
  ASSERT ((int_lsr & 0xbe) == 0x20);
502
  MARK();
503
#endif
504
 
505 409 markom
  /* I am configured - start interrupt test */
506
  send_char ('I');
507
  while (!int_cnt); /* Wait for THR to be empty */
508
  ASSERT (--int_cnt == 0);
509
  ASSERT (int_iir == 0xc2);
510
  ASSERT ((int_lsr & 0xbe) == 0x20);
511
  MARK();
512
 
513
  int_rbr = '0';
514
  while (!int_cnt); /* Wait for DR */
515
  ASSERT (--int_cnt == 0);
516
  ASSERT (int_iir == 0xc4);
517
  ASSERT (int_lsr == 0x61);
518
  ASSERT (int_cnt == 0); /* no interrupts should be pending */
519
  MARK();
520
 
521
  setreg (UART_FCR, 0x41); /* Set trigger level = 4 chars, fifo should not be reset */
522
 
523
  /* Everything ok here, send me 4 more */
524
  send_char ('I');
525
  while (!int_cnt); /* Wait for THR to be empty */
526
  ASSERT (--int_cnt == 0);
527
  ASSERT (int_iir == 0xc2);
528
  ASSERT ((int_lsr & 0xbe) == 0x20);
529
  MARK();
530
 
531
  int_rbr = '1';
532
  while (!int_cnt); /* Wait for DR */
533
  ASSERT (--int_cnt == 0);
534
  ASSERT (int_iir == 0xc4);
535
  ASSERT (int_lsr == 0x61);
536
  MARK();
537
 
538
  setreg (UART_FCR, 0x81); /* Set trigger level = 8 chars, fifo should not be reset */
539
 
540
  /* Everything ok here, send me 5 more */
541
  send_char ('I');
542
  while (!int_cnt); /* Wait for THR to be empty */
543
  ASSERT (--int_cnt == 0);
544
  ASSERT (int_iir == 0xc2);
545
  ASSERT ((int_lsr & 0xbe) == 0x20);
546
  MARK();
547
 
548
  int_rbr = '2';
549
  while (!int_cnt); /* Wait for DR */
550
  ASSERT (--int_cnt == 0);
551
  ASSERT (int_iir == 0xc4);
552
  ASSERT (int_lsr == 0x61);
553
  MARK();
554
 
555
  setreg (UART_FCR, 0xc1); /* Set trigger level = 14 chars, fifo should not be reset */
556
 
557
  /* Everything ok here, send me 7 more */
558
  send_char ('I');
559
  while (!int_cnt); /* Wait for THR to be empty */
560
  ASSERT (--int_cnt == 0);
561
  ASSERT (int_iir == 0xc2);
562
  ASSERT ((int_lsr & 0xbe) == 0x20);
563
  MARK();
564
 
565
  int_rbr = '3';
566
  while (!int_cnt); /* Wait for DR */
567
  ASSERT (--int_cnt == 0);
568
  ASSERT (int_iir == 0xc4);
569
  ASSERT (int_lsr == 0x61);
570
  MARK();
571
 
572
  /* Everything ok here, send me 4 more - fifo should be full OE should occur */
573
  setreg (UART_IER, 0x06); /* Enable interrupts: line status, THR empty */
574
  send_char ('I');
575
  while (!int_cnt); /* Wait for THR to be empty */
576
  ASSERT (--int_cnt == 0);
577
  ASSERT (int_iir == 0xc2);
578
  ASSERT ((int_lsr & 0xbe) == 0x20);
579
  MARK();
580
 
581
  while (!int_cnt); /* Wait for OE */
582
  ASSERT (--int_cnt == 0);
583
  ASSERT (int_iir == 0xc6);
584
  ASSERT (int_lsr == 0xe3);           /* OE flag should be set */
585
  ASSERT (getreg (UART_LSR) == 0x61); /* LSR should be cleared by previous read */
586
  ASSERT (getreg (UART_IIR) == 0xc1); /* No interrupts should be pending */
587
  MARK();
588
 
589
  /* Check if we got everything */
590
  ASSERT (int_cnt == 0); /* no interrupts should be pending */
591
  for (i = 0; i < 3; i++) {
592
    recv_char ("456"[i]);   /* WARNING: read should not cause interrupt even if we step over trigger */
593
    MARK ();
594
  }
595
  /* It is now safe to enable data ready interrupt */
596
  setreg (UART_IER, 0x07); /* Enable interrupts: line status, THR empty, data ready */
597
 
598
  /* Check if we got everything */
599
  for (i = 0; i < 13; i++) {
600
    recv_char ("789abcdefghij"[i]);   /* WARNING: read should not cause interrupt even if we step over trigger */
601
    MARK ();
602
  }
603
 
604
  ASSERT (int_cnt == 0); /* no interrupts should be pending */
605
  ASSERT (getreg (UART_LSR) == 0x60); /* FIFO should be empty */
606
 
607
  getreg (UART_RBR);      /* check for FIFO counter overflow - fifo must still be empty */
608
  ASSERT (getreg (UART_LSR) == 0x60); /* FIFO should be empty */
609
 
610
  /* check for break interrupt */
611
  send_char ('I');
612
  while (!int_cnt); /* Wait for THR to be empty */
613
  ASSERT (--int_cnt == 0);
614
  ASSERT (int_iir == 0xc2);
615
  ASSERT ((int_lsr & 0xbe) == 0x20);
616
  MARK();
617
 
618
  while (!int_cnt); /* Wait for break interrupt */
619
  ASSERT (--int_cnt == 0);
620
  ASSERT (int_iir == 0xc6);
621 423 markom
  ASSERT (int_lsr == 0xf1); /* BE flag should be set */
622 409 markom
  ASSERT (getreg (UART_LSR) == 0x61); /* BE flag should be cleared by previous read */
623 411 markom
  MARK();
624 409 markom
  recv_char (0);
625
  MARK();
626
 
627
  send_char ('B');  /* Release break */
628
  while (!int_cnt); /* Wait for THR to be empty */
629
  ASSERT (--int_cnt == 0);
630
  ASSERT (int_iir == 0xc2);
631
  ASSERT ((int_lsr & 0xbe) == 0x20);
632
  MARK();
633
  /* Wait for acknowledge */
634
  int_rbr = '$';
635 411 markom
  while (!int_cnt); /* Wait for timeout */
636 409 markom
  ASSERT (--int_cnt == 0);
637 411 markom
  ASSERT (int_iir == 0xcc);
638 409 markom
  ASSERT (int_lsr == 0x61);
639
  MARK();
640
 
641
  /* TODO: Check for parity error */
642
  /* TODO: Check for frame error */
643
 
644
  /* Check for timeout */
645
  send_char ('I');
646
  while (!int_cnt); /* Wait for THR to be empty */
647
  ASSERT (--int_cnt == 0);
648
  ASSERT (int_iir == 0xc2);
649
  ASSERT ((int_lsr & 0xbe) == 0x20);
650
  MARK();
651
 
652
  int_rbr = 'T';
653
  while (!int_cnt); /* Wait for timeout */
654
  ASSERT (--int_cnt == 0);
655
  ASSERT (int_iir == 0xcc);  /* timeout interrupt occured */
656
  ASSERT (int_lsr == 0x61); /* DR flag should be set */
657
  ASSERT (getreg (UART_LSR) == 0x60); /* DR flag should be cleared - timeout occurred */
658
  MARK();
659
 
660
  send_char ('T');
661 411 markom
  while (!int_cnt); /* Wait for THR to be empty */
662
  ASSERT (--int_cnt == 0);
663
  ASSERT (int_iir == 0xc2);
664
  ASSERT ((int_lsr & 0xbe) == 0x20);
665
  MARK();
666 409 markom
 
667
  setreg (UART_IER, 0x00); /* Disable interrupts */
668
  ASSERT (int_cnt == 0); /* no interrupts should be pending */
669 411 markom
  NO_ERROR ();
670 409 markom
 
671 411 markom
  while (getreg (UART_LSR) != 0x60);  /* wait till we sent everynthing and then change mode */
672
  setreg (UART_LCR, LCR_DIVL);
673
  setreg (UART_DLH, 2 >> 8);            /* Set relatively slow speed, so we can hanlde interrupts properly */
674
  setreg (UART_DLL, 2 & 0xff);
675
  setreg (UART_LCR, 0x03);    /* 8N1 @ 2 */
676
  send_char ('T');
677 409 markom
 
678
  MARK ();
679 411 markom
  printf ("OK\n");
680 344 markom
}
681
 
682 411 markom
/* Test if all control bits are set correctly.  Lot of this was already tested
683
   elsewhere and tests are not duplicated.  */
684
 
685
void control_register_test ()
686
{
687
  /* RBR already tested in send_recv_test() */
688
  /* THR already tested in send_recv_test() */
689
  /* IER already tested in interrupt_test() */
690
  /* IIR already tested in interrupt_test() */
691
  /* FCR0 - uart 16450 specific, not tested */
692
 
693
  /* FCR1 - reset rx FIFO */
694
  send_char ('*');
695
  NO_ERROR ();
696
  while (!(getreg (UART_LSR) & 0x01)); /* Wait for data ready */
697
  setreg (UART_FCR, 2); /* Clears rx fifo */
698
  ASSERT (getreg (UART_LSR) == 0x60);  /* nothing happening */
699
  send_char ('!');
700
  recv_char ('!');
701
  MARK ();
702
 
703
  /* FCR2 - reset tx FIFO */
704
  send_char ('1');
705
  send_char ('2');
706
  setreg (UART_FCR, 4); /* Should clear '2' from fifo, but '1' should be sent OK */
707
  ASSERT (getreg (UART_LSR) == 0x00);  /* we should still be sending '1' */
708
  NO_ERROR();
709
  send_char ('*');
710
  recv_char ('*');
711
  MARK ();
712
 
713
  /* LCR already tested in different_modes_test () */
714
  /* TODO: MSR */
715
  /* LSR already tested in different_modes_test () and interrupt_test() */
716
  /* SCR already tested in register_test () */
717
 
718
  MARK ();
719
  printf ("OK\n");
720
}
721
 
722
/* Tests parity error and frane error behaviour */
723
 
724
void line_error_test ()
725
{
726
  printf ("line_error_test\n");
727
 
728
  /* Test framing error if we change speed */
729
  setreg (UART_LCR, LCR_DIVL);
730
  setreg (UART_DLH, 2 >> 8);
731
  setreg (UART_DLL, 2 & 0xff);
732
  setreg (UART_LCR, 0x03);    /* 8N1 @ 2 */
733
  MARK();
734
 
735
  send_char ('c');
736
  ASSERT (int_cnt == 0);
737
  setreg (UART_IER, 0x04); /* Enable interrupts: line status */
738
  while (!int_cnt); /* Wait for THR to be empty */
739
  ASSERT (--int_cnt == 0);
740
  ASSERT (int_iir == 0xc6);
741
  ASSERT (int_lsr == 0xe9); /* Framing error and FIFO error */
742
  getreg (UART_RBR);        /* Ignore the data */
743
  MARK ();
744
  recv_char ('b');
745
  MARK ();
746
 
747
#if COMPLETE  
748
  /* Test framing error if we change stop bits */
749
  send_char ('*');
750
  while (getreg (UART_LSR));  /* wait till we sent everynthing and then change mode */
751
  setreg (UART_LCR, 0x07); /* 8N2 */
752
  send_char ('*');
753
  MARK ();
754
 
755
  ASSERT (int_cnt == 0);
756
  setreg (UART_IER, 0x04); /* Enable interrupts: line status */
757
  while (!int_cnt); /* Wait for THR to be empty */
758
  ASSERT (--int_cnt == 0);
759
  ASSERT (int_iir == 0xc6);
760
  ASSERT (int_lsr == 0xe9); /* Framing error and FIFO error */
761
  getreg (UART_RBR);        /* Ignore the data */
762
  recv_char ('b');
763
  MARK();
764
#endif
765
 
766
  MARK ();
767
  printf ("OK\n");
768
}
769
 
770 344 markom
int main ()
771
{
772
  /* Use our low priority interrupt handler */
773
  excpt_lpint = (unsigned long)interrupt_handler;
774
 
775
  /* Enable interrupts */
776 409 markom
  mtspr (SPR_SR, mfspr(SPR_SR) | SPR_SR_EXR | SPR_SR_EIR);
777 411 markom
  mtspr (SPR_PICMR, mfspr(SPR_PICMR) | (0x00000001L << UART_INT_LINE));
778 409 markom
 
779 411 markom
  register_test ();
780 409 markom
  init_8n1 ();
781
//  send_recv_test ();
782
//  break_test ();
783 423 markom
  different_modes_test ();
784
  interrupt_test ();
785
  control_register_test ();
786 411 markom
  line_error_test ();
787
 
788
  /* loopback_test ();
789 344 markom
  modem_test ();
790
  modem_error_test ();*/
791 411 markom
  recv_char ('@');
792 355 markom
  printf ("ALL TESTS PASSED\n");
793 344 markom
  return 0;
794
}

powered by: WebSVN 2.1.0

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