1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24#include <common.h>
25#include <asm/processor.h>
26#include <command.h>
27#include <malloc.h>
28
29
30
31#if 0
32#define FPGA_DEBUG
33#endif
34
35extern int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);
36
37
38const unsigned char fpgadata[] =
39{
40#include "fpgadata.c"
41};
42
43
44
45
46#include "../common/fpga.c"
47
48
49int board_early_init_f (void)
50{
51
52
53
54
55
56
57
58
59
60
61
62
63 mtdcr(UIC0SR, 0xFFFFFFFF);
64 mtdcr(UIC0ER, 0x00000000);
65 mtdcr(UIC0CR, 0x00000000);
66 mtdcr(UIC0PR, 0xFFFFFF9F);
67 mtdcr(UIC0TR, 0x10000000);
68 mtdcr(UIC0VCR, 0x00000001);
69 mtdcr(UIC0SR, 0xFFFFFFFF);
70
71
72
73
74 mtebc (EBC0_CFG, 0xa8400000);
75
76 return 0;
77}
78
79int misc_init_r (void)
80{
81 unsigned char *dst;
82 ulong len = sizeof(fpgadata);
83 int status;
84 int index;
85 int i;
86
87 dst = malloc(CONFIG_SYS_FPGA_MAX_SIZE);
88 if (gunzip (dst, CONFIG_SYS_FPGA_MAX_SIZE, (uchar *)fpgadata, &len) != 0) {
89 printf ("GUNZIP ERROR - must RESET board to recover\n");
90 do_reset (NULL, 0, 0, NULL);
91 }
92
93 status = fpga_boot(dst, len);
94 if (status != 0) {
95 printf("\nFPGA: Booting failed ");
96 switch (status) {
97 case ERROR_FPGA_PRG_INIT_LOW:
98 printf("(Timeout: INIT not low after asserting PROGRAM*)\n ");
99 break;
100 case ERROR_FPGA_PRG_INIT_HIGH:
101 printf("(Timeout: INIT not high after deasserting PROGRAM*)\n ");
102 break;
103 case ERROR_FPGA_PRG_DONE:
104 printf("(Timeout: DONE not high after programming FPGA)\n ");
105 break;
106 }
107
108
109 index = 15;
110 for (i=0; i<4; i++) {
111 len = dst[index];
112 printf("FPGA: %s\n", &(dst[index+1]));
113 index += len+3;
114 }
115 putc ('\n');
116
117 for (i=20; i>0; i--) {
118 printf("Rebooting in %2d seconds \r",i);
119 for (index=0;index<1000;index++)
120 udelay(1000);
121 }
122 putc ('\n');
123 do_reset(NULL, 0, 0, NULL);
124 }
125
126 puts("FPGA: ");
127
128
129 index = 15;
130 for (i=0; i<4; i++) {
131 len = dst[index];
132 printf("%s ", &(dst[index+1]));
133 index += len+3;
134 }
135 putc ('\n');
136
137 free(dst);
138
139
140
141
142 SET_FPGA(FPGA_PRG | FPGA_CLK);
143 udelay(1000);
144 SET_FPGA(FPGA_PRG | FPGA_CLK | FPGA_DATA);
145 udelay(1000);
146
147
148
149
150 out_be32((void *)GPIO0_OR,
151 in_be32((void *)GPIO0_OR) | CONFIG_SYS_DUART_RST);
152 udelay(10);
153 out_be32((void *)GPIO0_OR,
154 in_be32((void *)GPIO0_OR) & ~CONFIG_SYS_DUART_RST);
155 udelay(1000);
156
157
158
159
160 out_8((void *)(DUART0_BA + 4), 0x08);
161 out_8((void *)(DUART1_BA + 4), 0x08);
162 out_8((void *)(DUART2_BA + 4), 0x08);
163 out_8((void *)(DUART3_BA + 4), 0x08);
164
165 return (0);
166}
167
168
169
170
171
172
173int checkboard (void)
174{
175 char str[64];
176 int i = getenv_r ("serial#", str, sizeof(str));
177
178 puts ("Board: ");
179
180 if (i == -1) {
181 puts ("### No HW ID - assuming WUH405");
182 } else {
183 puts(str);
184 }
185
186 putc ('\n');
187
188 return 0;
189}
190