]> git.kernelconcepts.de Git - karo-tx-uboot.git/blob - board/dave/PPChameleonEVB/PPChameleonEVB.c
61f7031b21d5a154f1faad018b157160b1b0fa88
[karo-tx-uboot.git] / board / dave / PPChameleonEVB / PPChameleonEVB.c
1 /*
2  * (C) Copyright 2003
3  * DAVE Srl
4  * http://www.dave-tech.it
5  * http://www.wawnet.biz
6  * mailto:info@wawnet.biz
7  *
8  * See file CREDITS for list of people who contributed to this
9  * project.
10  *
11  * This program is free software; you can redistribute it and/or
12  * modify it under the terms of the GNU General Public License as
13  * published by the Free Software Foundation; either version 2 of
14  * the License, or (at your option) any later version.
15  *
16  * This program is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19  * GNU General Public License for more details.
20  *
21  * You should have received a copy of the GNU General Public License
22  * along with this program; if not, write to the Free Software
23  * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
24  * MA 02111-1307 USA
25  */
26
27 #include <common.h>
28 #include <asm/processor.h>
29 #include <command.h>
30 #include <malloc.h>
31
32 /* ------------------------------------------------------------------------- */
33
34 #if 0
35 #define FPGA_DEBUG
36 #endif
37
38 /* fpga configuration data - gzip compressed and generated by bin2c */
39 const unsigned char fpgadata[] =
40 {
41 #include "fpgadata.c"
42 };
43
44 /*
45  * include common fpga code (for esd boards)
46  */
47 #include "../common/fpga.c"
48
49
50 /* Prototypes */
51 int gunzip(void *, int, unsigned char *, int *);
52
53
54 int board_pre_init (void)
55 {
56         out32(GPIO0_OR, CFG_NAND0_CE);                 /* set initial outputs     */
57         out32(GPIO0_OR, CFG_NAND1_CE);                 /* set initial outputs     */
58
59         /*
60          * IRQ 0-15  405GP internally generated; active high; level sensitive
61          * IRQ 16    405GP internally generated; active low; level sensitive
62          * IRQ 17-24 RESERVED
63          * IRQ 25 (EXT IRQ 0) CAN0; active low; level sensitive
64          * IRQ 26 (EXT IRQ 1) SER0 ; active low; level sensitive
65          * IRQ 27 (EXT IRQ 2) SER1; active low; level sensitive
66          * IRQ 28 (EXT IRQ 3) FPGA 0; active low; level sensitive
67          * IRQ 29 (EXT IRQ 4) FPGA 1; active low; level sensitive
68          * IRQ 30 (EXT IRQ 5) PCI INTA; active low; level sensitive
69          * IRQ 31 (EXT IRQ 6) COMPACT FLASH; active high; level sensitive
70          */
71         mtdcr(uicsr, 0xFFFFFFFF);       /* clear all ints */
72         mtdcr(uicer, 0x00000000);       /* disable all ints */
73         mtdcr(uiccr, 0x00000000);       /* set all to be non-critical*/
74         mtdcr(uicpr, 0xFFFFFF80);       /* set int polarities */
75         mtdcr(uictr, 0x10000000);       /* set int trigger levels */
76         mtdcr(uicvcr, 0x00000001);      /* set vect base=0,INT0 highest priority*/
77         mtdcr(uicsr, 0xFFFFFFFF);       /* clear all ints */
78
79         /*
80          * EBC Configuration Register: set ready timeout to 512 ebc-clks -> ca. 15 us
81          */
82 #if 1 /* test-only */
83         mtebc (epcr, 0xa8400000); /* ebc always driven */
84 #else
85         mtebc (epcr, 0x28400000); /* ebc in high-z */
86 #endif
87
88         return 0;
89 }
90
91
92 /* ------------------------------------------------------------------------- */
93
94 int misc_init_f (void)
95 {
96         return 0;  /* dummy implementation */
97 }
98
99
100 int misc_init_r (void)
101 {
102 #if 0 /* test-only */
103         DECLARE_GLOBAL_DATA_PTR;
104 #if 0
105         volatile unsigned short *fpga_mode =
106                 (unsigned short *)((ulong)CFG_FPGA_BASE_ADDR + CFG_FPGA_CTRL);
107         volatile unsigned char *duart0_mcr =
108                 (unsigned char *)((ulong)DUART0_BA + 4);
109         volatile unsigned char *duart1_mcr =
110                 (unsigned char *)((ulong)DUART1_BA + 4);
111
112         bd_t *bd = gd->bd;
113         char *  tmp;                    /* Temporary char pointer      */
114         unsigned char *dst;
115         ulong len = sizeof(fpgadata);
116         int status;
117         int index;
118         int i;
119         unsigned long cntrl0Reg;
120
121         dst = malloc(CFG_FPGA_MAX_SIZE);
122         if (gunzip (dst, CFG_FPGA_MAX_SIZE, (uchar *)fpgadata, (int *)&len) != 0) {
123                 printf ("GUNZIP ERROR - must RESET board to recover\n");
124                 do_reset (NULL, 0, 0, NULL);
125         }
126
127         status = fpga_boot(dst, len);
128         if (status != 0) {
129                 printf("\nFPGA: Booting failed ");
130                 switch (status) {
131                 case ERROR_FPGA_PRG_INIT_LOW:
132                         printf("(Timeout: INIT not low after asserting PROGRAM*)\n ");
133                         break;
134                 case ERROR_FPGA_PRG_INIT_HIGH:
135                         printf("(Timeout: INIT not high after deasserting PROGRAM*)\n ");
136                         break;
137                 case ERROR_FPGA_PRG_DONE:
138                         printf("(Timeout: DONE not high after programming FPGA)\n ");
139                         break;
140                 }
141
142                 /* display infos on fpgaimage */
143                 index = 15;
144                 for (i=0; i<4; i++) {
145                         len = dst[index];
146                         printf("FPGA: %s\n", &(dst[index+1]));
147                         index += len+3;
148                 }
149                 putc ('\n');
150                 /* delayed reboot */
151                 for (i=20; i>0; i--) {
152                         printf("Rebooting in %2d seconds \r",i);
153                         for (index=0;index<1000;index++)
154                                 udelay(1000);
155                 }
156                 putc ('\n');
157                 do_reset(NULL, 0, 0, NULL);
158         }
159
160         puts("FPGA:  ");
161
162         /* display infos on fpgaimage */
163         index = 15;
164         for (i=0; i<4; i++) {
165                 len = dst[index];
166                 printf("%s ", &(dst[index+1]));
167                 index += len+3;
168         }
169         putc ('\n');
170
171         free(dst);
172
173         /*
174          * Reset FPGA via FPGA_DATA pin
175          */
176         SET_FPGA(FPGA_PRG | FPGA_CLK);
177         udelay(1000); /* wait 1ms */
178         SET_FPGA(FPGA_PRG | FPGA_CLK | FPGA_DATA);
179         udelay(1000); /* wait 1ms */
180
181 #endif
182
183 #if 0
184         /*
185          * Enable power on PS/2 interface
186          */
187         *fpga_mode |= CFG_FPGA_CTRL_PS2_RESET;
188
189         /*
190          * Enable interrupts in exar duart mcr[3]
191          */
192         *duart0_mcr = 0x08;
193         *duart1_mcr = 0x08;
194 #endif
195 #endif
196
197         return (0);
198 }
199
200
201 /*
202  * Check Board Identity:
203  */
204
205 int checkboard (void)
206 {
207         unsigned char str[64];
208         int i = getenv_r ("serial#", str, sizeof(str));
209
210         puts ("Board: ");
211
212         if (i == -1) {
213                 puts ("### No HW ID - assuming PPChameleonEVB");
214         } else {
215                 puts(str);
216         }
217
218         putc ('\n');
219
220         return 0;
221 }
222
223 /* ------------------------------------------------------------------------- */
224
225 long int initdram (int board_type)
226 {
227         unsigned long val;
228
229         mtdcr(memcfga, mem_mb0cf);
230         val = mfdcr(memcfgd);
231
232 #if 0 /* test-only */
233         for (;;) {
234                 NAND_DISABLE_CE(1);
235                 udelay(100);
236                 NAND_ENABLE_CE(1);
237                 udelay(100);
238         }
239 #endif
240 #if 0
241         printf("\nmb0cf=%x\n", val); /* test-only */
242         printf("strap=%x\n", mfdcr(strap)); /* test-only */
243 #endif
244
245         return (4*1024*1024 << ((val & 0x000e0000) >> 17));
246 }
247
248 /* ------------------------------------------------------------------------- */
249
250 int testdram (void)
251 {
252         /* TODO: XXX XXX XXX */
253         printf ("test: 16 MB - ok\n");
254
255         return (0);
256 }
257
258 /* ------------------------------------------------------------------------- */
259
260 #if (CONFIG_COMMANDS & CFG_CMD_NAND)
261 extern ulong
262 nand_probe(ulong physadr);
263
264 void
265 nand_init(void)
266 {
267         ulong totlen = 0;
268
269 #if (CONFIG_PPCHAMELEON_MODULE_MODEL == CONFIG_PPCHAMELEON_MODULE_ME) || \
270     (CONFIG_PPCHAMELEON_MODULE_MODEL == CONFIG_PPCHAMELEON_MODULE_HI)
271         debug ("Probing at 0x%.8x\n", CFG_NAND0_BASE);
272         totlen += nand_probe (CFG_NAND0_BASE);
273 #endif  /* CONFIG_PPCHAMELEON_MODULE_ME, CONFIG_PPCHAMELEON_MODULE_HI */
274
275         debug ("Probing at 0x%.8x\n", CFG_NAND1_BASE);
276         totlen += nand_probe (CFG_NAND1_BASE);
277
278         printf ("%4lu MB\n", totlen >>20);
279 }
280 #endif