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 361

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

powered by: WebSVN 2.1.0

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