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 371

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

powered by: WebSVN 2.1.0

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