diff --git a/avrdude/ChangeLog b/avrdude/ChangeLog index 8d1fb85b..b0a47a50 100644 --- a/avrdude/ChangeLog +++ b/avrdude/ChangeLog @@ -1,3 +1,13 @@ +2013-04-27 Hannes Weisbach + + * configure.ac: Add libftdi1 library check, remove TYPE_232H DECL check + * Makefile.am: Add @LIBFTDI1@ to avrdude_LDADD + * avrftdi.c: Update from libftdi0 to libftdi1. Use libftdi1's function to + find a device by vid/pid/serial instead of doing it ourself and add/update + error messages. avrftdi_print is changed so that a message is printed when + the verbosity level is greater or equal the message level, to have always-on + messages. + 2013-04-25 Joerg Wunsch * configure.ac(AC_CONFIG_HEADERS): Replace the old AM_CONFIG_HEADER diff --git a/avrdude/Makefile.am b/avrdude/Makefile.am index 46914bab..b94318ed 100644 --- a/avrdude/Makefile.am +++ b/avrdude/Makefile.am @@ -63,7 +63,7 @@ avrdude_CFLAGS = @ENABLE_WARNINGS@ libavrdude_a_CFLAGS = @ENABLE_WARNINGS@ -avrdude_LDADD = $(top_builddir)/$(noinst_LIBRARIES) @LIBUSB@ @LIBUSB_1_0@ @LIBFTDI@ @LIBHID@ @LIBELF@ @LIBPTHREAD@ -lm +avrdude_LDADD = $(top_builddir)/$(noinst_LIBRARIES) @LIBUSB@ @LIBUSB_1_0@ @LIBFTDI@ @LIBFTDI1@ @LIBHID@ @LIBELF@ @LIBPTHREAD@ -lm bin_PROGRAMS = avrdude diff --git a/avrdude/avrftdi.c b/avrdude/avrftdi.c index a072b9db..609af985 100644 --- a/avrdude/avrftdi.c +++ b/avrdude/avrftdi.c @@ -41,17 +41,11 @@ #include "tpi.h" #include "usbasp.h" -#ifdef HAVE_LIBUSB -#ifdef HAVE_LIBFTDI +#ifdef HAVE_LIBUSB_1_0 +#ifdef HAVE_LIBFTDI1 -#include -#if defined(HAVE_USB_H) -# include -#elif defined(HAVE_LUSB0_USB_H) -# include -#else -# error "libusb needs either or " -#endif +#include +#include enum { FTDI_SCK = 1, FTDI_MOSI, FTDI_MISO, FTDI_RESET }; #define FTDI_DEFAULT_MASK ( (1 << (FTDI_SCK - 1)) | (1 << (FTDI_MOSI - 1)) ) @@ -147,7 +141,7 @@ static void avrftdi_print(int level, const char * fmt, ...) { va_list ap; - if(verbose > level) + if(verbose >= level) { fprintf(stderr, "avrftdi: "); va_start(ap, fmt); @@ -612,11 +606,8 @@ static int write_flush(avrftdi_t* pdata) static int avrftdi_open(PROGRAMMER * pgm, char *port) { - int vid, pid, interface, snfound; - char serial[255], *foundsn; - struct ftdi_device_list* devlist; - struct ftdi_device_list* devlist_ptr; - struct usb_device *found_dev; + int vid, pid, interface, index, err; + char * serial, *desc; avrftdi_t* pdata = to_pdata(pgm); @@ -626,10 +617,7 @@ static int avrftdi_open(PROGRAMMER * pgm, char *port) /* use vid/pid in following priority: config, * defaults. cmd-line is currently not supported */ - snfound = 0; - foundsn = NULL; - memset(serial, 0, sizeof(serial)); - + if (pgm->usbvid) vid = pgm->usbvid; else @@ -641,7 +629,15 @@ static int avrftdi_open(PROGRAMMER * pgm, char *port) pid = 0x6010; if (0 == pgm->usbsn[0]) /* we don't care about SN. Use first avail. */ - snfound = 1; + serial = NULL; + else + serial = pgm->usbsn; + + /* not used yet, but i put them here, just in case someone does needs or + * wants to implement this. + */ + desc = NULL; + index = 0; if (pgm->usbdev[0] == 'a' || pgm->usbdev[0] == 'A') interface = INTERFACE_A; @@ -654,76 +650,33 @@ static int avrftdi_open(PROGRAMMER * pgm, char *port) interface = INTERFACE_A; } - /************** - * USB lookup * - **************/ - -#ifndef DRYRUN - found_dev = NULL; - if (ftdi_usb_find_all(pdata->ftdic, &devlist, vid, pid)) { - devlist_ptr = devlist; - do { - ftdi_usb_get_strings(pdata->ftdic, devlist_ptr->dev, - NULL, 0, NULL, 0, serial, sizeof(serial)); - - avrftdi_print(1, "%s: device: %s, serial number: %s type 0x%04x found\n", - progname, devlist_ptr->dev->filename, serial, - devlist_ptr->dev->descriptor.bcdDevice); - - if (!snfound) { - if (strcmp(pgm->usbsn, serial) == 0){ - foundsn = strdup(serial); - snfound = 1; - found_dev = devlist_ptr->dev; - } - }else { - if (NULL == found_dev) - found_dev = devlist_ptr->dev; - if (NULL == foundsn) - foundsn = strdup(serial); - } - memset(serial, 0, 255); - devlist_ptr = devlist_ptr->next; - } while (devlist_ptr); - ftdi_list_free(&devlist); - } else { - fprintf(stderr, - "%s: No devices with Vendor-ID:Product-ID %04x:%04x found.\n", - progname, vid, pid); - ftdi_list_free(&devlist); - return -1; - } - if (!snfound) { - fprintf(stderr, - "%s: No devices with VID:PID %04x:%04x and SN '%s' found.\n", - progname, vid, pid, pgm->usbsn); - return -1; - } - - avrftdi_print(1, - "%s: Using device VID:PID %04x:%04x and SN '%s' on interface %c.\n", - progname, vid, pid, foundsn, INTERFACE_A == interface? 'A': 'B'); - - free(foundsn); -#endif - /**************** * Device setup * ****************/ E(ftdi_set_interface(pdata->ftdic, interface) < 0, pdata->ftdic); - E(ftdi_usb_open_dev(pdata->ftdic,found_dev) <0, pdata->ftdic); - E(ftdi_usb_reset(pdata->ftdic) < 0, pdata->ftdic); + + err = ftdi_usb_open_desc_index(pdata->ftdic, vid, pid, desc, serial, index); + if(err) { + avrftdi_print(0, "Error %d occured: %s\n", err, ftdi_get_error_string(pdata->ftdic)); + //stupid hack, because avrdude calls pgm->close() even when pgm->open() fails + //and usb_dev is intialized to the last usb device from probing + pdata->ftdic->usb_dev = NULL; + return err; + } else { + avrftdi_print(1, + "Using device VID:PID %04x:%04x and SN '%s' on interface %c.\n", + vid, pid, serial, INTERFACE_A == interface? 'A': 'B'); + } + + //E(ftdi_usb_open_dev(pdata->ftdic, found_dev) <0, pdata->ftdic); ftdi_set_latency_timer(pdata->ftdic, 1); -#ifndef DRYRUN /* set SPI mode */ E(ftdi_set_bitmode(pdata->ftdic, 0, BITMODE_RESET) < 0, pdata->ftdic); E(ftdi_set_bitmode(pdata->ftdic, pdata->pin_direction & 0xff, BITMODE_MPSSE) < 0, pdata->ftdic); E(ftdi_usb_purge_buffers(pdata->ftdic), pdata->ftdic); -#endif - if (pgm->baudrate) { set_frequency(pdata, pgm->baudrate); } else if(pgm->bitclock) { @@ -778,9 +731,7 @@ static int avrftdi_open(PROGRAMMER * pgm, char *port) pdata->pin_limit = 11; break; case TYPE_2232H: -#ifdef HAVE_LIBFTDI_TYPE_232H case TYPE_232H: -#endif pdata->pin_limit = 15; break; case TYPE_4232H: @@ -1322,12 +1273,12 @@ void avrftdi_initpgm(PROGRAMMER * pgm) pgm->vfy_led = set_led_vfy; } -#else /*HAVE_LIBFTDI*/ +#else /*HAVE_LIBFTDI1*/ static int avrftdi_noftdi_open (struct programmer_t *pgm, char * name) { fprintf(stderr, - "%s: error: no libftdi support. please compile again with libftdi installed.\n", + "%s: Error: no libftdi1 support. Install libftdi1 and run configure/make again.\n", progname); exit(1); @@ -1339,14 +1290,14 @@ void avrftdi_initpgm(PROGRAMMER * pgm) pgm->open = avrftdi_noftdi_open; } -#endif /* HAVE_LIBFTDI */ +#endif /* HAVE_LIBFTDI1 */ -#else /*HAVE_LIBUSB*/ +#else /*HAVE_LIBUSB_1_0*/ static int avrftdi_nousb_open (struct programmer_t *pgm, char * name) { fprintf(stderr, - "%s: error: no usb support. please compile again with libusb installed.\n", + "%s: Error: no USB support. Install libusb-1.0 and run configure/make again.\n", progname); exit(1); @@ -1358,7 +1309,7 @@ void avrftdi_initpgm(PROGRAMMER * pgm) pgm->open = avrftdi_nousb_open; } -#endif /*HAVE_LIBUSB*/ +#endif /*HAVE_LIBUSB_1_0*/ const char avrftdi_desc[] = "Interface to the MPSSE Engine of FTDI Chips using libftdi."; diff --git a/avrdude/configure.ac b/avrdude/configure.ac index 01e110d8..eca0e246 100644 --- a/avrdude/configure.ac +++ b/avrdude/configure.ac @@ -152,12 +152,16 @@ AC_CHECK_LIB([ftdi], [ftdi_usb_get_strings], [have_libftdi=yes], [], [-lusb]) if test x$have_libftdi = xyes; then LIBFTDI="-lftdi -lusb" AC_DEFINE([HAVE_LIBFTDI]) - AC_CHECK_DECL(TYPE_232H,[have_libftdi_FT232H=yes], [], [[#include ]]) - if test x$have_libftdi_FT232H = xyes; then - AC_DEFINE([HAVE_LIBFTDI_TYPE_232H]) - fi fi AC_SUBST(LIBFTDI, $LIBFTDI) +AH_TEMPLATE([HAVE_LIBFTDI1], + [Define if FTDI support is enabled via libftdi1]) +AC_CHECK_LIB([ftdi1], [ftdi_new], [have_libftdi1=yes], [], [-lusb-1.0]) +if test x$have_libftdi1 = xyes; then + LIBFTDI1="-lftdi1" + AC_DEFINE([HAVE_LIBFTDI1]) +fi +AC_SUBST(LIBFTDI1, $LIBFTDI1) AC_CHECK_HEADERS([pthread.h]) # as there exits header file only pthread implementations for Windows, check if we have a library AC_CHECK_LIB([pthread], [pthread_create], [have_pthread=yes]) @@ -488,6 +492,12 @@ else echo "DON'T HAVE libftdi" fi +if test x$have_libftdi1 = xyes; then + echo "DO HAVE libftdi1" +else + echo "DON'T HAVE libftdi1" +fi + if test x$have_libhid = xyes; then echo "DO HAVE libhid" else