From: Yegor Yefremov Date: Mon, 23 Jun 2025 12:44:13 +0000 (+0200) Subject: python/CMakeLists.txt: rework Python development files detection X-Git-Url: http://developer.intra2net.com/git/?p=libftdi;a=commitdiff_plain;h=HEAD;hp=32e899fa5ecd30aad0a25ea8d7e208d203aaa0ae python/CMakeLists.txt: rework Python development files detection Both the FindPythonInterp and FindPythonLibs modules were removed. Use find_package(Python3 COMPONENTS Interpreter Development) to find both the interpreter and the library. The old modules have been deprecated since CMake 3.12. Resolves the following warning: CMake Warning (dev) at python/CMakeLists.txt:11 (find_package): Policy CMP0148 is not set: The FindPythonInterp and FindPythonLibs modules are removed. Run "cmake --help-policy CMP0148" for policy details. Use the cmake_policy command to set the policy and suppress this warning. --- diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..afa4632 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,16 @@ +root = true + +[*] +end_of_line = lf +trim_trailing_whitespace = true +insert_final_newline = true + +[{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/.gitignore b/.gitignore index b652e9f..4d57cba 100644 --- a/.gitignore +++ b/.gitignore @@ -9,7 +9,6 @@ .deps/ .libs/ .kdev4/ -build/ # kdevelop *.kdevelop.pcs @@ -54,3 +53,13 @@ opt # ctags tags + +# clangd specific files +.cache +compile_commands.json + +# VSCode +.vscode + +# CLion +.idea/ diff --git a/CMakeLists.txt b/CMakeLists.txt index 58f664a..105f83a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,3 +1,7 @@ +cmake_minimum_required(VERSION 3.15 FATAL_ERROR) + +message(STATUS "CMake version: ${CMAKE_VERSION}") + # Project project(libftdi1 C) set(MAJOR_VERSION 1) @@ -5,14 +9,28 @@ 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) + +# 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) -endif("${CMAKE_BUILD_TYPE}" STREQUAL "") -set(CMAKE_COLOR_MAKEFILE ON) -cmake_minimum_required(VERSION 2.6 FATAL_ERROR) +if ("${CMAKE_BUILD_TYPE}" STREQUAL "") + set(CMAKE_BUILD_TYPE RelWithDebInfo) +endif ("${CMAKE_BUILD_TYPE}" STREQUAL "") + +set(CMAKE_EXPORT_COMPILE_COMMANDS ON) + +if (NOT PROJECT_SOURCE_DIR STREQUAL PROJECT_BINARY_DIR) + # Auto-create a .gitignore in the out-of-source build directory. + file(GENERATE OUTPUT .gitignore CONTENT "*") +endif () + +include(GNUInstallDirs) add_definitions(-Wall) @@ -20,18 +38,18 @@ include(CMakeOptions.txt) # Debug build message("-- Build type: ${CMAKE_BUILD_TYPE}") -if(${CMAKE_BUILD_TYPE} STREQUAL Debug) - add_definitions(-DDEBUG) -endif(${CMAKE_BUILD_TYPE} STREQUAL Debug) +if (${CMAKE_BUILD_TYPE} STREQUAL Debug) + add_definitions(-DDEBUG) +endif (${CMAKE_BUILD_TYPE} STREQUAL Debug) -# find libusb -find_package ( USB1 REQUIRED ) -include_directories ( ${LIBUSB_INCLUDE_DIR} ) +# Find libusb +find_package(LibUSB REQUIRED) +include_directories(${LIBUSB_INCLUDE_DIR}) # Find Boost -if (FTDIPP OR BUILD_TESTS) - find_package( Boost REQUIRED ) -endif() +if (BUILD_TESTS) + find_package(Boost REQUIRED) +endif () # Set components set(CPACK_COMPONENTS_ALL sharedlibs staticlibs headers) @@ -40,207 +58,211 @@ set(CPACK_COMPONENT_STATICLIBS_DISPLAY_NAME "Static libraries") set(CPACK_COMPONENT_HEADERS_DISPLAY_NAME "C++ Headers") set(CPACK_COMPONENT_SHAREDLIBS_DESCRIPTION -"Shared library for general use.") + "Shared library for general use.") set(CPACK_COMPONENT_STATICLIBS_DESCRIPTION -"Static library, good if you want to embed libftdi1 in your application.") + "Static library, good if you want to embed libftdi1 in your application.") set(CPACK_COMPONENT_HEADERS_DESCRIPTION -"C/C++ header files.") + "C/C++ header files.") 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 -if ( NOT DEFINED LIB_SUFFIX ) - if( CMAKE_SYSTEM_NAME MATCHES "Linux" - AND NOT CMAKE_CROSSCOMPILING - AND NOT EXISTS "/etc/debian_version" - AND NOT EXISTS "/etc/arch-release" ) - if ( "${CMAKE_SIZEOF_VOID_P}" EQUAL "8" ) - set ( LIB_SUFFIX 64 ) +set(CPACK_COMPONENT_HEADERS_GROUP "Development") + +# 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 + AND NOT EXISTS "/etc/debian_version" + AND NOT EXISTS "/etc/arch-release") + if ("${CMAKE_SIZEOF_VOID_P}" EQUAL "8") + set(LIB_SUFFIX 64) + endif () endif () - endif () 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) - endif(CMAKE_SIZEOF_VOID_P EQUAL 4) -else(NOT APPLE) - SET(PACK_ARCH "") -endif(NOT APPLE) +if (NOT APPLE) + if (CMAKE_SIZEOF_VOID_P EQUAL 4) + SET(PACK_ARCH "") + elseif (CMAKE_SIZEOF_VOID_P EQUAL 8) + SET(PACK_ARCH .x86_64) + endif (CMAKE_SIZEOF_VOID_P EQUAL 4) +else (NOT APPLE) + SET(PACK_ARCH "") +endif (NOT APPLE) # Package information -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_VERSION ${VERSION_STRING}) +set(CPACK_PACKAGE_CONTACT "Intra2net AG ") +set(CPACK_PACKAGE_DESCRIPTION "libftdi1 library.") +set(CPACK_PACKAGE_DESCRIPTION_SUMMARY ${CPACK_PACKAGE_DESCRIPTION}) + # Package settings -if ( UNIX ) - set(CPACK_GENERATOR "DEB;RPM") - set(CPACK_CMAKE_GENERATOR "Unix Makefiles") - set(CPACK_PACKAGE_NAME ${PROJECT_NAME}) - set(CPACK_PACKAGE_FILE_NAME ${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}${PACK_ARCH}) +if (UNIX) + set(CPACK_GENERATOR "DEB;RPM") + set(CPACK_CMAKE_GENERATOR "Unix Makefiles") + set(CPACK_PACKAGE_NAME ${PROJECT_NAME}) + set(CPACK_PACKAGE_FILE_NAME ${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}${PACK_ARCH}) endif () -if ( WIN32 ) - set ( CPACK_GENERATOR "NSIS" ) - set ( CPACK_CMAKE_GENERATOR "MinGW Makefiles" ) - set ( CPACK_PACKAGE_NAME "${PROJECT_NAME}" ) - set ( CPACK_PACKAGE_VENDOR "" ) - set ( CPACK_PACKAGE_INSTALL_DIRECTORY "libftdi1" ) - set ( CPACK_PACKAGE_FILE_NAME "${PROJECT_NAME}-${VERSION_STRING}-win32") - set ( CPACK_NSIS_DISPLAY_NAME "libftdi1" ) - set ( CPACK_NSIS_MODIFY_PATH ON ) +if (WIN32) + set(CPACK_GENERATOR "NSIS") + set(CPACK_CMAKE_GENERATOR "MinGW Makefiles") + set(CPACK_PACKAGE_NAME "${PROJECT_NAME}") + set(CPACK_PACKAGE_VENDOR "") + set(CPACK_PACKAGE_INSTALL_DIRECTORY "libftdi1") + set(CPACK_PACKAGE_FILE_NAME "${PROJECT_NAME}-${VERSION_STRING}-win32") + set(CPACK_NSIS_DISPLAY_NAME "libftdi1") + 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/") -set(CPACK_SOURCE_PACKAGE_FILE_NAME ${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}) +set(CPACK_SOURCE_GENERATOR TGZ) +set(CPACK_SOURCE_IGNORE_FILES "\\\\.git;~$;build/") +set(CPACK_SOURCE_PACKAGE_FILE_NAME ${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}) # Subdirectories -if ( UNIX ) - set ( CPACK_SET_DESTDIR ON ) +if (UNIX) + set(CPACK_SET_DESTDIR ON) endif () # "make dist" target 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}) - -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 () + COMMAND git archive --prefix=${ARCHIVE_NAME}/ HEAD + | bzip2 > ${PROJECT_BINARY_DIR}/${ARCHIVE_NAME}.tar.bz2 + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) add_subdirectory(src) -if ( FTDIPP ) - project(libftdi1 C CXX) - add_subdirectory(ftdipp) -endif () -if ( PYTHON_BINDINGS ) -add_subdirectory(python) -endif () -if ( FTDI_EEPROM ) - add_subdirectory(ftdi_eeprom) -endif () -if ( EXAMPLES ) - add_subdirectory(examples) -endif () add_subdirectory(packages) -if ( BUILD_TESTS ) - project(libftdi1 C CXX) - add_subdirectory(test) -endif () + +if (DOCUMENTATION) + add_subdirectory(doc) +endif (DOCUMENTATION) + +if (FTDIPP) + project(libftdi1 C CXX) + add_subdirectory(ftdipp) +endif (FTDIPP) + +if (PYTHON_BINDINGS) + add_subdirectory(python) +endif (PYTHON_BINDINGS) + +if (FTDI_EEPROM) + add_subdirectory(ftdi_eeprom) +endif (FTDI_EEPROM) + +if (EXAMPLES) + add_subdirectory(examples) +endif (EXAMPLES) + +if (BUILD_TESTS) + project(libftdi1 C CXX) + add_subdirectory(test) +endif (BUILD_TESTS) # PkgConfig -set(prefix ${CMAKE_INSTALL_PREFIX}) +set(prefix ${CMAKE_INSTALL_PREFIX}) 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}) -endif(${UNIX}) -if(${WIN32}) - set(libdir ${CMAKE_INSTALL_PREFIX}/bin) -endif(${WIN32}) +set(includedir ${CMAKE_INSTALL_PREFIX}/include/${PROJECT_NAME}) + +if (${UNIX}) + set(libdir ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}) +endif (${UNIX}) +if (${WIN32}) + set(libdir ${CMAKE_INSTALL_PREFIX}/bin) + if (STATICLIBS) + list(APPEND libdir ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}) + endif () +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 ) - install ( PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/libftdi1-config - DESTINATION bin ) + configure_file(libftdi1-config.in ${CMAKE_CURRENT_BINARY_DIR}/libftdi1-config @ONLY) + install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/libftdi1-config + DESTINATION bin) endif () # config script install path -if ( NOT DEFINED LIBFTDI_CMAKE_CONFIG_DIR ) - set ( LIBFTDI_CMAKE_CONFIG_DIR lib${LIB_SUFFIX}/cmake/libftdi1 ) +if (NOT DEFINED LIBFTDI_CMAKE_CONFIG_DIR) + set(LIBFTDI_CMAKE_CONFIG_DIR ${CMAKE_INSTALL_LIBDIR}/cmake/libftdi1) endif () -set ( LIBFTDI_INCLUDE_DIR ${includedir} ) -set ( LIBFTDI_INCLUDE_DIRS ${LIBFTDI_INCLUDE_DIR} ) -set ( LIBFTDI_LIBRARY ftdi1 ) -set ( LIBFTDI_LIBRARIES ${LIBFTDI_LIBRARY} ) -list ( APPEND LIBFTDI_LIBRARIES ${LIBUSB_LIBRARIES} ) -set ( LIBFTDI_STATIC_LIBRARY ftdi1.a ) -set ( LIBFTDI_STATIC_LIBRARIES ${LIBFTDI_STATIC_LIBRARY} ) -list ( APPEND LIBFTDI_STATIC_LIBRARIES ${LIBUSB_LIBRARIES} ) -if ( FTDIPP ) - set ( LIBFTDIPP_LIBRARY ftdipp1 ) - set ( LIBFTDIPP_LIBRARIES ${LIBFTDIPP_LIBRARY} ) - list ( APPEND LIBFTDIPP_LIBRARIES ${LIBUSB_LIBRARIES} ) -endif () -set ( LIBFTDI_LIBRARY_DIRS ${libdir} ) -set ( LIBFTDI_ROOT_DIR ${prefix} ) -set ( LIBFTDI_VERSION_STRING ${VERSION_STRING} ) -set ( LIBFTDI_VERSION_MAJOR ${MAJOR_VERSION} ) -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 - ${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 - ) +set(LIBFTDI_INCLUDE_DIR ${includedir}) +set(LIBFTDI_INCLUDE_DIRS ${LIBFTDI_INCLUDE_DIR}) + +# Set up library variables based on what's being built +if (SHAREDLIBS) + set(LIBFTDI_LIBRARY ftdi1) + set(LIBFTDI_LIBRARIES ${LIBFTDI_LIBRARY}) + list(APPEND LIBFTDI_LIBRARIES ${LIBUSB_LIBRARIES}) endif () +if (STATICLIBS) + set(LIBFTDI_STATIC_LIBRARY ftdi1.a) + set(LIBFTDI_STATIC_LIBRARIES ${LIBFTDI_STATIC_LIBRARY}) + list(APPEND LIBFTDI_STATIC_LIBRARIES ${LIBUSB_LIBRARIES}) +endif () -install ( FILES - ${CMAKE_CURRENT_BINARY_DIR}/LibFTDI1Config.cmake - ${CMAKE_CURRENT_BINARY_DIR}/LibFTDI1ConfigVersion.cmake - cmake/UseLibFTDI1.cmake +if (FTDIPP) + if (SHAREDLIBS) + set(LIBFTDIPP_LIBRARY ftdipp1) + set(LIBFTDIPP_LIBRARIES ${LIBFTDIPP_LIBRARY}) + list(APPEND LIBFTDIPP_LIBRARIES ${LIBUSB_LIBRARIES}) + endif () + if (STATICLIBS) + set(LIBFTDIPP_STATIC_LIBRARY ftdipp1.a) + set(LIBFTDIPP_STATIC_LIBRARIES ${LIBFTDIPP_STATIC_LIBRARY}) + list(APPEND LIBFTDIPP_STATIC_LIBRARIES ${LIBUSB_LIBRARIES}) + endif () +endif () - DESTINATION ${LIBFTDI_CMAKE_CONFIG_DIR} - ) +set(LIBFTDI_LIBRARY_DIRS ${libdir}) +set(LIBFTDI_ROOT_DIR ${prefix}) +set(LIBFTDI_VERSION_STRING ${VERSION_STRING}) +set(LIBFTDI_VERSION_MAJOR ${MAJOR_VERSION}) +set(LIBFTDI_VERSION_MINOR ${MINOR_VERSION}) + +set(LIBFTDI_USE_FILE ${CMAKE_INSTALL_PREFIX}/${LIBFTDI_CMAKE_CONFIG_DIR}/UseLibFTDI1.cmake) + +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 + ${CMAKE_CURRENT_BINARY_DIR}/LibFTDI1ConfigVersion.cmake + cmake/UseLibFTDI1.cmake + DESTINATION ${LIBFTDI_CMAKE_CONFIG_DIR} +) include(CPack) -message (STATUS "Summary of build options: +message(STATUS "Summary of build options: + Build shared libs: ${SHAREDLIBS} Build static libs: ${STATICLIBS} Build C++ bindings: ${FTDIPP} Build Python bindings: ${PYTHON_BINDINGS} diff --git a/CMakeOptions.txt b/CMakeOptions.txt index 07b5887..b4d3cfa 100644 --- a/CMakeOptions.txt +++ b/CMakeOptions.txt @@ -1,8 +1,9 @@ -option ( STATICLIBS "Build static libraries" ON ) -option ( BUILD_TESTS "Build unit tests with Boost Unit Test framework" OFF ) -option ( DOCUMENTATION "Generate API documentation with Doxygen" OFF ) -option ( EXAMPLES "Build example programs" ON ) -option ( FTDIPP "Build C++ binding library libftdi1++" OFF ) -option ( FTDI_EEPROM "Build ftdi_eeprom" ON ) -option ( PYTHON_BINDINGS "Build python bindings via swig" OFF ) -option ( LINK_PYTHON_LIBRARY "Link against python libraries" OFF ) +option(STATICLIBS "Build static libraries" ON) +option(SHAREDLIBS "Build shared/dynamic libraries" ON) +option(BUILD_TESTS "Build unit tests with Boost Unit Test framework" OFF) +option(DOCUMENTATION "Generate API documentation with Doxygen" OFF) +option(EXAMPLES "Build example programs" ON) +option(FTDIPP "Build C++ binding library libftdi1++" OFF) +option(FTDI_EEPROM "Build ftdi_eeprom" ON) +option(PYTHON_BINDINGS "Build python bindings via swig" OFF) +option(LINK_PYTHON_LIBRARY "Link against python libraries" OFF) diff --git a/README.build b/README.build index e130ca0..54c253f 100644 --- a/README.build +++ b/README.build @@ -14,7 +14,7 @@ earlier, it is recommended you build libusbx-1.0.14 or later). sudo apt-get install libconfuse-dev (for ftdi-eeprom) (yum install libconfuse-devel) sudo apt-get install swig python-dev (for python bindings) (yum install swig python-devel) -sudo apt-get install libboost-all-dev (for C++ binding and unit test) (yum install boost-devel) +sudo apt-get install libboost-all-dev (for unit test) (yum install boost-devel) 3) Clone the git repository mkdir libftdi 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..8e83711 --- /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..08e1e53 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -1,7 +1,7 @@ # Includes -include_directories( ${CMAKE_CURRENT_SOURCE_DIR} - ${CMAKE_CURRENT_BINARY_DIR} - ) +include_directories(${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_BINARY_DIR} +) # Targets add_executable(simple simple.c) @@ -15,9 +15,9 @@ add_executable(baud_test baud_test.c) add_executable(stream_test stream_test.c) add_executable(eeprom eeprom.c) add_executable(async async.c) -if(NOT MINGW) +if (NOT MINGW) add_executable(purge_test purge_test.c) -endif(NOT MINGW) +endif (NOT MINGW) # Linkage target_link_libraries(simple ftdi1) @@ -31,21 +31,21 @@ target_link_libraries(baud_test ftdi1) target_link_libraries(stream_test ftdi1) target_link_libraries(eeprom ftdi1) target_link_libraries(async ftdi1) -if(NOT MINGW) +if (NOT MINGW) target_link_libraries(purge_test ftdi1) -endif(NOT MINGW) +endif (NOT MINGW) # libftdi++ examples -if( FTDIPP ) - include_directories(BEFORE ${CMAKE_SOURCE_DIR}/ftdipp - ${Boost_INCLUDE_DIRS}) +if (FTDIPP) + include_directories(BEFORE ${PROJECT_SOURCE_DIR}/ftdipp + ) - # 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) -endif( FTDIPP ) + # 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/async.c b/examples/async.c index 241bb7f..63933c8 100644 --- a/examples/async.c +++ b/examples/async.c @@ -19,8 +19,6 @@ #include #include -#include -#include #include #include #include @@ -30,7 +28,7 @@ int main(int argc, char **argv) struct ftdi_context *ftdi; int do_read = 0; int do_write = 0; - int i, f, retval; + int i, f, retval = EXIT_SUCCESS; if ((ftdi = ftdi_new()) == 0) { diff --git a/examples/cmake_example/CMakeLists.txt b/examples/cmake_example/CMakeLists.txt index fe203ed..acd3880 100644 --- a/examples/cmake_example/CMakeLists.txt +++ b/examples/cmake_example/CMakeLists.txt @@ -1,13 +1,13 @@ -cmake_minimum_required ( VERSION 2.8 ) +cmake_minimum_required(VERSION 3.5 FATAL_ERROR) -project ( example C ) +project(example C) -find_package ( LibFTDI1 NO_MODULE REQUIRED ) -include ( ${LIBFTDI_USE_FILE} ) +find_package(LibFTDI1 NO_MODULE REQUIRED) +include(${LIBFTDI_USE_FILE}) -add_executable ( example main.c ) -target_link_libraries( example ${LIBFTDI_LIBRARIES} ) +add_executable(example main.c) +target_link_libraries(example ${LIBFTDI_LIBRARIES}) -install ( TARGETS example - DESTINATION bin ) - +install(TARGETS example + 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..38147b5 100644 --- a/ftdi_eeprom/CMakeLists.txt +++ b/ftdi_eeprom/CMakeLists.txt @@ -1,44 +1,52 @@ -find_package ( Confuse REQUIRED ) -find_package ( Libintl ) +find_package(Confuse REQUIRED) +find_package(Libintl) # determine docdir include(GNUInstallDirs) -if(NOT CMAKE_INSTALL_DOCDIR) - if(WIN32) - set(CMAKE_INSTALL_DOCDIR .) - else(WIN32) - set(CMAKE_INSTALL_DOCDIR ${CMAKE_INSTALL_DATAROOTDIR}/doc/${PROJECT_NAME}) - endif(WIN32) -endif(NOT CMAKE_INSTALL_DOCDIR) +if (NOT CMAKE_INSTALL_DOCDIR) + if (WIN32) + set(CMAKE_INSTALL_DOCDIR .) + else (WIN32) + set(CMAKE_INSTALL_DOCDIR ${CMAKE_INSTALL_DATAROOTDIR}/doc/${PROJECT_NAME}) + endif (WIN32) +endif (NOT CMAKE_INSTALL_DOCDIR) message(STATUS "Building ftdi_eeprom") -include_directories ( ${CONFUSE_INCLUDE_DIRS} ) -list ( APPEND libs ${CONFUSE_LIBRARIES} ) +include_directories(${CONFUSE_INCLUDE_DIRS}) +list(APPEND libs ${CONFUSE_LIBRARIES}) -if ( LIBINTL_FOUND ) - include_directories ( ${LIBINTL_INCLUDE_DIR} ) - list ( APPEND libs ${LIBINTL_LIBRARIES} ) +if (LIBINTL_FOUND) + include_directories(${LIBINTL_INCLUDE_DIR}) + list(APPEND libs ${LIBINTL_LIBRARIES}) endif () # Version defines -set ( EEPROM_MAJOR_VERSION 0 ) -set ( EEPROM_MINOR_VERSION 17 ) -set ( EEPROM_VERSION_STRING ${EEPROM_MAJOR_VERSION}.${EEPROM_MINOR_VERSION} ) +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 ${CMAKE_CURRENT_BINARY_DIR} ) +include_directories(BEFORE ${PROJECT_SOURCE_DIR}/src) +include_directories(BEFORE ${CMAKE_CURRENT_BINARY_DIR}) configure_file( - ftdi_eeprom_version.h.in - ${CMAKE_CURRENT_BINARY_DIR}/ftdi_eeprom_version.h + ftdi_eeprom_version.h.in + ${CMAKE_CURRENT_BINARY_DIR}/ftdi_eeprom_version.h ) -add_executable ( ftdi_eeprom main.c ) -target_link_libraries ( ftdi_eeprom ftdi1 ${CONFUSE_LIBRARIES} ) -if ( LIBINTL_FOUND ) - target_link_libraries ( ftdi_eeprom ${LIBINTL_LIBRARIES} ) +add_executable(ftdi_eeprom main.c) +if (NOT SHAREDLIBS AND STATICLIBS) + target_link_libraries(ftdi_eeprom ftdi1-static) +else() + target_link_libraries(ftdi_eeprom ftdi1) endif () -install ( TARGETS ftdi_eeprom DESTINATION bin ) -install ( FILES example.conf DESTINATION ${CMAKE_INSTALL_DOCDIR} ) +target_link_libraries(ftdi_eeprom ${CONFUSE_LIBRARIES}) +if (LIBINTL_FOUND) + target_link_libraries(ftdi_eeprom ${LIBINTL_LIBRARIES}) +endif () +if (NOT SHAREDLIBS AND STATICLIBS) + target_link_libraries(ftdi_eeprom ${LIBUSB_LIBRARIES}) +endif () +install(TARGETS ftdi_eeprom DESTINATION bin) +install(FILES example.conf DESTINATION ${CMAKE_INSTALL_DOCDIR}) diff --git a/ftdipp/CMakeLists.txt b/ftdipp/CMakeLists.txt index fac5bcc..272b8f6 100644 --- a/ftdipp/CMakeLists.txt +++ b/ftdipp/CMakeLists.txt @@ -1,47 +1,42 @@ -# 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" ) +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) - -include_directories(${Boost_INCLUDE_DIRS}) + ${CMAKE_CURRENT_SOURCE_DIR} + ${PROJECT_SOURCE_DIR}/src +) # Shared library -add_library(ftdipp1 SHARED ${cpp_sources}) - -math(EXPR VERSION_FIXUP "${MAJOR_VERSION} + 1") # Compatibility with previous releases -set_target_properties(ftdipp1 PROPERTIES VERSION ${VERSION_FIXUP}.${MINOR_VERSION}.0 SOVERSION 3) - -# Prevent clobbering each other during the build -set_target_properties(ftdipp1 PROPERTIES CLEAN_DIRECT_OUTPUT 1) - -# Dependencies -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} - ) +if (SHAREDLIBS) + add_library(ftdipp1 SHARED ${cpp_sources}) + math(EXPR VERSION_FIXUP "${MAJOR_VERSION} + 1") # Compatibility with previous releases + set_target_properties(ftdipp1 PROPERTIES VERSION ${VERSION_FIXUP}.${MINOR_VERSION}.0 SOVERSION 3) + # Prevent clobbering each other during the build + set_target_properties(ftdipp1 PROPERTIES CLEAN_DIRECT_OUTPUT 1) + # Dependencies + target_link_libraries(ftdipp1 ftdi1 ${LIBUSB_LIBRARIES}) + install(TARGETS ftdipp1 + RUNTIME DESTINATION bin + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + ) +endif () # 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 - ) +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) + target_link_libraries(ftdipp1-static ftdi1-static ${LIBUSB_LIBRARIES}) + install(TARGETS ftdipp1-static + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + COMPONENT staticlibs + ) endif () -install ( FILES ${cpp_headers} - DESTINATION include/${PROJECT_NAME} - COMPONENT headers - ) +install(FILES ${cpp_headers} + DESTINATION include/${PROJECT_NAME} + COMPONENT headers +) diff --git a/ftdipp/ftdi.hpp b/ftdipp/ftdi.hpp index f569cce..2458327 100644 --- a/ftdipp/ftdi.hpp +++ b/ftdipp/ftdi.hpp @@ -31,7 +31,7 @@ on this file might be covered by the GNU General Public License. #include #include -#include +#include #include namespace Ftdi @@ -145,7 +145,7 @@ protected: private: class Private; - boost::shared_ptr d; + std::shared_ptr d; }; /*! \brief Device EEPROM. @@ -168,7 +168,7 @@ public: private: class Private; - boost::shared_ptr d; + std::shared_ptr d; }; /*! \brief Device list. @@ -214,7 +214,7 @@ public: private: class Private; - boost::shared_ptr d; + std::shared_ptr d; }; } diff --git a/packages/CMakeLists.txt b/packages/CMakeLists.txt index 4bf58d2..ea4a171 100644 --- a/packages/CMakeLists.txt +++ b/packages/CMakeLists.txt @@ -1,21 +1,21 @@ # Debian -if("${PACKAGE}" STREQUAL "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") +endif ("${PACKAGE}" STREQUAL "Debian") # General RPM rules -set(CPACK_RPM_PACKAGE_DEPENDS "libusb1" PARENT_SCOPE) +set(CPACK_RPM_PACKAGE_DEPENDS "libusb1" PARENT_SCOPE) diff --git a/python/CMakeLists.txt b/python/CMakeLists.txt index 5b6f420..d312fae 100644 --- a/python/CMakeLists.txt +++ b/python/CMakeLists.txt @@ -1,81 +1,74 @@ -# swig_add_library behavior changed in cmake 3.13 to no longer set -# SWIG_MODULE__REAL_NAME, so restore the old behavior. -if ( POLICY CMP0078 ) - cmake_policy( SET CMP0078 OLD ) -endif () - # workaround for cmake bug #0013449 -if ( NOT DEFINED CMAKE_FIND_ROOT_PATH OR NOT CMAKE_VERSION VERSION_LESS 3.0.0 ) - find_package ( SWIG REQUIRED ) +if (NOT DEFINED CMAKE_FIND_ROOT_PATH OR NOT CMAKE_VERSION VERSION_LESS 3.0.0) + find_package(SWIG REQUIRED) else () - find_program ( SWIG_EXECUTABLE NAMES swig2.0 swig ) - if ( SWIG_EXECUTABLE ) - set ( SWIG_USE_FILE ${CMAKE_ROOT}/Modules/UseSWIG.cmake ) - set ( SWIG_FOUND TRUE ) - endif () + find_program(SWIG_EXECUTABLE NAMES swig2.0 swig) + if (SWIG_EXECUTABLE) + set(SWIG_USE_FILE ${CMAKE_ROOT}/Modules/UseSWIG.cmake) + set(SWIG_FOUND TRUE) + endif () endif () -find_package ( PythonInterp REQUIRED ) -find_package ( PythonLibs REQUIRED ) +find_package(Python3 COMPONENTS Interpreter Development) -include ( UseSWIG ) -include_directories ( BEFORE ${CMAKE_SOURCE_DIR}/src ) -include_directories ( ${PYTHON_INCLUDE_DIRS} ) -link_directories ( ${CMAKE_CURRENT_BINARY_DIR}/../src ) +include(UseSWIG) +include_directories(BEFORE ${PROJECT_SOURCE_DIR}/src) +include_directories(${Python3_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) -endif() -if(NOT CMAKE_VERSION VERSION_LESS 3.8.0) - swig_add_library ( ftdi1 LANGUAGE python SOURCES ftdi1.i ) -else () - swig_add_module ( ftdi1 python ftdi1.i ) -endif() -swig_link_libraries ( ftdi1 ftdi1 ) +if (DOCUMENTATION) + set(CMAKE_SWIG_FLAGS -DDOXYGEN=${DOXYGEN_FOUND}) + # manually add dependency for new cmake / swig versions + set_property(SOURCE ftdi1.i PROPERTY DEPENDS doc_i) +endif () +swig_add_library(pyftdi1 LANGUAGE python SOURCES ftdi1.i) +swig_link_libraries(pyftdi1 ftdi1) -if ( LINK_PYTHON_LIBRARY ) - swig_link_libraries ( ftdi1 ${PYTHON_LIBRARIES} ) -elseif( APPLE ) - set_target_properties ( ${SWIG_MODULE_ftdi1_REAL_NAME} PROPERTIES LINK_FLAGS "-undefined dynamic_lookup" ) +if (LINK_PYTHON_LIBRARY) + swig_link_libraries(pyftdi1 ${PYTHON_LIBRARIES}) +elseif (APPLE) + set_target_properties(pyftdi1 PROPERTIES LINK_FLAGS "-undefined dynamic_lookup") endif () -set_target_properties ( ${SWIG_MODULE_ftdi1_REAL_NAME} PROPERTIES NO_SONAME ON ) +set_target_properties(pyftdi1 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}' ) )" - OUTPUT_VARIABLE _ABS_PYTHON_MODULE_PATH - OUTPUT_STRIP_TRAILING_WHITESPACE ) +execute_process(COMMAND ${Python3_EXECUTABLE} -c "import sysconfig; print( sysconfig.get_path( 'platlib', vars={'platbase': '${CMAKE_INSTALL_PREFIX}'} ) )" + OUTPUT_VARIABLE _ABS_PYTHON_MODULE_PATH + OUTPUT_STRIP_TRAILING_WHITESPACE) -get_filename_component ( _ABS_PYTHON_MODULE_PATH ${_ABS_PYTHON_MODULE_PATH} ABSOLUTE ) -file ( RELATIVE_PATH _REL_PYTHON_MODULE_PATH ${CMAKE_INSTALL_PREFIX} ${_ABS_PYTHON_MODULE_PATH} ) +get_filename_component(_ABS_PYTHON_MODULE_PATH ${_ABS_PYTHON_MODULE_PATH} ABSOLUTE) +file(RELATIVE_PATH _REL_PYTHON_MODULE_PATH ${CMAKE_INSTALL_PREFIX} ${_ABS_PYTHON_MODULE_PATH}) -set ( PYTHON_MODULE_PATH ${_REL_PYTHON_MODULE_PATH} ) +set(PYTHON_MODULE_PATH ${_REL_PYTHON_MODULE_PATH}) -install ( FILES ${CMAKE_CURRENT_BINARY_DIR}/ftdi1.py DESTINATION ${PYTHON_MODULE_PATH} ) -install ( TARGETS ${SWIG_MODULE_ftdi1_REAL_NAME} LIBRARY DESTINATION ${PYTHON_MODULE_PATH} ) +install(FILES ${CMAKE_CURRENT_BINARY_DIR}/ftdi1.py DESTINATION ${PYTHON_MODULE_PATH}) +install(TARGETS pyftdi1 LIBRARY DESTINATION ${PYTHON_MODULE_PATH}) -if ( DOCUMENTATION ) +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} + 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 + add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/ftdi1_doc.i + COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/doxy2swig.py -n + ${PROJECT_BINARY_DIR}/doc/xml/ftdi_8c.xml ${CMAKE_CURRENT_BINARY_DIR}/ftdi1_doc.i - DEPENDS ${CMAKE_BINARY_DIR}/doc/xml/ftdi_8c.xml + 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_custom_target ( doc_i DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/ftdi1_doc.i ) - add_dependencies( ${SWIG_MODULE_ftdi1_REAL_NAME} doc_i ) + add_dependencies(pyftdi1 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 +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 -add_subdirectory ( examples ) +add_subdirectory(examples) diff --git a/python/examples/CMakeLists.txt b/python/examples/CMakeLists.txt index b4ed93d..904fd4e 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 - ) - + install(FILES simple.py complete.py cbus.py + DESTINATION share/libftdi/examples + PERMISSIONS OWNER_READ GROUP_READ WORLD_READ + ) diff --git a/python/ftdi1.i b/python/ftdi1.i index 8b179f9..fac4d16 100644 --- a/python/ftdi1.i +++ b/python/ftdi1.i @@ -52,7 +52,7 @@ char * str2charp_size(PyObject* pyObj, int * size) %enddef %feature("autodoc", ftdi_usb_find_all_docstring) ftdi_usb_find_all; %typemap(in,numinputs=0) SWIGTYPE** OUTPUT ($*ltype temp) %{ $1 = &temp; %} -%typemap(argout) SWIGTYPE** OUTPUT %{ $result = SWIG_Python_AppendOutput($result, SWIG_NewPointerObj((void*)*$1,$*descriptor,0)); %} +%typemap(argout,noblock=1) SWIGTYPE** OUTPUT { $result = SWIG_AppendOutput($result, SWIG_NewPointerObj((void*)*$1,$*descriptor,0)); } %apply SWIGTYPE** OUTPUT { struct ftdi_device_list **devlist }; int ftdi_usb_find_all(struct ftdi_context *ftdi, struct ftdi_device_list **devlist, int vendor, int product); @@ -92,12 +92,12 @@ char * str2charp_size(PyObject* pyObj, int * size) %enddef %feature("autodoc", ftdi_read_data_docstring) ftdi_read_data; %typemap(in,numinputs=1) (unsigned char *buf, int size) %{ $2 = PyInt_AsLong($input);$1 = (unsigned char*)malloc($2*sizeof(char)); %} -%typemap(argout) (unsigned char *buf, int size) %{ +%typemap(argout,noblock=1) (unsigned char *buf, int size) { if(result<0) $2=0; - $result = SWIG_Python_AppendOutput($result, charp2str((char*)$1, $2)); + $result = SWIG_AppendOutput($result, charp2str((char*)$1, $2)); free($1); -%} +} int ftdi_read_data(struct ftdi_context *ftdi, unsigned char *buf, int size); %clear (unsigned char *buf, int size); @@ -119,12 +119,12 @@ char * str2charp_size(PyObject* pyObj, int * size) %enddef %feature("autodoc", ftdi_read_pins_docstring) ftdi_read_pins; %typemap(in,numinputs=0) unsigned char *pins ($*ltype temp) %{ $1 = &temp; %} -%typemap(argout) (unsigned char *pins) %{ $result = SWIG_Python_AppendOutput($result, charp2str((char*)$1, 1)); %} +%typemap(argout,noblock=1) (unsigned char *pins) { $result = SWIG_AppendOutput($result, charp2str((char*)$1, 1)); } int ftdi_read_pins(struct ftdi_context *ftdi, unsigned char *pins); %clear unsigned char *pins; %typemap(in,numinputs=0) unsigned char *latency ($*ltype temp) %{ $1 = &temp; %} -%typemap(argout) (unsigned char *latency) %{ $result = SWIG_Python_AppendOutput($result, charp2str((char*)$1, 1)); %} +%typemap(argout,noblock=1) (unsigned char *latency) { $result = SWIG_AppendOutput($result, charp2str((char*)$1, 1)); } int ftdi_get_latency_timer(struct ftdi_context *ftdi, unsigned char *latency); %clear unsigned char *latency; @@ -137,12 +137,12 @@ char * str2charp_size(PyObject* pyObj, int * size) %clear int* value; %typemap(in,numinputs=1) (unsigned char *buf, int size) %{ $2 = PyInt_AsLong($input);$1 = (unsigned char*)malloc($2*sizeof(char)); %} -%typemap(argout) (unsigned char *buf, int size) %{ +%typemap(argout,noblock=1) (unsigned char *buf, int size) { if(result<0) $2=0; - $result = SWIG_Python_AppendOutput($result, charp2str((char*)$1, $2)); + $result = SWIG_AppendOutput($result, charp2str((char*)$1, $2)); free($1); -%} +} int ftdi_get_eeprom_buf(struct ftdi_context *ftdi, unsigned char * buf, int size); %clear (unsigned char *buf, int size); diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 17b3617..7e81bea 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,55 +1,81 @@ # Includes include_directories(BEFORE ${CMAKE_CURRENT_BINARY_DIR} - ${CMAKE_CURRENT_SOURCE_DIR} - ) + ${CMAKE_CURRENT_SOURCE_DIR} +) # Version information set(SNAPSHOT_VERSION "unknown") 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}) + 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 () message(STATUS "Detected git snapshot version: ${SNAPSHOT_VERSION}") configure_file(ftdi_version_i.h.in "${CMAKE_CURRENT_BINARY_DIR}/ftdi_version_i.h" @ONLY) -# Targets -set(c_sources ${CMAKE_CURRENT_SOURCE_DIR}/ftdi.c ${CMAKE_CURRENT_SOURCE_DIR}/ftdi_stream.c CACHE INTERNAL "List of c sources" ) -set(c_headers ${CMAKE_CURRENT_SOURCE_DIR}/ftdi.h CACHE INTERNAL "List of c headers" ) +if (MSVC) + # Disable some overly-verbose warnings activated by -Wall + + # '': function not inlined + add_compile_options(/wd4710) + + # function '' selected for automatic inline expansion + add_compile_options(/wd4711) + + # Compiler will insert Spectre mitigation for memory load if /Qspectre switch specified + add_compile_options(/wd5045) -add_library(ftdi1 SHARED ${c_sources}) + # '': '4' bytes padding added after data member '' + add_compile_options(/wd4820) -math(EXPR VERSION_FIXUP "${MAJOR_VERSION} + 1") # Compatibility with previous releases -set_target_properties(ftdi1 PROPERTIES VERSION ${VERSION_FIXUP}.${MINOR_VERSION}.0 SOVERSION 2) -# Prevent clobbering each other during the build -set_target_properties ( ftdi1 PROPERTIES CLEAN_DIRECT_OUTPUT 1 ) + # conversion from '' to '', possible loss of data + add_compile_options(/wd4242 /wd4244 /wd4267) + # Disable warning on unsafe string functions + add_compile_definitions(_CRT_SECURE_NO_WARNINGS) -# Dependencies -target_link_libraries(ftdi1 ${LIBUSB_LIBRARIES}) + if (MSVC_VERSION GREATER_EQUAL 1913) + # Disable warnings from system headers + add_compile_options(/external:anglebrackets /external:W0) + endif () +endif () + +# Targets +set(c_sources ${CMAKE_CURRENT_SOURCE_DIR}/ftdi.c ${CMAKE_CURRENT_SOURCE_DIR}/ftdi_stream.c CACHE INTERNAL "List of c sources") +set(c_headers ${CMAKE_CURRENT_SOURCE_DIR}/ftdi.h CACHE INTERNAL "List of c headers") -install ( TARGETS ftdi1 - RUNTIME DESTINATION bin - LIBRARY DESTINATION lib${LIB_SUFFIX} - ARCHIVE DESTINATION lib${LIB_SUFFIX} - ) +# Shared library +if (SHAREDLIBS) + add_library(ftdi1 SHARED ${c_sources}) + math(EXPR VERSION_FIXUP "${MAJOR_VERSION} + 1") # Compatibility with previous releases + set_target_properties(ftdi1 PROPERTIES VERSION ${VERSION_FIXUP}.${MINOR_VERSION}.0 SOVERSION 2) + # Prevent clobbering each other during the build + set_target_properties(ftdi1 PROPERTIES CLEAN_DIRECT_OUTPUT 1) + target_link_libraries(ftdi1 ${LIBUSB_LIBRARIES}) + install(TARGETS ftdi1 + RUNTIME DESTINATION bin + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + ) +endif () -if ( STATICLIBS ) - add_library(ftdi1-static STATIC ${c_sources}) - target_link_libraries(ftdi1-static ${LIBUSB_LIBRARIES}) - 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} +# Static library +if (STATICLIBS) + add_library(ftdi1-static STATIC ${c_sources}) + target_link_libraries(ftdi1-static ${LIBUSB_LIBRARIES}) + 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 ${CMAKE_INSTALL_LIBDIR} COMPONENT staticlibs - ) + ) endif () -install ( FILES ${c_headers} - DESTINATION include/${PROJECT_NAME} - COMPONENT headers - ) +install(FILES ${c_headers} + DESTINATION include/${PROJECT_NAME} + COMPONENT headers +) diff --git a/src/ftdi.c b/src/ftdi.c index 92c5fae..de07d6e 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 @@ -2900,8 +2918,12 @@ static unsigned char type2bit(unsigned char type, enum ftdi_chip_type chip) } } case TYPE_230X: /* FT230X is only UART */ + case TYPE_AM: + case TYPE_BM: + case TYPE_4232H: default: return 0; } + /* fallback */ return 0; } @@ -3049,7 +3071,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 +3094,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 +3125,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 +3147,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 +3160,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 +3232,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 +3464,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]; @@ -3497,12 +3521,14 @@ int ftdi_eeprom_build(struct ftdi_context *ftdi) i = 0x40; } if ((ftdi->type == TYPE_230X) && (i >= 0x40) && (i < 0x50)) { - uint16_t data; + uint16_t data = 0; if (ftdi_read_eeprom_location(ftdi, i, &data)) { fprintf(stderr, "Reading Factory Configuration Data failed\n"); i = 0x50; } value = data; + output[i * 2] = data; + output[(i * 2) + 1] = data >> 8; } else { value = output[i*2]; @@ -3876,11 +3902,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 +4205,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"); } @@ -4593,7 +4629,7 @@ int ftdi_write_eeprom_location(struct ftdi_context *ftdi, int eeprom_addr, switch (ftdi->type) { case TYPE_BM: - case TYPE_2232C: + case TYPE_2232C: chip_type_location = 0x14; break; case TYPE_2232H: @@ -4603,6 +4639,9 @@ int ftdi_write_eeprom_location(struct ftdi_context *ftdi, int eeprom_addr, case TYPE_232H: chip_type_location = 0x1e; break; + case TYPE_AM: + case TYPE_R: + case TYPE_230X: default: ftdi_error_return(-4, "Device can't access unprotected area"); } 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..d146afd 100644 --- a/src/ftdi_stream.c +++ b/src/ftdi_stream.c @@ -241,16 +241,17 @@ 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); - if (err == LIBUSB_ERROR_INTERRUPTED) + int xfer_err = libusb_handle_events_timeout(ftdi->usb_ctx, &timeout); + if (xfer_err == LIBUSB_ERROR_INTERRUPTED) /* restart interrupted events */ - err = libusb_handle_events_timeout(ftdi->usb_ctx, &timeout); + xfer_err = libusb_handle_events_timeout(ftdi->usb_ctx, &timeout); if (!state.result) { - state.result = err; + state.result = xfer_err; } if (state.activity == 0) state.result = 1; 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)