commit 10390b105a1bb53c4e30ae2cff1a26a33a2660b9
Author: Thomas Sailer <t.sailer(a)alumni.ethz.ch>
Date: Tue Jul 1 01:54:19 2014 +0200
try to get libftdi1 work with vfrnav
ftdiconfig.patch | 295 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
vfrnav.spec | 5 +
2 files changed, 300 insertions(+), 0 deletions(-)
---
diff --git a/ftdiconfig.patch b/ftdiconfig.patch
new file mode 100644
index 0000000..105af0c
--- /dev/null
+++ b/ftdiconfig.patch
@@ -0,0 +1,295 @@
+diff --git a/configure.ac b/configure.ac
+index 7434c43..f543ce3 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -116,11 +116,11 @@ PKG_CHECK_MODULES([UDEV], [libudev], [have_udev=yes],
[have_udev=no])
+ PKG_CHECK_MODULES([HIDAPI], [hidapi], [have_hidapi=yes], [have_hidapi=no])
+ PKG_CHECK_MODULES([GSL], [gsl], [have_gsl=yes], [have_gsl=no])
+ PKG_CHECK_MODULES([LIBUSB1], [libusb-1.0], [have_libusb1=yes], [have_libusb1=no])
+-PKG_CHECK_MODULES([FTDI], [libftdi >= 0.18], [have_ftdi=libftdi],
[AC_CHECK_HEADERS([ftdi/ftd2xx.h], [have_ftdi=d2xx], [have_ftdi=no],
++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],
+ [[#ifdef HAVE_WINDOWS_H
+ # include <windows.h>
+ #endif
+-]])])
++]])])])
+ #dnl PKG_CHECK_MODULES([POPPLER], [poppler], [have_poppler=yes], [have_poppler=no])
+ PKG_CHECK_MODULES([CURL], [libcurl >= 7.0.0], [have_curl=yes], [have_curl=no])
+ PKG_CHECK_MODULES([OPENJPEG], [libopenjpeg], [have_openjpeg=yes], [have_openjpeg=no])
+@@ -573,7 +573,7 @@ fi
+
+ AM_CONDITIONAL(HAVE_LIBUSB1, test x$have_libusb1 = xyes)
+
+-if test "x${have_ftdi}" = "xlibftdi" -o "x${have_ftdi}" =
"xd2xx"; then
++if test "x${have_ftdi}" = "xlibftdi" -o "x${have_ftdi}" =
"xlibftdi1" -o "x${have_ftdi}" = "xd2xx"; then
+ AC_DEFINE(HAVE_FTDI,[],[either libftdi or d2xx FTDI chip access library])
+ fi
+
+@@ -581,11 +581,15 @@ if test "x${have_ftdi}" = "xlibftdi"; then
+ AC_DEFINE(HAVE_LIBFTDI, [], [whether we have libftdi])
+ fi
+
++if test "x${have_ftdi}" = "xlibftdi1"; then
++ AC_DEFINE(HAVE_LIBFTDI1, [], [whether we have libftdi1])
++fi
++
+ if test "x${have_ftdi}" = "xd2xx"; then
+ AC_DEFINE(HAVE_FTDID2XX, [], [whether we have FTDI D2XX Library])
+ fi
+
+-AM_CONDITIONAL(HAVE_FTDI, test x$have_ftdi = xlibftdi -o x$have_ftdi = xd2xx)
++AM_CONDITIONAL(HAVE_FTDI, test x$have_ftdi = xlibftdi -o x$have_ftdi = xlibftdi1 -o
x$have_ftdi = xd2xx)
+
+ if test "x${have_poppler}" = "xyes"; then
+ AC_DEFINE(HAVE_POPPLER,[],[poppler library])
+diff --git a/flightdeck/Makefile.am b/flightdeck/Makefile.am
+index a0a7aec..c659a03 100644
+--- a/flightdeck/Makefile.am
++++ b/flightdeck/Makefile.am
+@@ -12,7 +12,7 @@ flightdeck_SOURCES = flightdeck.cc flightdeckwindow.cc splash.cc
gyroinst.cc alt
+ fplgpsimppage.cc keyboarddlg.cc coorddlg.cc suspenddlg.cc docpage.cc srsspage.cc
perfpage.cc logpage.cc \
+ grib2page.cc fplatmodlg.cc fplverifdlg.cc fplautoroutedlg.cc nwxchartdlg.cc
routeprofile.cc svgimage.cc \
+ senscfg.cc sensors.cc sensnav.cc sensgps.cc senscfgmagcalib.cc senscfggps.cc
sensgpsking.cc sensgpsking.h \
+- sensgpskingtty.cc sensgpskingtty.h sensgpsnmea.cc sensgpsnmea.h sensms5534.cc
sensms5534.h \
++ sensgpskingtty.cc sensgpskingtty.h sensgpsnmea.cc sensgpsnmea.h \
+ sensadsb.cc sensadsb.h sensrtladsb.cc sensrtladsb.h sensremoteadsb.cc sensremoteadsb.h
+ flightdeck_LDADD = ../cfmu/libcfmuautoroute.a ../src/libvfrnav.la @LIBS@ @GTKMM_LIBS@
@GLIBMM_LIBS@ @GIOMM_LIBS@ \
+ @EVINCE_LIBS@ @GPS_LIBS@ @LOCATION_LIBS@ @GYPSY_LIBS@ @SQLITE3X_LIBS@ @GTHREAD_LIBS@ \
+@@ -24,7 +24,8 @@ flightdeck_LDFLAGS = @BOOST_LDFLAGS@ @GEOS_LDFLAGS@ @CLIPPER_LDFLAGS@
+ EXTRA_flightdeck_SOURCES = flightdeckrc.rc sensattitude.h sensattitude.cc ahrs.h ahrs.cc
sensattpsmove.h sensattpsmove.cc \
+ sensattpsmovebt.h sensattpsmovebt.cc sensattpsmovehid.h sensattpsmovehid.cc \
+ sensgpsd.h sensgpsd.cc sensgypsy.h sensgypsy.cc senslibloc.h senslibloc.cc
sensgeoclue.h sensgeoclue.cc \
+- sensgpskingftdi.h sensgpskingftdi.cc win/sensors.h win/sensorspk.cc senswingps.h
senswingps.cc \
++ sensgpskingftdi.h sensgpskingftdi.cc sensms5534.cc sensms5534.h \
++ win/sensors.h win/sensorspk.cc senswingps.h senswingps.cc \
+ senswinbaro.h senswinbaro.cc senswinatt.h senswinatt.cc sensattiio.h sensattiio.cc
sensattstmhub.h sensattstmhub.cc
+
+ if WIN32
+@@ -64,7 +65,7 @@ flightdeck_SOURCES += sensgeoclue.h sensgeoclue.cc
+ endif
+
+ if HAVE_FTDI
+-flightdeck_SOURCES += sensgpskingftdi.h sensgpskingftdi.cc
++flightdeck_SOURCES += sensgpskingftdi.h sensgpskingftdi.cc sensms5534.cc sensms5534.h
+ bin_PROGRAMS += flightdeckftdieeprog
+ flightdeckftdieeprog_SOURCES = ftdieeprog.cc
+ flightdeckftdieeprog_LDADD = @GLIBMM_LIBS@ @FTDI_LIBS@
+diff --git a/flightdeck/ftdieeprog.cc b/flightdeck/ftdieeprog.cc
+index 96a1d42..462a204 100644
+--- a/flightdeck/ftdieeprog.cc
++++ b/flightdeck/ftdieeprog.cc
+@@ -13,7 +13,7 @@
+
+ #include <glibmm.h>
+
+-#ifdef HAVE_LIBFTDI
++#if defined(HAVE_LIBFTDI) || defined(HAVE_LIBFTDI1)
+ #include <ftdi.h>
+ #elif WIN32
+ #include <windows.h>
+@@ -51,7 +51,7 @@ Original EEPROM Contents:
+
+ */
+
+-#ifdef HAVE_LIBFTDI
++#if defined(HAVE_LIBFTDI)
+
+ class FtdiProg {
+ public:
+@@ -202,6 +202,196 @@ std::vector<uint8_t> FtdiDump::dump(void)
+ return r;
+ }
+
++#elif defined(HAVE_LIBFTDI1)
++
++class FtdiProg {
++public:
++ FtdiProg(void);
++ ~FtdiProg();
++ void program_all(const char *manufacturer, const char *product, const char *serial,
bool force);
++
++protected:
++ struct ftdi_context m_ctx;
++ struct ftdi_device_list *m_devlist;
++ bool m_init;
++
++ void chk(int r, const std::string& n);
++};
++
++FtdiProg::FtdiProg(void)
++ : m_devlist(0), m_init(false)
++{
++ if (ftdi_init(&m_ctx) < 0)
++ throw std::runtime_error("ftdi_init failed");
++ m_init = true;
++ if (ftdi_usb_find_all(&m_ctx, &m_devlist, vendor_id, device_id) < 0)
++ throw std::runtime_error("ftdi_usb_find_all failed");
++}
++
++FtdiProg::~FtdiProg()
++{
++ if (m_devlist)
++ ftdi_list_free(&m_devlist);
++ m_devlist = 0;
++ if (m_init)
++ ftdi_deinit(&m_ctx);
++ m_init = false;
++}
++
++void FtdiProg::chk(int r, const std::string& n)
++{
++ if (r >= 0)
++ return;
++ std::ostringstream oss;
++ oss << n << " failed (" << r << ", "
<< ftdi_get_error_string(&m_ctx) << ")";
++ throw std::runtime_error(oss.str());
++}
++
++void FtdiProg::program_all(const char *manufacturer, const char *product, const char
*serial, bool force)
++{
++ if (!serial)
++ serial = dev_serial;
++ for (struct ftdi_device_list *dev(m_devlist); dev; dev = dev->next) {
++ struct usb_device *udev(dev->dev);
++ if (!udev)
++ continue;
++ char mfg[128], desc[128], ser[128];
++ mfg[0] = desc[0] = ser[0] = 0;
++ if (ftdi_usb_get_strings(&m_ctx, udev, mfg, sizeof mfg, desc, sizeof
desc, ser, sizeof ser) && !force)
++ continue;
++ mfg[sizeof(mfg)-1] = 0;
++ desc[sizeof(desc)-1] = 0;
++ ser[sizeof(ser)-1] = 0;
++ if (!force && (std::string(mfg) != dev_orig_manufacturer || std::string(desc)
!= dev_orig_product)) {
++ std::cout << "Skipping Adapter: MFG \"" << mfg <<
"\" Desc \""
++ << desc << "\" Serial \"" << ser <<
"\"" << std::endl;
++ continue;
++ }
++ if (ftdi_usb_open_dev(&m_ctx, udev) < 0)
++ continue;
++ std::cout << "Reprogramming Adapter: MFG \"" << mfg
<< "\" Desc \""
++ << desc << "\" Serial \"" << ser <<
"\"" << std::endl;
++ ftdi_eeprom_initdefaults(&m_ctx, manufacturer, product, serial);
++ chk(ftdi_set_eeprom_value(&m_ctx, VENDOR_ID, vendor_id),
"ftdi_set_eeprom_value: VENDOR_ID");
++ chk(ftdi_set_eeprom_value(&m_ctx, PRODUCT_ID, device_id),
"ftdi_set_eeprom_value: PRODUCT_ID");
++ chk(ftdi_set_eeprom_value(&m_ctx, SELF_POWERED, 0), "ftdi_set_eeprom_value:
SELF_POWERED");
++ chk(ftdi_set_eeprom_value(&m_ctx, REMOTE_WAKEUP, 0), "ftdi_set_eeprom_value:
REMOTE_WAKEUP");
++ chk(ftdi_set_eeprom_value(&m_ctx, IN_IS_ISOCHRONOUS, 0),
"ftdi_set_eeprom_value: IN_IS_ISOCHRONOUS");
++ chk(ftdi_set_eeprom_value(&m_ctx, OUT_IS_ISOCHRONOUS, 0),
"ftdi_set_eeprom_value: OUT_IS_ISOCHRONOUS");
++ chk(ftdi_set_eeprom_value(&m_ctx, SUSPEND_PULL_DOWNS, 0),
"ftdi_set_eeprom_value: SUSPEND_PULL_DOWNS");
++ chk(ftdi_set_eeprom_value(&m_ctx, USE_SERIAL, 1), "ftdi_set_eeprom_value:
USE_SERIAL");
++ chk(ftdi_set_eeprom_value(&m_ctx, USE_USB_VERSION, 0),
"ftdi_set_eeprom_value: USE_USB_VERSION");
++ chk(ftdi_set_eeprom_value(&m_ctx, USB_VERSION, 0x0200),
"ftdi_set_eeprom_value: USB_VERSION");
++ chk(ftdi_set_eeprom_value(&m_ctx, MAX_POWER, 50), "ftdi_set_eeprom_value:
MAX_POWER");
++ chk(ftdi_set_eeprom_value(&m_ctx, CBUS_FUNCTION_0, CBUS_IOMODE),
"ftdi_set_eeprom_value: CBUS_FUNCTION_0");
++ chk(ftdi_set_eeprom_value(&m_ctx, CBUS_FUNCTION_1, CBUS_IOMODE),
"ftdi_set_eeprom_value: CBUS_FUNCTION_1");
++ chk(ftdi_set_eeprom_value(&m_ctx, CBUS_FUNCTION_2, CBUS_IOMODE),
"ftdi_set_eeprom_value: CBUS_FUNCTION_2");
++ chk(ftdi_set_eeprom_value(&m_ctx, CBUS_FUNCTION_3, CBUS_IOMODE),
"ftdi_set_eeprom_value: CBUS_FUNCTION_3");
++ chk(ftdi_set_eeprom_value(&m_ctx, CBUS_FUNCTION_4, CBUS_SLEEP),
"ftdi_set_eeprom_value: CBUS_FUNCTION_4");
++ chk(ftdi_set_eeprom_value(&m_ctx, CHIP_TYPE, TYPE_R), "ftdi_set_eeprom_value:
CHIP_TYPE");
++ //chk(ftdi_set_eeprom_value(&m_ctx, CHIP_SIZE, FTDI_DEFAULT_EEPROM_SIZE),
"ftdi_set_eeprom_value: CHIP_SIZE");
++ //chk(ftdi_set_eeprom_value(&m_ctx, IS_NOT_PNP, ), "ftdi_set_eeprom_value:
IS_NOT_PNP");
++ //chk(ftdi_set_eeprom_value(&m_ctx, SUSPEND_DBUS7, ), "ftdi_set_eeprom_value:
SUSPEND_DBUS7");
++ //chk(ftdi_set_eeprom_value(&m_ctx, CHANNEL_A_TYPE, ),
"ftdi_set_eeprom_value: CHANNEL_A_TYPE");
++ //chk(ftdi_set_eeprom_value(&m_ctx, CHANNEL_B_TYPE, ),
"ftdi_set_eeprom_value: CHANNEL_B_TYPE");
++ //chk(ftdi_set_eeprom_value(&m_ctx, CHANNEL_A_DRIVER, ),
"ftdi_set_eeprom_value: CHANNEL_A_DRIVER");
++ //chk(ftdi_set_eeprom_value(&m_ctx, CHANNEL_B_DRIVER, ),
"ftdi_set_eeprom_value: CHANNEL_B_DRIVER");
++ //chk(ftdi_set_eeprom_value(&m_ctx, CBUS_FUNCTION_5, ),
"ftdi_set_eeprom_value: CBUS_FUNCTION_5");
++ //chk(ftdi_set_eeprom_value(&m_ctx, CBUS_FUNCTION_6, ),
"ftdi_set_eeprom_value: CBUS_FUNCTION_6");
++ //chk(ftdi_set_eeprom_value(&m_ctx, CBUS_FUNCTION_7, ),
"ftdi_set_eeprom_value: CBUS_FUNCTION_7");
++ //chk(ftdi_set_eeprom_value(&m_ctx, CBUS_FUNCTION_8, ),
"ftdi_set_eeprom_value: CBUS_FUNCTION_8");
++ //chk(ftdi_set_eeprom_value(&m_ctx, CBUS_FUNCTION_9, ),
"ftdi_set_eeprom_value: CBUS_FUNCTION_9");
++ //chk(ftdi_set_eeprom_value(&m_ctx, HIGH_CURRENT, ), "ftdi_set_eeprom_value:
HIGH_CURRENT");
++ //chk(ftdi_set_eeprom_value(&m_ctx, HIGH_CURRENT_A, ),
"ftdi_set_eeprom_value: HIGH_CURRENT_A");
++ //chk(ftdi_set_eeprom_value(&m_ctx, HIGH_CURRENT_B, ),
"ftdi_set_eeprom_value: HIGH_CURRENT_B");
++ //chk(ftdi_set_eeprom_value(&m_ctx, INVERT, ), "ftdi_set_eeprom_value:
INVERT");
++ //chk(ftdi_set_eeprom_value(&m_ctx, GROUP0_DRIVE, ), "ftdi_set_eeprom_value:
GROUP0_DRIVE");
++ //chk(ftdi_set_eeprom_value(&m_ctx, GROUP0_SCHMITT, ),
"ftdi_set_eeprom_value: GROUP0_SCHMITT");
++ //chk(ftdi_set_eeprom_value(&m_ctx, GROUP0_SLEW, ), "ftdi_set_eeprom_value:
GROUP0_SLEW");
++ //chk(ftdi_set_eeprom_value(&m_ctx, GROUP1_DRIVE, ), "ftdi_set_eeprom_value:
GROUP1_DRIVE");
++ //chk(ftdi_set_eeprom_value(&m_ctx, GROUP1_SCHMITT, ),
"ftdi_set_eeprom_value: GROUP1_SCHMITT");
++ //chk(ftdi_set_eeprom_value(&m_ctx, GROUP1_SLEW, ), "ftdi_set_eeprom_value:
GROUP1_SLEW");
++ //chk(ftdi_set_eeprom_value(&m_ctx, GROUP2_DRIVE, ), "ftdi_set_eeprom_value:
GROUP2_DRIVE");
++ //chk(ftdi_set_eeprom_value(&m_ctx, GROUP2_SCHMITT, ),
"ftdi_set_eeprom_value: GROUP2_SCHMITT");
++ //chk(ftdi_set_eeprom_value(&m_ctx, GROUP2_SLEW, ), "ftdi_set_eeprom_value:
GROUP2_SLEW");
++ //chk(ftdi_set_eeprom_value(&m_ctx, GROUP3_DRIVE, ), "ftdi_set_eeprom_value:
GROUP3_DRIVE");
++ //chk(ftdi_set_eeprom_value(&m_ctx, GROUP3_SCHMITT, ),
"ftdi_set_eeprom_value: GROUP3_SCHMITT");
++ //chk(ftdi_set_eeprom_value(&m_ctx, GROUP3_SLEW, ), "ftdi_set_eeprom_value:
GROUP3_SLEW");
++ //chk(ftdi_set_eeprom_value(&m_ctx, POWER_SAVE, ), "ftdi_set_eeprom_value:
POWER_SAVE");
++ //chk(ftdi_set_eeprom_value(&m_ctx, CLOCK_POLARITY, ),
"ftdi_set_eeprom_value: CLOCK_POLARITY");
++ //chk(ftdi_set_eeprom_value(&m_ctx, DATA_ORDER, ), "ftdi_set_eeprom_value:
DATA_ORDER");
++ //chk(ftdi_set_eeprom_value(&m_ctx, FLOW_CONTROL, ), "ftdi_set_eeprom_value:
FLOW_CONTROL");
++ //chk(ftdi_set_eeprom_value(&m_ctx, CHANNEL_C_DRIVER, ),
"ftdi_set_eeprom_value: CHANNEL_C_DRIVER");
++ //chk(ftdi_set_eeprom_value(&m_ctx, CHANNEL_D_DRIVER, ),
"ftdi_set_eeprom_value: CHANNEL_D_DRIVER");
++ //chk(ftdi_set_eeprom_value(&m_ctx, CHANNEL_A_RS485, ),
"ftdi_set_eeprom_value: CHANNEL_A_RS485");
++ //chk(ftdi_set_eeprom_value(&m_ctx, CHANNEL_B_RS485, ),
"ftdi_set_eeprom_value: CHANNEL_B_RS485");
++ //chk(ftdi_set_eeprom_value(&m_ctx, CHANNEL_C_RS485, ),
"ftdi_set_eeprom_value: CHANNEL_C_RS485");
++ //chk(ftdi_set_eeprom_value(&m_ctx, CHANNEL_D_RS485, ),
"ftdi_set_eeprom_value: CHANNEL_D_RS485");
++ //chk(ftdi_set_eeprom_value(&m_ctx, RELEASE_NUMBER, ),
"ftdi_set_eeprom_value: RELEASE_NUMBER");
++ //m_eeprom.BM_type_chip = 1;
++ chk(ftdi_eeprom_build(&m_ctx), "ftdi_eeprom_build");
++ chk(ftdi_write_eeprom(&m_ctx), "ftdi_write_eeprom");
++ chk(ftdi_usb_close(&m_ctx), "ftdi_usb_close");
++ }
++}
++
++class FtdiDump {
++public:
++ FtdiDump(void);
++ ~FtdiDump();
++ std::vector<uint8_t> dump(void);
++
++protected:
++ struct ftdi_context m_ctx;
++ bool m_init;
++
++ void chk(int r, const std::string& n);
++};
++
++FtdiDump::FtdiDump(void)
++ : m_init(false)
++{
++ if (ftdi_init(&m_ctx) < 0)
++ throw std::runtime_error("ftdi_init failed");
++ m_init = true;
++}
++
++FtdiDump::~FtdiDump()
++{
++ ftdi_usb_close(&m_ctx);
++ if (m_init)
++ ftdi_deinit(&m_ctx);
++ m_init = false;
++}
++
++void FtdiDump::chk(int r, const std::string& n)
++{
++ if (r >= 0)
++ return;
++ std::ostringstream oss;
++ oss << n << " failed (" << r << ", "
<< ftdi_get_error_string(&m_ctx) << ")";
++ throw std::runtime_error(oss.str());
++}
++
++std::vector<uint8_t> FtdiDump::dump(void)
++{
++ ftdi_usb_close(&m_ctx);
++ chk(ftdi_usb_open(&m_ctx, vendor_id, device_id), "ftdi_usb_open");
++ chk(ftdi_read_eeprom(&m_ctx), "ftdi_read_eeprom");
++ chk(ftdi_eeprom_decode(&m_ctx, 0), "ftdi_eeprom_decode");
++ int rsize(0);
++ chk(ftdi_get_eeprom_value(&m_ctx, CHIP_SIZE, &rsize),
"ftdi_get_eeprom_value");
++ std::vector<uint8_t> r;
++ if (rsize > 0 && rsize <= FTDI_MAX_EEPROM_SIZE) {
++ r.resize(rsize, 0);
++ chk(ftdi_get_eeprom_buf(&m_ctx, &r[0], rsize),
"ftdi_get_eeprom_buf");
++ }
++ chk(ftdi_usb_close(&m_ctx), "ftdi_usb_close");
++ return r;
++}
++
++};
++
+ #else
+
+ class FtdiProg {
diff --git a/vfrnav.spec b/vfrnav.spec
index 5ee9a8e..adccec5 100644
--- a/vfrnav.spec
+++ b/vfrnav.spec
@@ -8,6 +8,7 @@ License: GPLv2+
URL:
http://www.baycom.org/~tom/vfrnav
Source0:
http://download.gna.org/vfrnav/%{name}-%{version}.tar.gz
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
+Patch0: ftdiconfig.patch
%bcond_without webservice
@@ -125,6 +126,10 @@ This package contains a webservice for the CFMU Autorouter.
%prep
%setup -q
+%patch0 -p1 -b .ftdi
+aclocal -I m4
+automake -a -c
+autoconf
%build
%configure