From: Yegor Yefremov Date: Tue, 12 Dec 2023 13:20:36 +0000 (+0100) Subject: CMake: bump the minimal required version to 3.5 X-Git-Url: http://developer.intra2net.com/git/?p=libftdi;a=commitdiff_plain;h=HEAD;hp=32e899fa5ecd30aad0a25ea8d7e208d203aaa0ae CMake: bump the minimal required version to 3.5 Older CMake versions are treated as deprecated. --- diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..40392cd --- /dev/null +++ b/.editorconfig @@ -0,0 +1,16 @@ +root = true + +[*] +end_of_line = lf +trim_trailing_whitespace = true +insert_final_newline = false + +[{CMakeLists.txt,*.cmake}] +indent_style = space +indent_size = 2 +tab_width = 2 + +[{*.c,*.h}] +indent_style = space +indent_size = 4 +tab_width = 4 diff --git a/CMakeLists.txt b/CMakeLists.txt index 58f664a..2ce1ad4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,3 +1,7 @@ +cmake_minimum_required(VERSION 3.5 FATAL_ERROR) + +message(STATUS "CMake version: ${CMAKE_VERSION}") + # Project project(libftdi1 C) set(MAJOR_VERSION 1) @@ -5,14 +9,30 @@ set(MINOR_VERSION 5) set(PACKAGE libftdi1) set(VERSION_STRING ${MAJOR_VERSION}.${MINOR_VERSION}) set(VERSION ${VERSION_STRING}) -set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake) +set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake) + +# Support new if() IN_LIST operator +if(POLICY CMP0057) + cmake_policy(SET CMP0057 NEW) +endif() + +# Included scripts do automatic cmake_policy() PUSH and POP +if(POLICY CMP0011) + cmake_policy(SET CMP0011 NEW) +endif() + +# Target link properties INTERFACE_LINK_OPTIONS, INTERFACE_LINK_DIRECTORIES +# and INTERFACE_LINK_DEPENDS are now transitive over private dependencies +# of static libraries +if(POLICY CMP0099) + cmake_policy(SET CMP0099 NEW) +endif() # CMake if("${CMAKE_BUILD_TYPE}" STREQUAL "") - set(CMAKE_BUILD_TYPE RelWithDebInfo) + set(CMAKE_BUILD_TYPE RelWithDebInfo) endif("${CMAKE_BUILD_TYPE}" STREQUAL "") set(CMAKE_COLOR_MAKEFILE ON) -cmake_minimum_required(VERSION 2.6 FATAL_ERROR) add_definitions(-Wall) @@ -21,11 +41,11 @@ include(CMakeOptions.txt) # Debug build message("-- Build type: ${CMAKE_BUILD_TYPE}") if(${CMAKE_BUILD_TYPE} STREQUAL Debug) - add_definitions(-DDEBUG) + add_definitions(-DDEBUG) endif(${CMAKE_BUILD_TYPE} STREQUAL Debug) -# find libusb -find_package ( USB1 REQUIRED ) +# Find libusb +find_package ( LibUSB REQUIRED ) include_directories ( ${LIBUSB_INCLUDE_DIR} ) # Find Boost @@ -50,7 +70,7 @@ set(CPACK_COMPONENT_SHAREDLIBS_GROUP "Development") set(CPACK_COMPONENT_STATICLIBS_GROUP "Development") set(CPACK_COMPONENT_HEADERS_GROUP "Development") -# guess LIB_SUFFIX, don't take debian multiarch into account +# guess LIB_SUFFIX, don't take debian multiarch into account if ( NOT DEFINED LIB_SUFFIX ) if( CMAKE_SYSTEM_NAME MATCHES "Linux" AND NOT CMAKE_CROSSCOMPILING @@ -64,9 +84,9 @@ endif () if(NOT APPLE) if(CMAKE_SIZEOF_VOID_P EQUAL 4) - SET(PACK_ARCH "") - else(CMAKE_SIZEOF_VOID_P EQUAL 8) - SET(PACK_ARCH .x86_64) + SET(PACK_ARCH "") + else(CMAKE_SIZEOF_VOID_P EQUAL 8) + SET(PACK_ARCH .x86_64) endif(CMAKE_SIZEOF_VOID_P EQUAL 4) else(NOT APPLE) SET(PACK_ARCH "") @@ -76,8 +96,8 @@ endif(NOT APPLE) set(CPACK_PACKAGE_VERSION ${VERSION_STRING}) set(CPACK_PACKAGE_CONTACT "Intra2net AG ") set(CPACK_PACKAGE_DESCRIPTION "libftdi1 library.") -set(CPACK_PACKAGE_DESCRIPTION_SUMMARY ${CPACK_PACKAGE_DESCRIPTION} - ) +set(CPACK_PACKAGE_DESCRIPTION_SUMMARY ${CPACK_PACKAGE_DESCRIPTION}) + # Package settings if ( UNIX ) set(CPACK_GENERATOR "DEB;RPM") @@ -97,7 +117,7 @@ if ( WIN32 ) set ( CPACK_NSIS_MODIFY_PATH ON ) endif () -set(CPACK_RESOURCE_FILE_LICENSE ${CMAKE_SOURCE_DIR}/LICENSE) +set(CPACK_RESOURCE_FILE_LICENSE ${CMAKE_CURRENT_SOURCE_DIR}/LICENSE) set(CPACK_SOURCE_GENERATOR TGZ) set(CPACK_SOURCE_IGNORE_FILES "\\\\.git;~$;build/") @@ -112,47 +132,37 @@ endif () set(ARCHIVE_NAME ${CMAKE_PROJECT_NAME}-${VERSION_STRING}) add_custom_target(dist COMMAND git archive --prefix=${ARCHIVE_NAME}/ HEAD - | bzip2 > ${CMAKE_BINARY_DIR}/${ARCHIVE_NAME}.tar.bz2 - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}) + | bzip2 > ${PROJECT_BINARY_DIR}/${ARCHIVE_NAME}.tar.bz2 + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) + +add_subdirectory(src) +add_subdirectory(packages) if ( DOCUMENTATION ) - find_package ( Doxygen REQUIRED) - - # Copy doxy.config.in - set(top_srcdir ${CMAKE_SOURCE_DIR}) - configure_file(${CMAKE_SOURCE_DIR}/doc/Doxyfile.in ${CMAKE_BINARY_DIR}/Doxyfile ) - configure_file(${CMAKE_SOURCE_DIR}/doc/Doxyfile.xml.in ${CMAKE_BINARY_DIR}/Doxyfile.xml ) - - # Run doxygen - add_custom_command( - OUTPUT ${CMAKE_BINARY_DIR}/doc/html/index.html - COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR}/doc - COMMAND ${DOXYGEN_EXECUTABLE} ${CMAKE_BINARY_DIR}/Doxyfile - DEPENDS ${c_headers};${c_sources};${cpp_sources};${cpp_headers} - ) - - add_custom_target(docs ALL DEPENDS ${CMAKE_BINARY_DIR}/doc/html/index.html) -endif () + add_subdirectory(doc) +endif ( DOCUMENTATION ) -add_subdirectory(src) if ( FTDIPP ) project(libftdi1 C CXX) add_subdirectory(ftdipp) -endif () +endif ( FTDIPP ) + if ( PYTHON_BINDINGS ) -add_subdirectory(python) -endif () + add_subdirectory(python) +endif ( PYTHON_BINDINGS ) + if ( FTDI_EEPROM ) add_subdirectory(ftdi_eeprom) -endif () +endif ( FTDI_EEPROM ) + if ( EXAMPLES ) add_subdirectory(examples) -endif () -add_subdirectory(packages) +endif ( EXAMPLES ) + if ( BUILD_TESTS ) project(libftdi1 C CXX) add_subdirectory(test) -endif () +endif ( BUILD_TESTS ) # PkgConfig set(prefix ${CMAKE_INSTALL_PREFIX}) @@ -160,16 +170,16 @@ set(exec_prefix ${CMAKE_INSTALL_PREFIX}/bin) set(includedir ${CMAKE_INSTALL_PREFIX}/include/${PROJECT_NAME}) if(${UNIX}) - set(libdir ${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX}) + set(libdir ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}) endif(${UNIX}) if(${WIN32}) - set(libdir ${CMAKE_INSTALL_PREFIX}/bin) + set(libdir ${CMAKE_INSTALL_PREFIX}/bin) endif(${WIN32}) -configure_file(${CMAKE_SOURCE_DIR}/libftdi1.pc.in ${CMAKE_BINARY_DIR}/libftdi1.pc @ONLY) -configure_file(${CMAKE_SOURCE_DIR}/libftdipp1.pc.in ${CMAKE_BINARY_DIR}/libftdipp1.pc @ONLY) -install(FILES ${CMAKE_BINARY_DIR}/libftdi1.pc ${CMAKE_BINARY_DIR}/libftdipp1.pc - DESTINATION lib${LIB_SUFFIX}/pkgconfig) +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/libftdi1.pc.in ${CMAKE_CURRENT_BINARY_DIR}/libftdi1.pc @ONLY) +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/libftdipp1.pc.in ${CMAKE_CURRENT_BINARY_DIR}/libftdipp1.pc @ONLY) +install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libftdi1.pc ${CMAKE_CURRENT_BINARY_DIR}/libftdipp1.pc + DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) if (UNIX OR MINGW) configure_file ( libftdi1-config.in ${CMAKE_CURRENT_BINARY_DIR}/libftdi1-config @ONLY ) @@ -179,7 +189,7 @@ endif () # config script install path if ( NOT DEFINED LIBFTDI_CMAKE_CONFIG_DIR ) - set ( LIBFTDI_CMAKE_CONFIG_DIR lib${LIB_SUFFIX}/cmake/libftdi1 ) + set ( LIBFTDI_CMAKE_CONFIG_DIR ${CMAKE_INSTALL_LIBDIR}/cmake/libftdi1 ) endif () set ( LIBFTDI_INCLUDE_DIR ${includedir} ) @@ -203,39 +213,33 @@ set ( LIBFTDI_VERSION_MINOR ${MINOR_VERSION} ) set ( LIBFTDI_USE_FILE ${CMAKE_INSTALL_PREFIX}/${LIBFTDI_CMAKE_CONFIG_DIR}/UseLibFTDI1.cmake ) -if(CMAKE_VERSION VERSION_LESS 2.8.8) - configure_file ( cmake/LibFTDI1Config.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/LibFTDI1Config.cmake @ONLY ) - configure_file ( cmake/LibFTDI1ConfigVersion.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/LibFTDI1ConfigVersion.cmake @ONLY ) -else () - include(CMakePackageConfigHelpers) - - configure_package_config_file ( - cmake/LibFTDI1Config.cmake.in +include(CMakePackageConfigHelpers) + +configure_package_config_file ( + cmake/LibFTDI1Config.cmake.in + ${CMAKE_CURRENT_BINARY_DIR}/LibFTDI1Config.cmake + INSTALL_DESTINATION ${LIBFTDI_CMAKE_CONFIG_DIR} + PATH_VARS + LIBFTDI_USE_FILE + LIBFTDI_ROOT_DIR + LIBFTDI_INCLUDE_DIR + LIBFTDI_INCLUDE_DIRS + LIBFTDI_LIBRARY_DIRS + NO_CHECK_REQUIRED_COMPONENTS_MACRO +) +write_basic_package_version_file ( + LibFTDI1ConfigVersion.cmake + VERSION ${LIBFTDI_VERSION_STRING} + COMPATIBILITY AnyNewerVersion +) + +install ( + FILES ${CMAKE_CURRENT_BINARY_DIR}/LibFTDI1Config.cmake - INSTALL_DESTINATION ${LIBFTDI_CMAKE_CONFIG_DIR} - PATH_VARS - LIBFTDI_USE_FILE - LIBFTDI_ROOT_DIR - LIBFTDI_INCLUDE_DIR - LIBFTDI_INCLUDE_DIRS - LIBFTDI_LIBRARY_DIRS - NO_CHECK_REQUIRED_COMPONENTS_MACRO - ) - write_basic_package_version_file ( - LibFTDI1ConfigVersion.cmake - VERSION ${LIBFTDI_VERSION_STRING} - COMPATIBILITY AnyNewerVersion - ) -endif () - - -install ( FILES - ${CMAKE_CURRENT_BINARY_DIR}/LibFTDI1Config.cmake - ${CMAKE_CURRENT_BINARY_DIR}/LibFTDI1ConfigVersion.cmake - cmake/UseLibFTDI1.cmake - - DESTINATION ${LIBFTDI_CMAKE_CONFIG_DIR} - ) + ${CMAKE_CURRENT_BINARY_DIR}/LibFTDI1ConfigVersion.cmake + cmake/UseLibFTDI1.cmake + DESTINATION ${LIBFTDI_CMAKE_CONFIG_DIR} +) include(CPack) diff --git a/cmake/FindUSB1.cmake b/cmake/FindLibUSB.cmake similarity index 76% rename from cmake/FindUSB1.cmake rename to cmake/FindLibUSB.cmake index b90e297..8bb3b11 100644 --- a/cmake/FindUSB1.cmake +++ b/cmake/FindLibUSB.cmake @@ -1,4 +1,4 @@ -# - Try to find the freetype library +# - Try to find the libusb library # Once done this defines # # LIBUSB_FOUND - system has libusb @@ -10,7 +10,6 @@ # Redistribution and use is allowed according to the terms of the BSD license. # For details see the accompanying COPYING-CMAKE-SCRIPTS file. - if (LIBUSB_INCLUDE_DIR AND LIBUSB_LIBRARIES) # in cache already @@ -22,16 +21,18 @@ else (LIBUSB_INCLUDE_DIR AND LIBUSB_LIBRARIES) find_package(PkgConfig) pkg_check_modules(PC_LIBUSB libusb-1.0) - FIND_PATH(LIBUSB_INCLUDE_DIR libusb.h + find_path(LIBUSB_INCLUDE_DIR libusb.h PATH_SUFFIXES libusb-1.0 PATHS ${PC_LIBUSB_INCLUDEDIR} ${PC_LIBUSB_INCLUDE_DIRS}) - FIND_LIBRARY(LIBUSB_LIBRARIES NAMES usb-1.0 + find_library(LIBUSB_LIBRARIES NAMES ${PC_LIBUSB_LIBRARIES} PATHS ${PC_LIBUSB_LIBDIR} ${PC_LIBUSB_LIBRARY_DIRS}) include(FindPackageHandleStandardArgs) - FIND_PACKAGE_HANDLE_STANDARD_ARGS(LIBUSB DEFAULT_MSG LIBUSB_LIBRARIES LIBUSB_INCLUDE_DIR) + find_package_handle_standard_args( + LibUSB DEFAULT_MSG LIBUSB_LIBRARIES LIBUSB_INCLUDE_DIR + ) - MARK_AS_ADVANCED(LIBUSB_INCLUDE_DIR LIBUSB_LIBRARIES) + mark_as_advanced(LIBUSB_INCLUDE_DIR LIBUSB_LIBRARIES) endif (LIBUSB_INCLUDE_DIR AND LIBUSB_LIBRARIES) diff --git a/doc/CMakeLists.txt b/doc/CMakeLists.txt new file mode 100644 index 0000000..983301d --- /dev/null +++ b/doc/CMakeLists.txt @@ -0,0 +1,26 @@ +find_package ( Doxygen REQUIRED ) + +# Copy doxy.config.in +configure_file( + ${PROJECT_SOURCE_DIR}/doc/Doxyfile.in + ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile +) + +configure_file( + ${PROJECT_SOURCE_DIR}/doc/Doxyfile.xml.in + ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile.xml +) + +# Run doxygen +add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/html/index.html + COMMAND ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile + COMMENT "Generating API documentation" + DEPENDS ${c_headers};${c_sources};${cpp_sources};${cpp_headers} +) + +add_custom_target( + docs ALL + COMMENT "Documentation target docs" + DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/html/index.html +) diff --git a/doc/Doxyfile.in b/doc/Doxyfile.in index a4f59ee..a05fe57 100644 --- a/doc/Doxyfile.in +++ b/doc/Doxyfile.in @@ -58,7 +58,7 @@ PROJECT_LOGO = # entered, it will be relative to the location where doxygen was started. If # left blank the current directory will be used. -OUTPUT_DIRECTORY = doc +OUTPUT_DIRECTORY = @CMAKE_CURRENT_BINARY_DIR@ # If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub- # directories (in 2 levels) under the output directory of each output format and @@ -230,12 +230,6 @@ TAB_SIZE = 4 ALIASES = -# This tag can be used to specify a number of word-keyword mappings (TCL only). -# A mapping has the form "name=value". For example adding "class=itcl::class" -# will allow you to use the command class in the itcl::class meaning. - -TCL_SUBST = - # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources # only. Doxygen will then generate output that is more tailored for C. For # instance, some of the names that are used will be different. The list of all @@ -765,8 +759,8 @@ WARN_LOGFILE = # spaces. See also FILE_PATTERNS and EXTENSION_MAPPING # Note: If this tag is empty the current directory is searched. -INPUT = @top_srcdir@/src \ - @top_srcdir@/ftdipp +INPUT = @PROJECT_SOURCE_DIR@/src \ + @PROJECT_SOURCE_DIR@/ftdipp # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses @@ -839,7 +833,7 @@ EXCLUDE_SYMBOLS = # that contain example code fragments that are included (see the \include # command). -EXAMPLE_PATH = @top_srcdir@/examples +EXAMPLE_PATH = @PROJECT_SOURCE_DIR@/examples # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and @@ -1006,13 +1000,6 @@ VERBATIM_HEADERS = YES ALPHABETICAL_INDEX = NO -# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in -# which the alphabetical index list will be split. -# Minimum value: 1, maximum value: 20, default value: 5. -# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. - -COLS_IN_ALPHA_INDEX = 5 - # In case all classes in a project start with a common prefix, all classes will # be put under the same header in the alphabetical index. The IGNORE_PREFIX tag # can be used to specify a prefix (or a list of prefixes) that should be ignored @@ -1615,7 +1602,7 @@ COMPACT_LATEX = NO # The default value is: a4. # This tag requires that the tag GENERATE_LATEX is set to YES. -PAPER_TYPE = a4wide +PAPER_TYPE = a4 # The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names # that should be included in the LaTeX output. The package can be specified just @@ -2072,12 +2059,6 @@ EXTERNAL_GROUPS = YES EXTERNAL_PAGES = YES -# The PERL_PATH should be the absolute path and name of the perl script -# interpreter (i.e. the result of 'which perl'). -# The default file (with absolute path) is: /usr/bin/perl. - -PERL_PATH = /usr/bin/perl - #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- @@ -2091,15 +2072,6 @@ PERL_PATH = /usr/bin/perl CLASS_DIAGRAMS = YES -# You can define message sequence charts within doxygen comments using the \msc -# command. Doxygen will then run the mscgen tool (see: -# http://www.mcternan.me.uk/mscgen/)) to produce the chart and insert it in the -# documentation. The MSCGEN_PATH tag allows you to specify the directory where -# the mscgen tool resides. If left empty the tool is assumed to be found in the -# default search path. - -MSCGEN_PATH = - # You can include diagrams made with dia in doxygen documentation. Doxygen will # then run dia to produce the diagram and insert it in the documentation. The # DIA_PATH tag allows you to specify the directory where the dia binary resides. diff --git a/doc/Doxyfile.xml.in b/doc/Doxyfile.xml.in index 8a32509..ab57478 100644 --- a/doc/Doxyfile.xml.in +++ b/doc/Doxyfile.xml.in @@ -2,7 +2,7 @@ # xml generation only # keep settings but shut off all other generation -@INCLUDE = Doxyfile +@INCLUDE = doc/Doxyfile GENERATE_TODOLIST = NO GENERATE_TESTLIST = NO diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index dd8ffbe..9ec7bff 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -1,7 +1,7 @@ # Includes include_directories( ${CMAKE_CURRENT_SOURCE_DIR} - ${CMAKE_CURRENT_BINARY_DIR} - ) + ${CMAKE_CURRENT_BINARY_DIR} +) # Targets add_executable(simple simple.c) @@ -16,7 +16,7 @@ add_executable(stream_test stream_test.c) add_executable(eeprom eeprom.c) add_executable(async async.c) if(NOT MINGW) - add_executable(purge_test purge_test.c) + add_executable(purge_test purge_test.c) endif(NOT MINGW) # Linkage @@ -32,20 +32,21 @@ target_link_libraries(stream_test ftdi1) target_link_libraries(eeprom ftdi1) target_link_libraries(async ftdi1) if(NOT MINGW) - target_link_libraries(purge_test ftdi1) + target_link_libraries(purge_test ftdi1) endif(NOT MINGW) # libftdi++ examples if( FTDIPP ) - include_directories(BEFORE ${CMAKE_SOURCE_DIR}/ftdipp - ${Boost_INCLUDE_DIRS}) + include_directories(BEFORE ${PROJECT_SOURCE_DIR}/ftdipp + ${Boost_INCLUDE_DIRS} + ) - # Target - add_executable(find_all_pp find_all_pp.cpp) + # Target + add_executable(find_all_pp find_all_pp.cpp) - # Linkage - target_link_libraries(find_all_pp ftdipp1) + # Linkage + target_link_libraries(find_all_pp ftdipp1) endif( FTDIPP ) # Source includes -include_directories(BEFORE ${CMAKE_SOURCE_DIR}/src) +include_directories(BEFORE ${PROJECT_SOURCE_DIR}/src) diff --git a/examples/cmake_example/CMakeLists.txt b/examples/cmake_example/CMakeLists.txt index fe203ed..7d60693 100644 --- a/examples/cmake_example/CMakeLists.txt +++ b/examples/cmake_example/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required ( VERSION 2.8 ) +cmake_minimum_required(VERSION 3.5 FATAL_ERROR) project ( example C ) @@ -9,5 +9,5 @@ add_executable ( example main.c ) target_link_libraries( example ${LIBFTDI_LIBRARIES} ) install ( TARGETS example - DESTINATION bin ) - + DESTINATION bin +) diff --git a/examples/eeprom.c b/examples/eeprom.c index 247589a..3d03ac3 100644 --- a/examples/eeprom.c +++ b/examples/eeprom.c @@ -90,6 +90,8 @@ int main(int argc, char **argv) return EXIT_FAILURE; } + ftdi->module_detach_mode = AUTO_DETACH_REATACH_SIO_MODULE; + while ((i = getopt(argc, argv, "d::ev:p:l:P:S:w")) != -1) { switch (i) @@ -151,14 +153,14 @@ int main(int argc, char **argv) if (res > 1) { int i = 1; - fprintf(stderr, "%d FTDI devices found: Only Readout on EEPROM done. ",res); + fprintf(stderr, "%d FTDI devices found: Only Readout on EEPROM done. \n",res); fprintf(stderr, "Use VID/PID/desc/serial to select device\n"); for (curdev = devlist; curdev != NULL; curdev= curdev->next, i++) { f = ftdi_usb_open_dev(ftdi, curdev->dev); if (f<0) { - fprintf(stderr, "Unable to open device %d: (%s)", + fprintf(stderr, "Unable to open device %d: (%s)\n", i, ftdi_get_error_string(ftdi)); continue; } @@ -175,7 +177,7 @@ int main(int argc, char **argv) f = ftdi_usb_open_dev(ftdi, devlist[0].dev); if (f<0) { - fprintf(stderr, "Unable to open device %d: (%s)", + fprintf(stderr, "Unable to open device %d: (%s)\n", i, ftdi_get_error_string(ftdi)); } } @@ -200,7 +202,7 @@ int main(int argc, char **argv) fprintf(stderr, "\n"); fprintf(stderr, "unable to open ftdi device: %d (%s)\n", f, ftdi_get_error_string(ftdi)); - + retval = -1; goto done; } @@ -210,7 +212,7 @@ int main(int argc, char **argv) f = ftdi_erase_eeprom(ftdi); /* needed to determine EEPROM chip type */ if (f < 0) { - fprintf(stderr, "Erase failed: %s", + fprintf(stderr, "Erase failed: %s\n", ftdi_get_error_string(ftdi)); retval = -2; goto done; @@ -277,7 +279,7 @@ int main(int argc, char **argv) f=(ftdi_eeprom_build(ftdi)); if (f < 0) { - fprintf(stderr, "Erase failed: %s", + fprintf(stderr, "Erase failed: %s\n", ftdi_get_error_string(ftdi)); retval = -2; goto done; diff --git a/ftdi_eeprom/CMakeLists.txt b/ftdi_eeprom/CMakeLists.txt index 8737c4b..525421e 100644 --- a/ftdi_eeprom/CMakeLists.txt +++ b/ftdi_eeprom/CMakeLists.txt @@ -27,7 +27,7 @@ set ( EEPROM_MAJOR_VERSION 0 ) set ( EEPROM_MINOR_VERSION 17 ) set ( EEPROM_VERSION_STRING ${EEPROM_MAJOR_VERSION}.${EEPROM_MINOR_VERSION} ) -include_directories ( BEFORE ${CMAKE_SOURCE_DIR}/src ) +include_directories ( BEFORE ${PROJECT_SOURCE_DIR}/src ) include_directories ( BEFORE ${CMAKE_CURRENT_BINARY_DIR} ) configure_file( diff --git a/ftdipp/CMakeLists.txt b/ftdipp/CMakeLists.txt index fac5bcc..360a831 100644 --- a/ftdipp/CMakeLists.txt +++ b/ftdipp/CMakeLists.txt @@ -1,13 +1,12 @@ -# vim: ts=2:sw=2:sts=2 - # Targets set(cpp_sources ${CMAKE_CURRENT_SOURCE_DIR}/ftdi.cpp CACHE INTERNAL "List of cpp sources" ) set(cpp_headers ${CMAKE_CURRENT_SOURCE_DIR}/ftdi.hpp CACHE INTERNAL "List of cpp headers" ) # Includes include_directories(BEFORE ${CMAKE_CURRENT_BINARY_DIR} - ${CMAKE_CURRENT_SOURCE_DIR} - ${CMAKE_SOURCE_DIR}/src) + ${CMAKE_CURRENT_SOURCE_DIR} + ${PROJECT_SOURCE_DIR}/src +) include_directories(${Boost_INCLUDE_DIRS}) @@ -24,24 +23,24 @@ set_target_properties(ftdipp1 PROPERTIES CLEAN_DIRECT_OUTPUT 1) target_link_libraries(ftdipp1 ftdi1 ${LIBUSB_LIBRARIES} ${BOOST_LIBRARIES}) install ( TARGETS ftdipp1 - RUNTIME DESTINATION bin - LIBRARY DESTINATION lib${LIB_SUFFIX} - ARCHIVE DESTINATION lib${LIB_SUFFIX} - ) + RUNTIME DESTINATION bin + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} +) # Static library if ( STATICLIBS ) - add_library(ftdipp1-static STATIC ${cpp_sources}) - set_target_properties(ftdipp1-static PROPERTIES OUTPUT_NAME "ftdipp1") - set_target_properties(ftdipp1-static PROPERTIES CLEAN_DIRECT_OUTPUT 1) - - install ( TARGETS ftdipp1-static - ARCHIVE DESTINATION lib${LIB_SUFFIX} - COMPONENT staticlibs - ) + add_library(ftdipp1-static STATIC ${cpp_sources}) + set_target_properties(ftdipp1-static PROPERTIES OUTPUT_NAME "ftdipp1") + set_target_properties(ftdipp1-static PROPERTIES CLEAN_DIRECT_OUTPUT 1) + + install ( TARGETS ftdipp1-static + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + COMPONENT staticlibs + ) endif () install ( FILES ${cpp_headers} - DESTINATION include/${PROJECT_NAME} - COMPONENT headers - ) + DESTINATION include/${PROJECT_NAME} + COMPONENT headers +) diff --git a/packages/CMakeLists.txt b/packages/CMakeLists.txt index 4bf58d2..204bbe0 100644 --- a/packages/CMakeLists.txt +++ b/packages/CMakeLists.txt @@ -1,19 +1,19 @@ # Debian if("${PACKAGE}" STREQUAL "Debian") - # Settings - set(REVISION 0) - set(CPACK_GENERATOR "DEB" PARENT_SCOPE) - set(CPACK_PACKAGE_VERSION ${CPACK_PACKAGE_VERSION}-${REVISION} PARENT_SCOPE) + # Settings + set(REVISION 0) + set(CPACK_GENERATOR "DEB" PARENT_SCOPE) + set(CPACK_PACKAGE_VERSION ${CPACK_PACKAGE_VERSION}-${REVISION} PARENT_SCOPE) - # Dependencies - set(CPACK_DEBIAN_PACKAGE_DEPENDS "libusb-1.0-0" PARENT_SCOPE) - set(DEBIAN_PACKAGE_BUILDS_DEPENDS "cmake, libusb2-dev" PARENT_SCOPE) + # Dependencies + set(CPACK_DEBIAN_PACKAGE_DEPENDS "libusb-1.0-0" PARENT_SCOPE) + set(DEBIAN_PACKAGE_BUILDS_DEPENDS "cmake, libusb2-dev" PARENT_SCOPE) - # Bundles - message("-- Installing udev rules to /etc/udev/rules.d") - install(FILES 99-libftdi.rules - DESTINATION /etc/udev/rules.d) + # Bundles + message("-- Installing udev rules to /etc/udev/rules.d") + install(FILES 99-libftdi.rules + DESTINATION /etc/udev/rules.d) endif("${PACKAGE}" STREQUAL "Debian") diff --git a/python/CMakeLists.txt b/python/CMakeLists.txt index 5b6f420..9358419 100644 --- a/python/CMakeLists.txt +++ b/python/CMakeLists.txt @@ -18,14 +18,14 @@ find_package ( PythonInterp REQUIRED ) find_package ( PythonLibs REQUIRED ) include ( UseSWIG ) -include_directories ( BEFORE ${CMAKE_SOURCE_DIR}/src ) +include_directories ( BEFORE ${PROJECT_SOURCE_DIR}/src ) include_directories ( ${PYTHON_INCLUDE_DIRS} ) link_directories ( ${CMAKE_CURRENT_BINARY_DIR}/../src ) if ( DOCUMENTATION ) set(CMAKE_SWIG_FLAGS -DDOXYGEN=${DOXYGEN_FOUND}) # manually add dependency for new cmake / swig versions - set_property(SOURCE ftdi1.i PROPERTY DEPENDS ftdi1_doc.i) + set_property(SOURCE ftdi1.i PROPERTY DEPENDS doc_i) endif() if(NOT CMAKE_VERSION VERSION_LESS 3.8.0) swig_add_library ( ftdi1 LANGUAGE python SOURCES ftdi1.i ) @@ -42,7 +42,7 @@ endif () set_target_properties ( ${SWIG_MODULE_ftdi1_REAL_NAME} PROPERTIES NO_SONAME ON ) -execute_process ( COMMAND ${PYTHON_EXECUTABLE} -c "from distutils import sysconfig; print( sysconfig.get_python_lib( plat_specific=True, prefix='${CMAKE_INSTALL_PREFIX}' ) )" +execute_process ( COMMAND ${PYTHON_EXECUTABLE} -c "import sysconfig; print( sysconfig.get_path( 'platlib', vars={'platbase': '${CMAKE_INSTALL_PREFIX}'} ) )" OUTPUT_VARIABLE _ABS_PYTHON_MODULE_PATH OUTPUT_STRIP_TRAILING_WHITESPACE ) @@ -55,25 +55,29 @@ install ( FILES ${CMAKE_CURRENT_BINARY_DIR}/ftdi1.py DESTINATION ${PYTHON_MODULE install ( TARGETS ${SWIG_MODULE_ftdi1_REAL_NAME} LIBRARY DESTINATION ${PYTHON_MODULE_PATH} ) if ( DOCUMENTATION ) - # Run doxygen to only generate the xml - add_custom_command ( OUTPUT ${CMAKE_BINARY_DIR}/doc/xml/ftdi_8c.xml - COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR}/doc - COMMAND ${DOXYGEN_EXECUTABLE} ${CMAKE_BINARY_DIR}/Doxyfile.xml - WORKING_DIRECTORY ${CMAKE_BINARY_DIR} - DEPENDS ${c_headers};${c_sources};${cpp_sources};${cpp_headers} - ) + # Run doxygen to only generate the xml + add_custom_command ( OUTPUT ${PROJECT_BINARY_DIR}/doc/xml/ftdi_8c.xml + COMMAND ${DOXYGEN_EXECUTABLE} ${PROJECT_BINARY_DIR}/doc/Doxyfile.xml + WORKING_DIRECTORY ${PROJECT_BINARY_DIR} + COMMENT "Generating ftdi_8c.xml" + DEPENDS ${c_headers};${c_sources};${cpp_sources};${cpp_headers} + ) - # generate .i from doxygen .xml - add_custom_command ( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/ftdi1_doc.i - COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/doxy2swig.py -n - ${CMAKE_BINARY_DIR}/doc/xml/ftdi_8c.xml - ${CMAKE_CURRENT_BINARY_DIR}/ftdi1_doc.i - DEPENDS ${CMAKE_BINARY_DIR}/doc/xml/ftdi_8c.xml - ) - add_custom_target ( doc_i DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/ftdi1_doc.i ) - add_dependencies( ${SWIG_MODULE_ftdi1_REAL_NAME} doc_i ) + # generate .i from doxygen .xml + add_custom_command ( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/ftdi1_doc.i + COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/doxy2swig.py -n + ${PROJECT_BINARY_DIR}/doc/xml/ftdi_8c.xml + ${CMAKE_CURRENT_BINARY_DIR}/ftdi1_doc.i + COMMENT "Generating ftdi1_doc.i from ftdi_8c.xml" + DEPENDS ${PROJECT_BINARY_DIR}/doc/xml/ftdi_8c.xml + ) + add_custom_target ( doc_i + COMMENT "Python API bindings documentation" + DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/ftdi1_doc.i + ) + add_dependencies( ${SWIG_MODULE_ftdi1_REAL_NAME} doc_i ) -endif () +endif ( DOCUMENTATION ) set ( LIBFTDI_PYTHON_MODULE_PATH ${CMAKE_INSTALL_PREFIX}/${PYTHON_MODULE_PATH} ) set ( LIBFTDI_PYTHON_MODULE_PATH ${LIBFTDI_PYTHON_MODULE_PATH} PARENT_SCOPE ) # for ftdiconfig.cmake diff --git a/python/examples/CMakeLists.txt b/python/examples/CMakeLists.txt index b4ed93d..232595f 100644 --- a/python/examples/CMakeLists.txt +++ b/python/examples/CMakeLists.txt @@ -1,5 +1,4 @@ install ( FILES simple.py complete.py cbus.py DESTINATION share/libftdi/examples - PERMISSIONS OWNER_READ GROUP_READ WORLD_READ - ) - + PERMISSIONS OWNER_READ GROUP_READ WORLD_READ +) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 17b3617..e145af1 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,7 +1,7 @@ # Includes include_directories(BEFORE ${CMAKE_CURRENT_BINARY_DIR} - ${CMAKE_CURRENT_SOURCE_DIR} - ) + ${CMAKE_CURRENT_SOURCE_DIR} +) # Version information set(SNAPSHOT_VERSION "unknown") @@ -9,7 +9,7 @@ execute_process(COMMAND git describe OUTPUT_VARIABLE GIT_DESCRIBE_OUTPUT RESULT_VARIABLE GIT_DESCRIBE_RESULT OUTPUT_STRIP_TRAILING_WHITESPACE - ) +) if(${GIT_DESCRIBE_RESULT} STREQUAL 0) set(SNAPSHOT_VERSION ${GIT_DESCRIBE_OUTPUT}) endif () @@ -34,9 +34,9 @@ target_link_libraries(ftdi1 ${LIBUSB_LIBRARIES}) install ( TARGETS ftdi1 RUNTIME DESTINATION bin - LIBRARY DESTINATION lib${LIB_SUFFIX} - ARCHIVE DESTINATION lib${LIB_SUFFIX} - ) + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} +) if ( STATICLIBS ) add_library(ftdi1-static STATIC ${c_sources}) @@ -44,12 +44,12 @@ if ( STATICLIBS ) set_target_properties(ftdi1-static PROPERTIES OUTPUT_NAME "ftdi1") set_target_properties(ftdi1-static PROPERTIES CLEAN_DIRECT_OUTPUT 1) install ( TARGETS ftdi1-static - ARCHIVE DESTINATION lib${LIB_SUFFIX} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT staticlibs - ) + ) endif () install ( FILES ${c_headers} DESTINATION include/${PROJECT_NAME} COMPONENT headers - ) +) diff --git a/src/ftdi.c b/src/ftdi.c index 92c5fae..534e3dd 100644 --- a/src/ftdi.c +++ b/src/ftdi.c @@ -83,7 +83,7 @@ static void ftdi_usb_close_internal (struct ftdi_context *ftdi) \retval 0: all fine \retval -1: couldn't allocate read buffer - \retval -2: couldn't allocate struct buffer + \retval -2: couldn't allocate struct buffer \retval -3: libusb_init() failed \remark This should be called before all functions @@ -112,7 +112,7 @@ int ftdi_init(struct ftdi_context *ftdi) ftdi_error_return(-3, "libusb_init() failed"); ftdi_set_interface(ftdi, INTERFACE_ANY); - ftdi->bitbang_mode = 1; /* when bitbang is enabled this holds the number of the mode */ + ftdi->bitbang_mode = 1; /* when bitbang is enabled this holds the number of the mode */ eeprom = (struct ftdi_eeprom *)malloc(sizeof(struct ftdi_eeprom)); if (eeprom == 0) @@ -298,7 +298,7 @@ struct ftdi_version_info ftdi_get_library_version(void) /** Finds all ftdi devices with given VID:PID on the usb bus. Creates a new ftdi_device_list which needs to be deallocated by ftdi_list_free() after - use. With VID:PID 0:0, search for the default devices + use. With VID:PID 0:0, search for the default devices (0x403:0x6001, 0x403:0x6010, 0x403:0x6011, 0x403:0x6014, 0x403:0x6015) \param ftdi pointer to ftdi_context @@ -639,7 +639,7 @@ int ftdi_usb_open_dev(struct ftdi_context *ftdi, libusb_device *dev) ftdi_error_return(-12, "libusb_get_configuration () failed"); // set configuration (needed especially for windows) // tolerate EBUSY: one device with one configuration, but two interfaces - // and libftdi sessions to both interfaces (e.g. FT2232) + // and libftdi sessions to both interfaces (e.g. FT2232) if (desc.bNumConfigurations > 0 && cfg != cfg0) { if (libusb_set_configuration(ftdi->usb_dev, cfg0) < 0) @@ -1316,7 +1316,7 @@ static int ftdi_to_clkbits_AM(int baudrate, unsigned long *encoded_divisor) return best_baud; } -/* ftdi_to_clkbits Convert a requested baudrate for a given system clock and predivisor +/* ftdi_to_clkbits Convert a requested baudrate for a given system clock and predivisor to encoded divisor and the achievable baudrate Function is only used internally \internal @@ -2218,6 +2218,24 @@ int ftdi_set_bitmode(struct ftdi_context *ftdi, unsigned char bitmask, unsigned } /** + Set module detach mode. + + \param ftdi pointer to ftdi_context + \param mode detach mode to use. + + \retval 0: all fine + \retval -1: can't enable bitbang mode +*/ +int ftdi_set_module_detach_mode(struct ftdi_context *ftdi, enum ftdi_module_detach_mode mode) +{ + if (ftdi == NULL) + ftdi_error_return(-1, "FTDI context invalid"); + + ftdi->module_detach_mode = mode; + return 0; +} + +/** Disable bitbang mode. \param ftdi pointer to ftdi_context @@ -3049,7 +3067,7 @@ int ftdi_eeprom_build(struct ftdi_context *ftdi) // Dynamic content // Strings start at 0x94 (TYPE_AM, TYPE_BM) // 0x96 (TYPE_2232C), 0x98 (TYPE_R) and 0x9a (TYPE_x232H) - // 0xa0 (TYPE_232H) + // 0xa0 (TYPE_232H, TYPE_230X) i = 0; switch (ftdi->type) { @@ -3072,7 +3090,7 @@ int ftdi_eeprom_build(struct ftdi_context *ftdi) i = 0xa0; break; } - /* Wrap around 0x80 for 128 byte EEPROMS (Internale and 93x46) */ + /* Wrap around 0x80 for 128 byte EEPROMS (Internal and 93x46) */ eeprom_size_mask = eeprom->size -1; free_end = i & eeprom_size_mask; @@ -3103,16 +3121,16 @@ int ftdi_eeprom_build(struct ftdi_context *ftdi) if (eeprom->use_serial) { // Addr 12: Offset of the serial string + 0x80, calculated later - // Addr 13: Length of serial string - output[0x12] = i | 0x80; // calculate offset - output[i & eeprom_size_mask] = serial_size*2 + 2, i++; - output[i & eeprom_size_mask] = 0x03, i++; - for (j = 0; j < serial_size; j++) - { - output[i & eeprom_size_mask] = eeprom->serial[j], i++; - output[i & eeprom_size_mask] = 0x00, i++; - } - output[0x13] = serial_size*2 + 2; + // Addr 13: Length of serial string + output[0x12] = i | 0x80; // calculate offset + output[i & eeprom_size_mask] = serial_size*2 + 2, i++; + output[i & eeprom_size_mask] = 0x03, i++; + for (j = 0; j < serial_size; j++) + { + output[i & eeprom_size_mask] = eeprom->serial[j], i++; + output[i & eeprom_size_mask] = 0x00, i++; + } + output[0x13] = serial_size*2 + 2; } // Legacy port name and PnP fields for FT2232 and newer chips @@ -3125,6 +3143,8 @@ int ftdi_eeprom_build(struct ftdi_context *ftdi) i++; output[i & eeprom_size_mask] = eeprom->is_not_pnp; /* as seen when written with FTD2XX */ i++; + output[i & eeprom_size_mask] = 0x00; + i++; } if (ftdi->type > TYPE_AM) /* use_serial not used in AM devices */ @@ -3136,7 +3156,7 @@ int ftdi_eeprom_build(struct ftdi_context *ftdi) } /* Bytes and Bits specific to (some) types - Write linear, as this allows easier fixing*/ + Write linear, as this allows easier fixing */ switch (ftdi->type) { case TYPE_AM: @@ -3208,7 +3228,7 @@ int ftdi_eeprom_build(struct ftdi_context *ftdi) if (eeprom->external_oscillator) output[0x00] |= 0x02; - output[0x01] = 0x40; /* Hard coded Endpoint Size*/ + output[0x01] = 0x40; /* Hard coded Endpoint Size */ if (eeprom->suspend_pull_downs) output[0x0A] |= 0x4; @@ -3440,7 +3460,7 @@ int ftdi_eeprom_build(struct ftdi_context *ftdi) case TYPE_230X: output[0x00] = 0x80; /* Actually, leave the default value */ /*FIXME: Make DBUS & CBUS Control configurable*/ - output[0x0c] = 0; /* DBUS drive 4mA, CBUS drive 4 mA like factory default */ + output[0x0c] = 0; /* DBUS drive 4mA, CBUS drive 4mA like factory default */ for (j = 0; j <= 6; j++) { output[0x1a + j] = eeprom->cbus_function[j]; @@ -3503,6 +3523,8 @@ int ftdi_eeprom_build(struct ftdi_context *ftdi) i = 0x50; } value = data; + output[i * 2] = data; + output[(i * 2) + 1] = data >> 8; } else { value = output[i*2]; @@ -3876,11 +3898,18 @@ int ftdi_eeprom_decode(struct ftdi_context *ftdi, int verbose) (eeprom->data_order)?"LSB":"MSB", (eeprom->flow_control)?"":"No "); } - if ((ftdi->type == TYPE_2232H) || (ftdi->type == TYPE_4232H)) + if ((ftdi->type == TYPE_2232H) || (ftdi->type == TYPE_4232H) || (ftdi->type == TYPE_2232C)) fprintf(stdout,"Channel B has Mode %s%s%s\n", channel_mode[eeprom->channel_b_type], (eeprom->channel_b_driver)?" VCP":"", (eeprom->high_current_b)?" High Current IO":""); + if (ftdi->type == TYPE_4232H) + { + fprintf(stdout,"Channel C has Mode UART%s\n", + (eeprom->channel_c_driver)?" VCP":""); + fprintf(stdout,"Channel D has Mode UART%s\n", + (eeprom->channel_d_driver)?" VCP":""); + } if (((ftdi->type == TYPE_BM) || (ftdi->type == TYPE_2232C)) && eeprom->use_usb_version) fprintf(stdout,"Use explicit USB Version %04x\n",eeprom->usb_version); @@ -4172,6 +4201,9 @@ int ftdi_get_eeprom_value(struct ftdi_context *ftdi, enum ftdi_eeprom_value valu case EXTERNAL_OSCILLATOR: *value = ftdi->eeprom->external_oscillator; break; + case USER_DATA_ADDR: + *value = ftdi->eeprom->user_data_addr; + break; default: ftdi_error_return(-1, "Request for unknown EEPROM value"); } diff --git a/src/ftdi.h b/src/ftdi.h index 0603335..ffeb452 100644 --- a/src/ftdi.h +++ b/src/ftdi.h @@ -520,6 +520,7 @@ extern "C" int ftdi_init(struct ftdi_context *ftdi); struct ftdi_context *ftdi_new(void); int ftdi_set_interface(struct ftdi_context *ftdi, enum ftdi_interface interface); + int ftdi_set_module_detach_mode(struct ftdi_context *ftdi, enum ftdi_module_detach_mode mode); void ftdi_deinit(struct ftdi_context *ftdi); void ftdi_free(struct ftdi_context *ftdi); diff --git a/src/ftdi_stream.c b/src/ftdi_stream.c index f5f1287..4229d94 100644 --- a/src/ftdi_stream.c +++ b/src/ftdi_stream.c @@ -241,7 +241,8 @@ ftdi_readstream(struct ftdi_context *ftdi, { FTDIProgressInfo *progress = &state.progress; const double progressInterval = 1.0; - struct timeval timeout = { 0, ftdi->usb_read_timeout * 1000}; + struct timeval timeout = { ftdi->usb_read_timeout / 1000, + (ftdi->usb_read_timeout % 1000) * 1000 }; struct timeval now; int err = libusb_handle_events_timeout(ftdi->usb_ctx, &timeout); diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 392c910..c44c614 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -2,7 +2,7 @@ find_package(Boost COMPONENTS unit_test_framework REQUIRED) enable_testing() -INCLUDE_DIRECTORIES(BEFORE ${CMAKE_SOURCE_DIR}/src ${Boost_INCLUDE_DIRS}) +INCLUDE_DIRECTORIES(BEFORE ${PROJECT_SOURCE_DIR}/src ${Boost_INCLUDE_DIRS}) set(cpp_tests basic.cpp baudrate.cpp)