]> git.kernelconcepts.de Git - karo-tx-uboot.git/blob - board/esd/tasreg/tasreg.c
do_reset: unify duplicate prototypes
[karo-tx-uboot.git] / board / esd / tasreg / tasreg.c
1 /*
2  * (C) Copyright 2004
3  * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
4  *
5  * See file CREDITS for list of people who contributed to this
6  * project.
7  *
8  * This program is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU General Public License as
10  * published by the Free Software Foundation; either version 2 of
11  * the License, or (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software
20  * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
21  * MA 02111-1307 USA
22  */
23
24 #include <common.h>
25 #include <command.h>
26 #include <malloc.h>
27 #include <asm/m5249.h>
28 #include <asm/io.h>
29
30
31 /* Prototypes */
32 int i2c_write(uchar chip, uint addr, int alen, uchar *buffer, int len);
33 int i2c_read(uchar chip, uint addr, int alen, uchar *buffer, int len);
34
35
36 #if 0
37 #define FPGA_DEBUG
38 #endif
39
40 /* predefine these here for FPGA programming (before including fpga.c) */
41 #define SET_FPGA(data)  mbar2_writeLong(MCFSIM_GPIO1_OUT, data)
42 #define FPGA_DONE_STATE (mbar2_readLong(MCFSIM_GPIO1_READ) & CONFIG_SYS_FPGA_DONE)
43 #define FPGA_INIT_STATE (mbar2_readLong(MCFSIM_GPIO1_READ) & CONFIG_SYS_FPGA_INIT)
44 #define FPGA_PROG_ACTIVE_HIGH          /* on this platform is PROG active high!   */
45 #define out32(a,b)                     /* nothing to do (gpio already configured) */
46
47
48 /* fpga configuration data - generated by bin2cc */
49 const unsigned char fpgadata[] =
50 {
51 #include "fpgadata.c"
52 };
53
54 /*
55  * include common fpga code (for esd boards)
56  */
57 #include "../common/fpga.c"
58
59
60 int checkboard (void) {
61         ulong val;
62         uchar val8;
63
64         puts ("Board: ");
65         puts("esd TASREG");
66         val8 = ((uchar)~((uchar)mbar2_readLong(MCFSIM_GPIO1_READ) >> 4)) & 0xf;
67         printf(" (Switch=%1X)\n", val8);
68
69         /*
70          * Set LED on
71          */
72         val = mbar2_readLong(MCFSIM_GPIO1_OUT) & ~CONFIG_SYS_GPIO1_LED;
73         mbar2_writeLong(MCFSIM_GPIO1_OUT, val);   /* Set LED on */
74
75         return 0;
76 };
77
78
79 phys_size_t initdram (int board_type) {
80         unsigned long   junk = 0xa5a59696;
81
82         /*
83          *  Note:
84          *      RC = ([(RefreshTime/#rows) / (1/BusClk)] / 16) - 1
85          */
86
87 #ifdef CONFIG_SYS_FAST_CLK
88         /*
89          * Busclk=70MHz, RefreshTime=64ms, #rows=4096 (4K)
90          * SO=1, NAM=0, COC=0, RTIM=01 (6clk refresh), RC=39
91          */
92         mbar_writeShort(MCFSIM_DCR, 0x8239);
93 #elif CONFIG_SYS_PLL_BYPASS
94         /*
95          * Busclk=5.6448MHz, RefreshTime=64ms, #rows=8192 (8K)
96          * SO=1, NAM=0, COC=0, RTIM=01 (6clk refresh), RC=02
97          */
98         mbar_writeShort(MCFSIM_DCR, 0x8202);
99 #else
100         /*
101          * Busclk=36MHz, RefreshTime=64ms, #rows=4096 (4K)
102          * SO=1, NAM=0, COC=0, RTIM=01 (6clk refresh), RC=22 (562 bus clock cycles)
103          */
104         mbar_writeShort(MCFSIM_DCR, 0x8222);
105 #endif
106
107         /*
108          * SDRAM starts at 0x0000_0000, CASL=10, CBM=010, PS=10 (16bit port),
109          * PM=1 (continuous page mode)
110          */
111
112         /* RE=0 (keep auto-refresh disabled while setting up registers) */
113         mbar_writeLong(MCFSIM_DACR0, 0x00003324);
114
115         /* BAM=007c (bits 22,21 are bank selects; 256kB blocks) */
116         mbar_writeLong(MCFSIM_DMR0, 0x01fc0001);
117
118         /** Precharge sequence **/
119         mbar_writeLong(MCFSIM_DACR0, 0x0000332c); /* Set DACR0[IP] (bit 3) */
120         out_be32((void *)0, junk); /* write to a memory location to init. precharge */
121         udelay(0x10); /* Allow several Precharge cycles */
122
123         /** Refresh Sequence **/
124         mbar_writeLong(MCFSIM_DACR0, 0x0000b324); /* Enable the refresh bit, DACR0[RE] (bit 15) */
125         udelay(0x7d0); /* Allow gobs of refresh cycles */
126
127         /** Mode Register initialization **/
128         mbar_writeLong(MCFSIM_DACR0, 0x0000b364);  /* Enable DACR0[IMRS] (bit 6); RE remains enabled */
129         out_be32((void *)0x800, junk); /* Access RAM to initialize the mode register */
130
131         return CONFIG_SYS_SDRAM_SIZE * 1024 * 1024;
132 };
133
134
135 int testdram (void) {
136         /* TODO: XXX XXX XXX */
137         printf ("DRAM test not implemented!\n");
138
139         return (0);
140 }
141
142
143 int misc_init_r (void)
144 {
145         unsigned char *dst;
146         ulong len = sizeof(fpgadata);
147         int status;
148         int index;
149         int i;
150         uchar buf[8];
151
152         dst = malloc(CONFIG_SYS_FPGA_MAX_SIZE);
153         if (gunzip (dst, CONFIG_SYS_FPGA_MAX_SIZE, (uchar *)fpgadata, &len) != 0) {
154                 printf ("GUNZIP ERROR - must RESET board to recover\n");
155                 do_reset (NULL, 0, 0, NULL);
156         }
157
158         status = fpga_boot(dst, len);
159         if (status != 0) {
160                 printf("\nFPGA: Booting failed ");
161                 switch (status) {
162                 case ERROR_FPGA_PRG_INIT_LOW:
163                         printf("(Timeout: INIT not low after asserting PROGRAM*)\n ");
164                         break;
165                 case ERROR_FPGA_PRG_INIT_HIGH:
166                         printf("(Timeout: INIT not high after deasserting PROGRAM*)\n ");
167                         break;
168                 case ERROR_FPGA_PRG_DONE:
169                         printf("(Timeout: DONE not high after programming FPGA)\n ");
170                         break;
171                 }
172
173                 /* display infos on fpgaimage */
174                 index = 15;
175                 for (i=0; i<4; i++) {
176                         len = dst[index];
177                         printf("FPGA: %s\n", &(dst[index+1]));
178                         index += len+3;
179                 }
180                 putc ('\n');
181                 /* delayed reboot */
182                 for (i=20; i>0; i--) {
183                         printf("Rebooting in %2d seconds \r",i);
184                         for (index=0;index<1000;index++)
185                                 udelay(1000);
186                 }
187                 putc ('\n');
188                 do_reset(NULL, 0, 0, NULL);
189         }
190
191         puts("FPGA:  ");
192
193         /* display infos on fpgaimage */
194         index = 15;
195         for (i=0; i<4; i++) {
196                 len = dst[index];
197                 printf("%s ", &(dst[index+1]));
198                 index += len+3;
199         }
200         putc ('\n');
201
202         free(dst);
203
204         /*
205          *
206          */
207         buf[0] = 0x00;
208         buf[1] = 0x32;
209         buf[2] = 0x3f;
210         i2c_write(0x38, 0, 0, buf, 3);
211
212         return (0);
213 }
214
215
216 #if 1 /* test-only: board specific test commands */
217 int i2c_probe(uchar addr);
218
219 /*
220  */
221 int do_iploop(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
222 {
223         ulong addr;
224
225         if (argc < 2) {
226                 puts("ERROR!\n");
227                 return -1;
228         }
229
230         addr = simple_strtol (argv[1], NULL, 16);
231
232         printf("i2c probe looping on addr 0x%lx (cntrl-c aborts)...\n", addr);
233
234         for (;;) {
235                 i2c_probe(addr);
236
237                 /* Abort if ctrl-c was pressed */
238                 if (ctrlc()) {
239                         puts("\nAbort\n");
240                         return 0;
241                 }
242
243                 udelay(1000);
244         }
245
246         return 0;
247 }
248 U_BOOT_CMD(
249         iploop, 2,      1,      do_iploop,
250         "i2c probe loop <addr>",
251         ""
252 );
253
254 /*
255  */
256 int do_codec(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
257 {
258         uchar buf[8];
259
260         out_be16((void *)0xe0000000, 0x4000);
261
262         udelay(5000); /* wait for 5ms */
263
264         buf[0] = 0x10;
265         buf[1] = 0x07;
266         buf[2] = 0x03;
267         i2c_write(0x10, 0, 0, buf, 3);
268
269         buf[0] = 0x10;
270         buf[1] = 0x01;
271         buf[2] = 0x80;
272         i2c_write(0x10, 0, 0, buf, 3);
273
274         buf[0] = 0x10;
275         buf[1] = 0x02;
276         buf[2] = 0x03;
277         i2c_write(0x10, 0, 0, buf, 3);
278
279         buf[0] = 0x10;
280         buf[1] = 0x03;
281         buf[2] = 0x29;
282         i2c_write(0x10, 0, 0, buf, 3);
283
284         buf[0] = 0x10;
285         buf[1] = 0x04;
286         buf[2] = 0x00;
287         i2c_write(0x10, 0, 0, buf, 3);
288
289         buf[0] = 0x10;
290         buf[1] = 0x05;
291         buf[2] = 0x00;
292         i2c_write(0x10, 0, 0, buf, 3);
293
294         buf[0] = 0x10;
295         buf[1] = 0x07;
296         buf[2] = 0x02;
297         i2c_write(0x10, 0, 0, buf, 3);
298
299         return 0;
300 }
301 U_BOOT_CMD(
302         codec,  1,      1,      do_codec,
303         "Enable codec",
304         ""
305 );
306
307 /*
308  */
309 int do_saa(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
310 {
311         ulong addr;
312         ulong instr;
313         ulong cntrl;
314         ulong data;
315         uchar buf[8];
316
317         if (argc < 5) {
318                 puts("ERROR!\n");
319                 return -1;
320         }
321
322         addr = simple_strtol (argv[1], NULL, 16);
323         instr = simple_strtol (argv[2], NULL, 16);
324         cntrl = simple_strtol (argv[3], NULL, 16);
325         data = simple_strtol (argv[4], NULL, 16);
326
327         buf[0] = (uchar)instr;
328         buf[1] = (uchar)cntrl;
329         buf[2] = (uchar)data;
330         i2c_write(addr, 0, 0, buf, 3);
331
332         return 0;
333 }
334 U_BOOT_CMD(
335         saa,    5,      1,      do_saa,
336         "Write to SAA1064 <addr> <instr> <cntrl> <data>",
337         ""
338 );
339
340 /*
341  */
342 int do_iwrite(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
343 {
344         ulong addr;
345         ulong data0;
346         ulong data1;
347         ulong data2;
348         ulong data3;
349         uchar buf[8];
350         int cnt;
351
352         if (argc < 3) {
353                 puts("ERROR!\n");
354                 return -1;
355         }
356
357         addr = simple_strtol (argv[1], NULL, 16);
358         cnt = simple_strtol (argv[2], NULL, 16);
359         data0 = simple_strtol (argv[3], NULL, 16);
360         data1 = simple_strtol (argv[4], NULL, 16);
361         data2 = simple_strtol (argv[5], NULL, 16);
362         data3 = simple_strtol (argv[6], NULL, 16);
363
364         printf("Writing %d bytes to device %lx!\n", cnt, addr);
365         buf[0] = (uchar)data0;
366         buf[1] = (uchar)data1;
367         buf[2] = (uchar)data2;
368         buf[3] = (uchar)data3;
369         i2c_write(addr, 0, 0, buf, cnt);
370
371         return 0;
372 }
373 U_BOOT_CMD(
374         iwrite, 6,      1,      do_iwrite,
375         "Write n bytes to I2C-device",
376         "addr cnt data0 ... datan"
377 );
378
379 /*
380  */
381 int do_iread(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
382 {
383         ulong addr;
384         ulong cnt;
385         uchar buf[32];
386         int i;
387
388         if (argc < 3) {
389                 puts("ERROR!\n");
390                 return -1;
391         }
392
393         addr = simple_strtol (argv[1], NULL, 16);
394         cnt = simple_strtol (argv[2], NULL, 16);
395
396         i2c_read(addr, 0, 0, buf, cnt);
397         printf("I2C Data:");
398         for (i=0; i<cnt; i++) {
399                 printf(" %02X", buf[i]);
400         }
401         printf("\n");
402
403         return 0;
404 }
405 U_BOOT_CMD(
406         iread,  3,      1,      do_iread,
407         "Read from I2C <addr> <cnt>",
408         ""
409 );
410
411 /*
412  */
413 int do_ireadl(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
414 {
415         ulong addr;
416         uchar buf[32];
417         int cnt;
418
419         if (argc < 2) {
420                 puts("ERROR!\n");
421                 return -1;
422         }
423
424         addr = simple_strtol (argv[1], NULL, 16);
425         cnt = 1;
426
427         printf("iread looping on addr 0x%lx (cntrl-c aborts)...\n", addr);
428
429         for (;;) {
430                 i2c_read(addr, 0, 0, buf, cnt);
431
432                 /* Abort if ctrl-c was pressed */
433                 if (ctrlc()) {
434                         puts("\nAbort\n");
435                         return 0;
436                 }
437
438                 udelay(3000);
439         }
440
441         return 0;
442 }
443 U_BOOT_CMD(
444         ireadl, 2,      1,      do_ireadl,
445         "Read-loop from I2C <addr>",
446         ""
447 );
448 #endif