1
2
3
4
5
6
7
8
9
10
11
12
13#include <common.h>
14#include <spartan3.h>
15
16
17#ifdef FPGA_DEBUG
18#define PRINTF(fmt,args...) printf (fmt ,##args)
19#else
20#define PRINTF(fmt,args...)
21#endif
22
23#undef CONFIG_SYS_FPGA_CHECK_BUSY
24
25
26
27
28
29
30#ifndef CONFIG_FPGA_DELAY
31#define CONFIG_FPGA_DELAY()
32#endif
33
34#ifndef CONFIG_SYS_FPGA_WAIT
35#define CONFIG_SYS_FPGA_WAIT CONFIG_SYS_HZ/100
36#endif
37
38static int spartan3_sp_load(xilinx_desc *desc, const void *buf, size_t bsize);
39static int spartan3_sp_dump(xilinx_desc *desc, const void *buf, size_t bsize);
40
41
42static int spartan3_ss_load(xilinx_desc *desc, const void *buf, size_t bsize);
43static int spartan3_ss_dump(xilinx_desc *desc, const void *buf, size_t bsize);
44
45
46
47
48static int spartan3_load(xilinx_desc *desc, const void *buf, size_t bsize,
49 bitstream_type bstype)
50{
51 int ret_val = FPGA_FAIL;
52
53 switch (desc->iface) {
54 case slave_serial:
55 PRINTF ("%s: Launching Slave Serial Load\n", __FUNCTION__);
56 ret_val = spartan3_ss_load(desc, buf, bsize);
57 break;
58
59 case slave_parallel:
60 PRINTF ("%s: Launching Slave Parallel Load\n", __FUNCTION__);
61 ret_val = spartan3_sp_load(desc, buf, bsize);
62 break;
63
64 default:
65 printf ("%s: Unsupported interface type, %d\n",
66 __FUNCTION__, desc->iface);
67 }
68
69 return ret_val;
70}
71
72static int spartan3_dump(xilinx_desc *desc, const void *buf, size_t bsize)
73{
74 int ret_val = FPGA_FAIL;
75
76 switch (desc->iface) {
77 case slave_serial:
78 PRINTF ("%s: Launching Slave Serial Dump\n", __FUNCTION__);
79 ret_val = spartan3_ss_dump(desc, buf, bsize);
80 break;
81
82 case slave_parallel:
83 PRINTF ("%s: Launching Slave Parallel Dump\n", __FUNCTION__);
84 ret_val = spartan3_sp_dump(desc, buf, bsize);
85 break;
86
87 default:
88 printf ("%s: Unsupported interface type, %d\n",
89 __FUNCTION__, desc->iface);
90 }
91
92 return ret_val;
93}
94
95static int spartan3_info(xilinx_desc *desc)
96{
97 return FPGA_SUCCESS;
98}
99
100
101
102
103
104static int spartan3_sp_load(xilinx_desc *desc, const void *buf, size_t bsize)
105{
106 int ret_val = FPGA_FAIL;
107 xilinx_spartan3_slave_parallel_fns *fn = desc->iface_fns;
108
109 PRINTF ("%s: start with interface functions @ 0x%p\n",
110 __FUNCTION__, fn);
111
112 if (fn) {
113 size_t bytecount = 0;
114 unsigned char *data = (unsigned char *) buf;
115 int cookie = desc->cookie;
116 unsigned long ts;
117
118 PRINTF ("%s: Function Table:\n"
119 "ptr:\t0x%p\n"
120 "struct: 0x%p\n"
121 "pre: 0x%p\n"
122 "pgm:\t0x%p\n"
123 "init:\t0x%p\n"
124 "err:\t0x%p\n"
125 "clk:\t0x%p\n"
126 "cs:\t0x%p\n"
127 "wr:\t0x%p\n"
128 "read data:\t0x%p\n"
129 "write data:\t0x%p\n"
130 "busy:\t0x%p\n"
131 "abort:\t0x%p\n",
132 "post:\t0x%p\n\n",
133 __FUNCTION__, &fn, fn, fn->pre, fn->pgm, fn->init, fn->err,
134 fn->clk, fn->cs, fn->wr, fn->rdata, fn->wdata, fn->busy,
135 fn->abort, fn->post);
136
137
138
139
140
141
142#ifdef CONFIG_SYS_FPGA_PROG_FEEDBACK
143 printf ("Loading FPGA Device %d...\n", cookie);
144#endif
145
146
147
148 if (*fn->pre) {
149 (*fn->pre) (cookie);
150 }
151
152
153 (*fn->pgm) (true, true, cookie);
154
155
156 CONFIG_FPGA_DELAY ();
157 (*fn->pgm) (false, true, cookie);
158
159 ts = get_timer (0);
160
161 do {
162 CONFIG_FPGA_DELAY ();
163 if (get_timer (ts) > CONFIG_SYS_FPGA_WAIT) {
164 puts ("** Timeout waiting for INIT to clear.\n");
165 (*fn->abort) (cookie);
166 return FPGA_FAIL;
167 }
168 } while ((*fn->init) (cookie) && (*fn->busy) (cookie));
169
170 (*fn->wr) (true, true, cookie);
171 (*fn->cs) (true, true, cookie);
172 (*fn->clk) (true, true, cookie);
173
174
175 while (bytecount < bsize) {
176
177
178
179 (*fn->wdata) (data[bytecount++], true, cookie);
180 CONFIG_FPGA_DELAY ();
181 (*fn->clk) (false, true, cookie);
182 CONFIG_FPGA_DELAY ();
183 (*fn->clk) (true, true, cookie);
184
185#ifdef CONFIG_SYS_FPGA_CHECK_BUSY
186 ts = get_timer (0);
187 while ((*fn->busy) (cookie)) {
188
189
190
191 CONFIG_FPGA_DELAY ();
192 (*fn->clk) (false, true, cookie);
193 CONFIG_FPGA_DELAY ();
194 (*fn->clk) (true, true, cookie);
195
196 if (get_timer (ts) > CONFIG_SYS_FPGA_WAIT) {
197 puts ("** Timeout waiting for BUSY to clear.\n");
198 (*fn->abort) (cookie);
199 return FPGA_FAIL;
200 }
201 }
202#endif
203
204#ifdef CONFIG_SYS_FPGA_PROG_FEEDBACK
205 if (bytecount % (bsize / 40) == 0)
206 putc ('.');
207#endif
208 }
209
210 CONFIG_FPGA_DELAY ();
211 (*fn->cs) (false, true, cookie);
212 (*fn->wr) (false, true, cookie);
213
214#ifdef CONFIG_SYS_FPGA_PROG_FEEDBACK
215 putc ('\n');
216#endif
217
218
219 ts = get_timer (0);
220 ret_val = FPGA_SUCCESS;
221 while ((*fn->done) (cookie) == FPGA_FAIL) {
222
223
224
225 CONFIG_FPGA_DELAY ();
226 (*fn->clk) (false, true, cookie);
227 CONFIG_FPGA_DELAY ();
228 (*fn->clk) (true, true, cookie);
229
230 if (get_timer (ts) > CONFIG_SYS_FPGA_WAIT) {
231 puts ("** Timeout waiting for DONE to clear.\n");
232 (*fn->abort) (cookie);
233 ret_val = FPGA_FAIL;
234 break;
235 }
236 }
237
238
239
240
241 if (*fn->post)
242 (*fn->post) (cookie);
243
244#ifdef CONFIG_SYS_FPGA_PROG_FEEDBACK
245 if (ret_val == FPGA_SUCCESS)
246 puts ("Done.\n");
247 else
248 puts ("Fail.\n");
249#endif
250
251 } else {
252 printf ("%s: NULL Interface function table!\n", __FUNCTION__);
253 }
254
255 return ret_val;
256}
257
258static int spartan3_sp_dump(xilinx_desc *desc, const void *buf, size_t bsize)
259{
260 int ret_val = FPGA_FAIL;
261 xilinx_spartan3_slave_parallel_fns *fn = desc->iface_fns;
262
263 if (fn) {
264 unsigned char *data = (unsigned char *) buf;
265 size_t bytecount = 0;
266 int cookie = desc->cookie;
267
268 printf ("Starting Dump of FPGA Device %d...\n", cookie);
269
270 (*fn->cs) (true, true, cookie);
271 (*fn->clk) (true, true, cookie);
272
273
274 while (bytecount < bsize) {
275
276
277 (*fn->clk) (false, true, cookie);
278 (*fn->clk) (true, true, cookie);
279 (*fn->rdata) (&(data[bytecount++]), cookie);
280#ifdef CONFIG_SYS_FPGA_PROG_FEEDBACK
281 if (bytecount % (bsize / 40) == 0)
282 putc ('.');
283#endif
284 }
285
286 (*fn->cs) (false, false, cookie);
287 (*fn->clk) (false, true, cookie);
288 (*fn->clk) (true, true, cookie);
289
290#ifdef CONFIG_SYS_FPGA_PROG_FEEDBACK
291 putc ('\n');
292#endif
293 puts ("Done.\n");
294
295
296 } else {
297 printf ("%s: NULL Interface function table!\n", __FUNCTION__);
298 }
299
300 return ret_val;
301}
302
303
304
305
306static int spartan3_ss_load(xilinx_desc *desc, const void *buf, size_t bsize)
307{
308 int ret_val = FPGA_FAIL;
309 xilinx_spartan3_slave_serial_fns *fn = desc->iface_fns;
310 int i;
311 unsigned char val;
312
313 PRINTF ("%s: start with interface functions @ 0x%p\n",
314 __FUNCTION__, fn);
315
316 if (fn) {
317 size_t bytecount = 0;
318 unsigned char *data = (unsigned char *) buf;
319 int cookie = desc->cookie;
320 unsigned long ts;
321
322 PRINTF ("%s: Function Table:\n"
323 "ptr:\t0x%p\n"
324 "struct: 0x%p\n"
325 "pgm:\t0x%p\n"
326 "init:\t0x%p\n"
327 "clk:\t0x%p\n"
328 "wr:\t0x%p\n"
329 "done:\t0x%p\n\n",
330 __FUNCTION__, &fn, fn, fn->pgm, fn->init,
331 fn->clk, fn->wr, fn->done);
332#ifdef CONFIG_SYS_FPGA_PROG_FEEDBACK
333 printf ("Loading FPGA Device %d...\n", cookie);
334#endif
335
336
337
338
339 if (*fn->pre) {
340 (*fn->pre) (cookie);
341 }
342
343
344 (*fn->pgm) (true, true, cookie);
345
346
347 ts = get_timer (0);
348 do {
349 CONFIG_FPGA_DELAY ();
350 if (get_timer (ts) > CONFIG_SYS_FPGA_WAIT) {
351 puts ("** Timeout waiting for INIT to start.\n");
352 if (*fn->abort)
353 (*fn->abort) (cookie);
354 return FPGA_FAIL;
355 }
356 } while (!(*fn->init) (cookie));
357
358
359 CONFIG_FPGA_DELAY ();
360 (*fn->pgm) (false, true, cookie);
361
362 ts = get_timer (0);
363
364 do {
365 CONFIG_FPGA_DELAY ();
366 if (get_timer (ts) > CONFIG_SYS_FPGA_WAIT) {
367 puts ("** Timeout waiting for INIT to clear.\n");
368 if (*fn->abort)
369 (*fn->abort) (cookie);
370 return FPGA_FAIL;
371 }
372 } while ((*fn->init) (cookie));
373
374
375 if(*fn->bwr)
376 (*fn->bwr) (data, bsize, true, cookie);
377 else {
378 while (bytecount < bsize) {
379
380
381
382 if ((*fn->done) (cookie) == 0 && (*fn->init) (cookie)) {
383 puts ("** CRC error during FPGA load.\n");
384 if (*fn->abort)
385 (*fn->abort) (cookie);
386 return (FPGA_FAIL);
387 }
388 val = data [bytecount ++];
389 i = 8;
390 do {
391
392 (*fn->clk) (false, true, cookie);
393 CONFIG_FPGA_DELAY ();
394
395 (*fn->wr) ((val & 0x80), true, cookie);
396 CONFIG_FPGA_DELAY ();
397
398 (*fn->clk) (true, true, cookie);
399 CONFIG_FPGA_DELAY ();
400 val <<= 1;
401 i --;
402 } while (i > 0);
403
404#ifdef CONFIG_SYS_FPGA_PROG_FEEDBACK
405 if (bytecount % (bsize / 40) == 0)
406 putc ('.');
407#endif
408 }
409 }
410
411 CONFIG_FPGA_DELAY ();
412
413#ifdef CONFIG_SYS_FPGA_PROG_FEEDBACK
414 putc ('\n');
415#endif
416
417
418 ts = get_timer (0);
419 ret_val = FPGA_SUCCESS;
420 (*fn->wr) (true, true, cookie);
421
422 while (! (*fn->done) (cookie)) {
423
424
425
426 CONFIG_FPGA_DELAY ();
427 (*fn->clk) (false, true, cookie);
428 CONFIG_FPGA_DELAY ();
429 (*fn->clk) (true, true, cookie);
430
431 putc ('*');
432
433 if (get_timer (ts) > CONFIG_SYS_FPGA_WAIT) {
434 puts ("** Timeout waiting for DONE to clear.\n");
435 ret_val = FPGA_FAIL;
436 break;
437 }
438 }
439 putc ('\n');
440
441
442
443
444 if (*fn->post)
445 (*fn->post) (cookie);
446
447#ifdef CONFIG_SYS_FPGA_PROG_FEEDBACK
448 if (ret_val == FPGA_SUCCESS)
449 puts ("Done.\n");
450 else
451 puts ("Fail.\n");
452#endif
453
454 } else {
455 printf ("%s: NULL Interface function table!\n", __FUNCTION__);
456 }
457
458 return ret_val;
459}
460
461static int spartan3_ss_dump(xilinx_desc *desc, const void *buf, size_t bsize)
462{
463
464
465 printf ("%s: Slave Serial Dumping is unavailable\n",
466 __FUNCTION__);
467 return FPGA_FAIL;
468}
469
470struct xilinx_fpga_op spartan3_op = {
471 .load = spartan3_load,
472 .dump = spartan3_dump,
473 .info = spartan3_info,
474};
475