<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://simhard.com/wiki/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://simhard.com/wiki/index.php?action=history&amp;feed=atom&amp;title=Co-Simulation%2F%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B_%D0%BA%D0%BE%D0%B4%D0%B0</id>
		<title>Co-Simulation/Примеры кода - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://simhard.com/wiki/index.php?action=history&amp;feed=atom&amp;title=Co-Simulation%2F%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B_%D0%BA%D0%BE%D0%B4%D0%B0"/>
		<link rel="alternate" type="text/html" href="http://simhard.com/wiki/index.php?title=Co-Simulation/%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B_%D0%BA%D0%BE%D0%B4%D0%B0&amp;action=history"/>
		<updated>2026-04-05T18:43:30Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.21.3</generator>

	<entry>
		<id>http://simhard.com/wiki/index.php?title=Co-Simulation/%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B_%D0%BA%D0%BE%D0%B4%D0%B0&amp;diff=3494&amp;oldid=prev</id>
		<title>ANA: Новая страница: «{{Co-Simulation TOC}}  {{Hider|Пример win}} &lt;source lang=&quot;cpp&quot;&gt; FT_HANDLE ftHandle;    // Handle of the FTDI device  FT_STATUS ftStatus;    // Result of eac…»</title>
		<link rel="alternate" type="text/html" href="http://simhard.com/wiki/index.php?title=Co-Simulation/%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B_%D0%BA%D0%BE%D0%B4%D0%B0&amp;diff=3494&amp;oldid=prev"/>
				<updated>2013-11-26T18:08:51Z</updated>
		
		<summary type="html">&lt;p&gt;Новая страница: «{{Co-Simulation TOC}}  {{Hider|Пример win}} &amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt; FT_HANDLE ftHandle;    // Handle of the FTDI device  FT_STATUS ftStatus;    // Result of eac…»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Co-Simulation TOC}}&lt;br /&gt;
&lt;br /&gt;
{{Hider|Пример win}}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
FT_HANDLE ftHandle;    // Handle of the FTDI device&lt;br /&gt;
 FT_STATUS ftStatus;    // Result of each D2XX call&lt;br /&gt;
 &lt;br /&gt;
 DWORD dwNumDevs;    // The number of devices&lt;br /&gt;
 unsigned int uiDevIndex = 0xF; // The device in the list that we'll use&lt;br /&gt;
&lt;br /&gt;
 BYTE byOutputBuffer[1024];  // Buffer to hold MPSSE commands and data to be sent to the FT2232H&lt;br /&gt;
 BYTE byInputBuffer[1024];  // Buffer to hold data read from the FT2232H&lt;br /&gt;
&lt;br /&gt;
 DWORD dwCount = 0;    // General loop index&lt;br /&gt;
 DWORD dwNumBytesToSend = 0;  // Index to the output buffer&lt;br /&gt;
 DWORD dwNumBytesSent = 0;  // Count of actual bytes sent - used with FT_Write&lt;br /&gt;
 DWORD dwNumBytesToRead = 0;  // Number of bytes available to read in the driver's input buffer&lt;br /&gt;
 DWORD dwNumBytesRead = 0;  // Count of actual bytes read - used with FT_Read&lt;br /&gt;
&lt;br /&gt;
 DWORD dwClockDivisor = 0x0001; // Value of clock divisor, SCL Frequency = 60/((1+0x05DB)*2) (MHz) = 20khz&lt;br /&gt;
&lt;br /&gt;
 DWORD RxBytes = 0;&lt;br /&gt;
 DWORD TxBytes = 0;&lt;br /&gt;
 DWORD EventDWord = 0;&lt;br /&gt;
&lt;br /&gt;
printf(&amp;quot;Checking for FTDI devices...\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 ftStatus = FT_CreateDeviceInfoList(&amp;amp;dwNumDevs);&lt;br /&gt;
         // Get the number of FTDI devices&lt;br /&gt;
 if (ftStatus != FT_OK)   // Did the command execute OK?&lt;br /&gt;
 {&lt;br /&gt;
  printf(&amp;quot;Error in getting the number of devices\n&amp;quot;);&lt;br /&gt;
  return 1;     // Exit with error&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 if (dwNumDevs &amp;lt; 1)    // Exit if we don't see any&lt;br /&gt;
 {&lt;br /&gt;
  printf(&amp;quot;There are no FTDI devices installed\n&amp;quot;);&lt;br /&gt;
  return 1;     // Exist with error&lt;br /&gt;
 }&lt;br /&gt;
 // Open the port - For this application note, we'll assume the first device is a FT2232H or FT4232H&lt;br /&gt;
 // Further checks can be made against the device descriptions, locations, serial numbers, etc. &lt;br /&gt;
 //  before opening the port.&lt;br /&gt;
&lt;br /&gt;
 printf(&amp;quot;\nAssume first device has the FIFO and open it...\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 ftStatus = FT_Open(0, &amp;amp;ftHandle);&lt;br /&gt;
 if (ftStatus != FT_OK)&lt;br /&gt;
 {&lt;br /&gt;
  printf(&amp;quot;Open Failed with error %d\n&amp;quot;, ftStatus);&lt;br /&gt;
  return 1;     // Exit with error&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;{{Hider|end}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Hider|Листинг файла baud_test.c}}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
/* baud_test.c&lt;br /&gt;
 *&lt;br /&gt;
 * test setting the baudrate and compare it with the expected runtime&lt;br /&gt;
 *&lt;br /&gt;
 * options:&lt;br /&gt;
 *  -p &amp;lt;devicestring&amp;gt; defaults to &amp;quot;i:0x0403:0x6001&amp;quot; (this is the first FT232R with default id)&lt;br /&gt;
 *       d:&amp;lt;devicenode&amp;gt; path of bus and device-node (e.g. &amp;quot;003/001&amp;quot;) within usb device tree (usually at /proc/bus/usb/)&lt;br /&gt;
 *       i:&amp;lt;vendor&amp;gt;:&amp;lt;product&amp;gt; first device with given vendor and product id,&lt;br /&gt;
 *                            ids can be decimal, octal (preceded by &amp;quot;0&amp;quot;) or hex (preceded by &amp;quot;0x&amp;quot;)&lt;br /&gt;
 *       i:&amp;lt;vendor&amp;gt;:&amp;lt;product&amp;gt;:&amp;lt;index&amp;gt; as above with index being the number of the device (starting with 0)&lt;br /&gt;
 *                            if there are more than one&lt;br /&gt;
 *       s:&amp;lt;vendor&amp;gt;:&amp;lt;product&amp;gt;:&amp;lt;serial&amp;gt; first device with given vendor id, product id and serial string&lt;br /&gt;
 *  -d &amp;lt;datasize to send in bytes&amp;gt;&lt;br /&gt;
 *  -b &amp;lt;baudrate&amp;gt; (divides by 16 if bitbang as taken from the ftdi datasheets)&lt;br /&gt;
 *  -m &amp;lt;mode to use&amp;gt; r: serial a: async bitbang s:sync bitbang h:sync FIFO&lt;br /&gt;
 *  -c &amp;lt;chunksize&amp;gt;&lt;br /&gt;
 *&lt;br /&gt;
 * (C) 2009 by Gerd v. Egidy &amp;lt;gerd.von.egidy@intra2net.com&amp;gt;&lt;br /&gt;
 *&lt;br /&gt;
 * This program is free software; you can redistribute it and/or modify&lt;br /&gt;
 * it under the terms of the GNU General Public License as published by&lt;br /&gt;
 * the Free Software Foundation; either version 2 of the License, or&lt;br /&gt;
 * (at your option) any later version.&lt;br /&gt;
&lt;br /&gt;
 * This program is distributed in the hope that it will be useful,&lt;br /&gt;
 * but WITHOUT ANY WARRANTY; without even the implied warranty of&lt;br /&gt;
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the&lt;br /&gt;
 * GNU General Public License for more details.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;sys/time.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
#include &amp;lt;ftdi.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
double get_prec_time()&lt;br /&gt;
{&lt;br /&gt;
    struct timeval tv;&lt;br /&gt;
    double res;&lt;br /&gt;
&lt;br /&gt;
    gettimeofday(&amp;amp;tv,NULL);&lt;br /&gt;
&lt;br /&gt;
    res=tv.tv_sec;&lt;br /&gt;
    res+=((double)tv.tv_usec/1000000);&lt;br /&gt;
&lt;br /&gt;
    return res;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char **argv)&lt;br /&gt;
{&lt;br /&gt;
    struct ftdi_context *ftdi;&lt;br /&gt;
    int i, t;&lt;br /&gt;
    unsigned char *txbuf;&lt;br /&gt;
    unsigned char *rxbuf;&lt;br /&gt;
    double start, duration, plan;&lt;br /&gt;
    int retval= 0;&lt;br /&gt;
&lt;br /&gt;
    // default values&lt;br /&gt;
    int baud=9600;&lt;br /&gt;
    int set_baud;&lt;br /&gt;
    int datasize=100000;&lt;br /&gt;
&lt;br /&gt;
    char default_devicedesc[] = &amp;quot;i:0x0403:0x6014&amp;quot;;&lt;br /&gt;
    char *devicedesc=default_devicedesc;&lt;br /&gt;
    int txchunksize=256;&lt;br /&gt;
    enum ftdi_mpsse_mode test_mode=BITMODE_BITBANG;&lt;br /&gt;
&lt;br /&gt;
    while ((t = getopt (argc, argv, &amp;quot;b:d:p:m:c:&amp;quot;)) != -1)&lt;br /&gt;
    {&lt;br /&gt;
        switch (t)&lt;br /&gt;
        {&lt;br /&gt;
            case 'd':&lt;br /&gt;
                datasize = atoi (optarg);&lt;br /&gt;
                break;&lt;br /&gt;
            case 'm':&lt;br /&gt;
                switch (*optarg)&lt;br /&gt;
                {&lt;br /&gt;
                    case 'r':&lt;br /&gt;
                        // serial&lt;br /&gt;
                        test_mode=BITMODE_RESET;&lt;br /&gt;
                        break;&lt;br /&gt;
                    case 'a':&lt;br /&gt;
                        // async&lt;br /&gt;
                        test_mode=BITMODE_BITBANG;&lt;br /&gt;
                        break;&lt;br /&gt;
                    case 's':&lt;br /&gt;
                        // sync&lt;br /&gt;
                        test_mode=BITMODE_SYNCBB;&lt;br /&gt;
                        break;&lt;br /&gt;
                    case 'h':&lt;br /&gt;
                        // sync&lt;br /&gt;
                        test_mode=BITMODE_SYNCFF;&lt;br /&gt;
                        break;&lt;br /&gt;
                }&lt;br /&gt;
                break;&lt;br /&gt;
            case 'b':&lt;br /&gt;
                baud = atoi (optarg);&lt;br /&gt;
                break;&lt;br /&gt;
            case 'p':&lt;br /&gt;
                devicedesc=optarg;&lt;br /&gt;
                break;&lt;br /&gt;
            case 'c':&lt;br /&gt;
                txchunksize = atoi (optarg);&lt;br /&gt;
                break;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    txbuf=malloc(txchunksize);&lt;br /&gt;
    rxbuf=malloc(txchunksize);&lt;br /&gt;
    if (txbuf == NULL || rxbuf == NULL)&lt;br /&gt;
    {&lt;br /&gt;
        fprintf(stderr, &amp;quot;can't malloc\n&amp;quot;);&lt;br /&gt;
        return EXIT_FAILURE;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if ((ftdi = ftdi_new()) == 0)&lt;br /&gt;
    {&lt;br /&gt;
        fprintf(stderr, &amp;quot;ftdi_new failed\n&amp;quot;);&lt;br /&gt;
        retval = EXIT_FAILURE;&lt;br /&gt;
        goto done;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (ftdi_usb_open_string(ftdi, devicedesc) &amp;lt; 0)&lt;br /&gt;
    {&lt;br /&gt;
        fprintf(stderr,&amp;quot;Can't open ftdi device: %s\n&amp;quot;,ftdi_get_error_string(ftdi));&lt;br /&gt;
        retval = EXIT_FAILURE;&lt;br /&gt;
        goto do_deinit;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    set_baud=baud;&lt;br /&gt;
    if (test_mode!=BITMODE_RESET)&lt;br /&gt;
    {&lt;br /&gt;
        // we do bitbang, so real baudrate / 16&lt;br /&gt;
        set_baud=baud/16;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    ftdi_set_baudrate(ftdi,set_baud);&lt;br /&gt;
    printf(&amp;quot;real baudrate used: %d\n&amp;quot;,(test_mode==BITMODE_RESET) ? ftdi-&amp;gt;baudrate : ftdi-&amp;gt;baudrate*16);&lt;br /&gt;
&lt;br /&gt;
    if (ftdi_set_bitmode(ftdi, 0xFF,test_mode) &amp;lt; 0)&lt;br /&gt;
    {&lt;br /&gt;
        fprintf(stderr,&amp;quot;Can't set mode: %s\n&amp;quot;,ftdi_get_error_string(ftdi));&lt;br /&gt;
        retval = EXIT_FAILURE;&lt;br /&gt;
        goto do_close;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (test_mode==BITMODE_RESET)&lt;br /&gt;
    {&lt;br /&gt;
        // serial 8N1: 8 data bits, 1 startbit, 1 stopbit&lt;br /&gt;
        plan=((double)(datasize*10))/baud;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        // bitbang means 8 bits at once&lt;br /&gt;
        plan=((double)datasize)/baud;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;this test should take %.2f seconds\n&amp;quot;,plan);&lt;br /&gt;
&lt;br /&gt;
    // prepare data to send: 0 and 1 bits alternating (except for serial start/stopbit):&lt;br /&gt;
    // maybe someone wants to look at this with a scope or logic analyzer&lt;br /&gt;
    for (i=0; i&amp;lt;txchunksize; i++)&lt;br /&gt;
    {&lt;br /&gt;
        if (test_mode==BITMODE_RESET)&lt;br /&gt;
            txbuf[i]=0xAA;&lt;br /&gt;
        else&lt;br /&gt;
            txbuf[i]=(i%2) ? 0xff : 0;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (ftdi_write_data_set_chunksize(ftdi, txchunksize) &amp;lt; 0 ||&lt;br /&gt;
            ftdi_read_data_set_chunksize(ftdi, txchunksize) &amp;lt; 0)&lt;br /&gt;
    {&lt;br /&gt;
        fprintf(stderr,&amp;quot;Can't set chunksize: %s\n&amp;quot;,ftdi_get_error_string(ftdi));&lt;br /&gt;
        retval = EXIT_FAILURE;&lt;br /&gt;
        goto do_close;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (test_mode==BITMODE_SYNCBB)&lt;br /&gt;
    {&lt;br /&gt;
        // completely clear the receive buffer before beginning&lt;br /&gt;
        while (ftdi_read_data(ftdi, rxbuf, txchunksize)&amp;gt;0);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (test_mode==BITMODE_SYNCFF)&lt;br /&gt;
    {&lt;br /&gt;
        // completely clear the receive buffer before beginning&lt;br /&gt;
        while (ftdi_read_data(ftdi, rxbuf, txchunksize)&amp;gt;0);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    start=get_prec_time();&lt;br /&gt;
&lt;br /&gt;
    // don't wait for more data to arrive, take what we get and keep on sending&lt;br /&gt;
    // yes, we really would like to have libusb 1.0+ with async read/write...&lt;br /&gt;
    ftdi-&amp;gt;usb_read_timeout=1;&lt;br /&gt;
&lt;br /&gt;
    i=0;&lt;br /&gt;
    while (i &amp;lt; datasize)&lt;br /&gt;
    {&lt;br /&gt;
        int sendsize=txchunksize;&lt;br /&gt;
        if (i+sendsize &amp;gt; datasize)&lt;br /&gt;
            sendsize=datasize-i;&lt;br /&gt;
&lt;br /&gt;
        if ((sendsize=ftdi_write_data(ftdi, txbuf, sendsize)) &amp;lt; 0)&lt;br /&gt;
        {&lt;br /&gt;
            fprintf(stderr,&amp;quot;write failed at %d: %s\n&amp;quot;,&lt;br /&gt;
                    i, ftdi_get_error_string(ftdi));&lt;br /&gt;
            retval = EXIT_FAILURE;&lt;br /&gt;
            goto do_close;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        i+=sendsize;&lt;br /&gt;
&lt;br /&gt;
        if (test_mode==BITMODE_SYNCBB)&lt;br /&gt;
        {&lt;br /&gt;
            // read the same amount of data as sent&lt;br /&gt;
            ftdi_read_data(ftdi, rxbuf, sendsize);&lt;br /&gt;
        }&lt;br /&gt;
        if (test_mode==BITMODE_SYNCFF)&lt;br /&gt;
        {&lt;br /&gt;
            // read the same amount of data as sent&lt;br /&gt;
            ftdi_read_data(ftdi, rxbuf, sendsize);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    duration=get_prec_time()-start;&lt;br /&gt;
    printf(&amp;quot;and took %.4f seconds, this is %.0f baud or factor %.3f\n&amp;quot;,duration,(plan*baud)/duration,plan/duration);&lt;br /&gt;
do_close:&lt;br /&gt;
    ftdi_usb_close(ftdi);&lt;br /&gt;
do_deinit:&lt;br /&gt;
    ftdi_free(ftdi);&lt;br /&gt;
done:&lt;br /&gt;
    if(rxbuf)&lt;br /&gt;
        free(rxbuf);&lt;br /&gt;
    if(txbuf)&lt;br /&gt;
        free(txbuf);&lt;br /&gt;
    exit (retval);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{Hider|end}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Hider|Листинг файла stream_test.c}}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
/* stream_test.c&lt;br /&gt;
 *&lt;br /&gt;
 * Test reading  from FT2232H in synchronous FIFO mode.&lt;br /&gt;
 *&lt;br /&gt;
 * The FT2232H must supply data due to an appropriate circuit&lt;br /&gt;
 *&lt;br /&gt;
 * To check for skipped block with appended code, &lt;br /&gt;
 *     a structure as follows is assumed&lt;br /&gt;
 * 1* uint32_t num (incremented in 0x4000 steps)&lt;br /&gt;
 * 3* uint32_t dont_care&lt;br /&gt;
 *&lt;br /&gt;
 * After start, data will be read in streaming until the program is aborted&lt;br /&gt;
 * Progess information wil be printed out&lt;br /&gt;
 * If a filename is given on the command line, the data read will be&lt;br /&gt;
 * written to that file&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
#include &amp;lt;getopt.h&amp;gt;&lt;br /&gt;
#include &amp;lt;signal.h&amp;gt;&lt;br /&gt;
#include &amp;lt;errno.h&amp;gt;&lt;br /&gt;
#include &amp;lt;ftdi.h&amp;gt;&lt;br /&gt;
void check_outfile(char *);&lt;br /&gt;
&lt;br /&gt;
static FILE *outputFile;&lt;br /&gt;
&lt;br /&gt;
static int check = 1;&lt;br /&gt;
static int exitRequested = 0;&lt;br /&gt;
/*&lt;br /&gt;
 * sigintHandler --&lt;br /&gt;
 *&lt;br /&gt;
 *    SIGINT handler, so we can gracefully exit when the user hits ctrl-C.&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
static void&lt;br /&gt;
sigintHandler(int signum)&lt;br /&gt;
{&lt;br /&gt;
   exitRequested = 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
static void&lt;br /&gt;
usage(const char *argv0)&lt;br /&gt;
{&lt;br /&gt;
   fprintf(stderr,&lt;br /&gt;
           &amp;quot;Usage: %s [options...] \n&amp;quot;&lt;br /&gt;
           &amp;quot;Test streaming read from FT2232H\n&amp;quot;&lt;br /&gt;
           &amp;quot;[-P string] only look for product with given string\n&amp;quot;&lt;br /&gt;
           &amp;quot;[-n] don't check for special block structure\n&amp;quot;&lt;br /&gt;
           &amp;quot;\n&amp;quot;&lt;br /&gt;
           &amp;quot;If some filename is given, write data read to that file\n&amp;quot;&lt;br /&gt;
           &amp;quot;Progess information is printed each second\n&amp;quot;&lt;br /&gt;
           &amp;quot;Abort with ^C\n&amp;quot;&lt;br /&gt;
           &amp;quot;\n&amp;quot;&lt;br /&gt;
           &amp;quot;Options:\n&amp;quot;&lt;br /&gt;
           &amp;quot;\n&amp;quot;&lt;br /&gt;
           &amp;quot;Copyright (C) 2009 Micah Dowty &amp;lt;micah@navi.cx&amp;gt;\n&amp;quot;&lt;br /&gt;
           &amp;quot;Adapted for use with libftdi (C) 2010 Uwe Bonnes &amp;lt;bon@elektron.ikp.physik.tu-darmstadt.de&amp;gt;\n&amp;quot;,&lt;br /&gt;
           argv0);&lt;br /&gt;
   exit(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
static uint32_t start = 0;&lt;br /&gt;
static uint32_t offset = 0;&lt;br /&gt;
static uint64_t blocks = 0;&lt;br /&gt;
static uint32_t skips = 0;&lt;br /&gt;
static uint32_t n_err = 0;&lt;br /&gt;
static int&lt;br /&gt;
readCallback(uint8_t *buffer, int length, FTDIProgressInfo *progress, void *userdata)&lt;br /&gt;
{&lt;br /&gt;
   if (length)&lt;br /&gt;
   {&lt;br /&gt;
       if (check)&lt;br /&gt;
       {&lt;br /&gt;
           int i,rem;&lt;br /&gt;
           uint32_t num;&lt;br /&gt;
           for (i= offset; i&amp;lt;length-16; i+=16)&lt;br /&gt;
           {&lt;br /&gt;
               num = *(uint32_t*) (buffer+i);&lt;br /&gt;
               if (start &amp;amp;&amp;amp; (num != start +0x4000))&lt;br /&gt;
               {&lt;br /&gt;
                   uint32_t delta = ((num-start)/0x4000)-1;&lt;br /&gt;
                   fprintf(stderr, &amp;quot;Skip %7d blocks from 0x%08x to 0x%08x at blocks %10llu\n&amp;quot;,&lt;br /&gt;
                           delta, start -0x4000, num, (unsigned long long)blocks);&lt;br /&gt;
                   n_err++;&lt;br /&gt;
                   skips += delta;&lt;br /&gt;
               }&lt;br /&gt;
               blocks ++;&lt;br /&gt;
               start = num;&lt;br /&gt;
           }&lt;br /&gt;
           rem = length -i;&lt;br /&gt;
           if (rem &amp;gt;3)&lt;br /&gt;
           {&lt;br /&gt;
               num = *(uint32_t*) (buffer+i);&lt;br /&gt;
               if (start &amp;amp;&amp;amp; (num != start +0x4000))&lt;br /&gt;
               {&lt;br /&gt;
                   uint32_t delta = ((num-start)/0x4000)-1;&lt;br /&gt;
                   fprintf(stderr, &amp;quot;Skip %7d blocks from 0x%08x to 0x%08x at blocks %10llu\n&amp;quot;,&lt;br /&gt;
                           delta, start -0x4000, num, (unsigned long long) blocks);&lt;br /&gt;
                   n_err++;&lt;br /&gt;
                   skips += delta;&lt;br /&gt;
               }&lt;br /&gt;
               start = num;&lt;br /&gt;
           }&lt;br /&gt;
           else if (rem)&lt;br /&gt;
               start += 0x4000;&lt;br /&gt;
           if (rem != 0)&lt;br /&gt;
           {&lt;br /&gt;
               blocks ++;&lt;br /&gt;
               offset = 16-rem;&lt;br /&gt;
           }&lt;br /&gt;
       }&lt;br /&gt;
       if (outputFile)&lt;br /&gt;
       {&lt;br /&gt;
           if (fwrite(buffer, length, 1, outputFile) != 1)&lt;br /&gt;
           {&lt;br /&gt;
               perror(&amp;quot;Write error&amp;quot;);&lt;br /&gt;
               return 1;&lt;br /&gt;
           }&lt;br /&gt;
       }&lt;br /&gt;
   }&lt;br /&gt;
   if (progress)&lt;br /&gt;
   {&lt;br /&gt;
       fprintf(stderr, &amp;quot;%10.02fs total time %9.3f MiB captured %7.1f kB/s curr rate %7.1f kB/s totalrate %d dropouts\n&amp;quot;,&lt;br /&gt;
               progress-&amp;gt;totalTime,&lt;br /&gt;
               progress-&amp;gt;current.totalBytes / (1024.0 * 1024.0),&lt;br /&gt;
               progress-&amp;gt;currentRate / 1024.0,&lt;br /&gt;
               progress-&amp;gt;totalRate / 1024.0,&lt;br /&gt;
               n_err);&lt;br /&gt;
   }&lt;br /&gt;
   return exitRequested ? 1 : 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char **argv)&lt;br /&gt;
{&lt;br /&gt;
   struct ftdi_context *ftdi;&lt;br /&gt;
   int err, c;&lt;br /&gt;
   FILE *of = NULL;&lt;br /&gt;
   char const *outfile  = 0;&lt;br /&gt;
   outputFile =0;&lt;br /&gt;
   exitRequested = 0;&lt;br /&gt;
   char *descstring = NULL;&lt;br /&gt;
   int option_index;&lt;br /&gt;
   static struct option long_options[] = {{NULL},};&lt;br /&gt;
&lt;br /&gt;
   while ((c = getopt_long(argc, argv, &amp;quot;P:n&amp;quot;, long_options, &amp;amp;option_index)) !=- 1)&lt;br /&gt;
       switch (c) &lt;br /&gt;
       {&lt;br /&gt;
       case -1:&lt;br /&gt;
           break;&lt;br /&gt;
       case 'P':&lt;br /&gt;
           descstring = optarg;&lt;br /&gt;
           break;&lt;br /&gt;
       case 'n':&lt;br /&gt;
           check = 0;&lt;br /&gt;
           break;&lt;br /&gt;
       default:&lt;br /&gt;
           usage(argv[0]);&lt;br /&gt;
       }&lt;br /&gt;
   &lt;br /&gt;
   if (optind == argc - 1)&lt;br /&gt;
   {&lt;br /&gt;
       // Exactly one extra argument- a dump file&lt;br /&gt;
       outfile = argv[optind];&lt;br /&gt;
   }&lt;br /&gt;
   else if (optind &amp;lt; argc)&lt;br /&gt;
   {&lt;br /&gt;
       // Too many extra args&lt;br /&gt;
       usage(argv[0]);&lt;br /&gt;
   }&lt;br /&gt;
   &lt;br /&gt;
   if ((ftdi = ftdi_new()) == 0)&lt;br /&gt;
   {&lt;br /&gt;
       fprintf(stderr, &amp;quot;ftdi_new failed\n&amp;quot;);&lt;br /&gt;
       return EXIT_FAILURE;&lt;br /&gt;
   }&lt;br /&gt;
   &lt;br /&gt;
   if (ftdi_set_interface(ftdi, INTERFACE_A) &amp;lt; 0)&lt;br /&gt;
   {&lt;br /&gt;
       fprintf(stderr, &amp;quot;ftdi_set_interface failed\n&amp;quot;);&lt;br /&gt;
       ftdi_free(ftdi);&lt;br /&gt;
       return EXIT_FAILURE;&lt;br /&gt;
   }&lt;br /&gt;
   &lt;br /&gt;
   if (ftdi_usb_open_desc(ftdi, 0x0403, 0x6014, descstring, NULL) &amp;lt; 0)&lt;br /&gt;
   {&lt;br /&gt;
       fprintf(stderr,&amp;quot;Can't open ftdi device: %s\n&amp;quot;,ftdi_get_error_string(ftdi));&lt;br /&gt;
       ftdi_free(ftdi);&lt;br /&gt;
       return EXIT_FAILURE;&lt;br /&gt;
   }&lt;br /&gt;
   &lt;br /&gt;
   /* A timeout value of 1 results in may skipped blocks */&lt;br /&gt;
   if(ftdi_set_latency_timer(ftdi, 2))&lt;br /&gt;
   {&lt;br /&gt;
       fprintf(stderr,&amp;quot;Can't set latency, Error %s\n&amp;quot;,ftdi_get_error_string(ftdi));&lt;br /&gt;
       ftdi_usb_close(ftdi);&lt;br /&gt;
       ftdi_free(ftdi);&lt;br /&gt;
       return EXIT_FAILURE;&lt;br /&gt;
   }&lt;br /&gt;
   &lt;br /&gt;
/*   if(ftdi_usb_purge_rx_buffer(ftdi) &amp;lt; 0)&lt;br /&gt;
   {&lt;br /&gt;
       fprintf(stderr,&amp;quot;Can't rx purge\n&amp;quot;,ftdi_get_error_string(ftdi));&lt;br /&gt;
       return EXIT_FAILURE;&lt;br /&gt;
       }*/&lt;br /&gt;
   if (outfile)&lt;br /&gt;
       if ((of = fopen(outfile,&amp;quot;w+&amp;quot;)) == 0)&lt;br /&gt;
           fprintf(stderr,&amp;quot;Can't open logfile %s, Error %s\n&amp;quot;, outfile, strerror(errno));&lt;br /&gt;
   if (of)&lt;br /&gt;
       if (setvbuf(of, NULL, _IOFBF , 1&amp;lt;&amp;lt;16) == 0)&lt;br /&gt;
           outputFile = of;&lt;br /&gt;
   signal(SIGINT, sigintHandler);&lt;br /&gt;
   &lt;br /&gt;
   err = ftdi_readstream(ftdi, readCallback, NULL, 8, 256);&lt;br /&gt;
   if (err &amp;lt; 0 &amp;amp;&amp;amp; !exitRequested)&lt;br /&gt;
       exit(1);&lt;br /&gt;
   &lt;br /&gt;
   if (outputFile) {&lt;br /&gt;
       fclose(outputFile);&lt;br /&gt;
       outputFile = NULL;&lt;br /&gt;
   }&lt;br /&gt;
   fprintf(stderr, &amp;quot;Capture ended.\n&amp;quot;);&lt;br /&gt;
   &lt;br /&gt;
//   if (ftdi_set_bitmode(ftdi,  0xff, BITMODE_RESET) &amp;lt; 0)&lt;br /&gt;
   if (ftdi_set_bitmode(ftdi,  0xff, BITMODE_SYNCFF) &amp;lt; 0)&lt;br /&gt;
   {&lt;br /&gt;
       fprintf(stderr,&amp;quot;Can't set synchronous fifo mode, Error %s\n&amp;quot;,ftdi_get_error_string(ftdi));&lt;br /&gt;
       ftdi_usb_close(ftdi);&lt;br /&gt;
       ftdi_free(ftdi);&lt;br /&gt;
       return EXIT_FAILURE;&lt;br /&gt;
   }&lt;br /&gt;
   ftdi_usb_close(ftdi);&lt;br /&gt;
   ftdi_free(ftdi);&lt;br /&gt;
   signal(SIGINT, SIG_DFL);&lt;br /&gt;
   if (check &amp;amp;&amp;amp; outfile)&lt;br /&gt;
   {&lt;br /&gt;
       if ((outputFile = fopen(outfile,&amp;quot;r&amp;quot;)) == 0)&lt;br /&gt;
       {&lt;br /&gt;
           fprintf(stderr,&amp;quot;Can't open logfile %s, Error %s\n&amp;quot;, outfile, strerror(errno));&lt;br /&gt;
           ftdi_usb_close(ftdi);&lt;br /&gt;
           ftdi_free(ftdi);&lt;br /&gt;
           return EXIT_FAILURE;&lt;br /&gt;
       }&lt;br /&gt;
       check_outfile(descstring);&lt;br /&gt;
       fclose(outputFile);&lt;br /&gt;
   }&lt;br /&gt;
   else if (check)&lt;br /&gt;
       fprintf(stderr,&amp;quot;%d errors of %llu blocks (%Le), %d (%Le) blocks skipped\n&amp;quot;,&lt;br /&gt;
               n_err, (unsigned long long) blocks, (long double)n_err/(long double) blocks,&lt;br /&gt;
               skips, (long double)skips/(long double) blocks);&lt;br /&gt;
   exit (0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void check_outfile(char *descstring)&lt;br /&gt;
{&lt;br /&gt;
    if(strcmp(descstring,&amp;quot;FT2232HTEST&amp;quot;) == 0)&lt;br /&gt;
    {&lt;br /&gt;
       char buf0[1024];&lt;br /&gt;
       char buf1[1024];&lt;br /&gt;
       char bufr[1024];&lt;br /&gt;
       char *pa, *pb, *pc;&lt;br /&gt;
       unsigned int num_lines = 0, line_num = 1;&lt;br /&gt;
       int err_count = 0;&lt;br /&gt;
       unsigned int num_start, num_end;&lt;br /&gt;
&lt;br /&gt;
       pa = buf0;&lt;br /&gt;
       pb = buf1;&lt;br /&gt;
       pc = buf0;&lt;br /&gt;
       if(fgets(pa, 1023, outputFile) == NULL)&lt;br /&gt;
       {&lt;br /&gt;
           fprintf(stderr,&amp;quot;Empty output file\n&amp;quot;);&lt;br /&gt;
           return;&lt;br /&gt;
       }&lt;br /&gt;
       while(fgets(pb, 1023, outputFile) != NULL)&lt;br /&gt;
       {&lt;br /&gt;
           num_lines++;&lt;br /&gt;
           unsigned int num_save = num_start;&lt;br /&gt;
           if( sscanf(pa,&amp;quot;%6u%94s%6u&amp;quot;,&amp;amp;num_start, bufr,&amp;amp;num_end) !=3)&lt;br /&gt;
           {&lt;br /&gt;
               fprintf(stdout,&amp;quot;Format doesn't match at line %8d \&amp;quot;%s&amp;quot;,&lt;br /&gt;
                       num_lines, pa);&lt;br /&gt;
               err_count++;&lt;br /&gt;
               line_num = num_save +2;&lt;br /&gt;
           }&lt;br /&gt;
           else&lt;br /&gt;
           {&lt;br /&gt;
               if ((num_start+1)%100000 != num_end)&lt;br /&gt;
               {&lt;br /&gt;
                   if (err_count &amp;lt; 20)&lt;br /&gt;
                       fprintf(stdout,&amp;quot;Malformed line %d \&amp;quot;%s\&amp;quot;\n&amp;quot;, &lt;br /&gt;
                               num_lines, pa);&lt;br /&gt;
                   err_count++;&lt;br /&gt;
               }&lt;br /&gt;
               else if(num_start != line_num)&lt;br /&gt;
               {&lt;br /&gt;
                   if (err_count &amp;lt; 20)&lt;br /&gt;
                       fprintf(stdout,&amp;quot;Skipping from %d to %d\n&amp;quot;, &lt;br /&gt;
                               line_num, num_start);&lt;br /&gt;
                   err_count++;&lt;br /&gt;
                  &lt;br /&gt;
               }&lt;br /&gt;
               line_num = num_end;&lt;br /&gt;
           }&lt;br /&gt;
           pa = pb;&lt;br /&gt;
           pb = pc;&lt;br /&gt;
           pc = pa;&lt;br /&gt;
       }&lt;br /&gt;
       if(err_count)&lt;br /&gt;
           fprintf(stdout,&amp;quot;\n%d errors of %d data sets %f\n&amp;quot;, err_count, num_lines, (double) err_count/(double)num_lines);&lt;br /&gt;
       else&lt;br /&gt;
           fprintf(stdout,&amp;quot;No errors for %d lines\n&amp;quot;,num_lines);&lt;br /&gt;
   }&lt;br /&gt;
    else if(strcmp(descstring,&amp;quot;LLBBC10&amp;quot;) == 0)&lt;br /&gt;
    { &lt;br /&gt;
        uint32_t block0[4];&lt;br /&gt;
        uint32_t block1[4];&lt;br /&gt;
        uint32_t *pa = block0;&lt;br /&gt;
        uint32_t *pb = block1;&lt;br /&gt;
        uint32_t *pc = block0;&lt;br /&gt;
        uint32_t start= 0;&lt;br /&gt;
        uint32_t nread = 0;&lt;br /&gt;
        int n_shown = 0;&lt;br /&gt;
        int n_errors = 0;&lt;br /&gt;
        if (fread(pa, sizeof(uint32_t), 4,outputFile) &amp;lt; 4)&lt;br /&gt;
        {&lt;br /&gt;
            fprintf(stderr,&amp;quot;Empty result file\n&amp;quot;);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        while(fread(pb, sizeof(uint32_t), 4,outputFile) != 0)&lt;br /&gt;
        {&lt;br /&gt;
            blocks++;&lt;br /&gt;
            nread =  pa[0];&lt;br /&gt;
            if(start&amp;gt;0 &amp;amp;&amp;amp; (nread != start))&lt;br /&gt;
            {&lt;br /&gt;
                if(n_shown &amp;lt; 30)&lt;br /&gt;
                {&lt;br /&gt;
                    fprintf(stderr, &amp;quot;Skip %7d blocks from 0x%08x to 0x%08x at blocks %10llu \n&amp;quot;,&lt;br /&gt;
                            (nread-start)/0x4000, start -0x4000, nread, (unsigned long long) blocks);&lt;br /&gt;
                    n_shown ++;&lt;br /&gt;
                }&lt;br /&gt;
                n_errors++;&lt;br /&gt;
            }&lt;br /&gt;
            else if (n_shown &amp;gt;0) &lt;br /&gt;
                n_shown--; &lt;br /&gt;
            start = nread + 0x4000;&lt;br /&gt;
            pa = pb;&lt;br /&gt;
            pb = pc;&lt;br /&gt;
            pc = pa;&lt;br /&gt;
        }&lt;br /&gt;
        if(n_errors)&lt;br /&gt;
            fprintf(stderr, &amp;quot;%d blocks wrong from %llu blocks read\n&amp;quot;,&lt;br /&gt;
                    n_errors, (unsigned long long) blocks);&lt;br /&gt;
        else&lt;br /&gt;
            fprintf(stderr, &amp;quot;%llu blocks all fine\n&amp;quot;, (unsigned long long) blocks);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{Hider|end}}&lt;/div&gt;</summary>
		<author><name>ANA</name></author>	</entry>

	</feed>