commit 10390b105a1bb53c4e30ae2cff1a26a33a2660b9 Author: Thomas Sailer t.sailer@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/%%7Bname%7D-%%7Bversion%7D.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