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

Subversion Repositories or1k

[/] [or1k/] [tags/] [nog_patch_65/] [or1ksim/] [testbench/] [acv_uart.c] - Blame information for rev 409

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

powered by: WebSVN 2.1.0

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