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 380

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

powered by: WebSVN 2.1.0

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