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

Subversion Repositories or1k

[/] [or1k/] [tags/] [nog_patch_63/] [or1ksim/] [testbench/] [acv_uart.c] - Blame information for rev 396

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 344 markom
#define UART_ADDR   (0x9c000000)
10
#define UART_RBR    (UART_ADDR + 0)
11
#define UART_THR    (UART_ADDR + 0)
12
#define UART_IER    (UART_ADDR + 1)
13
#define UART_IIR    (UART_ADDR + 2)
14
#define UART_FCR    (UART_ADDR + 2)
15
#define UART_LCR    (UART_ADDR + 3)
16
#define UART_MCR    (UART_ADDR + 4)
17
#define UART_LSR    (UART_ADDR + 5)
18
#define UART_MSR    (UART_ADDR + 6)
19
 
20
#define UART_DLL    (UART_ADDR + 0)
21
#define UART_DLH    (UART_ADDR + 1)
22
 
23 355 markom
#define LCR_DIVL    (0x80)
24
#define LCR_BREAK   (0x40)
25
#define LCR_STICK   (0x20)
26
#define LCR_EVENP   (0x10)
27
#define LCR_PAREN   (0x08)
28
#define LCR_NSTOP   (0x04)
29
#define LCR_NBITS   (0x03)
30 344 markom
 
31 355 markom
#define LSR_DR      (0x01)
32
#define LSR_OE      (0x02)
33
#define LSR_PE      (0x04)
34
#define LSR_FE      (0x08)
35
#define LSR_BREAK   (0x10)
36
#define LSR_TXFE    (0x20)
37
#define LSR_TXE     (0x40)
38
#define LSR_ERR     (0x80)
39
 
40 344 markom
/* fails if x is false */
41
#define ASSERT(x) ((x)?1: fail (__FUNCTION__, __LINE__))
42
/* Waits a few cycles that uart can prepare its data */
43
#define WAIT() {asm ("l.nop");asm ("l.nop");asm ("l.nop");asm ("l.nop");}
44
/* fails if there is an error */
45 355 markom
#define NO_ERROR() { unsigned x = getreg (UART_LSR); if ((x & (LSR_BREAK|LSR_FE|LSR_PE|LSR_OE)) && !(x & LSR_ERR)) \
46
printf ("LSR7 ERR\n"); ASSERT(!(x & LSR_ERR));}
47 344 markom
 
48 355 markom
#ifndef __LINE__
49
#define __LINE__  0
50
#endif
51
 
52 344 markom
void fail (char *func, int line)
53
{
54
#ifndef __FUNCTION__
55
#define __FUNCTION__ "?"
56
#endif
57
  printf ("Test failed in %s:%i\n", func, line);
58 376 markom
  report(0xeeeeeeee);
59 344 markom
  exit (1);
60
}
61
 
62
inline void setreg (unsigned long addr, unsigned char value)
63
{
64
  *((volatile unsigned char *)addr) = value;
65
}
66
 
67
inline unsigned long getreg (unsigned long addr)
68
{
69
  return *((volatile unsigned char *)addr);
70
}
71
 
72
void interrupt_handler ()
73
{
74
  printf ("Int\n");
75
}
76
 
77
/* Test reset values and r/w properties of some registers */
78
 
79
void register_test ()
80
{
81
  printf ("register test\n");
82
  { /* test reset values */
83
    ASSERT(getreg (UART_RBR) == 0x00); //0
84
    ASSERT(getreg (UART_IER) == 0x00); //1
85
    ASSERT(getreg (UART_IIR) == 0xc1); //2
86
    ASSERT(getreg (UART_LCR) == 0x03); //3
87
    ASSERT(getreg (UART_MCR) == 0x00); //4
88 396 markom
#if COMPLETE
89
    ASSERT(getreg (UART_LSR) == 0x60); //5
90
    ASSERT(getreg (UART_MSR) == 0x00); //6
91
#endif
92 344 markom
 
93 355 markom
    setreg(UART_LCR, LCR_DIVL); //enable latches
94 344 markom
    ASSERT(getreg (UART_DLL) == 0x00); //0
95
    ASSERT(getreg (UART_DLH) == 0x00); //1
96
    setreg(UART_LCR, 0x00); //disable latches
97
  }
98
 
99 396 markom
#if COMPLETE
100 344 markom
  { /* test if status registers are read only */
101 396 markom
    unsigned long tmp;
102 344 markom
    int i;
103
    tmp = getreg (UART_LSR);
104
    setreg (UART_LSR, ~tmp);
105
    ASSERT(getreg (UART_LSR) == tmp);
106
 
107
    for (i = 0; i < 9; i++) {
108 371 markom
      setreg (UART_LSR, 1 << i);
109 344 markom
      ASSERT(getreg (UART_LSR) == tmp);
110
    }
111 396 markom
 
112
    tmp = getreg (UART_MSR);
113 344 markom
    setreg (UART_MSR, ~tmp);
114
    ASSERT(getreg (UART_MSR) == tmp);
115
 
116
    for (i = 0; i < 9; i++) {
117 371 markom
      setreg (UART_MSR, 1 << i);
118 344 markom
      ASSERT(getreg (UART_MSR) == tmp);
119 396 markom
    }
120 344 markom
  }
121 396 markom
#endif
122
 
123 344 markom
  ASSERT (!(getreg (UART_LSR) & 0x1f));
124
  { /* test whether MCR is write only, be careful not to set the loopback bit */
125 396 markom
#if COMPLETE
126
    ASSERT(getreg (UART_MCR) == 0x00);
127 344 markom
    setreg (UART_MCR, 0x45);
128
    ASSERT(getreg (UART_MCR) == 0x00);
129
    setreg (UART_MCR, 0xaa);
130 396 markom
    ASSERT(getreg (UART_MCR) == 0x00);
131
#endif
132 344 markom
  }
133
  ASSERT (!(getreg (UART_LSR) & 0x1f));
134
  { /* Test if Divisor latch byte holds the data */
135
    int i;
136 355 markom
    setreg(UART_LCR, LCR_DIVL); //enable latches
137
    ASSERT(getreg (UART_LCR) == LCR_DIVL);
138 344 markom
    for (i = 0; i < 16; i++) {
139
      unsigned short tmp = 0xdead << i;
140
      setreg (UART_DLH, tmp >> 8);
141
      setreg (UART_DLL, tmp & 0xff);
142
      ASSERT(getreg (UART_DLL) == (tmp & 0xff)); //0
143
      ASSERT(getreg (UART_DLH) == (tmp >> 8)); //1
144
    }
145
    ASSERT (!(getreg (UART_LSR) & 0x1f));
146
    for (i = 0; i < 16; i++) {
147
      unsigned short tmp = 0xdead << i;
148
      setreg (UART_DLL, tmp >> 8);
149
      setreg (UART_DLH, tmp & 0xff);
150
      ASSERT(getreg (UART_DLL) == (tmp >> 8)); //1
151
      ASSERT(getreg (UART_DLH) == (tmp & 0xff)); //0
152
    }
153
    setreg(UART_LCR, 0x00); //disable latches
154
    ASSERT(getreg (UART_LCR) == 0x00);
155
    ASSERT (!(getreg (UART_LSR) & 0x1f));
156
  }
157
  { /* Test LCR, if it holds our data */
158
    int i;
159
    for (i = 0; i < 6; i++) {
160
      unsigned short tmp = (0xde << i) & 0x3f;
161
      setreg (UART_LCR, tmp);
162
      ASSERT(getreg (UART_LCR) == tmp);
163
    }
164
    ASSERT (!(getreg (UART_LSR) & 0x1f));
165
  }
166
  /* Other registers will be tested later, if they function correctly,
167
     since we cannot test them now, without destroying anything.  */
168
}
169
 
170
/* Initializes uart and sends a few bytes to VAPI. It is then activated and send something back. */
171
 
172
void send_recv_test ()
173
{
174
  char *s;
175 355 markom
  printf ("send_recv_test: ");
176 344 markom
  /* Init */
177
  setreg (UART_IER, 0x00); /* disable interrupts */
178
  WAIT();
179
  ASSERT(getreg (UART_IIR) == 0xc1); /* nothing should be happening */
180
  setreg (UART_FCR, 0x06);      /* clear RX and TX FIFOs */
181 355 markom
  setreg (UART_LCR, LCR_DIVL);
182 344 markom
  setreg (UART_DLH, 10 >> 8);
183
  setreg (UART_DLL, 10 & 0xff);
184 355 markom
  setreg (UART_LCR, 0x03);    /* 8N1 @ 10 => 160 instructions for one cycle */
185
  ASSERT(getreg (UART_LCR) == 0x03);
186 344 markom
 
187 355 markom
  //printf ("basic\n");
188
  ASSERT (!(getreg (UART_LSR) & LSR_DR));
189 344 markom
 
190
  /* Send a string */
191
  s = "send_";
192
  while (*s) {
193
    /* Wait for tx fifo to be empty */
194 355 markom
    while (!(getreg (UART_LSR) & LSR_TXFE));
195 344 markom
    NO_ERROR();
196
    setreg (UART_THR, *s); /* send character */
197
    NO_ERROR();
198 371 markom
    report((unsigned long)*s);
199 344 markom
    s++;
200
  }
201 355 markom
  ASSERT (!(getreg (UART_LSR) & LSR_DR));
202 344 markom
  s = "test_";
203
  while (*s) {
204
    /* Wait for tx fifo and tx to be empty */
205 355 markom
    while (!(getreg (UART_LSR) & LSR_TXE));
206 344 markom
    NO_ERROR();
207
    setreg (UART_THR, *s); /* send character */
208
    NO_ERROR();
209
    s++;
210
  }
211 355 markom
  ASSERT (!(getreg (UART_LSR) & LSR_DR));
212 344 markom
 
213
  /* Send characters with delay inbetween */
214
  s = "is_running";
215
  while (*s) {
216
    int i;
217
    /* Wait for tx fifo and tx to be empty */
218 355 markom
    while (!(getreg (UART_LSR) & LSR_TXE));
219 344 markom
    NO_ERROR();
220
    setreg (UART_THR, *s); /* send character */
221
    NO_ERROR();
222 371 markom
// igor   for (i = 0; i < 1600; i++) /* wait at least ten chars before sending next one */
223 396 markom
    for (i = 0; i < 16; i++) /* wait at few chars before sending next one */
224 344 markom
      asm volatile ("l.nop");
225
    s++;
226
  }
227
 
228 355 markom
  while (!(getreg (UART_LSR) & LSR_TXE));
229
  NO_ERROR();
230
  setreg (UART_THR, 0); /* send terminate character */
231
  NO_ERROR();
232
 
233 344 markom
  /* Receives and compares the string */
234
  s = "recv_test";
235
  while (*s) {
236 376 markom
    unsigned x;
237 344 markom
    /* Wait for rx fifo to be  */
238 376 markom
    while (!((x = getreg (UART_LSR)) & LSR_DR));
239
    if ((x & (LSR_BREAK|LSR_FE|LSR_PE|LSR_OE)) && !(x & LSR_ERR)) printf ("LSR7 ERR\n");
240
    ASSERT(!(x & LSR_ERR));
241
 
242 344 markom
    ASSERT (getreg (UART_RBR) == *s); /* compare character */
243
    s++;
244
  }
245 355 markom
  printf ("OK\n");
246 344 markom
}
247
 
248 355 markom
/* sends break in both directions */
249
 
250
void break_test ()
251
{
252
  char *s;
253
  printf ("break_test: ");
254
 
255
  /* Send and receive break */
256
  NO_ERROR();
257
  setreg (UART_LCR, LCR_BREAK);
258
  while (!(getreg (UART_LSR) & LSR_BREAK));
259
  setreg (UART_THR, '*');
260
  while (getreg (UART_LSR) & LSR_BREAK);
261
  NO_ERROR(); /* BREAK bit should be cleared */
262
 
263
  /* Break while sending characters */
264
  s = "no_star";
265
  while (*s) {
266
    /* Wait for tx fifo to be empty */
267
    while (!(getreg (UART_LSR) & LSR_TXFE));
268
    NO_ERROR();
269
    setreg (UART_THR, *s); /* send character */
270
    NO_ERROR();
271
    s++;
272
  }
273
  ASSERT (!(getreg (UART_LSR) & LSR_DR));
274 361 markom
  /* this should break the * char, so it should not be received */
275
  setreg (UART_LCR, LCR_BREAK);
276 355 markom
  setreg (UART_THR, '*');
277
  /* uart should hold line long enough even if we drop it immediately */
278
  setreg (UART_LCR, 0);
279
  NO_ERROR();
280
 
281
  /* Receives and compares the string */
282
  s = "no_star";
283
  while (*s) {
284
    /* Wait for rx fifo to be nonempty */
285
    while (!(getreg (UART_LSR) & LSR_DR));
286
    NO_ERROR();
287
    ASSERT (getreg (UART_RBR) == *s); /* compare character */
288
    s++;
289
  }
290
  /* right now we should receive break */
291
  while (!(getreg (UART_LSR) & LSR_BREAK));
292
  setreg (UART_THR, '*');
293
  while (getreg (UART_LSR) & LSR_BREAK);
294
  NO_ERROR(); /* BREAK bit should be cleared */
295
  /* we should not receive incoming characters */
296
  ASSERT (!(getreg (UART_LSR) & LSR_DR));
297
  printf ("OK\n");
298
}
299
 
300 344 markom
void loopback_test ()
301
{
302
  printf ("loopback test\n");
303
  setreg (UART_MCR, 0);
304
}
305
 
306
int main ()
307
{
308
  /* Use our low priority interrupt handler */
309
  excpt_lpint = (unsigned long)interrupt_handler;
310
 
311
  /* Enable interrupts */
312
  mtspr (SPR_SR, mfspr(SPR_SR) | SPR_SR_EXR);
313
 
314 376 markom
  register_test ();
315 344 markom
  send_recv_test ();
316 355 markom
  break_test ();
317
  /*different_modes_test ();
318 344 markom
  loopback_send_rcv_test ();
319
  interrupt_test ();
320
  fifo_test ();
321
  loopback_test ();
322
  modem_test ();
323
  line_error_test ();
324
  speed_error_test ();
325
  frame_error_test ();
326
  modem_error_test ();*/
327 355 markom
  printf ("ALL TESTS PASSED\n");
328 344 markom
  return 0;
329
}

powered by: WebSVN 2.1.0

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