* s:<vendor>:<product>:<serial> first device with given vendor id, product id and serial string
* -d <datasize to send in bytes>
* -b <baudrate> (divides by 16 if bitbang as taken from the ftdi datasheets)
- * -m <mode to use> r: serial a: async bitbang s:sync bitbang
+ * -m <mode to use> r: serial a: async bitbang s:sync bitbang
* -c <chunksize>
*
* (C) 2009 by Gerd v. Egidy <gerd.von.egidy@intra2net.com>
{
struct timeval tv;
double res;
-
+
gettimeofday(&tv,NULL);
res=tv.tv_sec;
int main(int argc, char **argv)
{
- struct ftdi_context ftdic;
+ struct ftdi_context *ftdi;
int i, t;
- char *txbuf;
- char *rxbuf;
+ unsigned char *txbuf;
+ unsigned char *rxbuf;
double start, duration, plan;
+ int retval= 0;
// default values
int baud=9600;
char *devicedesc=default_devicedesc;
int txchunksize=256;
enum ftdi_mpsse_mode test_mode=BITMODE_BITBANG;
-
+
while ((t = getopt (argc, argv, "b:d:p:m:c:")) != -1)
{
switch (t)
datasize = atoi (optarg);
break;
case 'm':
- switch(*optarg)
+ switch (*optarg)
{
case 'r':
// serial
return EXIT_FAILURE;
}
- if (ftdi_init(&ftdic) < 0)
+ if ((ftdi = ftdi_new()) == 0)
{
- fprintf(stderr, "ftdi_init failed\n");
- return EXIT_FAILURE;
+ fprintf(stderr, "ftdi_new failed\n");
+ retval = EXIT_FAILURE;
+ goto done;
}
- if (ftdi_usb_open_string(&ftdic, devicedesc) < 0)
+ if (ftdi_usb_open_string(ftdi, devicedesc) < 0)
{
- fprintf(stderr,"Can't open ftdi device: %s\n",ftdi_get_error_string(&ftdic));
- return EXIT_FAILURE;
+ fprintf(stderr,"Can't open ftdi device: %s\n",ftdi_get_error_string(ftdi));
+ retval = EXIT_FAILURE;
+ goto do_deinit;
}
set_baud=baud;
set_baud=baud/16;
}
- ftdi_set_baudrate(&ftdic,set_baud);
- printf("real baudrate used: %d\n",(test_mode==BITMODE_RESET) ? ftdic.baudrate : ftdic.baudrate*16);
+ ftdi_set_baudrate(ftdi,set_baud);
+ printf("real baudrate used: %d\n",(test_mode==BITMODE_RESET) ? ftdi->baudrate : ftdi->baudrate*16);
- if (ftdi_set_bitmode(&ftdic, 0xFF,test_mode) < 0)
+ if (ftdi_set_bitmode(ftdi, 0xFF,test_mode) < 0)
{
- fprintf(stderr,"Can't set mode: %s\n",ftdi_get_error_string(&ftdic));
- return EXIT_FAILURE;
+ fprintf(stderr,"Can't set mode: %s\n",ftdi_get_error_string(ftdi));
+ retval = EXIT_FAILURE;
+ goto do_close;
}
if (test_mode==BITMODE_RESET)
txbuf[i]=(i%2) ? 0xff : 0;
}
- if (ftdi_write_data_set_chunksize(&ftdic, txchunksize) < 0 ||
- ftdi_read_data_set_chunksize(&ftdic, txchunksize) < 0)
+ if (ftdi_write_data_set_chunksize(ftdi, txchunksize) < 0 ||
+ ftdi_read_data_set_chunksize(ftdi, txchunksize) < 0)
{
- fprintf(stderr,"Can't set chunksize: %s\n",ftdi_get_error_string(&ftdic));
- return EXIT_FAILURE;
+ fprintf(stderr,"Can't set chunksize: %s\n",ftdi_get_error_string(ftdi));
+ retval = EXIT_FAILURE;
+ goto do_close;
}
- if(test_mode==BITMODE_SYNCBB)
+ if (test_mode==BITMODE_SYNCBB)
{
// completely clear the receive buffer before beginning
- while(ftdi_read_data(&ftdic, rxbuf, txchunksize)>0);
+ while (ftdi_read_data(ftdi, rxbuf, txchunksize)>0);
}
start=get_prec_time();
// don't wait for more data to arrive, take what we get and keep on sending
// yes, we really would like to have libusb 1.0+ with async read/write...
- ftdic.usb_read_timeout=1;
+ ftdi->usb_read_timeout=1;
i=0;
- while(i < datasize)
+ while (i < datasize)
{
int sendsize=txchunksize;
if (i+sendsize > datasize)
sendsize=datasize-i;
- if ((sendsize=ftdi_write_data(&ftdic, txbuf, sendsize)) < 0)
+ if ((sendsize=ftdi_write_data(ftdi, txbuf, sendsize)) < 0)
{
fprintf(stderr,"write failed at %d: %s\n",
- i, ftdi_get_error_string(&ftdic));
- return EXIT_FAILURE;
+ i, ftdi_get_error_string(ftdi));
+ retval = EXIT_FAILURE;
+ goto do_close;
}
i+=sendsize;
- if(test_mode==BITMODE_SYNCBB)
+ if (test_mode==BITMODE_SYNCBB)
{
// read the same amount of data as sent
- ftdi_read_data(&ftdic, rxbuf, sendsize);
+ ftdi_read_data(ftdi, rxbuf, sendsize);
}
}
duration=get_prec_time()-start;
printf("and took %.4f seconds, this is %.0f baud or factor %.3f\n",duration,(plan*baud)/duration,plan/duration);
-
- ftdi_usb_close(&ftdic);
- ftdi_deinit(&ftdic);
- exit (0);
+do_close:
+ ftdi_usb_close(ftdi);
+do_deinit:
+ ftdi_free(ftdi);
+done:
+ if(rxbuf)
+ free(rxbuf);
+ if(txbuf)
+ free(txbuf);
+ exit (retval);
}