1
2
3
4
5
6
7
8#include <common.h>
9#include <asm/io.h>
10#include <asm/processor.h>
11#include <command.h>
12#include <malloc.h>
13
14
15
16#if 0
17#define FPGA_DEBUG
18#endif
19
20extern void lxt971_no_sleep(void);
21
22
23const unsigned char fpgadata[] =
24{
25#include "fpgadata.c"
26};
27
28
29
30
31#include "../common/fpga.c"
32
33
34
35unsigned char logo_bmp_320[] =
36{
37#include "logo_320_240_4bpp.c"
38};
39
40unsigned char logo_bmp_640[] =
41{
42#include "logo_640_480_24bpp.c"
43};
44
45
46
47
48
49#include "../common/lcd.c"
50
51#include "../common/s1d13704_320_240_4bpp.h"
52#include "../common/s1d13806_320_240_4bpp.h"
53#include "../common/s1d13806_640_480_16bpp.h"
54
55
56int board_early_init_f (void)
57{
58
59
60
61
62
63
64
65
66
67
68
69
70 mtdcr(UIC0SR, 0xFFFFFFFF);
71 mtdcr(UIC0ER, 0x00000000);
72 mtdcr(UIC0CR, 0x00000000);
73 mtdcr(UIC0PR, 0xFFFFFFB5);
74 mtdcr(UIC0TR, 0x10000000);
75 mtdcr(UIC0VCR, 0x00000001);
76 mtdcr(UIC0SR, 0xFFFFFFFF);
77
78
79
80
81 mtebc (EBC0_CFG, 0xa8400000);
82
83 return 0;
84}
85
86int misc_init_r (void)
87{
88 unsigned char *duart0_mcr = (unsigned char *)((ulong)DUART0_BA + 4);
89 unsigned char *duart1_mcr = (unsigned char *)((ulong)DUART1_BA + 4);
90 unsigned short *lcd_contrast =
91 (unsigned short *)((ulong)CONFIG_SYS_FPGA_BASE_ADDR + CONFIG_SYS_FPGA_CTRL + 4);
92 unsigned short *lcd_backlight =
93 (unsigned short *)((ulong)CONFIG_SYS_FPGA_BASE_ADDR + CONFIG_SYS_FPGA_CTRL + 6);
94 unsigned char *dst;
95 ulong len = sizeof(fpgadata);
96 int status;
97 int index;
98 int i;
99 char *str;
100
101 dst = malloc(CONFIG_SYS_FPGA_MAX_SIZE);
102 if (gunzip (dst, CONFIG_SYS_FPGA_MAX_SIZE, (uchar *)fpgadata, &len) != 0) {
103 printf ("GUNZIP ERROR - must RESET board to recover\n");
104 do_reset (NULL, 0, 0, NULL);
105 }
106
107 status = fpga_boot(dst, len);
108 if (status != 0) {
109 printf("\nFPGA: Booting failed ");
110 switch (status) {
111 case ERROR_FPGA_PRG_INIT_LOW:
112 printf("(Timeout: INIT not low after asserting PROGRAM*)\n ");
113 break;
114 case ERROR_FPGA_PRG_INIT_HIGH:
115 printf("(Timeout: INIT not high after deasserting PROGRAM*)\n ");
116 break;
117 case ERROR_FPGA_PRG_DONE:
118 printf("(Timeout: DONE not high after programming FPGA)\n ");
119 break;
120 }
121
122
123 index = 15;
124 for (i=0; i<4; i++) {
125 len = dst[index];
126 printf("FPGA: %s\n", &(dst[index+1]));
127 index += len+3;
128 }
129 putc ('\n');
130
131 for (i=20; i>0; i--) {
132 printf("Rebooting in %2d seconds \r",i);
133 for (index=0;index<1000;index++)
134 udelay(1000);
135 }
136 putc ('\n');
137 do_reset(NULL, 0, 0, NULL);
138 }
139
140 puts("FPGA: ");
141
142
143 index = 15;
144 for (i=0; i<4; i++) {
145 len = dst[index];
146 printf("%s ", &(dst[index+1]));
147 index += len+3;
148 }
149 putc ('\n');
150
151 free(dst);
152
153
154
155
156 out_be32((void*)GPIO0_TCR, in_be32((void*)GPIO0_TCR) | FPGA_INIT);
157 out_be32((void*)GPIO0_OR, in_be32((void*)GPIO0_OR) & ~FPGA_INIT);
158 udelay(1000);
159 out_be32((void*)GPIO0_OR, in_be32((void*)GPIO0_OR) | FPGA_INIT);
160 udelay(1000);
161
162
163
164
165 out_be32((void*)GPIO0_OR, in_be32((void*)GPIO0_OR) | CONFIG_SYS_DUART_RST);
166 udelay(10);
167 out_be32((void*)GPIO0_OR, in_be32((void*)GPIO0_OR) & ~CONFIG_SYS_DUART_RST);
168 udelay(1000);
169
170
171
172
173 out_be32((void*)GPIO0_OR, in_be32((void*)GPIO0_OR) & ~(CONFIG_SYS_NAND_CLE | CONFIG_SYS_NAND_ALE));
174 out_be32((void*)GPIO0_OR, in_be32((void*)GPIO0_OR) | CONFIG_SYS_NAND_CE);
175
176
177
178
179 out_be32((void*)GPIO0_OR, in_be32((void*)GPIO0_OR) | CONFIG_SYS_EEPROM_WP);
180 out_be32((void*)GPIO0_TCR, in_be32((void*)GPIO0_TCR) | CONFIG_SYS_EEPROM_WP);
181
182
183
184
185 out_8(duart0_mcr, 0x08);
186 out_8(duart1_mcr, 0x08);
187
188
189
190
191 str = getenv("bd_type");
192 if (strcmp(str, "voh405_bw") == 0) {
193 lcd_setup(0, 1);
194 lcd_init((uchar *)CONFIG_SYS_LCD_SMALL_REG, (uchar *)CONFIG_SYS_LCD_SMALL_MEM,
195 regs_13704_320_240_4bpp,
196 sizeof(regs_13704_320_240_4bpp)/sizeof(regs_13704_320_240_4bpp[0]),
197 logo_bmp_320, sizeof(logo_bmp_320));
198 } else if (strcmp(str, "voh405_bwbw") == 0) {
199 lcd_setup(0, 1);
200 lcd_init((uchar *)CONFIG_SYS_LCD_SMALL_REG, (uchar *)CONFIG_SYS_LCD_SMALL_MEM,
201 regs_13704_320_240_4bpp,
202 sizeof(regs_13704_320_240_4bpp)/sizeof(regs_13704_320_240_4bpp[0]),
203 logo_bmp_320, sizeof(logo_bmp_320));
204 lcd_setup(1, 1);
205 lcd_init((uchar *)CONFIG_SYS_LCD_BIG_REG, (uchar *)CONFIG_SYS_LCD_BIG_MEM,
206 regs_13806_320_240_4bpp,
207 sizeof(regs_13806_320_240_4bpp)/sizeof(regs_13806_320_240_4bpp[0]),
208 logo_bmp_320, sizeof(logo_bmp_320));
209 } else if (strcmp(str, "voh405_bwc") == 0) {
210 lcd_setup(0, 1);
211 lcd_init((uchar *)CONFIG_SYS_LCD_SMALL_REG, (uchar *)CONFIG_SYS_LCD_SMALL_MEM,
212 regs_13704_320_240_4bpp,
213 sizeof(regs_13704_320_240_4bpp)/sizeof(regs_13704_320_240_4bpp[0]),
214 logo_bmp_320, sizeof(logo_bmp_320));
215 lcd_setup(1, 0);
216 lcd_init((uchar *)CONFIG_SYS_LCD_BIG_REG, (uchar *)CONFIG_SYS_LCD_BIG_MEM,
217 regs_13806_640_480_16bpp,
218 sizeof(regs_13806_640_480_16bpp)/sizeof(regs_13806_640_480_16bpp[0]),
219 logo_bmp_640, sizeof(logo_bmp_640));
220 } else {
221 printf("Unsupported bd_type defined (%s) -> No display configured!\n", str);
222 return 0;
223 }
224
225
226
227
228 out_8((unsigned char *)(CONFIG_SYS_LCD_SMALL_REG + 2),
229 in_8((unsigned char *)(CONFIG_SYS_LCD_SMALL_REG + 2)) | 0x01);
230
231
232
233
234 out_be16(lcd_contrast, 0x4646);
235
236
237
238
239 out_be16(lcd_backlight, 0xffff);
240
241
242
243
244 out_be32((void*)GPIO0_TCR, in_be32((void*)GPIO0_TCR) | CONFIG_SYS_IIC_ON);
245
246 return (0);
247}
248
249
250
251
252
253
254int checkboard (void)
255{
256 char str[64];
257 int i = getenv_f("serial#", str, sizeof(str));
258
259 puts ("Board: ");
260
261 if (i == -1) {
262 puts ("### No HW ID - assuming VOH405");
263 } else {
264 puts(str);
265 }
266
267 if (getenv_f("bd_type", str, sizeof(str)) != -1) {
268 printf(" (%s)", str);
269 } else {
270 puts(" (Missing bd_type!)");
271 }
272
273 putc ('\n');
274
275 return 0;
276}
277
278#ifdef CONFIG_IDE_RESET
279#define FPGA_MODE (CONFIG_SYS_FPGA_BASE_ADDR + CONFIG_SYS_FPGA_CTRL)
280void ide_set_reset(int on)
281{
282
283
284
285 if (on) {
286 out_be16((void *)FPGA_MODE,
287 in_be16((void *)FPGA_MODE) & ~CONFIG_SYS_FPGA_CTRL_CF_RESET);
288 } else {
289 out_be16((void *)FPGA_MODE,
290 in_be16((void *)FPGA_MODE) | CONFIG_SYS_FPGA_CTRL_CF_RESET);
291 }
292}
293#endif
294
295#if defined(CONFIG_RESET_PHY_R)
296void reset_phy(void)
297{
298#ifdef CONFIG_LXT971_NO_SLEEP
299
300
301
302
303 lxt971_no_sleep();
304#endif
305}
306#endif
307
308#if defined(CONFIG_SYS_EEPROM_WREN)
309
310
311
312
313
314
315
316
317int eeprom_write_enable (unsigned dev_addr, int state)
318{
319 if (CONFIG_SYS_I2C_EEPROM_ADDR != dev_addr) {
320 return -1;
321 } else {
322 switch (state) {
323 case 1:
324
325 out_be32((void*)GPIO0_OR, in_be32((void*)GPIO0_OR) & ~CONFIG_SYS_EEPROM_WP);
326 state = 0;
327 break;
328 case 0:
329
330 out_be32((void*)GPIO0_OR, in_be32((void*)GPIO0_OR) | CONFIG_SYS_EEPROM_WP);
331 state = 0;
332 break;
333 default:
334
335 state = (0 == (in_be32((void*)GPIO0_OR) & CONFIG_SYS_EEPROM_WP));
336 break;
337 }
338 }
339 return state;
340}
341
342int do_eep_wren (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
343{
344 int query = argc == 1;
345 int state = 0;
346
347 if (query) {
348
349 state = eeprom_write_enable (CONFIG_SYS_I2C_EEPROM_ADDR, -1);
350 if (state < 0) {
351 puts ("Query of write access state failed.\n");
352 } else {
353 printf ("Write access for device 0x%0x is %sabled.\n",
354 CONFIG_SYS_I2C_EEPROM_ADDR, state ? "en" : "dis");
355 state = 0;
356 }
357 } else {
358 if ('0' == argv[1][0]) {
359
360 state = eeprom_write_enable (CONFIG_SYS_I2C_EEPROM_ADDR, 0);
361 } else {
362
363 state = eeprom_write_enable (CONFIG_SYS_I2C_EEPROM_ADDR, 1);
364 }
365 if (state < 0) {
366 puts ("Setup of write access state failed.\n");
367 }
368 }
369
370 return state;
371}
372
373U_BOOT_CMD(eepwren, 2, 0, do_eep_wren,
374 "Enable / disable / query EEPROM write access",
375 ""
376);
377#endif
378