OSDN Git Service

5881da053f11cd94a19421746635b34c282038eb
[kozos-expbrd/kozos_expbrd.git] / firm / sample / simple_mp3_player / bootload / dram.c
1
2 #include "defines.h"
3 #include "lib.h"
4 #include "dram.h"
5 #include "portconf.h"
6 #include "spreg.h"
7
8 typedef struct {
9   union {
10     volatile uint8  val8[4];
11     volatile uint16 val16[2];
12     volatile uint32 val32[1];
13   } u;
14 } val_t;
15
16 int dram_init()
17 {
18   spreg_dram_init();
19   return 0;
20 }
21
22 static int check_val(volatile val_t *p, volatile val_t *wval)
23 {
24   volatile val_t rval;
25
26   p->u.val8[0] = wval->u.val8[0]; p->u.val8[1] = wval->u.val8[1];
27   p->u.val8[2] = wval->u.val8[2]; p->u.val8[3] = wval->u.val8[3];
28   rval.u.val8[0] = p->u.val8[0]; rval.u.val8[1] = p->u.val8[1];
29   rval.u.val8[2] = p->u.val8[2]; rval.u.val8[3] = p->u.val8[3];
30
31   if (rval.u.val32[0] != wval->u.val32[0])
32     return -1;
33
34   p->u.val16[0] = wval->u.val16[0]; p->u.val16[1] = wval->u.val16[1];
35   rval.u.val16[0] = p->u.val16[0]; rval.u.val16[1] = p->u.val16[1];
36
37   if (rval.u.val32[0] != wval->u.val32[0])
38     return -1;
39
40   p->u.val32[0] = wval->u.val32[0];
41   rval.u.val32[0] = p->u.val32[0];
42
43   if (rval.u.val32[0] != wval->u.val32[0])
44     return -1;
45
46   return 0;
47 }
48
49 int dram_check()
50 {
51   uint32 *p;
52   int err;
53   val_t val;
54
55   puts("DRAM checking...\n");
56
57   for (p = (uint32 *)DRAM_START; p < (uint32 *)DRAM_END; p++) {
58     putxval((unsigned long)p, 8);
59     err = 1;
60
61     val.u.val32[0] = (uint32)p;
62     if (check_val((val_t *)p, &val) < 0)
63       goto err;
64
65     val.u.val32[0] = 0;
66     if (check_val((val_t *)p, &val) < 0)
67       goto err;
68
69     val.u.val32[0] = 0xffffffffUL;
70     if (check_val((val_t *)p, &val) < 0)
71       goto err;
72
73     puts("\x08\x08\x08\x08\x08\x08\x08\x08");
74   }
75   puts("\nall check OK.\n");
76   return 0;
77
78 err:
79   puts("\nERROR: ");
80   putxval((unsigned long)*p, 8);
81   puts("\n");
82   return -1;
83 }
84
85 static uint32 dram_check2_val0(uint32 *addr) {  return  0x55555555UL; }
86 static uint32 dram_check2_val1(uint32 *addr) {  return  0xaaaaaaaaUL; }
87 static uint32 dram_check2_val2(uint32 *addr) {  return  0x00000000UL; }
88 static uint32 dram_check2_val3(uint32 *addr) {  return  0xffffffffUL; }
89 static uint32 dram_check2_val4(uint32 *addr) {  return  (uint32)addr; }
90 static uint32 dram_check2_val5(uint32 *addr) {  return ~(uint32)addr; }
91
92 int dram_check2()
93 {
94   uint32 *p;
95   int ret = 0, i;
96   uint32 (*getval[])(uint32 *) = {
97     dram_check2_val0,
98     dram_check2_val1,
99     dram_check2_val2,
100     dram_check2_val3,
101     dram_check2_val4,
102     dram_check2_val5,
103     NULL
104   };
105
106   for (i = 0; getval[i]; i++) {
107
108     puts("DRAM check pattern: ");
109     putxval(i, 0);
110
111     puts("\nDRAM setting...\n");
112
113     for (p = (uint32 *)DRAM_START; p < (uint32 *)DRAM_END; p++) {
114       *p = getval[i](p);
115       if (!((uint32)p & 0xfff)) {
116         putxval((unsigned long)p, 8);
117         puts("\x08\x08\x08\x08\x08\x08\x08\x08");
118       }
119     }
120
121     puts("\nDRAM checking...\n");
122
123     for (p = (uint32 *)DRAM_START; p < (uint32 *)DRAM_END; p++) {
124       if (*p != getval[i](p)) {
125         puts("\nERROR! :");
126         putxval((unsigned long)p, 8);
127         puts(" ");
128         putxval((unsigned long)*p, 8);
129         puts("\n");
130         ret = -1;
131       }
132       if (!((uint32)p & 0xfff)) {
133         putxval((unsigned long)p, 8);
134         puts("\x08\x08\x08\x08\x08\x08\x08\x08");
135       }
136     }
137
138     puts("\n");
139
140   }
141
142   if (ret == 0) {
143     puts("\nall check OK.\n");
144   }
145
146   return ret;
147 }
148
149 int dram_clear()
150 {
151   uint32 *p;
152
153   puts("DRAM clearing...\n");
154
155   for (p = (uint32 *)DRAM_START; p < (uint32 *)DRAM_END; p++)
156     *p = 0;
157
158   puts("DRAM cleared.\n");
159
160   return 0;
161 }