de     

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
en:ztex_boards:ztex_fpga_boards:sd_cards_on_series_2_fpga_boards [2014/07/21 12:51] stefanen:ztex_boards:ztex_fpga_boards:sd_cards_on_series_2_fpga_boards [2016/09/14 19:45] (current) stefan
Line 1: Line 1:
-====== SD card support on Series 2 FPGA Boards ======+====== SD card support on FX2 based Series 2 FPGA Boards ====== 
 +ZTEX uses the FX3S on its FPGA Boards. These boards have native SD card support (including SDIO). 
  
-By introduction of [[http://www.ztex.de/usb-fpga-2/|Series 2 FPGA Boards]] the microSD socket used on Series 1 FPGA Boards has been replaced by fixed SPI Flash. Nevertheless, SD-Card support can be easily be re-enabled by adding an (micro)SD card socket to the application circuit and routing the signals through FPGA. This is explained best by an example:+On FX2 based based Series 2 FPGA Boards there is no SD socket. Users that miss it (e.g. because they previously used Series 1 Boardscan easily add a (micro)SD socket to their application circuit
 + 
 +This page described how this is done and how firmware support is activated. This is explained best by an example:
  
 A SD card is connected to an [[http://www.ztex.de/usb-fpga-2/usb-fpga-2.01.e.html|USB-FPGA Module 2.01]] as follows A SD card is connected to an [[http://www.ztex.de/usb-fpga-2/usb-fpga-2.01.e.html|USB-FPGA Module 2.01]] as follows
Line 12: Line 15:
 |  DO  |  B19  |  H15  |  → (out)  | PA2  |  H15  | |  DO  |  B19  |  H15  |  → (out)  | PA2  |  H15  |
  
-The HDL code for routing the signals looks like:+The HDL code for routing the signals is:
  
 <code ucf> <code ucf>
 # ... # ...
 +
 NET "pa2" LOC = "B10" | IOSTANDARD = LVCMOS33 ; # PA2 NET "pa2" LOC = "B10" | IOSTANDARD = LVCMOS33 ; # PA2
 NET "pc1" LOC = "N12" | IOSTANDARD = LVCMOS33 ; # PC1/GPIFADR1 NET "pc1" LOC = "N12" | IOSTANDARD = LVCMOS33 ; # PC1/GPIFADR1
Line 56: Line 60:
  
 In order to enable firmware support the following lines have to be inserted between ''#include[ztex-conf.h]'' and ''#include[ztex.h]'' In order to enable firmware support the following lines have to be inserted between ''#include[ztex-conf.h]'' and ''#include[ztex.h]''
 +
 +<code>
 +ENABLE_FLASH2;            // enables SD support as secondary Flash
 +#define[MMC_PORT][C]      // Port for input signals, valid values: A..D
 +#define[MMC__PORT_DO][A]  // Port for output signals (valid values: A..D,
 +                          // can be omitted if equal to input port)
 +#define[MMC_BIT_CS][1]    // Pin number for CS signal, i.e. PC1
 +#define[MMC_BIT_DI][2]    // Pin number for DI signal, i.e. PC2
 +#define[MMC_BIT_DO][2]    // Pin number for DO signal, i.e. PA2
 +#define[MMC_BIT_CLK][3]   // Pin number for CLK signal, i.e. PC3
 +</code>
 +
 +From the firmware the SD card now can be accessed using the functions ''flash2_read_init'', ''flash2_read'', ''flash2_read_finish'',''flash2_write_init'', ''flash2_write'', ''flash2_write_finish''. The syntax is is the same as of ''flash_read_*'' and ''flash_write_*'' functions.
 +
 +From host software the SD card can be accessed using then functions [[http://www.ztex.de/firmware-kit/docs/java/ztex/Ztex1v1.html#flash2Enabled()|flash2*]] (which are equivalent to the [[http://www.ztex.de/firmware-kit/docs/java/ztex/Ztex1v1.html#flashEnabled()|functions for primary flash]]).
 +
 +Their usage can be explained with ''flashdemo'' example ported to secondary flash. The firmware code is:
  
 <code c> <code c>
 +#include[ztex-conf.h] // Loads the configuration macros, see ztex-conf.h for the available macros
 +#include[ztex-utils.h] // include basic functions and variables
 +
 +// select ZTEX USB FPGA Module 2.01 as target  (required for FPGA configuration)
 +IDENTITY_UFM_2_01(10.18.0.0,0);  
 +
 +// enable Flash support
 +ENABLE_FLASH;
 +ENABLE_FLASH_BITSTREAM;
 +
 ENABLE_FLASH2;            // enables SD support as secondary Flash ENABLE_FLASH2;            // enables SD support as secondary Flash
 #define[MMC_PORT][C]      // Port for input signals, valid values: A..D #define[MMC_PORT][C]      // Port for input signals, valid values: A..D
Line 66: Line 97:
 #define[MMC_BIT_DO][2]    // Pin number for DO signal, i.e. PA2 #define[MMC_BIT_DO][2]    // Pin number for DO signal, i.e. PA2
 #define[MMC_BIT_CLK][3]   // Pin number for CLK signal, i.e. PC3 #define[MMC_BIT_CLK][3]   // Pin number for CLK signal, i.e. PC3
 +
 +// this product string is also used for identification by the host software
 +#define[PRODUCT_STRING]["Flash2 demo for UFM 2.01"]
 +
 +__code char flash2_string[] = "Hello World!";
 +
 +// include the main part of the firmware kit, define the descriptors, ...
 +#include[ztex.h]
 +
 +void main(void)
 +{
 +    __xdata DWORD sector;
 +
 +    init_USB(); // init everything
 +
 +    if ( flash2_enabled ) {
 + flash2_read_init( 0 ); // prepare reading sector 0
 + flash2_read((__xdata BYTE*) &sector, 4); // read the number of last sector 
 + flash2_read_finish(flash2_sector_size - 4); // dummy-read the rest of the sector + finish read operation
 +
 + sector++;
 + if ( sector > flash2_sectors || sector == 0 ) {
 +     sector = 1;
 + }
 +
 + flash2_write_init( 0 ); // prepare writing sector 0
 + flash2_write((__xdata BYTE*) &sector, 4); // write the current sector number
 + flash2_write_finish_sector(flash2_sector_size - 4); // dummy-write the rest of the sector + CRC
 + flash2_write_finish(); // finish write operation
 +
 + flash2_write_init( sector ); // prepare writing sector sector
 + flash2_write((__xdata BYTE*) flash2_string, sizeof(flash2_string)); // write the string 
 + flash2_write_finish_sector(flash2_sector_size - sizeof(flash2_string)); // dummy-write the rest of the sector + CRC
 + flash2_write_finish(); // finish write operation
 +    }
 +
 +    while (1) { } //  twiddle thumbs
 +}
 </code> </code>
  
-The SD card now can be accessed using the functions ''flash2_read_init'', ''flash2_read'', ''flash2_read_finish''+and the host software is defined by  
 +<code java> 
 +import java.io.*; 
 +import java.util.*;
  
 +import ch.ntb.usb.*;
 +
 +import ztex.*;
 +
 +// *****************************************************************************
 +// ******* ParameterException **************************************************
 +// *****************************************************************************
 +// Exception the prints a help message
 +class ParameterException extends Exception {
 +    public final static String helpMsg = new String (
 + "Parameters:\n"+
 +   -d <number>  Device Number (default: 0)\n" +
 +   -f   Force uploads\n" +
 +   -p           Print bus info\n" +
 +   -ue          Upload Firmware to EEPROM\n" +
 +   -re          Reset EEPROM Firmware\n" +
 +   -w           Enable certain workarounds\n" +
 +   -h           This help" );
 +    
 +    public ParameterException (String msg) {
 + super( msg + "\n" + helpMsg );
 +    }
 +}
 +
 +// *****************************************************************************
 +// ******* Test0 ***************************************************************
 +// *****************************************************************************
 +class FlashDemo extends Ztex1v1 {
 +
 +// ******* FlashDemo ***********************************************************
 +// constructor
 +    public FlashDemo ( ZtexDevice1 pDev ) throws UsbException {
 + super ( pDev );
 +    }
 +
 +// ******* main ****************************************************************
 +    public static void main (String args[]) {
 +    
 + int devNum = 0;
 + boolean force = false;
 + boolean workarounds = false;
 +
 + try {
 +// init USB stuff
 +     LibusbJava.usb_init();
 +
 +// scan the USB bus
 +     ZtexScanBus1 bus = new ZtexScanBus1( ZtexDevice1.ztexVendorId, ZtexDevice1.ztexProductId, true, false, 1);
 +     if ( bus.numberOfDevices() <= 0) {
 + System.err.println("No devices found");
 +         System.exit(0);
 +     }
 +     
 +// scan the command line arguments
 +        for (int i=0; i<args.length; i++ ) {
 +         if ( args[i].equals("-d") ) {
 +         i++;
 +     try {
 + if (i>=args.length) throw new Exception();
 +    devNum = Integer.parseInt( args[i] );
 +     } 
 +     catch (Exception e) {
 +         throw new ParameterException("Device number expected after -d");
 +     }
 + }
 + else if ( args[i].equals("-f") ) {
 +     force = true;
 + }
 + else if ( args[i].equals("-p") ) {
 +         bus.printBus(System.out);
 +     System.exit(0);
 + }
 + else if ( args[i].equals("-w") ) {
 +         workarounds = true;
 + }
 + else if ( args[i].equals("-h") ) {
 +         System.err.println(ParameterException.helpMsg);
 +             System.exit(0);
 + }
 + else if ( !args[i].equals("-re") && !args[i].equals("-ue") )
 +     throw new ParameterException("Invalid Parameter: "+args[i]);
 +     }
 +     
 +
 +// create the main class     
 +     FlashDemo ztex = new FlashDemo ( bus.device(devNum) );
 +     ztex.certainWorkarounds = workarounds;
 +     
 +// upload the firmware if necessary
 +     if ( force || ! ztex.valid() || ! ztex.dev().productString().equals("Flash2 demo for UFM 2.01" ) {
 + System.out.println("Firmware upload time: " + ztex.uploadFirmware( "flashdemo.ihx", force ) + " ms");
 +     }
 +
 +        for (int i=0; i<args.length; i++ ) {
 + if ( args[i].equals("-re") ) {
 +     ztex.eepromDisable();
 +
 + else if ( args[i].equals("-ue") ) {
 +     System.out.println("Firmware to EEPROM upload time: " + ztex.eepromUpload( "flashdemo.ihx", force ) + " ms");
 + }
 +     }
 +     
 +// print some information
 +     System.out.println("Capabilities: " + ztex.capabilityInfo(", "));
 +     System.out.println("Enabled: " + ztex.flash2Enabled());
 +     System.out.println("Size: " + ztex.flash2Size());
 +     ztex.printMmc2State();
 +     
 +     if ( ztex.getFlash2EC() == ztex.FLASH_EC_PENDING ) {
 + System.out.print("Another operation is pending. Waiting ..");
 + int i = 20;
 + do {
 +     System.out.print(".");
 +     try {
 +    Thread.sleep( 1000 );
 +        }
 +     catch ( InterruptedException e) {
 +        } 
 +        i--;
 + } while ( ztex.getFlash2EC()==ztex.FLASH_EC_PENDING && i>0 );
 + System.out.println();
 +     }
 +     
 +     byte[] buf = new byte[ztex.flash2SectorSize()];
 +     ztex.flash2ReadSector(0,buf); // read out the last sector;
 +     int sector = (buf[0] & 255) | ((buf[1] & 255) << 8) | ((buf[1] & 255) << 16) | ((buf[1] & 255) << 24);
 +     System.out.println("Last sector: "+sector);
 +
 +     ztex.flash2ReadSector(sector,buf); // read out the string
 +     int i=0;
 +     while ( buf[i] != '\0'&& i < ztex.flash2SectorSize() )
 +         i++;
 +     System.out.println("The string: `" + new String(buf,0,i)+ "'");
 + }
 + catch (Exception e) {
 +     System.out.println("Error: "+e.getLocalizedMessage() );
 +
 +   
 +   
 +}
 +</code>
 
en/ztex_boards/ztex_fpga_boards/sd_cards_on_series_2_fpga_boards.txt · Last modified: 2016/09/14 19:45 by stefan
 
Recent changes RSS feed Creative Commons License Powered by PHP Debian Driven by DokuWiki
[ZTEX Home] [Imprint] [Privacy policy]