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