OSDN Git Service

Step 10 added.
[kozos-expbrd/kozos_expbrd.git] / firm / 08 / bootload / dram.c
1 #include "defines.h"
2 #include "lib.h"
3 #include "dram.h"
4
5 #define H8_3069F_ABWCR  ((volatile uint8 *)0xfee020)
6 #define H8_3069F_ASTCR  ((volatile uint8 *)0xfee021)
7 #define H8_3069F_RTCOR  ((volatile uint8 *)0xfee02a)
8 #define H8_3069F_RTMCSR ((volatile uint8 *)0xfee028)
9 #define H8_3069F_DRCRB  ((volatile uint8 *)0xfee027)
10 #define H8_3069F_DRCRA  ((volatile uint8 *)0xfee026)
11
12 #define H8_3069F_P1DDR  ((volatile uint8 *)0xfee000)
13 #define H8_3069F_P2DDR  ((volatile uint8 *)0xfee001)
14 #define H8_3069F_P8DDR  ((volatile uint8 *)0xfee007)
15 #define H8_3069F_PBDDR  ((volatile uint8 *)0xfee00a)
16
17 #define H8_3069F_WCRH   ((volatile uint8 *)0xfee022)
18 #define H8_3069F_WCRL   ((volatile uint8 *)0xfee023)
19
20 typedef struct {
21   union {
22     volatile uint8  val8[4];
23     volatile uint16 val16[2];
24     volatile uint32 val32[1];
25   } u;
26 } val_t;
27
28 int dram_init()
29 {
30   int i, j;
31
32   *H8_3069F_ABWCR  = 0xff;
33   *H8_3069F_RTCOR  = 0x03; /* ¥ê¥Õ¥ì¥Ã¥·¥å¼þ´ü¤òû¤á¤ËÀßÄê */
34   *H8_3069F_RTMCSR = 0x37;
35   *H8_3069F_DRCRB  = 0x8f; /* ¥¦¥¨¥¤¥ÈÁÞÆþ */
36   *H8_3069F_DRCRA  = 0x20;
37
38   *H8_3069F_P1DDR  = 0xff;
39   *H8_3069F_P2DDR  = 0x07;
40   *H8_3069F_P8DDR  = 0xee;
41   *H8_3069F_PBDDR  = 0x6c;
42
43   for (i = 0; i < 200; i++) {
44     for (j = 0; j < 200; j++) {
45       asm volatile ("nop");
46     }
47   }
48
49   /*
50    * 3¥¹¥Æ¡¼¥È¥¢¥¯¥»¥¹
51    */
52   *H8_3069F_WCRH = 0xff;
53   *H8_3069F_WCRL = 0xff;
54
55   /*
56    * 3¥¹¥Æ¡¼¥È¥¢¥¯¥»¥¹
57    */
58   *H8_3069F_ASTCR = 0xff;
59
60   return 0;
61 }
62
63 static int check_val(volatile val_t *p, volatile val_t *wval)
64 {
65   volatile val_t rval;
66
67   p->u.val8[0] = wval->u.val8[0]; p->u.val8[1] = wval->u.val8[1];
68   p->u.val8[2] = wval->u.val8[2]; p->u.val8[3] = wval->u.val8[3];
69   rval.u.val8[0] = p->u.val8[0]; rval.u.val8[1] = p->u.val8[1];
70   rval.u.val8[2] = p->u.val8[2]; rval.u.val8[3] = p->u.val8[3];
71
72   if (rval.u.val32[0] != wval->u.val32[0])
73     return -1;
74
75   p->u.val16[0] = wval->u.val16[0]; p->u.val16[1] = wval->u.val16[1];
76   rval.u.val16[0] = p->u.val16[0]; rval.u.val16[1] = p->u.val16[1];
77
78   if (rval.u.val32[0] != wval->u.val32[0])
79     return -1;
80
81   p->u.val32[0] = wval->u.val32[0];
82   rval.u.val32[0] = p->u.val32[0];
83
84   if (rval.u.val32[0] != wval->u.val32[0])
85     return -1;
86
87   return 0;
88 }
89
90 int dram_check()
91 {
92   uint32 *p;
93   int err;
94   val_t val;
95
96   puts("DRAM checking...\n");
97
98   for (p = (uint32 *)DRAM_START; p < (uint32 *)DRAM_END; p++) {
99     putxval((unsigned long)p, 8);
100     err = 1;
101
102     val.u.val32[0] = (uint32)p;
103     if (check_val((val_t *)p, &val) < 0)
104       goto err;
105
106     val.u.val32[0] = 0;
107     if (check_val((val_t *)p, &val) < 0)
108       goto err;
109
110     val.u.val32[0] = 0xffffffffUL;
111     if (check_val((val_t *)p, &val) < 0)
112       goto err;
113
114     puts("\x08\x08\x08\x08\x08\x08\x08\x08");
115   }
116   puts("\nall check OK.\n");
117   return 0;
118
119 err:
120   puts("\nERROR: ");
121   putxval((unsigned long)*p, 8);
122   puts("\n");
123   return -1;
124 }
125
126 static uint32 dram_check2_val0(uint32 *addr) {  return  0x55555555UL; }
127 static uint32 dram_check2_val1(uint32 *addr) {  return  0xaaaaaaaaUL; }
128 static uint32 dram_check2_val2(uint32 *addr) {  return  0x00000000UL; }
129 static uint32 dram_check2_val3(uint32 *addr) {  return  0xffffffffUL; }
130 static uint32 dram_check2_val4(uint32 *addr) {  return  (uint32)addr; }
131 static uint32 dram_check2_val5(uint32 *addr) {  return ~(uint32)addr; }
132
133 int dram_check2()
134 {
135   uint32 *p;
136   int ret = 0, i;
137   uint32 (*getval[])(uint32 *) = {
138     dram_check2_val0,
139     dram_check2_val1,
140     dram_check2_val2,
141     dram_check2_val3,
142     dram_check2_val4,
143     dram_check2_val5,
144     NULL
145   };
146
147   for (i = 0; getval[i]; i++) {
148
149     puts("DRAM check pattern: ");
150     putxval(i, 0);
151
152     puts("\nDRAM setting...\n");
153
154     for (p = (uint32 *)DRAM_START; p < (uint32 *)DRAM_END; p++) {
155       *p = getval[i](p);
156       if (!((uint32)p & 0xfff)) {
157         putxval((unsigned long)p, 8);
158         puts("\x08\x08\x08\x08\x08\x08\x08\x08");
159       }
160     }
161
162     puts("\nDRAM checking...\n");
163
164     for (p = (uint32 *)DRAM_START; p < (uint32 *)DRAM_END; p++) {
165       if (*p != getval[i](p)) {
166         puts("\nERROR! :");
167         putxval((unsigned long)p, 8);
168         puts(" ");
169         putxval((unsigned long)*p, 8);
170         puts("\n");
171         ret = -1;
172       }
173       if (!((uint32)p & 0xfff)) {
174         putxval((unsigned long)p, 8);
175         puts("\x08\x08\x08\x08\x08\x08\x08\x08");
176       }
177     }
178
179     puts("\n");
180
181   }
182
183   if (ret == 0) {
184     puts("\nall check OK.\n");
185   }
186
187   return ret;
188 }
189
190 int dram_clear()
191 {
192   uint32 *p;
193
194   puts("DRAM clearing...\n");
195
196   for (p = (uint32 *)DRAM_START; p < (uint32 *)DRAM_END; p++)
197     *p = 0;
198
199   puts("DRAM cleared.\n");
200
201   return 0;
202 }