10390b1
diff --git a/configure.ac b/configure.ac
10390b1
index 7434c43..f543ce3 100644
10390b1
--- a/configure.ac
10390b1
+++ b/configure.ac
10390b1
@@ -116,11 +116,11 @@ PKG_CHECK_MODULES([UDEV], [libudev], [have_udev=yes], [have_udev=no])
10390b1
 PKG_CHECK_MODULES([HIDAPI], [hidapi], [have_hidapi=yes], [have_hidapi=no])
10390b1
 PKG_CHECK_MODULES([GSL], [gsl], [have_gsl=yes], [have_gsl=no])
10390b1
 PKG_CHECK_MODULES([LIBUSB1], [libusb-1.0], [have_libusb1=yes], [have_libusb1=no])
10390b1
-PKG_CHECK_MODULES([FTDI], [libftdi >= 0.18], [have_ftdi=libftdi], [AC_CHECK_HEADERS([ftdi/ftd2xx.h], [have_ftdi=d2xx], [have_ftdi=no],
10390b1
+PKG_CHECK_MODULES([FTDI], [libftdi1 >= 1.0], [have_ftdi=libftdi1], [PKG_CHECK_MODULES([FTDI], [libftdi >= 0.18], [have_ftdi=libftdi], [AC_CHECK_HEADERS([ftdi/ftd2xx.h], [have_ftdi=d2xx], [have_ftdi=no],
10390b1
 [[#ifdef HAVE_WINDOWS_H
10390b1
 # include <windows.h>
10390b1
 #endif
10390b1
-]])])
10390b1
+]])])])
10390b1
 #dnl PKG_CHECK_MODULES([POPPLER], [poppler], [have_poppler=yes], [have_poppler=no])
10390b1
 PKG_CHECK_MODULES([CURL], [libcurl >= 7.0.0], [have_curl=yes], [have_curl=no])
10390b1
 PKG_CHECK_MODULES([OPENJPEG], [libopenjpeg], [have_openjpeg=yes], [have_openjpeg=no])
10390b1
@@ -573,7 +573,7 @@ fi
10390b1
 
10390b1
 AM_CONDITIONAL(HAVE_LIBUSB1, test x$have_libusb1 = xyes)
10390b1
 
10390b1
-if test "x${have_ftdi}" = "xlibftdi" -o "x${have_ftdi}" = "xd2xx"; then
10390b1
+if test "x${have_ftdi}" = "xlibftdi" -o "x${have_ftdi}" = "xlibftdi1" -o "x${have_ftdi}" = "xd2xx"; then
10390b1
    AC_DEFINE(HAVE_FTDI,[],[either libftdi or d2xx FTDI chip access library])
10390b1
 fi
10390b1
 
10390b1
@@ -581,11 +581,15 @@ if test "x${have_ftdi}" = "xlibftdi"; then
10390b1
    AC_DEFINE(HAVE_LIBFTDI, [], [whether we have libftdi])
10390b1
 fi
10390b1
 
10390b1
+if test "x${have_ftdi}" = "xlibftdi1"; then
10390b1
+   AC_DEFINE(HAVE_LIBFTDI1, [], [whether we have libftdi1])
10390b1
+fi
10390b1
+
10390b1
 if test "x${have_ftdi}" = "xd2xx"; then
10390b1
    AC_DEFINE(HAVE_FTDID2XX, [], [whether we have FTDI D2XX Library])
10390b1
 fi
10390b1
 
10390b1
-AM_CONDITIONAL(HAVE_FTDI, test x$have_ftdi = xlibftdi -o x$have_ftdi = xd2xx)
10390b1
+AM_CONDITIONAL(HAVE_FTDI, test x$have_ftdi = xlibftdi -o x$have_ftdi = xlibftdi1 -o x$have_ftdi = xd2xx)
10390b1
 
10390b1
 if test "x${have_poppler}" = "xyes"; then
10390b1
    AC_DEFINE(HAVE_POPPLER,[],[poppler library])
10390b1
diff --git a/flightdeck/Makefile.am b/flightdeck/Makefile.am
10390b1
index a0a7aec..c659a03 100644
10390b1
--- a/flightdeck/Makefile.am
10390b1
+++ b/flightdeck/Makefile.am
10390b1
@@ -12,7 +12,7 @@ flightdeck_SOURCES = flightdeck.cc flightdeckwindow.cc splash.cc gyroinst.cc alt
10390b1
 	fplgpsimppage.cc keyboarddlg.cc coorddlg.cc suspenddlg.cc docpage.cc srsspage.cc perfpage.cc logpage.cc \
10390b1
 	grib2page.cc fplatmodlg.cc fplverifdlg.cc fplautoroutedlg.cc nwxchartdlg.cc routeprofile.cc svgimage.cc \
10390b1
 	senscfg.cc sensors.cc sensnav.cc sensgps.cc senscfgmagcalib.cc senscfggps.cc sensgpsking.cc sensgpsking.h \
10390b1
-	sensgpskingtty.cc sensgpskingtty.h sensgpsnmea.cc sensgpsnmea.h sensms5534.cc sensms5534.h \
10390b1
+	sensgpskingtty.cc sensgpskingtty.h sensgpsnmea.cc sensgpsnmea.h \
10390b1
 	sensadsb.cc sensadsb.h sensrtladsb.cc sensrtladsb.h sensremoteadsb.cc sensremoteadsb.h
10390b1
 flightdeck_LDADD = ../cfmu/libcfmuautoroute.a ../src/libvfrnav.la @LIBS@ @GTKMM_LIBS@ @GLIBMM_LIBS@ @GIOMM_LIBS@ \
10390b1
 	@EVINCE_LIBS@ @GPS_LIBS@ @LOCATION_LIBS@ @GYPSY_LIBS@ @SQLITE3X_LIBS@ @GTHREAD_LIBS@ \
10390b1
@@ -24,7 +24,8 @@ flightdeck_LDFLAGS = @BOOST_LDFLAGS@ @GEOS_LDFLAGS@ @CLIPPER_LDFLAGS@
10390b1
 EXTRA_flightdeck_SOURCES = flightdeckrc.rc sensattitude.h sensattitude.cc ahrs.h ahrs.cc sensattpsmove.h sensattpsmove.cc \
10390b1
 	sensattpsmovebt.h sensattpsmovebt.cc sensattpsmovehid.h sensattpsmovehid.cc \
10390b1
 	sensgpsd.h sensgpsd.cc sensgypsy.h sensgypsy.cc senslibloc.h senslibloc.cc sensgeoclue.h sensgeoclue.cc \
10390b1
-	sensgpskingftdi.h sensgpskingftdi.cc win/sensors.h win/sensorspk.cc senswingps.h senswingps.cc \
10390b1
+	sensgpskingftdi.h sensgpskingftdi.cc sensms5534.cc sensms5534.h \
10390b1
+	win/sensors.h win/sensorspk.cc senswingps.h senswingps.cc \
10390b1
 	senswinbaro.h senswinbaro.cc senswinatt.h senswinatt.cc sensattiio.h sensattiio.cc sensattstmhub.h sensattstmhub.cc
10390b1
 
10390b1
 if WIN32
10390b1
@@ -64,7 +65,7 @@ flightdeck_SOURCES += sensgeoclue.h sensgeoclue.cc
10390b1
 endif
10390b1
 
10390b1
 if HAVE_FTDI
10390b1
-flightdeck_SOURCES += sensgpskingftdi.h sensgpskingftdi.cc
10390b1
+flightdeck_SOURCES += sensgpskingftdi.h sensgpskingftdi.cc sensms5534.cc sensms5534.h
10390b1
 bin_PROGRAMS += flightdeckftdieeprog
10390b1
 flightdeckftdieeprog_SOURCES = ftdieeprog.cc
10390b1
 flightdeckftdieeprog_LDADD = @GLIBMM_LIBS@ @FTDI_LIBS@
10390b1
diff --git a/flightdeck/ftdieeprog.cc b/flightdeck/ftdieeprog.cc
79d47be
index 96a1d42..b805a9c 100644
10390b1
--- a/flightdeck/ftdieeprog.cc
10390b1
+++ b/flightdeck/ftdieeprog.cc
10390b1
@@ -13,7 +13,7 @@
10390b1
 
10390b1
 #include <glibmm.h>
10390b1
 
10390b1
-#ifdef HAVE_LIBFTDI
10390b1
+#if defined(HAVE_LIBFTDI) || defined(HAVE_LIBFTDI1)
10390b1
 #include <ftdi.h>
10390b1
 #elif WIN32
10390b1
 #include <windows.h>
10390b1
@@ -51,7 +51,7 @@ Original EEPROM Contents:
10390b1
 
10390b1
 */
10390b1
 
10390b1
-#ifdef HAVE_LIBFTDI
10390b1
+#if defined(HAVE_LIBFTDI)
10390b1
 
10390b1
 class FtdiProg {
10390b1
 public:
79d47be
@@ -202,6 +202,194 @@ std::vector<uint8_t> FtdiDump::dump(void)
10390b1
 	return r;
10390b1
 }
10390b1
 
10390b1
+#elif defined(HAVE_LIBFTDI1)
10390b1
+
10390b1
+class FtdiProg {
10390b1
+public:
10390b1
+        FtdiProg(void);
10390b1
+        ~FtdiProg();
10390b1
+	void program_all(const char *manufacturer, const char *product, const char *serial, bool force);
10390b1
+
10390b1
+protected:
10390b1
+        struct ftdi_context m_ctx;
10390b1
+        struct ftdi_device_list *m_devlist;
10390b1
+        bool m_init;
10390b1
+
10390b1
+	void chk(int r, const std::string& n);
10390b1
+};
10390b1
+
10390b1
+FtdiProg::FtdiProg(void)
10390b1
+        : m_devlist(0), m_init(false)
10390b1
+{
10390b1
+	if (ftdi_init(&m_ctx) < 0)
10390b1
+                throw std::runtime_error("ftdi_init failed");
10390b1
+        m_init = true;
10390b1
+        if (ftdi_usb_find_all(&m_ctx, &m_devlist, vendor_id, device_id) < 0)
10390b1
+                throw std::runtime_error("ftdi_usb_find_all failed");
10390b1
+}
10390b1
+
10390b1
+FtdiProg::~FtdiProg()
10390b1
+{
10390b1
+        if (m_devlist)
10390b1
+                ftdi_list_free(&m_devlist);
10390b1
+        m_devlist = 0;
10390b1
+        if (m_init)
10390b1
+                ftdi_deinit(&m_ctx);
10390b1
+        m_init = false;
10390b1
+}
10390b1
+
10390b1
+void FtdiProg::chk(int r, const std::string& n)
10390b1
+{
10390b1
+	if (r >= 0)
10390b1
+		return;
10390b1
+	std::ostringstream oss;
10390b1
+	oss << n << " failed (" << r << ", " << ftdi_get_error_string(&m_ctx) << ")";
10390b1
+	throw std::runtime_error(oss.str());
10390b1
+}
10390b1
+
10390b1
+void FtdiProg::program_all(const char *manufacturer, const char *product, const char *serial, bool force)
10390b1
+{
10390b1
+	if (!serial)
10390b1
+		serial = dev_serial;
10390b1
+	for (struct ftdi_device_list *dev(m_devlist); dev; dev = dev->next) {
79d47be
+                struct libusb_device *udev(dev->dev);
10390b1
+                if (!udev)
10390b1
+                        continue;
10390b1
+		char mfg[128], desc[128], ser[128];
10390b1
+		mfg[0] = desc[0] = ser[0] = 0;
10390b1
+                if (ftdi_usb_get_strings(&m_ctx, udev, mfg, sizeof mfg, desc, sizeof desc, ser, sizeof ser) && !force)
10390b1
+                        continue;
10390b1
+                mfg[sizeof(mfg)-1] = 0;
10390b1
+                desc[sizeof(desc)-1] = 0;
10390b1
+                ser[sizeof(ser)-1] = 0;
10390b1
+		if (!force && (std::string(mfg) != dev_orig_manufacturer || std::string(desc) != dev_orig_product)) {
10390b1
+			std::cout << "Skipping Adapter: MFG \"" << mfg << "\" Desc \""
10390b1
+				  << desc << "\" Serial \"" << ser << "\"" << std::endl;
10390b1
+                        continue;
10390b1
+		}
10390b1
+		if (ftdi_usb_open_dev(&m_ctx, udev) < 0)
10390b1
+			continue;
10390b1
+		std::cout << "Reprogramming Adapter: MFG \"" << mfg << "\" Desc \""
10390b1
+			  << desc << "\" Serial \"" << ser << "\"" << std::endl;
79d47be
+		ftdi_eeprom_initdefaults(&m_ctx, const_cast<char *>(manufacturer), const_cast<char *>(product), const_cast<char *>(serial));
10390b1
+		chk(ftdi_set_eeprom_value(&m_ctx, VENDOR_ID, vendor_id), "ftdi_set_eeprom_value: VENDOR_ID");
10390b1
+		chk(ftdi_set_eeprom_value(&m_ctx, PRODUCT_ID, device_id), "ftdi_set_eeprom_value: PRODUCT_ID");
10390b1
+		chk(ftdi_set_eeprom_value(&m_ctx, SELF_POWERED, 0), "ftdi_set_eeprom_value: SELF_POWERED");
10390b1
+		chk(ftdi_set_eeprom_value(&m_ctx, REMOTE_WAKEUP, 0), "ftdi_set_eeprom_value: REMOTE_WAKEUP");
10390b1
+		chk(ftdi_set_eeprom_value(&m_ctx, IN_IS_ISOCHRONOUS, 0), "ftdi_set_eeprom_value: IN_IS_ISOCHRONOUS");
10390b1
+		chk(ftdi_set_eeprom_value(&m_ctx, OUT_IS_ISOCHRONOUS, 0), "ftdi_set_eeprom_value: OUT_IS_ISOCHRONOUS");
10390b1
+		chk(ftdi_set_eeprom_value(&m_ctx, SUSPEND_PULL_DOWNS, 0), "ftdi_set_eeprom_value: SUSPEND_PULL_DOWNS");
10390b1
+		chk(ftdi_set_eeprom_value(&m_ctx, USE_SERIAL, 1), "ftdi_set_eeprom_value: USE_SERIAL");
10390b1
+		chk(ftdi_set_eeprom_value(&m_ctx, USE_USB_VERSION, 0), "ftdi_set_eeprom_value: USE_USB_VERSION");
10390b1
+		chk(ftdi_set_eeprom_value(&m_ctx, USB_VERSION, 0x0200), "ftdi_set_eeprom_value: USB_VERSION");
10390b1
+		chk(ftdi_set_eeprom_value(&m_ctx, MAX_POWER, 50), "ftdi_set_eeprom_value: MAX_POWER");
10390b1
+		chk(ftdi_set_eeprom_value(&m_ctx, CBUS_FUNCTION_0, CBUS_IOMODE), "ftdi_set_eeprom_value: CBUS_FUNCTION_0");
10390b1
+		chk(ftdi_set_eeprom_value(&m_ctx, CBUS_FUNCTION_1, CBUS_IOMODE), "ftdi_set_eeprom_value: CBUS_FUNCTION_1");
10390b1
+		chk(ftdi_set_eeprom_value(&m_ctx, CBUS_FUNCTION_2, CBUS_IOMODE), "ftdi_set_eeprom_value: CBUS_FUNCTION_2");
10390b1
+		chk(ftdi_set_eeprom_value(&m_ctx, CBUS_FUNCTION_3, CBUS_IOMODE), "ftdi_set_eeprom_value: CBUS_FUNCTION_3");
10390b1
+		chk(ftdi_set_eeprom_value(&m_ctx, CBUS_FUNCTION_4, CBUS_SLEEP), "ftdi_set_eeprom_value: CBUS_FUNCTION_4");
10390b1
+		chk(ftdi_set_eeprom_value(&m_ctx, CHIP_TYPE, TYPE_R), "ftdi_set_eeprom_value: CHIP_TYPE");
10390b1
+		//chk(ftdi_set_eeprom_value(&m_ctx, CHIP_SIZE, FTDI_DEFAULT_EEPROM_SIZE), "ftdi_set_eeprom_value: CHIP_SIZE");
10390b1
+		//chk(ftdi_set_eeprom_value(&m_ctx, IS_NOT_PNP, ), "ftdi_set_eeprom_value: IS_NOT_PNP");
10390b1
+		//chk(ftdi_set_eeprom_value(&m_ctx, SUSPEND_DBUS7, ), "ftdi_set_eeprom_value: SUSPEND_DBUS7");
10390b1
+		//chk(ftdi_set_eeprom_value(&m_ctx, CHANNEL_A_TYPE, ), "ftdi_set_eeprom_value: CHANNEL_A_TYPE");
10390b1
+		//chk(ftdi_set_eeprom_value(&m_ctx, CHANNEL_B_TYPE, ), "ftdi_set_eeprom_value: CHANNEL_B_TYPE");
10390b1
+		//chk(ftdi_set_eeprom_value(&m_ctx, CHANNEL_A_DRIVER, ), "ftdi_set_eeprom_value: CHANNEL_A_DRIVER");
10390b1
+		//chk(ftdi_set_eeprom_value(&m_ctx, CHANNEL_B_DRIVER, ), "ftdi_set_eeprom_value: CHANNEL_B_DRIVER");
10390b1
+		//chk(ftdi_set_eeprom_value(&m_ctx, CBUS_FUNCTION_5, ), "ftdi_set_eeprom_value: CBUS_FUNCTION_5");
10390b1
+		//chk(ftdi_set_eeprom_value(&m_ctx, CBUS_FUNCTION_6, ), "ftdi_set_eeprom_value: CBUS_FUNCTION_6");
10390b1
+		//chk(ftdi_set_eeprom_value(&m_ctx, CBUS_FUNCTION_7, ), "ftdi_set_eeprom_value: CBUS_FUNCTION_7");
10390b1
+		//chk(ftdi_set_eeprom_value(&m_ctx, CBUS_FUNCTION_8, ), "ftdi_set_eeprom_value: CBUS_FUNCTION_8");
10390b1
+		//chk(ftdi_set_eeprom_value(&m_ctx, CBUS_FUNCTION_9, ), "ftdi_set_eeprom_value: CBUS_FUNCTION_9");
10390b1
+		//chk(ftdi_set_eeprom_value(&m_ctx, HIGH_CURRENT, ), "ftdi_set_eeprom_value: HIGH_CURRENT");
10390b1
+		//chk(ftdi_set_eeprom_value(&m_ctx, HIGH_CURRENT_A, ), "ftdi_set_eeprom_value: HIGH_CURRENT_A");
10390b1
+		//chk(ftdi_set_eeprom_value(&m_ctx, HIGH_CURRENT_B, ), "ftdi_set_eeprom_value: HIGH_CURRENT_B");
10390b1
+		//chk(ftdi_set_eeprom_value(&m_ctx, INVERT, ), "ftdi_set_eeprom_value: INVERT");
10390b1
+		//chk(ftdi_set_eeprom_value(&m_ctx, GROUP0_DRIVE, ), "ftdi_set_eeprom_value: GROUP0_DRIVE");
10390b1
+		//chk(ftdi_set_eeprom_value(&m_ctx, GROUP0_SCHMITT, ), "ftdi_set_eeprom_value: GROUP0_SCHMITT");
10390b1
+		//chk(ftdi_set_eeprom_value(&m_ctx, GROUP0_SLEW, ), "ftdi_set_eeprom_value: GROUP0_SLEW");
10390b1
+		//chk(ftdi_set_eeprom_value(&m_ctx, GROUP1_DRIVE, ), "ftdi_set_eeprom_value: GROUP1_DRIVE");
10390b1
+		//chk(ftdi_set_eeprom_value(&m_ctx, GROUP1_SCHMITT, ), "ftdi_set_eeprom_value: GROUP1_SCHMITT");
10390b1
+		//chk(ftdi_set_eeprom_value(&m_ctx, GROUP1_SLEW, ), "ftdi_set_eeprom_value: GROUP1_SLEW");
10390b1
+		//chk(ftdi_set_eeprom_value(&m_ctx, GROUP2_DRIVE, ), "ftdi_set_eeprom_value: GROUP2_DRIVE");
10390b1
+		//chk(ftdi_set_eeprom_value(&m_ctx, GROUP2_SCHMITT, ), "ftdi_set_eeprom_value: GROUP2_SCHMITT");
10390b1
+		//chk(ftdi_set_eeprom_value(&m_ctx, GROUP2_SLEW, ), "ftdi_set_eeprom_value: GROUP2_SLEW");
10390b1
+		//chk(ftdi_set_eeprom_value(&m_ctx, GROUP3_DRIVE, ), "ftdi_set_eeprom_value: GROUP3_DRIVE");
10390b1
+		//chk(ftdi_set_eeprom_value(&m_ctx, GROUP3_SCHMITT, ), "ftdi_set_eeprom_value: GROUP3_SCHMITT");
10390b1
+		//chk(ftdi_set_eeprom_value(&m_ctx, GROUP3_SLEW, ), "ftdi_set_eeprom_value: GROUP3_SLEW");
10390b1
+		//chk(ftdi_set_eeprom_value(&m_ctx, POWER_SAVE, ), "ftdi_set_eeprom_value: POWER_SAVE");
10390b1
+		//chk(ftdi_set_eeprom_value(&m_ctx, CLOCK_POLARITY, ), "ftdi_set_eeprom_value: CLOCK_POLARITY");
10390b1
+		//chk(ftdi_set_eeprom_value(&m_ctx, DATA_ORDER, ), "ftdi_set_eeprom_value: DATA_ORDER");
10390b1
+		//chk(ftdi_set_eeprom_value(&m_ctx, FLOW_CONTROL, ), "ftdi_set_eeprom_value: FLOW_CONTROL");
10390b1
+		//chk(ftdi_set_eeprom_value(&m_ctx, CHANNEL_C_DRIVER, ), "ftdi_set_eeprom_value: CHANNEL_C_DRIVER");
10390b1
+		//chk(ftdi_set_eeprom_value(&m_ctx, CHANNEL_D_DRIVER, ), "ftdi_set_eeprom_value: CHANNEL_D_DRIVER");
10390b1
+		//chk(ftdi_set_eeprom_value(&m_ctx, CHANNEL_A_RS485, ), "ftdi_set_eeprom_value: CHANNEL_A_RS485");
10390b1
+		//chk(ftdi_set_eeprom_value(&m_ctx, CHANNEL_B_RS485, ), "ftdi_set_eeprom_value: CHANNEL_B_RS485");
10390b1
+		//chk(ftdi_set_eeprom_value(&m_ctx, CHANNEL_C_RS485, ), "ftdi_set_eeprom_value: CHANNEL_C_RS485");
10390b1
+		//chk(ftdi_set_eeprom_value(&m_ctx, CHANNEL_D_RS485, ), "ftdi_set_eeprom_value: CHANNEL_D_RS485");
10390b1
+		//chk(ftdi_set_eeprom_value(&m_ctx, RELEASE_NUMBER, ), "ftdi_set_eeprom_value: RELEASE_NUMBER");
10390b1
+		//m_eeprom.BM_type_chip = 1;
10390b1
+		chk(ftdi_eeprom_build(&m_ctx), "ftdi_eeprom_build");
10390b1
+		chk(ftdi_write_eeprom(&m_ctx), "ftdi_write_eeprom");
10390b1
+		chk(ftdi_usb_close(&m_ctx), "ftdi_usb_close");
10390b1
+        }
10390b1
+}
10390b1
+
10390b1
+class FtdiDump {
10390b1
+public:
10390b1
+	FtdiDump(void);
10390b1
+	~FtdiDump();
10390b1
+	std::vector<uint8_t> dump(void);
10390b1
+
10390b1
+protected:
10390b1
+        struct ftdi_context m_ctx;
10390b1
+        bool m_init;
10390b1
+
10390b1
+	void chk(int r, const std::string& n);
10390b1
+};
10390b1
+
10390b1
+FtdiDump::FtdiDump(void)
10390b1
+        : m_init(false)
10390b1
+{
10390b1
+        if (ftdi_init(&m_ctx) < 0)
10390b1
+                throw std::runtime_error("ftdi_init failed");
10390b1
+        m_init = true;
10390b1
+}
10390b1
+
10390b1
+FtdiDump::~FtdiDump()
10390b1
+{
10390b1
+	ftdi_usb_close(&m_ctx);
10390b1
+        if (m_init)
10390b1
+                ftdi_deinit(&m_ctx);
10390b1
+        m_init = false;
10390b1
+}
10390b1
+
10390b1
+void FtdiDump::chk(int r, const std::string& n)
10390b1
+{
10390b1
+	if (r >= 0)
10390b1
+		return;
10390b1
+	std::ostringstream oss;
10390b1
+	oss << n << " failed (" << r << ", " << ftdi_get_error_string(&m_ctx) << ")";
10390b1
+	throw std::runtime_error(oss.str());
10390b1
+}
10390b1
+
10390b1
+std::vector<uint8_t> FtdiDump::dump(void)
10390b1
+{
10390b1
+	ftdi_usb_close(&m_ctx);
10390b1
+	chk(ftdi_usb_open(&m_ctx, vendor_id, device_id), "ftdi_usb_open");
10390b1
+	chk(ftdi_read_eeprom(&m_ctx), "ftdi_read_eeprom");
10390b1
+	chk(ftdi_eeprom_decode(&m_ctx, 0), "ftdi_eeprom_decode");
10390b1
+	int rsize(0);
10390b1
+	chk(ftdi_get_eeprom_value(&m_ctx, CHIP_SIZE, &rsize), "ftdi_get_eeprom_value");
10390b1
+	std::vector<uint8_t> r;
79d47be
+	if (rsize > 0 && rsize <= 65536) {
10390b1
+		r.resize(rsize, 0);
10390b1
+		chk(ftdi_get_eeprom_buf(&m_ctx, &r[0], rsize), "ftdi_get_eeprom_buf");
10390b1
+	}
10390b1
+	chk(ftdi_usb_close(&m_ctx), "ftdi_usb_close");
10390b1
+	return r;
10390b1
+}
10390b1
+
10390b1
 #else
10390b1
 
10390b1
 class FtdiProg {