From bb03181744fc10cf2c1b81b78fe5b83a7abad646 Mon Sep 17 00:00:00 2001 From: "henryk@ploetzli.ch" Date: Sun, 6 Sep 2009 19:08:56 +0000 Subject: [PATCH] Fix FPGA load code for the generic case where a new style bitstream is not DWORD aligned Completely switch to byte-wise load, shouldn't make much of a difference since this is not timing-critical --- armsrc/fpgaloader.c | 52 +++++++++++++++++++++++++++------------------ 1 file changed, 31 insertions(+), 21 deletions(-) diff --git a/armsrc/fpgaloader.c b/armsrc/fpgaloader.c index 58385588..c30468f4 100644 --- a/armsrc/fpgaloader.c +++ b/armsrc/fpgaloader.c @@ -135,9 +135,22 @@ void FpgaSetupSscDma(BYTE *buf, int len) PDC_CONTROL(SSC_BASE) = PDC_RX_ENABLE; } -// Download the fpga image starting at FpgaImage and with length FpgaImageLen DWORDs (e.g. 4 bytes) +static void DownloadFPGA_byte(unsigned char w) +{ +#define SEND_BIT(x) { if(w & (1<>(j*8); - else - w = v >>((3-j)*8); -#define SEND_BIT(x) { if(w & (1<0) + DownloadFPGA_byte(FpgaImage[(i++)^0x3]); + /* Explanation of the magic in the above line: + * i^0x3 inverts the lower two bits of the integer i, counting backwards + * for each 4 byte increment. The generated sequence of (i++)^3 is + * 3 2 1 0 7 6 5 4 11 10 9 8 15 14 13 12 etc. pp. + */ } + } else { + while(FpgaImageLen-->0) + DownloadFPGA_byte(*FpgaImage++); } LED_D_OFF(); @@ -268,7 +278,7 @@ void FpgaDownloadAndGo(void) void *bitstream_start; unsigned int bitstream_length; if(bitparse_find_section('e', &bitstream_start, &bitstream_length)) { - DownloadFPGA((DWORD *)bitstream_start, bitstream_length/4, 0); + DownloadFPGA(bitstream_start, bitstream_length, 0); return; /* All done */ } @@ -282,7 +292,7 @@ void FpgaDownloadAndGo(void) * the bytewise download. */ if( *(DWORD*)0x102000 == 0xFFFFFFFF && *(DWORD*)0x102004 == 0xAA995566 ) - DownloadFPGA((DWORD *)0x102000, 10524, 1); + DownloadFPGA((char*)0x102000, 10524*4, 1); } void FpgaGatherVersion(char *dst, int len) -- 2.39.2