1
2
3
4
5
6
7
8
9#include <common.h>
10#include <altera.h>
11#include <ACEX1K.h>
12
13
14#ifdef FPGA_DEBUG
15#define PRINTF(fmt,args...) printf (fmt ,##args)
16#else
17#define PRINTF(fmt,args...)
18#endif
19
20
21
22
23
24
25#ifndef CONFIG_FPGA_DELAY
26#define CONFIG_FPGA_DELAY()
27#endif
28
29#ifndef CONFIG_SYS_FPGA_WAIT
30#define CONFIG_SYS_FPGA_WAIT CONFIG_SYS_HZ/10
31#endif
32
33static int CYC2_ps_load(Altera_desc *desc, const void *buf, size_t bsize);
34static int CYC2_ps_dump(Altera_desc *desc, const void *buf, size_t bsize);
35
36
37
38
39int CYC2_load(Altera_desc *desc, const void *buf, size_t bsize)
40{
41 int ret_val = FPGA_FAIL;
42
43 switch (desc->iface) {
44 case passive_serial:
45 PRINTF ("%s: Launching Passive Serial Loader\n", __FUNCTION__);
46 ret_val = CYC2_ps_load (desc, buf, bsize);
47 break;
48
49 case fast_passive_parallel:
50
51
52
53
54 PRINTF ("%s: Launching Fast Passive Parallel Loader\n",
55 __FUNCTION__);
56 ret_val = CYC2_ps_load(desc, buf, bsize);
57 break;
58
59
60
61 default:
62 printf ("%s: Unsupported interface type, %d\n",
63 __FUNCTION__, desc->iface);
64 }
65
66 return ret_val;
67}
68
69int CYC2_dump(Altera_desc *desc, const void *buf, size_t bsize)
70{
71 int ret_val = FPGA_FAIL;
72
73 switch (desc->iface) {
74 case passive_serial:
75 PRINTF ("%s: Launching Passive Serial Dump\n", __FUNCTION__);
76 ret_val = CYC2_ps_dump (desc, buf, bsize);
77 break;
78
79
80
81 default:
82 printf ("%s: Unsupported interface type, %d\n",
83 __FUNCTION__, desc->iface);
84 }
85
86 return ret_val;
87}
88
89int CYC2_info( Altera_desc *desc )
90{
91 return FPGA_SUCCESS;
92}
93
94
95
96static int CYC2_ps_load(Altera_desc *desc, const void *buf, size_t bsize)
97{
98 int ret_val = FPGA_FAIL;
99 Altera_CYC2_Passive_Serial_fns *fn = desc->iface_fns;
100 int ret = 0;
101
102 PRINTF ("%s: start with interface functions @ 0x%p\n",
103 __FUNCTION__, fn);
104
105 if (fn) {
106 int cookie = desc->cookie;
107 unsigned long ts;
108
109 PRINTF ("%s: Function Table:\n"
110 "ptr:\t0x%p\n"
111 "struct: 0x%p\n"
112 "config:\t0x%p\n"
113 "status:\t0x%p\n"
114 "write:\t0x%p\n"
115 "done:\t0x%p\n\n",
116 __FUNCTION__, &fn, fn, fn->config, fn->status,
117 fn->write, fn->done);
118#ifdef CONFIG_SYS_FPGA_PROG_FEEDBACK
119 printf ("Loading FPGA Device %d...", cookie);
120#endif
121
122
123
124
125 if (*fn->pre) {
126 (*fn->pre) (cookie);
127 }
128
129
130 (*fn->config) (false, true, cookie);
131 udelay(100);
132 (*fn->config) (true, true, cookie);
133
134 udelay(2);
135
136
137 ts = get_timer (0);
138 do {
139 CONFIG_FPGA_DELAY ();
140 if (get_timer (ts) > CONFIG_SYS_FPGA_WAIT) {
141 puts ("** Timeout waiting for STATUS to go high.\n");
142 (*fn->abort) (cookie);
143 return FPGA_FAIL;
144 }
145 } while (!(*fn->status) (cookie));
146
147
148 CONFIG_FPGA_DELAY ();
149
150 ret = (*fn->write) (buf, bsize, true, cookie);
151 if (ret) {
152 puts ("** Write failed.\n");
153 (*fn->abort) (cookie);
154 return FPGA_FAIL;
155 }
156#ifdef CONFIG_SYS_FPGA_PROG_FEEDBACK
157 puts(" OK? ...");
158#endif
159
160 CONFIG_FPGA_DELAY ();
161
162#ifdef CONFIG_SYS_FPGA_PROG_FEEDBACK
163 putc (' ');
164#endif
165
166
167
168
169
170 if ( ! (*fn->done) (cookie) ) {
171 puts ("** Booting failed! CONF_DONE is still deasserted.\n");
172 (*fn->abort) (cookie);
173 return (FPGA_FAIL);
174 }
175#ifdef CONFIG_SYS_FPGA_PROG_FEEDBACK
176 puts(" OK\n");
177#endif
178
179 ret_val = FPGA_SUCCESS;
180
181#ifdef CONFIG_SYS_FPGA_PROG_FEEDBACK
182 if (ret_val == FPGA_SUCCESS) {
183 puts ("Done.\n");
184 }
185 else {
186 puts ("Fail.\n");
187 }
188#endif
189 (*fn->post) (cookie);
190
191 } else {
192 printf ("%s: NULL Interface function table!\n", __FUNCTION__);
193 }
194
195 return ret_val;
196}
197
198static int CYC2_ps_dump(Altera_desc *desc, const void *buf, size_t bsize)
199{
200
201
202 printf ("%s: Passive Serial Dumping is unavailable\n",
203 __FUNCTION__);
204 return FPGA_FAIL;
205}
206