OpenCores
URL https://opencores.org/ocsvn/usb_fpga_1_11/usb_fpga_1_11/trunk

Subversion Repositories usb_fpga_1_11

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /usb_fpga_1_11/trunk/java/ztex
    from Rev 2 to Rev 3
    Reverse comparison

Rev 2 → Rev 3

/Ztex1.java
125,7 → 125,7
int i = -1;
if ( controlMsgTimeout < 200 )
controlMsgTimeout = 200;
while ( i<=0 && new Date().getTime()-t0<controlMsgTimeout ) { // we repeat the message until the timeout has reached
// while ( i<=0 && new Date().getTime()-t0<controlMsgTimeout ) { // we repeat the message until the timeout has reached
i = LibusbJava.usb_control_msg(handle, 0x40, cmd, value, index, buf, length, controlMsgTimeout);
if ( certainWorkarounds ) {
try {
144,7 → 144,7
}
trynum++;
}
}
// }
if ( i < 0 )
throw new UsbException( dev.dev(), (func != null ? func + ": " : "" )+ LibusbJava.usb_strerror());
return i;
436,6 → 436,7
* @throws UsbException if a communication error occurs.
* @throws InvalidFirmwareException if ZTEX descriptor 1 is not available.
* @throws DeviceLostException if a device went lost after renumeration.
* @return the upload time in ms.
*/
// returns upload time in ms
public long uploadFirmware ( String ihxFileName, boolean force ) throws IncompatibleFirmwareException, FirmwareUploadException, UsbException, InvalidFirmwareException, DeviceLostException {
/Ztex1v1.java
43,7 → 43,7
VC 0x32 : send FPGA configuration data (Bitstream)
 
0.2 : Flash memory support
VR 0x40 : Flash state
VR 0x40 : read Flash state
Returns:
Offs Description
0 1:enabled, 0:disabled
52,6 → 52,14
7 Error code
VR 0x41 : read from Flash
VR 0x42 : write to Flash
0.3 : Debug helper support
VR 0x28 : read debug data
Returns:
Offs Description
0-1 number of messages
2 stack size in messages
3 message size in bytes
>=4 message stack
*/
package ztex;
 
209,6 → 217,45
* </table>
* </td>
* </tr>
* <tr>
* <td bgcolor="#ffffff" valign="top">0.3</td>
* <td bgcolor="#ffffff" valign="top" colspan=2>
* Debug helper support<p>
* <table bgcolor="#404040" cellspacing=1 cellpadding=6>
* <tr>
* <td bgcolor="#d0d0d0" valign="bottom"><b>Vendor request (VR)<br> or command (VC)</b></td>
* <td bgcolor="#d0d0d0" valign="bottom"><b>Description</b></td>
* </tr>
* <tr>
* <td bgcolor="#ffffff" valign="top">VR 0x28</td>
* <td bgcolor="#ffffff" valign="top">Get debug data. Returns:
* <table bgcolor="#404040" cellspacing=1 cellpadding=4>
* <tr>
* <td bgcolor="#d0d0d0" valign="bottom"><b>Bytes</b></td>
* <td bgcolor="#d0d0d0" valign="bottom"><b>Description</b></td>
* </tr>
* <tr>
* <td bgcolor="#ffffff" valign="top">0-1</td>
* <td bgcolor="#ffffff" valign="top">Number of the last message</td>
* </tr>
* <tr>
* <td bgcolor="#ffffff" valign="top">2</td>
* <td bgcolor="#ffffff" valign="top">Stack size in messages</td>
* </tr>
* <tr>
* <td bgcolor="#ffffff" valign="top">3</td>
* <td bgcolor="#ffffff" valign="top">Message size in bytes</td>
* </tr>
* <tr>
* <td bgcolor="#ffffff" valign="top">&ge;4</td>
* <td bgcolor="#ffffff" valign="top">Message stack</td>
* </tr>
* </table>
* </td>
* </tr>
* </table>
* </td>
* </tr>
* </table>
* @see ZtexDevice1
* @see Ztex1
215,11 → 262,24
*/
 
public class Ztex1v1 extends Ztex1 {
/** * Capability index for EEPROM support. */
public static final int CAPABILITY_EEPROM = 0;
/** * Capability index for FPGA configuration support. */
public static final int CAPABILITY_FPGA = 1;
/** * Capability index for FLASH memory support. */
public static final int CAPABILITY_FLASH = 2;
/** * Capability index for DEBUG helper support. */
public static final int CAPABILITY_DEBUG = 3;
/** * Capability index for AVR XMEGA support. */
public static final int CAPABILITY_XMEGA = 4;
 
/** * The names of the capabilities */
public static final String capabilityStrings[] = {
"EEPROM read/write" ,
"FPGA configuration" ,
"Flash memory support"
"Flash memory support",
"Debug helper",
"XMEGA support"
};
private boolean fpgaConfigured = false;
256,6 → 316,12
public static final int FLASH_EC_WRITE_ERROR = 6;
/** * Signals the the installed Flash memeory is not supported. */
public static final int FLASH_EC_NOTSUPPORTED = 7;
private int debugStackSize = -1;
private int debugMsgSize = -1;
private int debugLastMsg = 0;
/** * Is set by {@link #debugReadMessages(boolean,byte[])} and conains the number of new messages. */
public int debugNewMessages = 0;
 
// ******* Ztex1v1 *************************************************************
/**
332,6 → 398,16
}
}
 
/**
* Checks whether ZTEX descriptor 1 is available and interface 1 and a given capability are supported.
* @param i capability index (0..47)
* @throws InvalidFirmwareException if ZTEX descriptor 1 is not available or interface 1 is not supported.
* @throws CapabilityException if the given capability is not supported.
*/
public void checkCapability ( int i ) throws InvalidFirmwareException, CapabilityException {
checkCapability(i/8, i%8);
}
 
// ******* checkCompatible *****************************************************
/**
* Checks whether the given product ID is compatible to the device corresponding to this class and whether interface 1 is supported.
351,7 → 427,7
// ******* getFpgaState ********************************************************
private void getFpgaState () throws UsbException, InvalidFirmwareException, CapabilityException {
byte[] buffer = new byte[9];
checkCapability(0,1);
checkCapability(CAPABILITY_FPGA);
vendorRequest2(0x30, "getFpgaState", buffer, 9);
fpgaConfigured = buffer[0] == 0;
fpgaChecksum = buffer[1] & 0xff;
407,10 → 483,44
* @throws CapabilityException if FPGA configuration is not supported by the firmware.
*/
public void resetFpga () throws UsbException, InvalidFirmwareException, CapabilityException {
checkCapability(0,1);
checkCapability(CAPABILITY_FPGA);
vendorCommand(0x31, "resetFpga" );
}
 
 
// ******* detectBitstreamBitOrder *********************************************
private int detectBitstreamBitOrder ( byte[] buf ) {
for ( int i=0; i<buf.length-3; i++ ) {
if ( ((buf[i] & 255)==0xaa) && ((buf[i+1] & 255)==0x99) && ((buf[i+2] & 255)==0x55) && ((buf[i+3] & 255)==0x66) )
return 1;
if ( ((buf[i] & 255)==0x55) && ((buf[i+1] & 255)==0x99) && ((buf[i+2] & 255)==0xaa) && ((buf[i+3] & 255)==0x66) )
return 0;
}
System.err.println("Warning: Unable to determine bitstream bit order: no signature found");
return 0;
}
 
// ******* swapBits ************************************************************
private void swapBits ( byte[][] buf, int size ) {
int j=0, k=0;
for (int i=0; i<size; i++ ) {
while ( k >= buf[j].length ) {
j++;
k=0;
}
byte b = buf[j][k];
buf[j][k] = (byte) ( ((b & 128) >> 7) |
((b & 64) >> 5) |
((b & 32) >> 3) |
((b & 16) >> 1) |
((b & 8) << 1) |
((b & 4) << 3) |
((b & 2) << 5) |
((b & 1) << 7) );
k++;
}
}
 
// ******* configureFpga *******************************************************
// returns configuration time in ms
/**
417,6 → 527,7
* Upload a Bitstream to the FPGA.
* @param fwFileName The file name of the Bitstream. The file can be a regular file or a system resource (e.g. a file from the current jar archive).
* @param force If set to true existing configurations will be overwritten. (By default an {@link AlreadyConfiguredException} is thrown).
* @param bs 0: disable bit swapping, 1: enable bit swapping, all other values: automatic detection of bit order.
* @throws BitstreamReadException if an error occurred while attempting to read the Bitstream.
* @throws BitstreamUploadException if an error occurred while attempting to upload the Bitstream.
* @throws AlreadyConfiguredException if the FPGA is already configured.
424,17 → 535,17
* @throws UsbException if a communication error occurs.
* @throws CapabilityException if FPGA configuration is not supported by the firmware.
*/
public long configureFpga ( String fwFileName, boolean force ) throws BitstreamReadException, UsbException, BitstreamUploadException, AlreadyConfiguredException, InvalidFirmwareException, CapabilityException {
public long configureFpga ( String fwFileName, boolean force, int bs ) throws BitstreamReadException, UsbException, BitstreamUploadException, AlreadyConfiguredException, InvalidFirmwareException, CapabilityException {
final int transactionBytes = certainWorkarounds ? 256 : 2048;
long t0 = 0;
 
checkCapability(0,1);
checkCapability(CAPABILITY_FPGA);
if ( !force && getFpgaConfiguration() )
throw new AlreadyConfiguredException();
 
// read the Bitstream file
byte[][] buffer = new byte[4*1024*1024/transactionBytes][];
byte[][] buffer = new byte[16*1024*1024/transactionBytes][];
int size = 0;
try {
InputStream inputStream = JInputStream.getInputStream( fwFileName );
461,6 → 572,12
}
if ( size < 64 || size % 64 == 0 )
throw new BitstreamReadException("Invalid file size: " + size );
 
// detect bitstream bit order and swap bits if necessary
if ( bs<0 || bs>1 )
bs = detectBitstreamBitOrder ( buffer[0] );
if ( bs == 1 )
swapBits(buffer,size);
// upload the Bitstream file
for ( int tries=10; tries>0; tries-- ) {
470,7 → 587,7
try {
t0 = -new Date().getTime();
int cs = 0;
int bs = 0;
bs = 0;
for ( int i=0; i<buffer.length && i*transactionBytes < size; i++ ) {
int j = size-i*transactionBytes;
514,6 → 631,21
return t0;
}
 
/**
* Upload a Bitstream to the FPGA.
* @param fwFileName The file name of the Bitstream. The file can be a regular file or a system resource (e.g. a file from the current jar archive).
* @param force If set to true existing configurations will be overwritten. (By default an {@link AlreadyConfiguredException} is thrown).
* @throws BitstreamReadException if an error occurred while attempting to read the Bitstream.
* @throws BitstreamUploadException if an error occurred while attempting to upload the Bitstream.
* @throws AlreadyConfiguredException if the FPGA is already configured.
* @throws InvalidFirmwareException if interface 1 is not supported.
* @throws UsbException if a communication error occurs.
* @throws CapabilityException if FPGA configuration is not supported by the firmware.
*/
public long configureFpga ( String fwFileName, boolean force ) throws BitstreamReadException, UsbException, BitstreamUploadException, AlreadyConfiguredException, InvalidFirmwareException, CapabilityException {
return configureFpga(fwFileName, force, -1);
}
 
// ******* eepromState *********************************************************
// returns true if EEPROM is ready
/**
526,7 → 658,7
*/
public boolean eepromState ( ) throws UsbException, InvalidFirmwareException, CapabilityException {
byte[] buf = new byte[4];
checkCapability(0,0);
checkCapability(CAPABILITY_EEPROM);
vendorRequest2(0x3A, "EEPROM State", 0, 0, buf, 4);
eepromBytes = (buf[0] & 255) | (buf[1] & 255)<<8;
eepromChecksum = buf[2] & 255;
544,7 → 676,7
* @throws CapabilityException if EEPROM access is not supported by the firmware.
*/
public void eepromWrite ( int addr, byte[] buf, int length ) throws UsbException, InvalidFirmwareException, CapabilityException {
checkCapability(0,0);
checkCapability(CAPABILITY_EEPROM);
vendorCommand2( 0x39, "EEPROM Write", addr, 0, buf, length );
try {
Thread.sleep( 10 );
564,7 → 696,7
* @throws CapabilityException if EEPROM access is not supported by the firmware.
*/
public void eepromRead ( int addr, byte[] buf, int length ) throws UsbException, InvalidFirmwareException, CapabilityException {
checkCapability(0,0);
checkCapability(CAPABILITY_EEPROM);
vendorRequest2( 0x38, "EEPROM Read", addr, 0, buf, length ); // sometimes a little bit slow
try {
Thread.sleep( 10 );
591,7 → 723,7
int pages = 0;
byte[][] buffer = new byte[pagesMax][];
 
checkCapability(0,0);
checkCapability(CAPABILITY_EEPROM);
// load the ihx file
ZtexIhxFile1 ihxFile;
791,7 → 923,7
*/
public boolean flashState () throws UsbException, InvalidFirmwareException, CapabilityException {
byte[] buf = new byte[8];
checkCapability(0,2);
checkCapability(CAPABILITY_FLASH);
 
// device may be busy due to initialization, we try it up to up to 4s
vendorRequest2(0x40, "Flash State", 0, 0, buf, 8);
818,6 → 950,7
// reads the current error code
/**
* Gets the last Flash error from the device.
* @return The last error code.
* @throws InvalidFirmwareException if interface 1 is not supported.
* @throws UsbException if a communication error occurs.
* @throws CapabilityException if Flash memory access is not supported by the firmware.
824,7 → 957,7
*/
public int getFlashEC () throws UsbException, InvalidFirmwareException, CapabilityException {
byte[] buf = new byte[8];
checkCapability(0,2);
checkCapability(CAPABILITY_FLASH);
vendorRequest2(0x40, "Flash State", 0, 0, buf, 8);
flashEC = buf[7] & 255;
return flashEC;
841,7 → 974,7
* @throws CapabilityException if Flash memory access is not possible.
*/
public void flashReadSector ( int sector, byte[] buf ) throws UsbException, InvalidFirmwareException, CapabilityException {
checkCapability(0,2);
checkCapability(CAPABILITY_FLASH);
if ( ! flashEnabled() )
throw new CapabilityException(this, "No Flash memory installed or");
 
864,7 → 997,7
* @throws CapabilityException if Flash memory access is not possible.
*/
public void flashWriteSector ( int sector, byte[] buf ) throws UsbException, InvalidFirmwareException, CapabilityException {
checkCapability(0,2);
checkCapability(CAPABILITY_FLASH);
if ( ! flashEnabled() )
throw new CapabilityException(this, "No Flash memory installed or");
 
948,7 → 1081,7
*/
public boolean printMmcState ( ) throws UsbException, InvalidFirmwareException, CapabilityException {
byte[] buf = new byte[23];
checkCapability(0,2);
checkCapability(CAPABILITY_FLASH);
vendorRequest2(0x43, "MMC State", 0, 0, buf, 23);
System.out.println("status=" + Integer.toBinaryString(256+(buf[0] & 255)).substring(1) + "." + Integer.toBinaryString(256+(buf[1] & 255)).substring(1) +
" lastCmd=" + buf[3] +
1004,20 → 1137,21
* <p>
* The first sector of the Bitstream is sector 1.
* @param fwFileName The file name of the Bitstream. The file can be a regular file or a system resource (e.g. a file from the current jar archive).
* @param bs 0: disable bit swapping, 1: enable bit swapping, all other values: automatic detection of bit order.
* @throws InvalidFirmwareException if interface 1 is not supported.
* @throws UsbException if a communication error occurs.
* @throws CapabilityException if Flash memory access is not possible.
* @throws BitstreamReadException if an error occurred while attempting to read the Bitstream.
*/
public long flashUploadBitstream ( String fwFileName ) throws BitstreamReadException, UsbException, InvalidFirmwareException, CapabilityException {
checkCapability(0,1);
checkCapability(0,2);
public long flashUploadBitstream ( String fwFileName, int bs ) throws BitstreamReadException, UsbException, InvalidFirmwareException, CapabilityException {
checkCapability(CAPABILITY_FPGA);
checkCapability(CAPABILITY_FLASH);
if ( ! flashEnabled() )
throw new CapabilityException(this, "No Flash memory installed or");
getFpgaState();
// read the Bitstream file
byte[][] buffer = new byte[2048][];
byte[][] buffer = new byte[32768][];
int i,j;
try {
InputStream inputStream = JInputStream.getInputStream( fwFileName );
1025,19 → 1159,6
for ( i=0; i<buffer.length && j==flashSectorSize; i++ ) {
buffer[i] = new byte[flashSectorSize];
j = inputStream.read( buffer[i] );
if ( fpgaFlashBitSwap ) {
for (int k=0; k<flashSectorSize; k++ ) {
byte b = buffer[i][k];
buffer[i][k] = (byte) ( ((b & 128) >> 7) |
((b & 64) >> 5) |
((b & 32) >> 3) |
((b & 16) >> 1) |
((b & 8) << 1) |
((b & 4) << 3) |
((b & 2) << 5) |
((b & 1) << 7));
}
}
if ( j < 0 )
j = 0;
}
1053,6 → 1174,12
throw new BitstreamReadException(e.getLocalizedMessage());
}
 
// detect bitstream bit order and swap bits if necessary
if ( bs<0 || bs>1 )
bs = detectBitstreamBitOrder(buffer[0]);
if ( fpgaFlashBitSwap != (bs==1) )
swapBits( buffer, flashSectorSize*i );
 
// upload the Bitstream file
byte[] sector = new byte[flashSectorSize];
byte[] ID = new String("ZTEXBS").getBytes();
1074,6 → 1201,21
return new Date().getTime() - t0;
}
 
/**
* Uploads a Bitstream to the Flash.
* This allows the firmware to load the Bitstream from Flash. Together with installation of the firmware in EEPROM
* it is possible to construct fully autonomous devices.
* See {@link #flashUploadBitstream(String,int)} for further details.
* @param fwFileName The file name of the Bitstream. The file can be a regular file or a system resource (e.g. a file from the current jar archive).
* @throws InvalidFirmwareException if interface 1 is not supported.
* @throws UsbException if a communication error occurs.
* @throws CapabilityException if Flash memory access is not possible.
* @throws BitstreamReadException if an error occurred while attempting to read the Bitstream.
*/
public long flashUploadBitstream ( String fwFileName ) throws BitstreamReadException, UsbException, InvalidFirmwareException, CapabilityException {
return flashUploadBitstream(fwFileName, -1);
}
 
// ******* flashResetBitstream *************************************************
// Clears a Bitstream from the Flash.
/**
1085,7 → 1227,7
* @throws CapabilityException if Flash memory access is not possible.
*/
public void flashResetBitstream ( ) throws UsbException, InvalidFirmwareException, CapabilityException {
checkCapability(0,2);
checkCapability(CAPABILITY_FLASH);
if ( ! flashEnabled() )
throw new CapabilityException(this, "No Flash memory installed or");
byte[] sector = new byte[flashSectorSize];
1113,7 → 1255,7
* @throws CapabilityException if Flash memory access is not possible.
*/
public int flashFirstFreeSector ( ) throws UsbException, InvalidFirmwareException, CapabilityException {
checkCapability(0,2);
checkCapability(CAPABILITY_FLASH);
if ( ! flashEnabled() )
throw new CapabilityException(this, "No Flash memory installed or");
 
1129,6 → 1271,82
return (sector[8] & 255) + ((sector[9] & 255) << 8) + 1;
}
 
// ******* debugStackSize ******************************************************
/**
* Returns the size of message stack in messages.
* @return the size of message stack in messages.
* @throws InvalidFirmwareException if interface 1 is not supported.
* @throws UsbException if a communication error occurs.
* @throws CapabilityException if Flash memory access is not possible.
*/
public int debugStackSize ( ) throws UsbException, InvalidFirmwareException, CapabilityException {
checkCapability(CAPABILITY_DEBUG);
if ( debugStackSize<=0 || debugMsgSize<=0 ) {
byte[] buf = new byte[7];
vendorRequest2(0x28, "Read debug data", 0, 0, buf, 4);
debugStackSize = buf[2] & 255;
debugMsgSize = buf[3] & 255;
}
return debugStackSize;
}
 
// ******* debugMsgSize ********************************************************
/**
* Returns the size of messages in bytes.
* @return the size of messages in bytes.
* @throws InvalidFirmwareException if interface 1 is not supported.
* @throws UsbException if a communication error occurs.
* @throws CapabilityException if Flash memory access is not possible.
*/
public int debugMsgSize ( ) throws UsbException, InvalidFirmwareException, CapabilityException {
checkCapability(CAPABILITY_DEBUG);
if ( debugMsgSize<=0 )
debugStackSize();
return debugMsgSize;
}
 
// ******* debugLastMsg ********************************************************
/**
* Returns the number of the last message read out by {@link #debugReadMessages(boolean,byte[])}
* @return the number of the last message read out by {@link #debugReadMessages(boolean,byte[])}
*/
public final int debugLastMsg ( ) {
return debugLastMsg;
}
 
// ******* debugReadMessages ***************************************************
/**
* Reads debug messages from message stack.
* The number of messages stored in buf is returned. The total number of new messages is stored in {@link #debugNewMessages}.
* The number of the latest message is returned by {@link #debugLastMsg()}.
* @param all If true, all messages from stack are written to buf. If it is false, only the new messages are written to buf.
* @param buf The buffer to store the messages.
* @return the size of messages stored in buffer.
* @throws InvalidFirmwareException if interface 1 is not supported.
* @throws UsbException if a communication error occurs.
* @throws CapabilityException if Flash memory access is not possible.
*/
public int debugReadMessages ( boolean all, byte[] buf ) throws UsbException, InvalidFirmwareException, CapabilityException {
checkCapability(CAPABILITY_DEBUG);
byte buf2[] = new byte[ debugStackSize()*debugMsgSize() + 4 ];
vendorRequest2(0x28, "Read debug data", 0, 0, buf2, buf2.length);
int lm = (buf2[0] & 255) | ((buf2[1] & 255) << 8);
debugNewMessages = lm - debugLastMsg;
int r = Math.min( Math.min( buf.length/debugMsgSize() , debugStackSize ), lm);
if ( !all ) r = Math.min(r,debugNewMessages);
for (int i = 0; i<r; i++) {
int k=(lm-r+i) % debugStackSize;
for (int j=0; j<debugMsgSize; j++ )
buf[i*debugMsgSize+j] = buf2[k*debugMsgSize+j+4];
}
debugLastMsg = lm;
return r;
}
// ******* toString ************************************************************
/**
* Returns a lot of useful information about the corresponding device.
/EzUsb.java
53,7 → 53,7
* Uploads the Firmware to a Cypress EZ-USB device.
* @param handle The handle of the device.
* @param ihxFile The firmware image.
* @return The upload time in ms.
* @return the upload time in ms.
* @throws FirmwareUploadException if an error occurred while attempting to upload the firmware.
*/
public static long uploadFirmware (int handle, IhxFile ihxFile ) throws FirmwareUploadException {

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.