1 //----------------------------------------------------------------------------- 
   2 // Jonathan Westhues, April 2006 
   3 // iZsh <izsh at fail0verflow.com>, 2014 
   5 // This code is licensed to you under the terms of the GNU GPL, version 2 or, 
   6 // at your option, any later version. See the LICENSE.txt file for the text of 
   8 //----------------------------------------------------------------------------- 
   9 // Routines to load the FPGA image, and then to configure the FPGA's major 
  10 // mode once it is configured. 
  11 //----------------------------------------------------------------------------- 
  16 #include "fpgaloader.h" 
  17 #include "proxmark3.h" 
  23 extern void Dbprintf(const char *fmt
, ...); 
  25 // remember which version of the bitstream we have already downloaded to the FPGA 
  26 static int downloaded_bitstream 
= FPGA_BITSTREAM_ERR
; 
  28 // this is where the bitstreams are located in memory: 
  29 extern uint8_t _binary_obj_fpga_all_bit_z_start
, _binary_obj_fpga_all_bit_z_end
; 
  31 static uint8_t *fpga_image_ptr 
= NULL
; 
  32 static uint32_t uncompressed_bytes_cnt
; 
  34 static const uint8_t _bitparse_fixed_header
[] = {0x00, 0x09, 0x0f, 0xf0, 0x0f, 0xf0, 0x0f, 0xf0, 0x0f, 0xf0, 0x00, 0x00, 0x01}; 
  35 #define FPGA_BITSTREAM_FIXED_HEADER_SIZE        sizeof(_bitparse_fixed_header) 
  36 #define OUTPUT_BUFFER_LEN               80 
  37 #define FPGA_INTERLEAVE_SIZE    288 
  39 //----------------------------------------------------------------------------- 
  40 // Set up the Serial Peripheral Interface as master 
  41 // Used to write the FPGA config word 
  42 // May also be used to write to other SPI attached devices like an LCD 
  43 //----------------------------------------------------------------------------- 
  44 void SetupSpi(int mode
) 
  46         // PA10 -> SPI_NCS2 chip select (LCD) 
  47         // PA11 -> SPI_NCS0 chip select (FPGA) 
  48         // PA12 -> SPI_MISO Master-In Slave-Out 
  49         // PA13 -> SPI_MOSI Master-Out Slave-In 
  50         // PA14 -> SPI_SPCK Serial Clock 
  52         // Disable PIO control of the following pins, allows use by the SPI peripheral 
  53         AT91C_BASE_PIOA
->PIO_PDR 
= 
  60         AT91C_BASE_PIOA
->PIO_ASR 
= 
  66         AT91C_BASE_PIOA
->PIO_BSR 
= GPIO_NCS2
; 
  68         //enable the SPI Peripheral clock 
  69         AT91C_BASE_PMC
->PMC_PCER 
= (1<<AT91C_ID_SPI
); 
  71         AT91C_BASE_SPI
->SPI_CR 
= AT91C_SPI_SPIEN
; 
  75                         AT91C_BASE_SPI
->SPI_MR 
= 
  76                                 ( 0 << 24)      |       // Delay between chip selects (take default: 6 MCK periods) 
  77                                 (14 << 16)      |       // Peripheral Chip Select (selects FPGA SPI_NCS0 or PA11) 
  78                                 ( 0 << 7)       |       // Local Loopback Disabled 
  79                                 ( 1 << 4)       |       // Mode Fault Detection disabled 
  80                                 ( 0 << 2)       |       // Chip selects connected directly to peripheral 
  81                                 ( 0 << 1)       |       // Fixed Peripheral Select 
  82                                 ( 1 << 0);              // Master Mode 
  83                         AT91C_BASE_SPI
->SPI_CSR
[0] = 
  84                                 ( 1 << 24)      |       // Delay between Consecutive Transfers (32 MCK periods) 
  85                                 ( 1 << 16)      |       // Delay Before SPCK (1 MCK period) 
  86                                 ( 6 << 8)       |       // Serial Clock Baud Rate (baudrate = MCK/6 = 24Mhz/6 = 4M baud 
  87                                 ( 8 << 4)       |       // Bits per Transfer (16 bits) 
  88                                 ( 0 << 3)       |       // Chip Select inactive after transfer 
  89                                 ( 1 << 1)       |       // Clock Phase data captured on leading edge, changes on following edge 
  90                                 ( 0 << 0);              // Clock Polarity inactive state is logic 0 
  93                         AT91C_BASE_SPI
->SPI_MR 
= 
  94                                 ( 0 << 24)      |       // Delay between chip selects (take default: 6 MCK periods) 
  95                                 (11 << 16)      |       // Peripheral Chip Select (selects LCD SPI_NCS2 or PA10) 
  96                                 ( 0 << 7)       |       // Local Loopback Disabled 
  97                                 ( 1 << 4)       |       // Mode Fault Detection disabled 
  98                                 ( 0 << 2)       |       // Chip selects connected directly to peripheral 
  99                                 ( 0 << 1)       |       // Fixed Peripheral Select 
 100                                 ( 1 << 0);              // Master Mode 
 101                         AT91C_BASE_SPI
->SPI_CSR
[2] = 
 102                                 ( 1 << 24)      |       // Delay between Consecutive Transfers (32 MCK periods) 
 103                                 ( 1 << 16)      |       // Delay Before SPCK (1 MCK period) 
 104                                 ( 6 << 8)       |       // Serial Clock Baud Rate (baudrate = MCK/6 = 24Mhz/6 = 4M baud 
 105                                 ( 1 << 4)       |       // Bits per Transfer (9 bits) 
 106                                 ( 0 << 3)       |       // Chip Select inactive after transfer 
 107                                 ( 1 << 1)       |       // Clock Phase data captured on leading edge, changes on following edge 
 108                                 ( 0 << 0);              // Clock Polarity inactive state is logic 0 
 110                 default:                                // Disable SPI 
 111                         AT91C_BASE_SPI
->SPI_CR 
= AT91C_SPI_SPIDIS
; 
 116 //----------------------------------------------------------------------------- 
 117 // Set up the synchronous serial port, with the one set of options that we 
 118 // always use when we are talking to the FPGA. Both RX and TX are enabled. 
 119 //----------------------------------------------------------------------------- 
 120 void FpgaSetupSsc(void) { 
 121         // First configure the GPIOs, and get ourselves a clock. 
 122         AT91C_BASE_PIOA
->PIO_ASR 
= 
 127         AT91C_BASE_PIOA
->PIO_PDR 
= GPIO_SSC_DOUT
; 
 129         AT91C_BASE_PMC
->PMC_PCER 
|= (1 << AT91C_ID_SSC
); 
 131         // Now set up the SSC proper, starting from a known state. 
 132         AT91C_BASE_SSC
->SSC_CR 
= AT91C_SSC_SWRST
; 
 134         // RX clock comes from TX clock, RX starts when TX starts, data changes 
 135         // on RX clock rising edge, sampled on falling edge 
 136         AT91C_BASE_SSC
->SSC_RCMR 
= SSC_CLOCK_MODE_SELECT(1) | SSC_CLOCK_MODE_START(1); 
 138         // 8 bits per transfer, no loopback, MSB first, 1 transfer per sync 
 139         // pulse, no output sync 
 140         AT91C_BASE_SSC
->SSC_RFMR 
= SSC_FRAME_MODE_BITS_IN_WORD(8) |     AT91C_SSC_MSBF 
| SSC_FRAME_MODE_WORDS_PER_TRANSFER(0); 
 142         // clock comes from TK pin, no clock output, outputs change on falling 
 143         // edge of TK, sample on rising edge of TK, start on positive-going edge of sync 
 144         AT91C_BASE_SSC
->SSC_TCMR 
= SSC_CLOCK_MODE_SELECT(2) |   SSC_CLOCK_MODE_START(5); 
 146         // tx framing is the same as the rx framing 
 147         AT91C_BASE_SSC
->SSC_TFMR 
= AT91C_BASE_SSC
->SSC_RFMR
; 
 149         AT91C_BASE_SSC
->SSC_CR 
= AT91C_SSC_RXEN 
| AT91C_SSC_TXEN
; 
 152 //----------------------------------------------------------------------------- 
 153 // Set up DMA to receive samples from the FPGA. We will use the PDC, with 
 154 // a single buffer as a circular buffer (so that we just chain back to 
 155 // ourselves, not to another buffer). The stuff to manipulate those buffers 
 156 // is in apps.h, because it should be inlined, for speed. 
 157 //----------------------------------------------------------------------------- 
 158 bool FpgaSetupSscDma(uint8_t *buf
, int len
) { 
 159         if (buf 
== NULL
) return false; 
 161         AT91C_BASE_PDC_SSC
->PDC_PTCR 
= AT91C_PDC_RXTDIS
;        // Disable DMA Transfer 
 162         AT91C_BASE_PDC_SSC
->PDC_RPR 
= (uint32_t) buf
;           // transfer to this memory address 
 163         AT91C_BASE_PDC_SSC
->PDC_RCR 
= len
;                                      // transfer this many bytes 
 164         AT91C_BASE_PDC_SSC
->PDC_RNPR 
= (uint32_t) buf
;          // next transfer to same memory address 
 165         AT91C_BASE_PDC_SSC
->PDC_RNCR 
= len
;                                     // ... with same number of bytes 
 166         AT91C_BASE_PDC_SSC
->PDC_PTCR 
= AT91C_PDC_RXTEN
;         // go!     
 171 //---------------------------------------------------------------------------- 
 172 // Uncompress (inflate) the FPGA data. Returns one decompressed byte with 
 174 //---------------------------------------------------------------------------- 
 175 static int get_from_fpga_combined_stream(z_streamp compressed_fpga_stream
, uint8_t *output_buffer
) 
 177         if (fpga_image_ptr 
== compressed_fpga_stream
->next_out
) {       // need more data 
 178                 compressed_fpga_stream
->next_out 
= output_buffer
; 
 179                 compressed_fpga_stream
->avail_out 
= OUTPUT_BUFFER_LEN
; 
 180                 fpga_image_ptr 
= output_buffer
; 
 181                 int res 
= inflate(compressed_fpga_stream
, Z_SYNC_FLUSH
); 
 184                         Dbprintf("inflate returned: %d, %s", res
, compressed_fpga_stream
->msg
); 
 190         ++uncompressed_bytes_cnt
; 
 192         return *fpga_image_ptr
++; 
 195 //---------------------------------------------------------------------------- 
 196 // Undo the interleaving of several FPGA config files. FPGA config files 
 197 // are combined into one big file: 
 198 // 288 bytes from FPGA file 1, followed by 288 bytes from FGPA file 2, etc. 
 199 //---------------------------------------------------------------------------- 
 200 static int get_from_fpga_stream(int bitstream_version
, z_streamp compressed_fpga_stream
, uint8_t *output_buffer
) 
 202         while((uncompressed_bytes_cnt 
/ FPGA_INTERLEAVE_SIZE
) % FPGA_BITSTREAM_MAX 
!= (bitstream_version 
- 1)) { 
 203                 // skip undesired data belonging to other bitstream_versions 
 204                 get_from_fpga_combined_stream(compressed_fpga_stream
, output_buffer
); 
 207         return get_from_fpga_combined_stream(compressed_fpga_stream
, output_buffer
);     
 211 static voidpf 
fpga_inflate_malloc(voidpf opaque
, uInt items
, uInt size
) 
 213         return BigBuf_malloc(items
*size
); 
 217 static void fpga_inflate_free(voidpf opaque
, voidpf address
) 
 219         // free eventually allocated BigBuf memory 
 220         BigBuf_free(); BigBuf_Clear_ext(false); 
 224 //---------------------------------------------------------------------------- 
 225 // Initialize decompression of the respective (HF or LF) FPGA stream  
 226 //---------------------------------------------------------------------------- 
 227 static bool reset_fpga_stream(int bitstream_version
, z_streamp compressed_fpga_stream
, uint8_t *output_buffer
) 
 229         uint8_t header
[FPGA_BITSTREAM_FIXED_HEADER_SIZE
]; 
 231         uncompressed_bytes_cnt 
= 0; 
 233         // initialize z_stream structure for inflate: 
 234         compressed_fpga_stream
->next_in 
= &_binary_obj_fpga_all_bit_z_start
; 
 235         compressed_fpga_stream
->avail_in 
= &_binary_obj_fpga_all_bit_z_start 
- &_binary_obj_fpga_all_bit_z_end
; 
 236         compressed_fpga_stream
->next_out 
= output_buffer
; 
 237         compressed_fpga_stream
->avail_out 
= OUTPUT_BUFFER_LEN
; 
 238         compressed_fpga_stream
->zalloc 
= &fpga_inflate_malloc
; 
 239         compressed_fpga_stream
->zfree 
= &fpga_inflate_free
; 
 241         inflateInit2(compressed_fpga_stream
, 0); 
 243         fpga_image_ptr 
= output_buffer
; 
 245         for (uint16_t i 
= 0; i 
< FPGA_BITSTREAM_FIXED_HEADER_SIZE
; i
++) 
 246                 header
[i
] = get_from_fpga_stream(bitstream_version
, compressed_fpga_stream
, output_buffer
); 
 248         // Check for a valid .bit file (starts with _bitparse_fixed_header) 
 249         if(memcmp(_bitparse_fixed_header
, header
, FPGA_BITSTREAM_FIXED_HEADER_SIZE
) == 0) 
 256 static void DownloadFPGA_byte(unsigned char w
) 
 258 #define SEND_BIT(x) { if(w & (1<<x) ) HIGH(GPIO_FPGA_DIN); else LOW(GPIO_FPGA_DIN); HIGH(GPIO_FPGA_CCLK); LOW(GPIO_FPGA_CCLK); } 
 269 // Download the fpga image starting at current stream position with length FpgaImageLen bytes 
 270 static void DownloadFPGA(int bitstream_version
, int FpgaImageLen
, z_streamp compressed_fpga_stream
, uint8_t *output_buffer
) 
 274         AT91C_BASE_PIOA
->PIO_OER 
= GPIO_FPGA_ON
; 
 275         AT91C_BASE_PIOA
->PIO_PER 
= GPIO_FPGA_ON
; 
 276         HIGH(GPIO_FPGA_ON
);             // ensure everything is powered on 
 282         // These pins are inputs 
 283     AT91C_BASE_PIOA
->PIO_ODR 
= 
 286         // PIO controls the following pins 
 287     AT91C_BASE_PIOA
->PIO_PER 
= 
 291         AT91C_BASE_PIOA
->PIO_PPUER 
= 
 295         // setup initial logic state 
 296         HIGH(GPIO_FPGA_NPROGRAM
); 
 299         // These pins are outputs 
 300         AT91C_BASE_PIOA
->PIO_OER 
= 
 305         // enter FPGA configuration mode 
 306         LOW(GPIO_FPGA_NPROGRAM
); 
 308         HIGH(GPIO_FPGA_NPROGRAM
); 
 311         // wait for FPGA ready to accept data signal 
 312         while ((i
) && ( !(AT91C_BASE_PIOA
->PIO_PDSR 
& GPIO_FPGA_NINIT 
) ) ) { 
 316         // crude error indicator, leave both red LEDs on and return 
 323         for(i 
= 0; i 
< FpgaImageLen
; i
++) { 
 324                 int b 
= get_from_fpga_stream(bitstream_version
, compressed_fpga_stream
, output_buffer
); 
 326                         Dbprintf("Error %d during FpgaDownload", b
); 
 329                 DownloadFPGA_byte(b
); 
 332         // continue to clock FPGA until ready signal goes high 
 334         while ( (i
--) && ( !(AT91C_BASE_PIOA
->PIO_PDSR 
& GPIO_FPGA_DONE 
) ) ) { 
 335                 HIGH(GPIO_FPGA_CCLK
); 
 338         // crude error indicator, leave both red LEDs on and return 
 348 /* Simple Xilinx .bit parser. The file starts with the fixed opaque byte sequence 
 349  * 00 09 0f f0 0f f0 0f f0 0f f0 00 00 01 
 350  * After that the format is 1 byte section type (ASCII character), 2 byte length 
 351  * (big endian), <length> bytes content. Except for section 'e' which has 4 bytes 
 354 static int bitparse_find_section(int bitstream_version
, char section_name
, unsigned int *section_length
, z_streamp compressed_fpga_stream
, uint8_t *output_buffer
) 
 357         #define MAX_FPGA_BIT_STREAM_HEADER_SEARCH 100  // maximum number of bytes to search for the requested section 
 358         uint16_t numbytes 
= 0; 
 359         while(numbytes 
< MAX_FPGA_BIT_STREAM_HEADER_SEARCH
) { 
 360                 char current_name 
= get_from_fpga_stream(bitstream_version
, compressed_fpga_stream
, output_buffer
); 
 362                 unsigned int current_length 
= 0; 
 363                 if(current_name 
< 'a' || current_name 
> 'e') { 
 364                         /* Strange section name, abort */ 
 368                 switch(current_name
) { 
 370                         /* Four byte length field */ 
 371                         current_length 
+= get_from_fpga_stream(bitstream_version
, compressed_fpga_stream
, output_buffer
) << 24; 
 372                         current_length 
+= get_from_fpga_stream(bitstream_version
, compressed_fpga_stream
, output_buffer
) << 16; 
 374                 default: /* Fall through, two byte length field */ 
 375                         current_length 
+= get_from_fpga_stream(bitstream_version
, compressed_fpga_stream
, output_buffer
) << 8; 
 376                         current_length 
+= get_from_fpga_stream(bitstream_version
, compressed_fpga_stream
, output_buffer
) << 0; 
 380                 if(current_name 
!= 'e' && current_length 
> 255) { 
 381                         /* Maybe a parse error */ 
 385                 if(current_name 
== section_name
) { 
 387                         *section_length 
= current_length
; 
 392                 for (uint16_t i 
= 0; i 
< current_length 
&& numbytes 
< MAX_FPGA_BIT_STREAM_HEADER_SEARCH
; i
++) { 
 393                         get_from_fpga_stream(bitstream_version
, compressed_fpga_stream
, output_buffer
); 
 402 //---------------------------------------------------------------------------- 
 403 // Check which FPGA image is currently loaded (if any). If necessary  
 404 // decompress and load the correct (HF or LF) image to the FPGA 
 405 //---------------------------------------------------------------------------- 
 406 void FpgaDownloadAndGo(int bitstream_version
) 
 408         z_stream compressed_fpga_stream
; 
 409         uint8_t output_buffer
[OUTPUT_BUFFER_LEN
] = {0x00}; 
 411         // check whether or not the bitstream is already loaded 
 412         if (downloaded_bitstream 
== bitstream_version
) 
 415         // make sure that we have enough memory to decompress 
 416         BigBuf_free(); BigBuf_Clear_ext(false); 
 418         if (!reset_fpga_stream(bitstream_version
, &compressed_fpga_stream
, output_buffer
)) { 
 422         unsigned int bitstream_length
; 
 423         if(bitparse_find_section(bitstream_version
, 'e', &bitstream_length
, &compressed_fpga_stream
, output_buffer
)) { 
 424                 DownloadFPGA(bitstream_version
, bitstream_length
, &compressed_fpga_stream
, output_buffer
); 
 425                 downloaded_bitstream 
= bitstream_version
; 
 428         inflateEnd(&compressed_fpga_stream
); 
 430         // free eventually allocated BigBuf memory 
 431         BigBuf_free(); BigBuf_Clear_ext(false); 
 435 //----------------------------------------------------------------------------- 
 436 // Gather version information from FPGA image. Needs to decompress the begin  
 437 // of the respective (HF or LF) image. 
 438 // Note: decompression makes use of (i.e. overwrites) BigBuf[]. It is therefore 
 439 // advisable to call this only once and store the results for later use. 
 440 //----------------------------------------------------------------------------- 
 441 void FpgaGatherVersion(int bitstream_version
, char *dst
, int len
) 
 443         unsigned int fpga_info_len
; 
 444         char tempstr
[40] = {0x00}; 
 445         z_stream compressed_fpga_stream
; 
 446         uint8_t output_buffer
[OUTPUT_BUFFER_LEN
] = {0x00}; 
 450         // ensure that we can allocate enough memory for decompression: 
 451         BigBuf_free(); BigBuf_Clear_ext(false); 
 453         if (!reset_fpga_stream(bitstream_version
, &compressed_fpga_stream
, output_buffer
)) 
 456         if(bitparse_find_section(bitstream_version
, 'a', &fpga_info_len
, &compressed_fpga_stream
, output_buffer
)) { 
 457                 for (uint16_t i 
= 0; i 
< fpga_info_len
; i
++) { 
 458                         char c 
= (char)get_from_fpga_stream(bitstream_version
, &compressed_fpga_stream
, output_buffer
); 
 459                         if (i 
< sizeof(tempstr
)) { 
 463                 if (!memcmp("fpga_lf", tempstr
, 7)) 
 464                         strncat(dst
, "LF ", len
-1); 
 465                 else if (!memcmp("fpga_hf", tempstr
, 7)) 
 466                         strncat(dst
, "HF ", len
-1); 
 468         strncat(dst
, "FPGA image built", len
-1); 
 469         if(bitparse_find_section(bitstream_version
, 'b', &fpga_info_len
, &compressed_fpga_stream
, output_buffer
)) { 
 470                 strncat(dst
, " for ", len
-1); 
 471                 for (uint16_t i 
= 0; i 
< fpga_info_len
; i
++) { 
 472                         char c 
= (char)get_from_fpga_stream(bitstream_version
, &compressed_fpga_stream
, output_buffer
); 
 473                         if (i 
< sizeof(tempstr
)) { 
 477                 strncat(dst
, tempstr
, len
-1); 
 479         if(bitparse_find_section(bitstream_version
, 'c', &fpga_info_len
, &compressed_fpga_stream
, output_buffer
)) { 
 480                 strncat(dst
, " on ", len
-1); 
 481                 for (uint16_t i 
= 0; i 
< fpga_info_len
; i
++) { 
 482                         char c 
= (char)get_from_fpga_stream(bitstream_version
, &compressed_fpga_stream
, output_buffer
); 
 483                         if (i 
< sizeof(tempstr
)) { 
 487                 strncat(dst
, tempstr
, len
-1); 
 489         if(bitparse_find_section(bitstream_version
, 'd', &fpga_info_len
, &compressed_fpga_stream
, output_buffer
)) { 
 490                 strncat(dst
, " at ", len
-1); 
 491                 for (uint16_t i 
= 0; i 
< fpga_info_len
; i
++) { 
 492                         char c 
= (char)get_from_fpga_stream(bitstream_version
, &compressed_fpga_stream
, output_buffer
); 
 493                         if (i 
< sizeof(tempstr
)) { 
 497                 strncat(dst
, tempstr
, len
-1); 
 500         strncat(dst
, "\n", len
-1); 
 502         inflateEnd(&compressed_fpga_stream
); 
 506 //----------------------------------------------------------------------------- 
 507 // Send a 16 bit command/data pair to the FPGA. 
 508 // The bit format is:  C3 C2 C1 C0 D11 D10 D9 D8 D7 D6 D5 D4 D3 D2 D1 D0 
 509 // where C is the 4 bit command and D is the 12 bit data 
 510 //----------------------------------------------------------------------------- 
 511 void FpgaSendCommand(uint16_t cmd
, uint16_t v
) 
 513         SetupSpi(SPI_FPGA_MODE
); 
 514         while ((AT91C_BASE_SPI
->SPI_SR 
& AT91C_SPI_TXEMPTY
) == 0);              // wait for the transfer to complete 
 515         AT91C_BASE_SPI
->SPI_TDR 
= AT91C_SPI_LASTXFER 
| cmd 
| v
;         // send the data 
 517 //----------------------------------------------------------------------------- 
 518 // Write the FPGA setup word (that determines what mode the logic is in, read 
 519 // vs. clone vs. etc.). This is now a special case of FpgaSendCommand() to 
 520 // avoid changing this function's occurence everywhere in the source code. 
 521 //----------------------------------------------------------------------------- 
 522 void FpgaWriteConfWord(uint8_t v
) 
 524         FpgaSendCommand(FPGA_CMD_SET_CONFREG
, v
); 
 527 //----------------------------------------------------------------------------- 
 528 // Set up the CMOS switches that mux the ADC: four switches, independently 
 529 // closable, but should only close one at a time. Not an FPGA thing, but 
 530 // the samples from the ADC always flow through the FPGA. 
 531 //----------------------------------------------------------------------------- 
 532 void SetAdcMuxFor(uint32_t whichGpio
) 
 534         AT91C_BASE_PIOA
->PIO_OER 
= 
 540         AT91C_BASE_PIOA
->PIO_PER 
= 
 546         LOW(GPIO_MUXSEL_HIPKD
); 
 547         LOW(GPIO_MUXSEL_HIRAW
); 
 548         LOW(GPIO_MUXSEL_LORAW
); 
 549         LOW(GPIO_MUXSEL_LOPKD
); 
 554 void Fpga_print_status(void) 
 557         if(downloaded_bitstream 
== FPGA_BITSTREAM_HF
) Dbprintf("  mode.............HF"); 
 558         else if(downloaded_bitstream 
== FPGA_BITSTREAM_LF
) Dbprintf("  mode.............LF"); 
 559         else Dbprintf("  mode.............%d", downloaded_bitstream
);