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

Subversion Repositories mips_enhanced

[/] [mips_enhanced/] [trunk/] [grlib-gpl-1.0.19-b3188/] [software/] [leon3/] [spictrl.c] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 dimamali
/*
2
 * Simple loopback test for SPICTRL
3
 *
4
 * Copyright (c) 2008 Gaisler Research AB
5
 *
6
 * This test requires that the SPISEL input is HIGH
7
 *
8
 */
9
 
10
#include "testmod.h"
11
 
12
/* Register offsets */
13
#define SPIC_CAP_OFF    0x00
14
#define SPIC_MODE_OFF   0x20
15
 
16
/* Register fields */
17
/* Mode register */
18
#define SPIC_LOOP (1 << 30)
19
#define SPIC_CPOL (1 << 29)
20
#define SPIC_CPHA (1 << 28)
21
#define SPIC_DIV16 (1 << 27)
22
#define SPIC_REV (1 << 26)
23
#define SPIC_MS (1 << 25)
24
#define SPIC_EN (1 << 24)
25
#define SPIC_LEN 20
26
#define SPIC_PM 16
27
#define SPIC_CG 7
28
/* Event and Mask registers */
29
#define SPIC_LT (1 << 14)
30
#define SPIC_OV (1 << 12)
31
#define SPIC_UN (1 << 11)
32
#define SPIC_MME (1 << 10)
33
#define SPIC_NE (1 << 9)
34
#define SPIC_NF (1 << 8)
35
/* Command register */
36
#define SPIC_LST (1 << 22)
37
 
38
/* Reset values */
39
#define MODE_RESVAL  0
40
#define EVENT_RESVAL 0
41
#define MASK_RESVAL  0
42
#define CMD_RESVAL   0
43
#define TD_RESVAL    0
44
 
45
struct spictrlregs {
46
  volatile unsigned int mode;
47
  volatile unsigned int event;
48
  volatile unsigned int mask;
49
  volatile unsigned int com;
50
  volatile unsigned int td;
51
  volatile unsigned int rd;
52
  /* volatile unsigned int slvsel; */
53
};
54
 
55
/*
56
 * spictrl_test(int addr)
57
 *
58
 * Writes fifo depth + 1 words in loopback mode. Writes
59
 * one more word and checks LT and OV status
60
 *
61
 */
62
int spictrl_test(int addr)
63
{
64
  int i;
65
  int data;
66
  int fdepth;
67
 
68
 
69
  volatile unsigned int *capreg;
70
  struct spictrlregs *regs;
71
 
72
 
73
  report_device(0x0102D000);
74
 
75
  capreg = (int*)addr;
76
  regs = (struct spictrlregs*)(addr + SPIC_MODE_OFF);
77
 
78
  report_subtest(1);
79
 
80
  /*
81
   * Check register reset values
82
   */
83
  if (regs->mode != MODE_RESVAL)
84
    fail(0);
85
  if (regs->event != EVENT_RESVAL)
86
    fail(1);
87
  if (regs->mask != MASK_RESVAL)
88
    fail(2);
89
  if (regs->com != CMD_RESVAL)
90
    fail(3);
91
  if (regs->td != TD_RESVAL)
92
    fail(4);
93
  /* RD register is not reset and therefore not read */
94
 
95
  report_subtest(2);
96
 
97
  /*
98
   * Configure core in loopback and write FIFO depth + 1
99
   * words
100
   */
101
  fdepth = (*capreg >> 8) & 0xff;
102
 
103
  regs->mode = SPIC_LOOP | SPIC_MS | SPIC_EN;
104
 
105
  /* Check event bits */
106
  if (regs->event & SPIC_LT)
107
    fail(5);
108
  if (regs->event & SPIC_OV)
109
    fail(6);
110
  if (regs->event & SPIC_UN)
111
    fail(7);
112
  if (regs->event & SPIC_MME)
113
    fail(8);
114
  if (regs->event & SPIC_NE)
115
    fail(9);
116
  if (!(regs->event & SPIC_NF))
117
    fail(10);
118
 
119
  data = 0xaaaaaaaa;
120
  for (i = 0; i <= fdepth; i++) {
121
    regs->td = data;
122
    data = ~data;
123
  }
124
 
125
  /* Multiple master error */
126
  if (regs->event & SPIC_MME)
127
    fail(11);
128
 
129
  /* Wait for first word to be transferred */
130
  while (!(regs->event & SPIC_NF))
131
    ;
132
 
133
  if (!(regs->event & SPIC_NE))
134
    fail(12);
135
 
136
  /* Write one more word to trigger overflow, set LST */
137
  regs->td = data;
138
  regs->com = SPIC_LST;
139
 
140
  while (!(regs->event & SPIC_LT))
141
    ;
142
 
143
  if (!(regs->event & SPIC_OV))
144
    fail(13);
145
 
146
  /* Verify that words transferred correctly */
147
  data = 0xaaaaaaaa;
148
  for (i = 0; i <= fdepth; i++) {
149
    if (regs->rd != data)
150
      fail(14+7);
151
    data = ~data;
152
  }
153
 
154
  /* Deactivate core */
155
  regs->mode = 0;
156
 
157
  return 0;
158
}

powered by: WebSVN 2.1.0

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