fpga.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:4k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * Copyright (C) Eicon Technology Corporation, 2000.
  3.  *
  4.  * Eicon File Revision :    1.2  
  5.  *
  6.  * This software may be used and distributed according to the terms
  7.  * of the GNU General Public License, incorporated herein by reference.
  8.  *
  9.  */
  10. #include "sys.h"
  11. #include "idi.h"
  12. #include "uxio.h"
  13. #define FPGA_PORT 0x6E
  14. #define FPGA_DLOAD_BUFLEN    256
  15. #define NAME_OFFSET          0x10
  16. #define NAME_MAXLEN          12
  17. #define DATE_OFFSET          0x2c
  18. #define DATE_MAXLEN          10
  19. word UxCardPortIoInW(ux_diva_card_t *card, byte *base, int offset);
  20. void UxCardPortIoOutW(ux_diva_card_t *card, byte *base, int offset, word);
  21. void UxPause(long int);
  22. /*-------------------------------------------------------------------------*/
  23. /* Loads the FPGA configuration file onto the hardware.                    */
  24. /* Function returns 0 on success, else an error number.                    */
  25. /* On success, an identifier string is returned in the buffer              */
  26. /*                                                                         */
  27. /* A buffer of FPGA_BUFSIZE, a handle to the already opened bitstream      */
  28. /* file and a file read function has to be provided by the operating       */
  29. /* system part.                                                            */
  30. /* ----------------------------------------------------------------------- */
  31. int FPGA_Download( word      cardtype,
  32.                         dword     RegBase,
  33.                         byte *strbuf,
  34.                         byte FPGA_SRC[],
  35. int FPGA_LEN
  36.                       )
  37. {
  38.   word        i, j, k;
  39.   word        baseval, Mask_PROGRAM, Mask_DONE, Mask_CCLK, Mask_DIN;
  40.   dword       addr;
  41.   byte        *pFPGA;
  42.   //--- check for legal cardtype
  43.   switch (cardtype)
  44.   {
  45.     case IDI_ADAPTER_MAESTRAQ:
  46.       addr          = RegBase ; // address where to access FPGA
  47.       Mask_PROGRAM  = 0x0001;         // FPGA pins at address
  48.       Mask_DONE     = 0x0002;
  49.       Mask_CCLK     = 0x0100;
  50.       Mask_DIN      = 0x0400;
  51.       baseval       = 0x000d;         // PROGRAM hi, CCLK lo, DIN lo by default
  52.     break;
  53.       
  54.     default:
  55.    DPRINTF(("divas: FPGA Download ,Illegal Card"));
  56.        return -1; // illegal card 
  57.   }
  58.   //--- generate id string from file content
  59.   for (j=NAME_OFFSET, k=0; j<(NAME_OFFSET+NAME_MAXLEN); j++, k++) //name
  60.   {
  61.     if (!FPGA_SRC[j]) break;
  62.     strbuf[k] = FPGA_SRC[j];
  63.   } 
  64.   strbuf[k++] = ' ';
  65.   for (j=DATE_OFFSET; j<(DATE_OFFSET+DATE_MAXLEN); j++, k++) // date
  66.   {
  67.     if (!FPGA_SRC[j]) break;
  68.     strbuf[k] = FPGA_SRC[j];
  69.   } 
  70.   strbuf[k] = 0;
  71.   DPRINTF(("divas: FPGA Download - %s", strbuf));
  72.   //--- prepare download, Pulse PROGRAM pin down.
  73.   UxCardPortIoOutW(NULL, (byte *) addr, FPGA_PORT, baseval &~Mask_PROGRAM);  // PROGRAM low pulse
  74.   UxCardPortIoOutW(NULL, (byte *) addr, FPGA_PORT, baseval);                 // release
  75.   UxPause(50);  // wait until FPGA finised internal memory clear
  76.   
  77.   //--- check done pin, must be low
  78.   if (UxCardPortIoInW(NULL, (byte *) addr, FPGA_PORT) &Mask_DONE) 
  79.   {
  80.     DPRINTF(("divas: FPGA_ERR_DONE_WRONG_LEVEL"));
  81.     return -1;
  82.   }
  83.   pFPGA = FPGA_SRC;
  84.   i = 0; 
  85.   /* Move past the header */
  86.   while ((FPGA_SRC[i] != 0xFF) && (i < FPGA_LEN)) 
  87.   {
  88.     i++;
  89.   }
  90.   // We've hit the 0xFF so move on to the next byte
  91.   // i++;
  92.   DPRINTF(("divas: FPGA Code starts at offset %d", i));
  93.   //--- put data onto the FPGA
  94.   for (;i<FPGA_LEN; i++)
  95.   {
  96.     //--- put byte onto FPGA
  97.     for (j=0; j<8; j++)
  98.     {
  99.       if (FPGA_SRC[i] &(0x80>>j)) baseval |= Mask_DIN; // write a hi
  100.       else                      baseval &=~Mask_DIN; // write a lo
  101.       UxCardPortIoOutW(NULL, (byte *) addr, FPGA_PORT, baseval);
  102.       UxCardPortIoOutW(NULL, (byte *) addr, FPGA_PORT, baseval | Mask_CCLK);     // set CCLK hi
  103.       UxCardPortIoOutW(NULL, (byte *) addr, FPGA_PORT, baseval);                 // set CCLK lo
  104.     }
  105.   }
  106.   //--- add some additional startup clock cycles and check done pin
  107.   for (i=0; i<5; i++) 
  108.   {
  109.     UxCardPortIoOutW(NULL, (byte *) addr, FPGA_PORT, baseval | Mask_CCLK);     // set CCLK hi
  110.     UxCardPortIoOutW(NULL, (byte *) addr, FPGA_PORT, baseval);                 // set CCLK lo
  111.   }
  112.   UxPause(100);
  113.   if (UxCardPortIoInW(NULL, (byte *) addr, FPGA_PORT) &Mask_DONE) 
  114.   {
  115.     DPRINTF(("divas: FPGA download successful"));
  116.   }
  117.   else
  118.   {
  119.     DPRINTF(("divas: FPGA download failed - 0x%x", UxCardPortIoInW(NULL, (byte *) addr, FPGA_PORT)));
  120. return -1;
  121.   }
  122. return 0;
  123. }