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

Subversion Repositories usb_fpga_2_14

[/] [usb_fpga_2_14/] [trunk/] [examples/] [memfifo/] [MemFifo.java] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 ZTEX
/*%
2
   memfifo -- Connects the bi-directional high speed interface of default firmware to a FIFO built of on-board SDRAM or on-chip BRAM
3
   Copyright (C) 2009-2017 ZTEX GmbH.
4
   http://www.ztex.de
5
 
6
   Licensed under the Apache License, Version 2.0 (the "License");
7
   you may not use this file except in compliance with the License.
8
   You may obtain a copy of the License at
9
 
10
       http://www.apache.org/licenses/LICENSE-2.0
11
 
12
   Unless required by applicable law or agreed to in writing, software
13
   distributed under the License is distributed on an "AS IS" BASIS,
14
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
   See the License for the specific language governing permissions and
16
   limitations under the License.
17
%*/
18
 
19
import java.io.*;
20
import java.util.*;
21
import java.text.*;
22
import java.nio.*;
23
 
24
import org.usb4java.*;
25
 
26
import ztex.*;
27
 
28
// *****************************************************************************
29
// ******* ParameterException **************************************************
30
// *****************************************************************************
31
// Exception the prints a help message
32
class ParameterException extends Exception {
33
    public final static String helpMsg = new String (
34
                "Parameters:\n"+
35
                "    -d <number>    Device Number (default: 0)\n" +
36
                "    -r             Reset EZ-USB\n" +
37
                "    -v             Print debug info\n" +
38
                "    -p             Print bus info\n" +
39
                "    -h             This help" );
40
 
41
    public ParameterException (String msg) {
42
        super( msg + "\n" + helpMsg );
43
    }
44
}
45
 
46
// *****************************************************************************
47
// ******* UsbTestWriter *******************************************************
48
// *****************************************************************************
49
class UsbTestWriter extends Thread {
50
    private volatile boolean terminate = true;
51
    private volatile boolean isAlive = false;
52
    private ZtexUsbWriter writer;
53
    private byte[] b;
54
    private int bufCount = 0;
55
 
56
    public UsbTestWriter ( Ztex1v1 p_ztex ) throws InvalidFirmwareException, UsbException, CapabilityException {
57
        super ();
58
        writer = new ZtexUsbWriter( p_ztex, 8, 512*1024 );
59
        b = new byte[writer.bufSize()];
60
    }
61
 
62
    public ZtexUsbWriter writer() {
63
        return writer;
64
    }
65
 
66
    public boolean terminate(int timeout) throws UsbException {
67
        terminate = true;
68
        writer.cancel();
69
        int i;
70
        for (i=0; isAlive && i<=timeout; i+=20 ) {
71
            try { sleep(20); } catch ( InterruptedException e) { }
72
        }
73
        return (!isAlive) && writer.cancelWait(timeout-i+100);
74
    }
75
 
76
    public void run() {
77
        isAlive = true;
78
        terminate = false;
79
        int k = 0;
80
        int cs = 47;
81
        int sync;
82
        Random random = new Random();
83
        while ( !terminate ) {
84
            for ( int i=0; !terminate && i<writer.bufSize(); i++ ) {
85
                int j = k & 15;
86
                sync = ( ((j & 1)==1) || (j==14) ) ? 128 : 0;
87
                if ( j == 15 ) {
88
                    b[i] = (byte) (sync | ((cs & 127) ^ (cs>>7)));
89
                    cs = 47;
90
                }
91
                else {
92
//                  b[i] = (byte) ( (j==0 ? (k>>4) & 127 : random.nextInt(128)) | sync );
93
                    b[i] = (byte) ( (((k>>4)+j) & 127) | sync );
94
                    cs += (b[i] & 255);
95
                }
96
                k=(k+1) & 65535;
97
            }
98
            try {
99
                if ( writer.transmitBuffer(b,2000)<0 ) {
100
                    terminate = true;
101
                    System.err.println("Timeout error transmitting buffer "+bufCount);
102
                }
103
            }
104
            catch ( Exception e) {
105
                terminate = true;
106
                System.err.println("Error transmitting buffer "+bufCount+": "+e);
107
            }
108
            bufCount += 1;
109
        }
110
        isAlive = false;
111
    }
112
}
113
 
114
 
115
// *****************************************************************************
116
// ******* MemFifo *************************************************************
117
// *****************************************************************************
118
class MemFifo extends Ztex1v1 {
119
 
120
    // constructor
121
    public MemFifo ( ZtexDevice1 pDev ) throws UsbException {
122
        super ( pDev );
123
    }
124
 
125
    // set mode
126
    public void setMode( int i ) throws InvalidFirmwareException, UsbException, CapabilityException {
127
        defaultGpioCtl(7,i & 3);
128
    }
129
 
130
    // manual PKTEND
131
    public void manPktend() throws InvalidFirmwareException, UsbException, CapabilityException {
132
        defaultGpioCtl(4,4);
133
        defaultGpioCtl(4,0);
134
    }
135
 
136
    // reset
137
    public void reset( ) throws  InvalidFirmwareException, UsbException, CapabilityException {
138
        defaultGpioCtl(7,0);
139
        defaultReset();
140
        debug2PrintNextLogMessages(System.out);
141
    }
142
 
143
    // reads data and verifies them. It exits either if iz buffers are read of if a short package occurs
144
    // returns number of read bytes
145
    // rate is data rate in kBytes; <=0 means unlimited
146
    public long verify ( ZtexUsbReader reader, int iz, int rate, boolean verbose, boolean manPktend) throws UsbException {
147
        boolean valid = false;
148
        int byte_cnt = 0, sync_cnt = 0, cs = 47;
149
        boolean memError = false;
150
        byte[] b = new byte[reader.bufSize()];
151
        long size = 0;
152
 
153
        for (int i=0; i<iz; i++) {
154
            if ( i>0 && rate>0 ) {
155
                try {
156
                    Thread.sleep(reader.bufSize()/rate);
157
                }
158
                catch ( InterruptedException e) {
159
                }
160
            }
161
            int bb = reader.getBuffer(b, 5000);
162
            size += bb;
163
 
164
            // manually assert PKTEND in after 21 buffers
165
            try {
166
                if (manPktend && (i==20)) manPktend();
167
            }
168
            catch ( Exception e) {
169
                System.err.println(e);
170
            }
171
 
172
            if ( bb<0 ) throw new UsbException("Timeout during reading buffer "+i);
173
            else if (bb==0) {
174
                System.out.println("Received no data for buffer "+i+"                                  ");
175
                return 0;
176
            }
177
 
178
            int serrors = 0;
179
            int merrors = 0;
180
 
181
            for (int k=0; k<bb; k++ ) {
182
                byte_cnt++;
183
                sync_cnt++;
184
                if ( (b[k] & 128) == 0 ) sync_cnt=0;
185
                if ( sync_cnt == 3 ) {
186
                    boolean serror = byte_cnt != 16;
187
                    boolean merror = (byte_cnt == 16) && ( ( b[k] & 127 ) != ((cs & 127) ^ (cs>>7)) );
188
                    valid = valid || ( !serror && !merror );
189
                    if ( valid ) {
190
                        if ( serror ) serrors += 1;
191
                        if ( merror ) merrors += 1;
192
                        if ( verbose && ((serror && serrors <= 2) || (merror && merrors <= 2) )) {
193
                            if ( serror ) System.out.print( "Sync Error: " + byte_cnt + " at " + k + ": " );
194
                            else System.out.print( "Data Error: at " + k + ": " );
195
                            for ( int l=k-byte_cnt-2; l<k+3; l++ )
196
                                if ( (l>=0) && (l<bb) )
197
                                    System.out.print((b[l] < 0 ? "*" : "" ) + (b[l] & 127) + " ");
198
                        }
199
                    }
200
                    cs=47;
201
                    byte_cnt = 0;
202
                } else {
203
                    cs += b[k] & 255;
204
                }
205
            }
206
 
207
            if ( ! valid ) {
208
                System.out.println("Invalid data");
209
                return size;
210
            }
211
 
212
            System.out.print("Buffer " + i + (bb==reader.bufSize() ? ": " : "(short packet): ") + serrors + " sync errors,    " + merrors + " memory or transfer errors" + "                 \r" );
213
            if ( bb!=reader.bufSize() ) {
214
                System.out.println();
215
                return size;
216
            }
217
            if ( merrors + serrors > (i==0 ? 2 : 0 ) ) { // two errors in first buffer may occurs after changing mode
218
                System.out.println();
219
                memError |= (bb!=reader.bufSize());
220
            } else if (bb!=reader.bufSize()) {
221
                System.out.println();
222
            }
223
        }
224
        System.out.println();
225
        return size;
226
    }
227
 
228
// ******* main ****************************************************************
229
    public static void main (String args[]) {
230
 
231
        int devNum = 0;
232
        boolean verbose = false;
233
        boolean reset = false;
234
        ZtexUsbReader reader = null;
235
        UsbTestWriter writer = null;
236
        ZtexEventHandler eventHandler = null;
237
 
238
        if ( ! System.getProperty("os.name").equalsIgnoreCase("linux") ) {
239
            Runtime.getRuntime().addShutdownHook(new Thread() {
240
                public void run() {
241
                    Scanner s=new Scanner(System.in);
242
                    System.out.println("Press <enter> to continue ...");
243
                    s.nextLine();
244
                }
245
            });
246
        }
247
 
248
        try {
249
// Scan the USB. This also creates and initializes a new USB context.
250
            ZtexScanBus1 bus = new ZtexScanBus1( ZtexDevice1.ztexVendorId, ZtexDevice1.ztexProductId, true, false, 1);
251
 
252
// scan the command line arguments
253
            for (int i=0; i<args.length; i++ ) {
254
                if ( args[i].equals("-d") ) {
255
                    i++;
256
                    try {
257
                        if (i>=args.length) throw new Exception();
258
                        devNum = Integer.parseInt( args[i] );
259
                    }
260
                    catch (Exception e) {
261
                        throw new ParameterException("Device number expected after -d");
262
                    }
263
                }
264
                else if ( args[i].equals("-v") ) {
265
                    verbose = true;
266
                }
267
                else if ( args[i].equals("-r") ) {
268
                    reset = true;
269
                }
270
                else if ( args[i].equals("-p") ) {
271
                    bus.printBus(System.out);
272
                    System.exit(0);
273
                }
274
                else if ( args[i].equals("-h") ) {
275
                    System.err.println(ParameterException.helpMsg);
276
                    System.exit(0);
277
                }
278
                else throw new ParameterException("Invalid Parameter: "+args[i]);
279
            }
280
 
281
            String errStr = "";
282
 
283
// create the main class            
284
            if ( bus.numberOfDevices() <= 0) {
285
                System.err.println("No devices found");
286
                System.exit(0);
287
            }
288
            MemFifo ztex = new MemFifo ( bus.device(devNum) );
289
            bus.unref();
290
 
291
            try {
292
 
293
// reset EZ-USB
294
                if ( reset ) {
295
                    System.out.println("Reset EZ-USB");
296
                    ztex.resetEzUsb();
297
                }
298
                else {
299
                    ztex.resetDevice(false);    // sync data toggles
300
                }
301
 
302
 
303
// check for firmware
304
                ztex.defaultCheckVersion(1);
305
                ztex.debug2PrintNextLogMessages(System.out);
306
                if (ztex.config == null ) throw new Exception("Invalid configuration data");
307
 
308
// upload the bitstream 
309
                String configFN = ztex.config.defaultBitstreamPath("memfifo");
310
                System.out.println("Found " + ztex.config.getName()+",  using bitstream "+configFN);
311
                System.out.println("FPGA configuration time: " + ztex.configureFpga( configFN , true, -1 ) + " ms");
312
 
313
// upload the bitstream 
314
                boolean isFx3 = ztex.dev().fx3();
315
                int sizeFact = isFx3 ? 2 : 1;
316
 
317
// claim interface
318
                ztex.trySetConfiguration ( 1 );
319
                ztex.claimInterface ( 0 );
320
                ztex.debug2PrintNextLogMessages(System.out);
321
                eventHandler = new ZtexEventHandler(ztex);
322
                eventHandler.start();
323
 
324
// start bulk reader
325
                reader = new ZtexUsbReader( ztex, 8, 512*1024 );
326
                reader.start(-1);
327
 
328
// Mode 1: 208 MByte/s Test data generator: used for speed test
329
                ztex.setMode(1);
330
                System.out.println((isFx3 ? "208" : "48") + " MByte/s test data generator: ");
331
 
332
                long oldByteCount = 0;
333
                for (int i=0; i<4; i++) {
334
                    System.out.print("2s read only test: ");
335
                    try { Thread.sleep(2000); } catch ( InterruptedException e) { }
336
                    System.out.println(Math.round((reader.byteCount()-oldByteCount)/2000000.0) + " MByte/s");
337
                    oldByteCount = reader.byteCount();
338
                }
339
 
340
                reader.cancelWait(5000);
341
                reader.start(0);
342
                long t0 = new Date().getTime();
343
                long l = ztex.verify(reader, 1000*sizeFact, 0, verbose, false);
344
                System.out.println("Read + verify data rate: " + Math.round(l/((new Date().getTime()-t0)*1000.0)) + " MByte/s");
345
                ztex.debug2PrintNextLogMessages(System.out);
346
 
347
// Mode 2: 13 MByte/s Test data generator: used for speed test
348
                ztex.setMode(2);
349
                System.out.println((isFx3 ? "\n13" : "\n12") + " MByte/s test data generator: ");
350
                t0 = new Date().getTime();
351
                ztex.verify(reader, 500*sizeFact, 0, verbose, false);
352
                ztex.debug2PrintNextLogMessages(System.out);
353
 
354
// PKTEND tests
355
                if ( (ztex.defaultVersion() > 1) || (ztex.defaultSubVersion() > 2) ) {
356
                    System.out.println("\nPKTEND tests (may not work on all platforms)");
357
                    try {
358
                        System.out.println("Manual PKTEND test (1/2):");
359
                        l = ztex.verify(reader, 500, 0, verbose, true);
360
                        System.out.println("Seems" + (l<500*reader.bufSize() ? "" : " not") + " to work: received " + (l >> 9) +"*512 + " + (l&511) + " bytes");
361
                        System.out.println("Manual PKTEND test (2/2):");
362
                        l = ztex.verify(reader, 500, 0, verbose, true);
363
                        System.out.println("Seems" + (l<500*reader.bufSize() ? "" : " not") + " to work: received " + (l >> 9) +"*512 + " + (l&511) + " bytes");
364
                        System.out.println("Automatic PKTEND assertion after 0.5s timeout test:");
365
                        try { Thread.sleep(1000); } catch ( InterruptedException e) { }
366
                        ztex.setMode(0);
367
                        l = ztex.verify(reader, 1000, 0, verbose, false);
368
                        System.out.println("Seems" + (l<1000*reader.bufSize() ? "" : " not") + " to work: received " + (l >> 9) +"*512 + " + (l&511) + " bytes");
369
                        System.out.println("Zero length packet test:");
370
                        ztex.manPktend();
371
                        l = ztex.verify(reader, 1000, 0, verbose, false);
372
                        System.out.println("Seems" + (l==0 ? "" : " not") + " to work: received " + l + " bytes");
373
                    }
374
                    catch ( Exception e ) {
375
                        System.err.println("Error during PKTEND tests: "+e);
376
                    }
377
                }
378
 
379
 
380
// Mode 0: write+read mode
381
                reader.cancel();
382
                System.out.println("\nUSB write + read mode: on some USB implementations concurrent reading / writing may cause deadlocks or timeout errors");
383
                writer = new UsbTestWriter( ztex );
384
                ztex.reset();
385
//              ztex.setMode(3);
386
                writer.start();
387
                if ( !reader.cancelWait(5000) ) System.err.println("Unable to cancel transfers. Following data may be invalid");
388
                reader.start(0);
389
 
390
                ztex.debug2PrintNextLogMessages(System.out);
391
 
392
                System.out.println("USB write + read mode: speed test");
393
                t0 = new Date().getTime();
394
                l = ztex.verify(reader, 750*sizeFact, 0, verbose, false);
395
                System.out.println("Read + Write data rate: " + Math.round(l/((new Date().getTime()-t0)*100.0)*0.1) + " MByte/s");
396
                ztex.debug2PrintNextLogMessages(System.out);
397
 
398
                System.out.println("USB write + read mode: 10 MByte/s read test");
399
                ztex.verify(reader, 300, 10000, verbose, false);
400
                ztex.debug2PrintNextLogMessages(System.out);
401
            }
402
            catch (Exception e) {
403
                System.out.println("Error: "+e.getLocalizedMessage() );
404
                ztex.debug2PrintNextLogMessages(System.out);
405
            }
406
 
407
// terminating threads and releasing resources
408
            if ( reader!=null ) reader.cancel();
409
            if ( (writer!=null) && (!writer.terminate(10000)) ) System.err.println("Unable to cancel writing");
410
            if ( (eventHandler!=null) && !eventHandler.terminate() ) System.err.println("Unable to terminate event handler");
411
            if ( (reader!=null) && (!reader.cancelWait(10000)) ) System.err.println("Unable to cancel reading");
412
            ztex.dispose();  // this also releases claimed interfaces
413
        }
414
        catch (Exception e) {
415
            System.out.println("Error: "+e.getLocalizedMessage() );
416
        }
417
 
418
   }
419
 
420
}

powered by: WebSVN 2.1.0

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