updaet
This commit is contained in:
parent
c252dd0671
commit
01038fc9ff
9
.gitmodules
vendored
9
.gitmodules
vendored
@ -1,6 +1,3 @@
|
||||
[submodule "lib/libftdi"]
|
||||
path = lib/libftdi
|
||||
url = https://github.com/legege/libftdi.git
|
||||
[submodule "lib/libusb"]
|
||||
path = lib/libusb
|
||||
url = https://github.com/libusb/libusb.git
|
||||
# [submodule "lib/libftdi"]
|
||||
# path = lib/libftdi
|
||||
# url = https://github.com/legege/libftdi.git
|
@ -33,6 +33,11 @@ set(SubProjects
|
||||
|
||||
# Create the main executable, specifying the source file
|
||||
add_executable(${PROJECT_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/src/main.c)
|
||||
|
||||
# Set some application definitions
|
||||
target_compile_definitions(${PROJECT_NAME} PRIVATE MESSAGE="Hello for TESTLIB from cmake.")
|
||||
target_compile_definitions(${PROJECT_NAME} PRIVATE MAIN_MESSAGE="Hello for main.c from cmake.")
|
||||
|
||||
set_target_properties(${PROJECT_NAME}
|
||||
PROPERTIES
|
||||
OUTPUT_NAME ${BIN_NAME}
|
||||
@ -50,7 +55,3 @@ foreach(Project IN LISTS SubProjects)
|
||||
# Link the subproject to the main project executable
|
||||
target_link_libraries(${PROJECT_NAME} PRIVATE ${Project})
|
||||
endforeach()
|
||||
|
||||
# Set some application definitions
|
||||
target_compile_definitions(${PROJECT_NAME} PRIVATE MESSAGE="Hello from testlib! from cmake.")
|
||||
target_compile_definitions(${PROJECT_NAME} PRIVATE MAIN_MESSAGE="Hello from main! from cmake.")
|
||||
|
51
lib/libftdi/.gitignore
vendored
51
lib/libftdi/.gitignore
vendored
@ -1,51 +0,0 @@
|
||||
# Normal stuff
|
||||
*.o
|
||||
*.a
|
||||
*.so
|
||||
*.lo
|
||||
*.la
|
||||
*.pc
|
||||
.deps/
|
||||
.libs/
|
||||
.kdev4/
|
||||
build/
|
||||
|
||||
# kdevelop
|
||||
*.kdevelop.pcs
|
||||
*.kdevses
|
||||
|
||||
# Doxygen documentation
|
||||
Doxyfile
|
||||
doc/Doxyfile
|
||||
doc/html
|
||||
doc/man
|
||||
|
||||
# examples
|
||||
examples/baud_test
|
||||
examples/bitbang
|
||||
examples/bitbang2
|
||||
examples/bitbang_cbus
|
||||
examples/bitbang_ft2232
|
||||
examples/find_all
|
||||
examples/find_all_pp
|
||||
examples/serial_test
|
||||
examples/simple
|
||||
|
||||
# Backup files and stuff from patches
|
||||
*.orig
|
||||
*.rej
|
||||
*~
|
||||
.*.swp
|
||||
|
||||
# libftdi specific
|
||||
libftdi-config
|
||||
libftdi.spec
|
||||
|
||||
# CMake
|
||||
CMakeCache.txt
|
||||
cmake_install.cmake
|
||||
CMakeFiles
|
||||
|
||||
# Misc. binaries
|
||||
*.dylib
|
||||
opt
|
@ -1,47 +0,0 @@
|
||||
Main developers:
|
||||
|
||||
Intra2net AG <opensource@intra2net.com>
|
||||
|
||||
Contributors in alphabetical order,
|
||||
see Changelog for full details:
|
||||
|
||||
Alain Abbas <aa@libertech.fr>
|
||||
Alex Harford <harford@gmail.com>
|
||||
Anders Larsen <al@alarsen.net>
|
||||
Andrew John Rogers <andrew@rogerstech.co.uk>
|
||||
Arnim Läuger <arnim.laeuger@gmx.net>
|
||||
Aurelien Jarno <aurelien@aurel32.net>
|
||||
Chris Zeh <chris.w.zeh@gmail.com>
|
||||
Clifford Wolf <clifford@clifford.at>
|
||||
Daniel Kirkham <d.kirkham@telstra.com>
|
||||
David Challis <dchallis@qsimaging.com>
|
||||
Emil <emil@datel.co.uk>
|
||||
Evan Nemerson <evan@coeus-group.com>
|
||||
Evgeny Sinelnikov <sin@geoft.ru>
|
||||
Ian Abbott <abbotti@mev.co.uk>
|
||||
Jean-Daniel Merkli <jdmerkli@computerscience.ch>
|
||||
Juergen Beisert <juergen.beisert@weihenstephan.org>
|
||||
Lorenz Moesenlechner <lorenz@hcilab.org>
|
||||
Mark Hämmerling <mail@markh.de>
|
||||
Marek Vavruša <marek@vavrusa.com>
|
||||
Marius Kintel <kintel@sim.no>
|
||||
Matthias Kranz <matthias@hcilab.org>
|
||||
Matthias Richter <mail.to.mr@gmx.de>
|
||||
Matthijs ten Berge <m.h.tenberge@alumnus.utwente.nl>
|
||||
Max <max@koeln.ccc.de>
|
||||
Michel Zou <xantares09@hotmail.com>
|
||||
Mike Frysinger <vapier.adi@gmail.com>
|
||||
Nathan Fraser <ndf@undershorts.org>
|
||||
Oleg Seiljus <oseiljus@xverve.com>
|
||||
Peter Holik <peter@holik.at>
|
||||
Rogier Wolff <R.E.Wolff@harddisk-recovery.nl>
|
||||
Steven Turner <steven.turner@ftdichip.com>
|
||||
Tarek Heiland <tarek@illimitable.com>
|
||||
Thimo Eichstaedt <abc@digithi.de>
|
||||
Thomas Fischl <fischl@fundf.net>
|
||||
Tim Ansell <mithro@mithis.com>
|
||||
Tom Saunders <trsaunders@gmail.com>
|
||||
Uwe Bonnes <bon@elektron.ikp.physik.tu-darmstadt.de>
|
||||
Vladimir Yakovlev <nagos@inbox.ru>
|
||||
Wilfried Holzke <libftdi@holzke.net>
|
||||
Yi-Shin Li <ysli@araisrobo.com>
|
@ -1,180 +0,0 @@
|
||||
# Project
|
||||
project(libftdi)
|
||||
set(MAJOR_VERSION 1)
|
||||
set(MINOR_VERSION 0)
|
||||
set(VERSION_STRING ${MAJOR_VERSION}.${MINOR_VERSION})
|
||||
SET(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}")
|
||||
|
||||
# CMake
|
||||
if("${CMAKE_BUILD_TYPE}" STREQUAL "")
|
||||
set(CMAKE_BUILD_TYPE Debug)
|
||||
endif("${CMAKE_BUILD_TYPE}" STREQUAL "")
|
||||
set(CMAKE_COLOR_MAKEFILE ON)
|
||||
cmake_minimum_required(VERSION 2.6 FATAL_ERROR)
|
||||
|
||||
add_definitions(-Wall)
|
||||
|
||||
# Debug build
|
||||
message("-- Build type: ${CMAKE_BUILD_TYPE}")
|
||||
if(${CMAKE_BUILD_TYPE} STREQUAL Debug)
|
||||
add_definitions(-DDEBUG)
|
||||
endif(${CMAKE_BUILD_TYPE} STREQUAL Debug)
|
||||
|
||||
FIND_PACKAGE(USB1 REQUIRED)
|
||||
INCLUDE_DIRECTORIES(${LIBUSB_INCLUDE_DIR})
|
||||
|
||||
# Find Boost (optional package)
|
||||
find_package(Boost)
|
||||
|
||||
# Set components
|
||||
set(CPACK_COMPONENTS_ALL sharedlibs staticlibs headers)
|
||||
set(CPACK_COMPONENT_SHAREDLIBS_DISPLAY_NAME "Shared libraries")
|
||||
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.")
|
||||
set(CPACK_COMPONENT_STATICLIBS_DESCRIPTION
|
||||
"Static library, good if you want to embed libftdi in your application.")
|
||||
set(CPACK_COMPONENT_HEADERS_DESCRIPTION
|
||||
"C/C++ header files.")
|
||||
|
||||
set(CPACK_COMPONENT_SHAREDLIBS_GROUP "Development")
|
||||
set(CPACK_COMPONENT_STATICLIBS_GROUP "Development")
|
||||
set(CPACK_COMPONENT_HEADERS_GROUP "Development")
|
||||
|
||||
# automatically set lib suffix
|
||||
if ( UNIX AND NOT APPLE AND NOT CMAKE_CROSSCOMPILING AND NOT EXISTS "/etc/debian_version" )
|
||||
if ( CMAKE_SIZEOF_VOID_P EQUAL 8 AND NOT LIB_SUFFIX )
|
||||
set ( LIB_SUFFIX 64 )
|
||||
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)
|
||||
|
||||
# Package information
|
||||
set(CPACK_PACKAGE_VERSION ${VERSION_STRING})
|
||||
set(CPACK_PACKAGE_CONTACT "Intra2net AG <libftdi@developer.intra2net.com>")
|
||||
set(CPACK_PACKAGE_DESCRIPTION "libftdi 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})
|
||||
endif(${UNIX})
|
||||
|
||||
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 "libftdi")
|
||||
set(CPACK_PACKAGE_FILE_NAME "${PROJECT_NAME}-${VERSION_STRING}-win32")
|
||||
set(CPACK_NSIS_DISPLAY_NAME "libftdi")
|
||||
set(CPACK_NSIS_MODIFY_PATH "ON")
|
||||
endif(${WIN32})
|
||||
|
||||
set(CPACK_RESOURCE_FILE_LICENSE ${CMAKE_SOURCE_DIR}/LICENSE)
|
||||
|
||||
set(CPACK_SOURCE_GENERATOR TGZ)
|
||||
set(CPACK_SOURCE_IGNORE_FILES "\\\\.git")
|
||||
set(CPACK_SOURCE_PACKAGE_FILE_NAME ${CPACK_PACKAGE_FILE_NAME})
|
||||
|
||||
# Subdirectories
|
||||
if(${UNIX})
|
||||
set(CPACK_SET_DESTDIR "ON")
|
||||
endif(${UNIX})
|
||||
|
||||
add_subdirectory(src)
|
||||
add_subdirectory(ftdipp)
|
||||
add_subdirectory(bindings)
|
||||
add_subdirectory(ftdi_eeprom)
|
||||
add_subdirectory(examples)
|
||||
add_subdirectory(packages)
|
||||
add_subdirectory(test)
|
||||
|
||||
# "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})
|
||||
|
||||
|
||||
# Documentation
|
||||
|
||||
option(DOCUMENTATION "Generate API documentation with Doxygen" ON)
|
||||
|
||||
find_package(Doxygen)
|
||||
if(DOCUMENTATION AND DOXYGEN_FOUND)
|
||||
|
||||
# Set variables
|
||||
set(PACKAGE libftdi)
|
||||
set(VERSION ${VERSION_STRING})
|
||||
set(top_srcdir ${CMAKE_SOURCE_DIR})
|
||||
|
||||
# Find doxy config
|
||||
message(STATUS "Doxygen found.")
|
||||
set(DOXY_DIR "${CMAKE_SOURCE_DIR}/doc")
|
||||
set(DOXY_CONFIG "${DOXY_DIR}/Doxyfile.in")
|
||||
|
||||
# Copy doxy.config.in
|
||||
configure_file("${DOXY_CONFIG}" "${CMAKE_BINARY_DIR}/doxy.config")
|
||||
|
||||
# Create doc directory
|
||||
add_custom_command(
|
||||
OUTPUT ${CMAKE_BINARY_DIR}/doc
|
||||
COMMAND rm -rf ${CMAKE_BINARY_DIR}/doc/{html,man}
|
||||
COMMAND mkdir -p ${CMAKE_BINARY_DIR}/doc
|
||||
DEPENDS ftdi ftdipp
|
||||
)
|
||||
|
||||
# Run doxygen
|
||||
add_custom_command(
|
||||
OUTPUT ${CMAKE_BINARY_DIR}/doc/html/index.html
|
||||
COMMAND ${DOXYGEN_EXECUTABLE} "${CMAKE_BINARY_DIR}/doxy.config"
|
||||
DEPENDS "${CMAKE_BINARY_DIR}/doxy.config" "${CMAKE_BINARY_DIR}/doc"
|
||||
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/doc
|
||||
)
|
||||
|
||||
add_custom_target(docs ALL DEPENDS ${CMAKE_BINARY_DIR}/doc/html/index.html)
|
||||
|
||||
message(STATUS "Generating API documentation with Doxygen")
|
||||
else(DOCUMENTATION AND DOXYGEN_FOUND)
|
||||
message(STATUS "Not generating API documentation")
|
||||
endif(DOCUMENTATION AND DOXYGEN_FOUND)
|
||||
|
||||
# PkgConfig
|
||||
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})
|
||||
|
||||
configure_file(${CMAKE_SOURCE_DIR}/libftdi.pc.in ${CMAKE_BINARY_DIR}/libftdi.pc @ONLY)
|
||||
configure_file(${CMAKE_SOURCE_DIR}/libftdipp.pc.in ${CMAKE_BINARY_DIR}/libftdipp.pc @ONLY)
|
||||
install(FILES ${CMAKE_BINARY_DIR}/libftdi.pc ${CMAKE_BINARY_DIR}/libftdipp.pc
|
||||
DESTINATION lib${LIB_SUFFIX}/pkgconfig)
|
||||
|
||||
if(${UNIX})
|
||||
configure_file(${CMAKE_SOURCE_DIR}/libftdi-config.in ${CMAKE_BINARY_DIR}/libftdi-config @ONLY)
|
||||
install(PROGRAMS ${CMAKE_BINARY_DIR}/libftdi-config DESTINATION bin)
|
||||
endif(${UNIX})
|
||||
|
||||
include(CPack)
|
@ -1,22 +0,0 @@
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
|
||||
1. Redistributions of source code must retain the copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
2. Redistributions in binary form must reproduce the copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
3. The name of the author may not be used to endorse or promote products
|
||||
derived from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
@ -1,339 +0,0 @@
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 2, June 1991
|
||||
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
License is intended to guarantee your freedom to share and change free
|
||||
software--to make sure the software is free for all its users. This
|
||||
General Public License applies to most of the Free Software
|
||||
Foundation's software and to any other program whose authors commit to
|
||||
using it. (Some other Free Software Foundation software is covered by
|
||||
the GNU Lesser General Public License instead.) You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
this service if you wish), that you receive source code or can get it
|
||||
if you want it, that you can change the software or use pieces of it
|
||||
in new free programs; and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
anyone to deny you these rights or to ask you to surrender the rights.
|
||||
These restrictions translate to certain responsibilities for you if you
|
||||
distribute copies of the software, or if you modify it.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must give the recipients all the rights that
|
||||
you have. You must make sure that they, too, receive or can get the
|
||||
source code. And you must show them these terms so they know their
|
||||
rights.
|
||||
|
||||
We protect your rights with two steps: (1) copyright the software, and
|
||||
(2) offer you this license which gives you legal permission to copy,
|
||||
distribute and/or modify the software.
|
||||
|
||||
Also, for each author's protection and ours, we want to make certain
|
||||
that everyone understands that there is no warranty for this free
|
||||
software. If the software is modified by someone else and passed on, we
|
||||
want its recipients to know that what they have is not the original, so
|
||||
that any problems introduced by others will not reflect on the original
|
||||
authors' reputations.
|
||||
|
||||
Finally, any free program is threatened constantly by software
|
||||
patents. We wish to avoid the danger that redistributors of a free
|
||||
program will individually obtain patent licenses, in effect making the
|
||||
program proprietary. To prevent this, we have made it clear that any
|
||||
patent must be licensed for everyone's free use or not licensed at all.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License applies to any program or other work which contains
|
||||
a notice placed by the copyright holder saying it may be distributed
|
||||
under the terms of this General Public License. The "Program", below,
|
||||
refers to any such program or work, and a "work based on the Program"
|
||||
means either the Program or any derivative work under copyright law:
|
||||
that is to say, a work containing the Program or a portion of it,
|
||||
either verbatim or with modifications and/or translated into another
|
||||
language. (Hereinafter, translation is included without limitation in
|
||||
the term "modification".) Each licensee is addressed as "you".
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running the Program is not restricted, and the output from the Program
|
||||
is covered only if its contents constitute a work based on the
|
||||
Program (independent of having been made by running the Program).
|
||||
Whether that is true depends on what the Program does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Program's
|
||||
source code as you receive it, in any medium, provided that you
|
||||
conspicuously and appropriately publish on each copy an appropriate
|
||||
copyright notice and disclaimer of warranty; keep intact all the
|
||||
notices that refer to this License and to the absence of any warranty;
|
||||
and give any other recipients of the Program a copy of this License
|
||||
along with the Program.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy, and
|
||||
you may at your option offer warranty protection in exchange for a fee.
|
||||
|
||||
2. You may modify your copy or copies of the Program or any portion
|
||||
of it, thus forming a work based on the Program, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
|
||||
a) You must cause the modified files to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
b) You must cause any work that you distribute or publish, that in
|
||||
whole or in part contains or is derived from the Program or any
|
||||
part thereof, to be licensed as a whole at no charge to all third
|
||||
parties under the terms of this License.
|
||||
|
||||
c) If the modified program normally reads commands interactively
|
||||
when run, you must cause it, when started running for such
|
||||
interactive use in the most ordinary way, to print or display an
|
||||
announcement including an appropriate copyright notice and a
|
||||
notice that there is no warranty (or else, saying that you provide
|
||||
a warranty) and that users may redistribute the program under
|
||||
these conditions, and telling the user how to view a copy of this
|
||||
License. (Exception: if the Program itself is interactive but
|
||||
does not normally print such an announcement, your work based on
|
||||
the Program is not required to print an announcement.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Program,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Program, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Program.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Program
|
||||
with the Program (or with a work based on the Program) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
3. You may copy and distribute the Program (or a work based on it,
|
||||
under Section 2) in object code or executable form under the terms of
|
||||
Sections 1 and 2 above provided that you also do one of the following:
|
||||
|
||||
a) Accompany it with the complete corresponding machine-readable
|
||||
source code, which must be distributed under the terms of Sections
|
||||
1 and 2 above on a medium customarily used for software interchange; or,
|
||||
|
||||
b) Accompany it with a written offer, valid for at least three
|
||||
years, to give any third party, for a charge no more than your
|
||||
cost of physically performing source distribution, a complete
|
||||
machine-readable copy of the corresponding source code, to be
|
||||
distributed under the terms of Sections 1 and 2 above on a medium
|
||||
customarily used for software interchange; or,
|
||||
|
||||
c) Accompany it with the information you received as to the offer
|
||||
to distribute corresponding source code. (This alternative is
|
||||
allowed only for noncommercial distribution and only if you
|
||||
received the program in object code or executable form with such
|
||||
an offer, in accord with Subsection b above.)
|
||||
|
||||
The source code for a work means the preferred form of the work for
|
||||
making modifications to it. For an executable work, complete source
|
||||
code means all the source code for all modules it contains, plus any
|
||||
associated interface definition files, plus the scripts used to
|
||||
control compilation and installation of the executable. However, as a
|
||||
special exception, the source code distributed need not include
|
||||
anything that is normally distributed (in either source or binary
|
||||
form) with the major components (compiler, kernel, and so on) of the
|
||||
operating system on which the executable runs, unless that component
|
||||
itself accompanies the executable.
|
||||
|
||||
If distribution of executable or object code is made by offering
|
||||
access to copy from a designated place, then offering equivalent
|
||||
access to copy the source code from the same place counts as
|
||||
distribution of the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
4. You may not copy, modify, sublicense, or distribute the Program
|
||||
except as expressly provided under this License. Any attempt
|
||||
otherwise to copy, modify, sublicense or distribute the Program is
|
||||
void, and will automatically terminate your rights under this License.
|
||||
However, parties who have received copies, or rights, from you under
|
||||
this License will not have their licenses terminated so long as such
|
||||
parties remain in full compliance.
|
||||
|
||||
5. You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Program or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Program (or any work based on the
|
||||
Program), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Program or works based on it.
|
||||
|
||||
6. Each time you redistribute the Program (or any work based on the
|
||||
Program), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute or modify the Program subject to
|
||||
these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties to
|
||||
this License.
|
||||
|
||||
7. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot
|
||||
distribute so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you
|
||||
may not distribute the Program at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Program by
|
||||
all those who receive copies directly or indirectly through you, then
|
||||
the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Program.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under
|
||||
any particular circumstance, the balance of the section is intended to
|
||||
apply and the section as a whole is intended to apply in other
|
||||
circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system, which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
8. If the distribution and/or use of the Program is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Program under this License
|
||||
may add an explicit geographical distribution limitation excluding
|
||||
those countries, so that distribution is permitted only in or among
|
||||
countries not thus excluded. In such case, this License incorporates
|
||||
the limitation as if written in the body of this License.
|
||||
|
||||
9. The Free Software Foundation may publish revised and/or new versions
|
||||
of the General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Program
|
||||
specifies a version number of this License which applies to it and "any
|
||||
later version", you have the option of following the terms and conditions
|
||||
either of that version or of any later version published by the Free
|
||||
Software Foundation. If the Program does not specify a version number of
|
||||
this License, you may choose any version ever published by the Free Software
|
||||
Foundation.
|
||||
|
||||
10. If you wish to incorporate parts of the Program into other free
|
||||
programs whose distribution conditions are different, write to the author
|
||||
to ask for permission. For software which is copyrighted by the Free
|
||||
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||
make exceptions for this. Our decision will be guided by the two goals
|
||||
of preserving the free status of all derivatives of our free software and
|
||||
of promoting the sharing and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||
REPAIR OR CORRECTION.
|
||||
|
||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest
|
||||
to attach them to the start of each source file to most effectively
|
||||
convey the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License along
|
||||
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If the program is interactive, make it output a short notice like this
|
||||
when it starts in an interactive mode:
|
||||
|
||||
Gnomovision version 69, Copyright (C) year name of author
|
||||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
This is free software, and you are welcome to redistribute it
|
||||
under certain conditions; type `show c' for details.
|
||||
|
||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||
parts of the General Public License. Of course, the commands you use may
|
||||
be called something other than `show w' and `show c'; they could even be
|
||||
mouse-clicks or menu items--whatever suits your program.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or your
|
||||
school, if any, to sign a "copyright disclaimer" for the program, if
|
||||
necessary. Here is a sample; alter the names:
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
||||
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
||||
|
||||
<signature of Ty Coon>, 1 April 1989
|
||||
Ty Coon, President of Vice
|
||||
|
||||
This General Public License does not permit incorporating your program into
|
||||
proprietary programs. If your program is a subroutine library, you may
|
||||
consider it more useful to permit linking proprietary applications with the
|
||||
library. If this is what you want to do, use the GNU Lesser General
|
||||
Public License instead of this License.
|
@ -1,481 +0,0 @@
|
||||
GNU LIBRARY GENERAL PUBLIC LICENSE
|
||||
Version 2, June 1991
|
||||
|
||||
Copyright (C) 1991 Free Software Foundation, Inc.
|
||||
59 Temple Place - Suite 330
|
||||
Boston, MA 02111-1307, USA.
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
[This is the first released version of the library GPL. It is
|
||||
numbered 2 because it goes with version 2 of the ordinary GPL.]
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
Licenses are intended to guarantee your freedom to share and change
|
||||
free software--to make sure the software is free for all its users.
|
||||
|
||||
This license, the Library General Public License, applies to some
|
||||
specially designated Free Software Foundation software, and to any
|
||||
other libraries whose authors decide to use it. You can use it for
|
||||
your libraries, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
this service if you wish), that you receive source code or can get it
|
||||
if you want it, that you can change the software or use pieces of it
|
||||
in new free programs; and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
anyone to deny you these rights or to ask you to surrender the rights.
|
||||
These restrictions translate to certain responsibilities for you if
|
||||
you distribute copies of the library, or if you modify it.
|
||||
|
||||
For example, if you distribute copies of the library, whether gratis
|
||||
or for a fee, you must give the recipients all the rights that we gave
|
||||
you. You must make sure that they, too, receive or can get the source
|
||||
code. If you link a program with the library, you must provide
|
||||
complete object files to the recipients so that they can relink them
|
||||
with the library, after making changes to the library and recompiling
|
||||
it. And you must show them these terms so they know their rights.
|
||||
|
||||
Our method of protecting your rights has two steps: (1) copyright
|
||||
the library, and (2) offer you this license which gives you legal
|
||||
permission to copy, distribute and/or modify the library.
|
||||
|
||||
Also, for each distributor's protection, we want to make certain
|
||||
that everyone understands that there is no warranty for this free
|
||||
library. If the library is modified by someone else and passed on, we
|
||||
want its recipients to know that what they have is not the original
|
||||
version, so that any problems introduced by others will not reflect on
|
||||
the original authors' reputations.
|
||||
|
||||
Finally, any free program is threatened constantly by software
|
||||
patents. We wish to avoid the danger that companies distributing free
|
||||
software will individually obtain patent licenses, thus in effect
|
||||
transforming the program into proprietary software. To prevent this,
|
||||
we have made it clear that any patent must be licensed for everyone's
|
||||
free use or not licensed at all.
|
||||
|
||||
Most GNU software, including some libraries, is covered by the ordinary
|
||||
GNU General Public License, which was designed for utility programs. This
|
||||
license, the GNU Library General Public License, applies to certain
|
||||
designated libraries. This license is quite different from the ordinary
|
||||
one; be sure to read it in full, and don't assume that anything in it is
|
||||
the same as in the ordinary license.
|
||||
|
||||
The reason we have a separate public license for some libraries is that
|
||||
they blur the distinction we usually make between modifying or adding to a
|
||||
program and simply using it. Linking a program with a library, without
|
||||
changing the library, is in some sense simply using the library, and is
|
||||
analogous to running a utility program or application program. However, in
|
||||
a textual and legal sense, the linked executable is a combined work, a
|
||||
derivative of the original library, and the ordinary General Public License
|
||||
treats it as such.
|
||||
|
||||
Because of this blurred distinction, using the ordinary General
|
||||
Public License for libraries did not effectively promote software
|
||||
sharing, because most developers did not use the libraries. We
|
||||
concluded that weaker conditions might promote sharing better.
|
||||
|
||||
However, unrestricted linking of non-free programs would deprive the
|
||||
users of those programs of all benefit from the free status of the
|
||||
libraries themselves. This Library General Public License is intended to
|
||||
permit developers of non-free programs to use free libraries, while
|
||||
preserving your freedom as a user of such programs to change the free
|
||||
libraries that are incorporated in them. (We have not seen how to achieve
|
||||
this as regards changes in header files, but we have achieved it as regards
|
||||
changes in the actual functions of the Library.) The hope is that this
|
||||
will lead to faster development of free libraries.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow. Pay close attention to the difference between a
|
||||
"work based on the library" and a "work that uses the library". The
|
||||
former contains code derived from the library, while the latter only
|
||||
works together with the library.
|
||||
|
||||
Note that it is possible for a library to be covered by the ordinary
|
||||
General Public License rather than by this special one.
|
||||
|
||||
GNU LIBRARY GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License Agreement applies to any software library which
|
||||
contains a notice placed by the copyright holder or other authorized
|
||||
party saying it may be distributed under the terms of this Library
|
||||
General Public License (also called "this License"). Each licensee is
|
||||
addressed as "you".
|
||||
|
||||
A "library" means a collection of software functions and/or data
|
||||
prepared so as to be conveniently linked with application programs
|
||||
(which use some of those functions and data) to form executables.
|
||||
|
||||
The "Library", below, refers to any such software library or work
|
||||
which has been distributed under these terms. A "work based on the
|
||||
Library" means either the Library or any derivative work under
|
||||
copyright law: that is to say, a work containing the Library or a
|
||||
portion of it, either verbatim or with modifications and/or translated
|
||||
straightforwardly into another language. (Hereinafter, translation is
|
||||
included without limitation in the term "modification".)
|
||||
|
||||
"Source code" for a work means the preferred form of the work for
|
||||
making modifications to it. For a library, complete source code means
|
||||
all the source code for all modules it contains, plus any associated
|
||||
interface definition files, plus the scripts used to control compilation
|
||||
and installation of the library.
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running a program using the Library is not restricted, and output from
|
||||
such a program is covered only if its contents constitute a work based
|
||||
on the Library (independent of the use of the Library in a tool for
|
||||
writing it). Whether that is true depends on what the Library does
|
||||
and what the program that uses the Library does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Library's
|
||||
complete source code as you receive it, in any medium, provided that
|
||||
you conspicuously and appropriately publish on each copy an
|
||||
appropriate copyright notice and disclaimer of warranty; keep intact
|
||||
all the notices that refer to this License and to the absence of any
|
||||
warranty; and distribute a copy of this License along with the
|
||||
Library.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy,
|
||||
and you may at your option offer warranty protection in exchange for a
|
||||
fee.
|
||||
|
||||
2. You may modify your copy or copies of the Library or any portion
|
||||
of it, thus forming a work based on the Library, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
|
||||
a) The modified work must itself be a software library.
|
||||
|
||||
b) You must cause the files modified to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
c) You must cause the whole of the work to be licensed at no
|
||||
charge to all third parties under the terms of this License.
|
||||
|
||||
d) If a facility in the modified Library refers to a function or a
|
||||
table of data to be supplied by an application program that uses
|
||||
the facility, other than as an argument passed when the facility
|
||||
is invoked, then you must make a good faith effort to ensure that,
|
||||
in the event an application does not supply such function or
|
||||
table, the facility still operates, and performs whatever part of
|
||||
its purpose remains meaningful.
|
||||
|
||||
(For example, a function in a library to compute square roots has
|
||||
a purpose that is entirely well-defined independent of the
|
||||
application. Therefore, Subsection 2d requires that any
|
||||
application-supplied function or table used by this function must
|
||||
be optional: if the application does not supply it, the square
|
||||
root function must still compute square roots.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Library,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Library, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote
|
||||
it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Library.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Library
|
||||
with the Library (or with a work based on the Library) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
3. You may opt to apply the terms of the ordinary GNU General Public
|
||||
License instead of this License to a given copy of the Library. To do
|
||||
this, you must alter all the notices that refer to this License, so
|
||||
that they refer to the ordinary GNU General Public License, version 2,
|
||||
instead of to this License. (If a newer version than version 2 of the
|
||||
ordinary GNU General Public License has appeared, then you can specify
|
||||
that version instead if you wish.) Do not make any other change in
|
||||
these notices.
|
||||
|
||||
Once this change is made in a given copy, it is irreversible for
|
||||
that copy, so the ordinary GNU General Public License applies to all
|
||||
subsequent copies and derivative works made from that copy.
|
||||
|
||||
This option is useful when you wish to copy part of the code of
|
||||
the Library into a program that is not a library.
|
||||
|
||||
4. You may copy and distribute the Library (or a portion or
|
||||
derivative of it, under Section 2) in object code or executable form
|
||||
under the terms of Sections 1 and 2 above provided that you accompany
|
||||
it with the complete corresponding machine-readable source code, which
|
||||
must be distributed under the terms of Sections 1 and 2 above on a
|
||||
medium customarily used for software interchange.
|
||||
|
||||
If distribution of object code is made by offering access to copy
|
||||
from a designated place, then offering equivalent access to copy the
|
||||
source code from the same place satisfies the requirement to
|
||||
distribute the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
5. A program that contains no derivative of any portion of the
|
||||
Library, but is designed to work with the Library by being compiled or
|
||||
linked with it, is called a "work that uses the Library". Such a
|
||||
work, in isolation, is not a derivative work of the Library, and
|
||||
therefore falls outside the scope of this License.
|
||||
|
||||
However, linking a "work that uses the Library" with the Library
|
||||
creates an executable that is a derivative of the Library (because it
|
||||
contains portions of the Library), rather than a "work that uses the
|
||||
library". The executable is therefore covered by this License.
|
||||
Section 6 states terms for distribution of such executables.
|
||||
|
||||
When a "work that uses the Library" uses material from a header file
|
||||
that is part of the Library, the object code for the work may be a
|
||||
derivative work of the Library even though the source code is not.
|
||||
Whether this is true is especially significant if the work can be
|
||||
linked without the Library, or if the work is itself a library. The
|
||||
threshold for this to be true is not precisely defined by law.
|
||||
|
||||
If such an object file uses only numerical parameters, data
|
||||
structure layouts and accessors, and small macros and small inline
|
||||
functions (ten lines or less in length), then the use of the object
|
||||
file is unrestricted, regardless of whether it is legally a derivative
|
||||
work. (Executables containing this object code plus portions of the
|
||||
Library will still fall under Section 6.)
|
||||
|
||||
Otherwise, if the work is a derivative of the Library, you may
|
||||
distribute the object code for the work under the terms of Section 6.
|
||||
Any executables containing that work also fall under Section 6,
|
||||
whether or not they are linked directly with the Library itself.
|
||||
|
||||
6. As an exception to the Sections above, you may also compile or
|
||||
link a "work that uses the Library" with the Library to produce a
|
||||
work containing portions of the Library, and distribute that work
|
||||
under terms of your choice, provided that the terms permit
|
||||
modification of the work for the customer's own use and reverse
|
||||
engineering for debugging such modifications.
|
||||
|
||||
You must give prominent notice with each copy of the work that the
|
||||
Library is used in it and that the Library and its use are covered by
|
||||
this License. You must supply a copy of this License. If the work
|
||||
during execution displays copyright notices, you must include the
|
||||
copyright notice for the Library among them, as well as a reference
|
||||
directing the user to the copy of this License. Also, you must do one
|
||||
of these things:
|
||||
|
||||
a) Accompany the work with the complete corresponding
|
||||
machine-readable source code for the Library including whatever
|
||||
changes were used in the work (which must be distributed under
|
||||
Sections 1 and 2 above); and, if the work is an executable linked
|
||||
with the Library, with the complete machine-readable "work that
|
||||
uses the Library", as object code and/or source code, so that the
|
||||
user can modify the Library and then relink to produce a modified
|
||||
executable containing the modified Library. (It is understood
|
||||
that the user who changes the contents of definitions files in the
|
||||
Library will not necessarily be able to recompile the application
|
||||
to use the modified definitions.)
|
||||
|
||||
b) Accompany the work with a written offer, valid for at
|
||||
least three years, to give the same user the materials
|
||||
specified in Subsection 6a, above, for a charge no more
|
||||
than the cost of performing this distribution.
|
||||
|
||||
c) If distribution of the work is made by offering access to copy
|
||||
from a designated place, offer equivalent access to copy the above
|
||||
specified materials from the same place.
|
||||
|
||||
d) Verify that the user has already received a copy of these
|
||||
materials or that you have already sent this user a copy.
|
||||
|
||||
For an executable, the required form of the "work that uses the
|
||||
Library" must include any data and utility programs needed for
|
||||
reproducing the executable from it. However, as a special exception,
|
||||
the source code distributed need not include anything that is normally
|
||||
distributed (in either source or binary form) with the major
|
||||
components (compiler, kernel, and so on) of the operating system on
|
||||
which the executable runs, unless that component itself accompanies
|
||||
the executable.
|
||||
|
||||
It may happen that this requirement contradicts the license
|
||||
restrictions of other proprietary libraries that do not normally
|
||||
accompany the operating system. Such a contradiction means you cannot
|
||||
use both them and the Library together in an executable that you
|
||||
distribute.
|
||||
|
||||
7. You may place library facilities that are a work based on the
|
||||
Library side-by-side in a single library together with other library
|
||||
facilities not covered by this License, and distribute such a combined
|
||||
library, provided that the separate distribution of the work based on
|
||||
the Library and of the other library facilities is otherwise
|
||||
permitted, and provided that you do these two things:
|
||||
|
||||
a) Accompany the combined library with a copy of the same work
|
||||
based on the Library, uncombined with any other library
|
||||
facilities. This must be distributed under the terms of the
|
||||
Sections above.
|
||||
|
||||
b) Give prominent notice with the combined library of the fact
|
||||
that part of it is a work based on the Library, and explaining
|
||||
where to find the accompanying uncombined form of the same work.
|
||||
|
||||
8. You may not copy, modify, sublicense, link with, or distribute
|
||||
the Library except as expressly provided under this License. Any
|
||||
attempt otherwise to copy, modify, sublicense, link with, or
|
||||
distribute the Library is void, and will automatically terminate your
|
||||
rights under this License. However, parties who have received copies,
|
||||
or rights, from you under this License will not have their licenses
|
||||
terminated so long as such parties remain in full compliance.
|
||||
|
||||
9. You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Library or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Library (or any work based on the
|
||||
Library), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Library or works based on it.
|
||||
|
||||
10. Each time you redistribute the Library (or any work based on the
|
||||
Library), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute, link with or modify the Library
|
||||
subject to these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties to
|
||||
this License.
|
||||
|
||||
11. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot
|
||||
distribute so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you
|
||||
may not distribute the Library at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Library by
|
||||
all those who receive copies directly or indirectly through you, then
|
||||
the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Library.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under any
|
||||
particular circumstance, the balance of the section is intended to apply,
|
||||
and the section as a whole is intended to apply in other circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
12. If the distribution and/or use of the Library is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Library under this License may add
|
||||
an explicit geographical distribution limitation excluding those countries,
|
||||
so that distribution is permitted only in or among countries not thus
|
||||
excluded. In such case, this License incorporates the limitation as if
|
||||
written in the body of this License.
|
||||
|
||||
13. The Free Software Foundation may publish revised and/or new
|
||||
versions of the Library General Public License from time to time.
|
||||
Such new versions will be similar in spirit to the present version,
|
||||
but may differ in detail to address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Library
|
||||
specifies a version number of this License which applies to it and
|
||||
"any later version", you have the option of following the terms and
|
||||
conditions either of that version or of any later version published by
|
||||
the Free Software Foundation. If the Library does not specify a
|
||||
license version number, you may choose any version ever published by
|
||||
the Free Software Foundation.
|
||||
|
||||
14. If you wish to incorporate parts of the Library into other free
|
||||
programs whose distribution conditions are incompatible with these,
|
||||
write to the author to ask for permission. For software which is
|
||||
copyrighted by the Free Software Foundation, write to the Free
|
||||
Software Foundation; we sometimes make exceptions for this. Our
|
||||
decision will be guided by the two goals of preserving the free status
|
||||
of all derivatives of our free software and of promoting the sharing
|
||||
and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
|
||||
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
|
||||
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
|
||||
OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
|
||||
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
|
||||
LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
|
||||
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
|
||||
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
|
||||
AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
|
||||
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
|
||||
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
|
||||
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
|
||||
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
|
||||
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
|
||||
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
|
||||
DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
How to Apply These Terms to Your New Libraries
|
||||
|
||||
If you develop a new library, and you want it to be of the greatest
|
||||
possible use to the public, we recommend making it free software that
|
||||
everyone can redistribute and change. You can do so by permitting
|
||||
redistribution under these terms (or, alternatively, under the terms of the
|
||||
ordinary General Public License).
|
||||
|
||||
To apply these terms, attach the following notices to the library. It is
|
||||
safest to attach them to the start of each source file to most effectively
|
||||
convey the exclusion of warranty; and each file should have at least the
|
||||
"copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the library's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or your
|
||||
school, if any, to sign a "copyright disclaimer" for the library, if
|
||||
necessary. Here is a sample; alter the names:
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the
|
||||
library `Frob' (a library for tweaking knobs) written by James Random Hacker.
|
||||
|
||||
<signature of Ty Coon>, 1 April 1990
|
||||
Ty Coon, President of Vice
|
||||
|
||||
That's all there is to it!
|
@ -1,144 +0,0 @@
|
||||
New in 0.17 - 2009-12-19
|
||||
------------------------
|
||||
* C++ wrapper: Reduced code duplication and small other changes (Intra2net)
|
||||
* Deprecated old ftdi_enable_bitbang() function (Intra2net)
|
||||
* New ftdi_usb_open_desc_index() function (Intra2net)
|
||||
* Added baud rate test example code (Intra2net)
|
||||
* New serial input example code (Jim Paris)
|
||||
* Fix modem status byte filtering for USB high speed chips (Intra2net and Jim Paris)
|
||||
* Add bitmode for synchronous fifo in FT2232H (Uwe Bonnes)
|
||||
* Fix usb_set_configuration() call on Windows 64 (NIL)
|
||||
* Fix usb index in ftdi_convert_baudrate() for FT2232H/FT4232H chips (Thimo Eichstaedt)
|
||||
* Set initial baudrate on correct interface instead of always the first one (Thimo Eichstaedt)
|
||||
* Call usb_set_configuration() on Windows only (Uwe Bonnes)
|
||||
* 64 bit and other buildsystem fixes (Uwe Bonnes)
|
||||
* Don't build --with-async-mode w/ libusb-compat-0.1 (Clifford Wolf)
|
||||
* Functions for read/write of a single eeprom location (Oleg Seiljus)
|
||||
* Protect against double close of usb device (Nathan Fraser)
|
||||
* Fix out-of-tree-build in python wrapper (Aurelien Jarno)
|
||||
* Autoconf and doxygen cleanup (Jim Paris)
|
||||
|
||||
New in 0.16 - 2009-05-08
|
||||
------------------------
|
||||
* C++ wrapper: Reopen the device after calling get_strings() in Context::open() (Marek Vavruša and Intra2net)
|
||||
* C++ wrapper: Fixed an inheritance problem (Marek Vavruša and Intra2net)
|
||||
* C++ wrapper: Relicensed under GPLv2 + linking exception (Marek Vavruša and Intra2net)
|
||||
* Support for FT2232H and FT4232H (David Challis, Alex Harford and Intra2net)
|
||||
* Support for mingw cross compile (Uwe Bonnes)
|
||||
* Python bindings and minor autoconf cleanup (Tarek Heiland)
|
||||
* Code cleanup in various places (Intra2net)
|
||||
* Fixed ftdi_read_chipid in some cases (Matthias Richter)
|
||||
* eeprom decode function and small cleanups (Marius Kintel)
|
||||
* cmake system improvements (Marius Kintel and Intra2net)
|
||||
* Fix compilation in -ansi -pedantic mode (Matthias Janke)
|
||||
|
||||
New in 0.15 - 2008-12-19
|
||||
------------------------
|
||||
* Full C++ wrapper. Needs boost (Marek Vavruša and Intra2net)
|
||||
* cmake rules (Marek Vavruša)
|
||||
|
||||
New in 0.14 - 2008-09-09
|
||||
------------------------
|
||||
* Fixed flow control code for second FT2232 interface (Marek Vavruša)
|
||||
* Ability to set flow control via one USB call (Marek Vavruša)
|
||||
* 64 bit build support in the RPM spec file (Uwe Bonnes)
|
||||
* Small fix to the RPM spec file (Uwe Bonnes)
|
||||
* Ability to set RS232 break type (Intra2net)
|
||||
* Grouped flow control and modem status code together (Intra2net)
|
||||
|
||||
New in 0.13 - 2008-06-13
|
||||
------------------------
|
||||
* Build .spec file via configure.in (Intra2net)
|
||||
* Fixed "libusb-config --cflags" call (Mike Frysinger and Intra2net)
|
||||
* Always set usb configuration (Mike Frysinger and Intra2net)
|
||||
* Improved libusb-win32 support (Mike Frysinger)
|
||||
|
||||
New in 0.12 - 2008-04-16
|
||||
------------------------
|
||||
* Fix build of documentation for "out of tree" builds
|
||||
* Fix USB config descriptor in the eeprom (Juergen Beisert)
|
||||
* Ability to purge RX/TX buffers separately (Arnim Läuger)
|
||||
* Setting of event and error character (Arnim Läuger)
|
||||
* Poll modem status function (Arnim Läuger and Intra2net)
|
||||
* Updated documentation and created AUTHORS file
|
||||
|
||||
New in 0.11 - 2008-03-01
|
||||
------------------------
|
||||
* Vala bindings helper functions (ftdi_new, ftdi_free, ftdi_list_free2) (Even Nermerson)
|
||||
* Support for different EEPROM sizes (Andrew John Rogers, andrew@rogerstech.co.uk)
|
||||
* Async write support. Linux only and no error handling.
|
||||
You have to enable it via --with-async-mode.
|
||||
* Detection of R-type chips
|
||||
* FTDIChip-ID read support (Peter Holik)
|
||||
|
||||
New in 0.10 - 2007-05-08
|
||||
------------------------
|
||||
* Examples for libftdi_usb_find_all and CBUS mode
|
||||
* Fixed ftdi_list_free
|
||||
* Small cosmetic changes
|
||||
|
||||
New in 0.9 - 2007-02-09
|
||||
-----------------------
|
||||
* Fixed build without doxygen
|
||||
* Correct .so file library version
|
||||
|
||||
New in 0.8 - 2007-02-08
|
||||
-----------------------
|
||||
* Complete doxygen documentation and examples
|
||||
* Extended FT2232C bitbang mode example code (Max)
|
||||
* ftdi_usb_get_strings function to get device ID strings (Matthijs ten Berge)
|
||||
* Fix ftdi_read_pins on PowerPC systems (Thomas Fischl)
|
||||
* Automatically detach ftdi_sio kernel driver (Uwe Bonnes and Intra2net)
|
||||
* Configurable flow control (Lorenz Moesenlechner and Matthias Kranz)
|
||||
|
||||
New in 0.7 - 2005-10-11
|
||||
-----------------------
|
||||
* Baudrate calculation fix for FT2232C (Steven Turner/FTDI)
|
||||
* Find all devices by vendor/product id (Tim Ansell and Intra2net)
|
||||
* Documentation updates (Tim Ansell)
|
||||
|
||||
New in 0.6 - 2005-04-24
|
||||
-----------------------
|
||||
* Set library version on .so file again
|
||||
* Configurable serial line parameters (Alain Abbas)
|
||||
* Improved filtering of status bytes (Evgeny Sinelnikov)
|
||||
* Extended FT2232C support (Uwe Bonnes)
|
||||
* Small improvement to the baudrate calculation code (Emil)
|
||||
* Error handling cleanup (Rogier Wolff and Intra2net)
|
||||
|
||||
New in 0.5 - 2004-09-24
|
||||
-----------------------
|
||||
* New autoconf suite
|
||||
* pkgconfig support
|
||||
* Status byte filtering now works for "big" readbuffer sizes (Thanks Evgeny!)
|
||||
* Open device by description and/or serial (Evgeny Sinelnikov)
|
||||
* Improved error handling (Evgeny Sinelnikov)
|
||||
|
||||
New in 0.4 - 2004-06-15
|
||||
-----------------------
|
||||
* Fixed filtering of status bytes (Readbuffer size is now 64 bytes)
|
||||
* FT2232C support (Steven Turner/FTDI)
|
||||
* New baudrate calculation code (Ian Abbott)
|
||||
* Automatic detection of chip type
|
||||
* Important: ftdi_write_data now returns the bytes written
|
||||
* Fixed defaults values in ftdi_eeprom_initdefaults (Jean-Daniel Merkli)
|
||||
* Reset internal readbuffer offsets for reset()/purge_buffers()
|
||||
* Small typo fixes (Mark Haemmerling)
|
||||
|
||||
New in 0.3 - 2004-03-25
|
||||
-----------------------
|
||||
* Improved read function which takes arbitrary input buffer sizes
|
||||
Attention: Call ftdi_deinit() on exit to free used memory
|
||||
* Vastly increased read/write performance (configurable chunksize, default is 4096)
|
||||
* Set/get latency timer function working (Thanks Steven Turner/FTDI)
|
||||
* Increased library version because the changes require recompilation
|
||||
|
||||
New in 0.2 - 2004-01-03
|
||||
-----------------------
|
||||
* EEPROM build fix by Daniel Kirkham (Melbourne, Australia)
|
||||
* Implemented basic ftdi_read_data() function
|
||||
* EEPROM write fixes
|
||||
|
||||
New in 0.1 - 2003-06-10
|
||||
-----------------------
|
||||
* First public release
|
@ -1,38 +0,0 @@
|
||||
# - Try to find the freetype library
|
||||
# Once done this defines
|
||||
#
|
||||
# LIBUSB_FOUND - system has libusb
|
||||
# LIBUSB_INCLUDE_DIR - the libusb include directory
|
||||
# LIBUSB_LIBRARIES - Link these to use libusb
|
||||
|
||||
# Copyright (c) 2006, 2008 Laurent Montel, <montel@kde.org>
|
||||
#
|
||||
# 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
|
||||
set(LIBUSB_FOUND TRUE)
|
||||
|
||||
else (LIBUSB_INCLUDE_DIR AND LIBUSB_LIBRARIES)
|
||||
IF (NOT WIN32)
|
||||
# use pkg-config to get the directories and then use these values
|
||||
# in the FIND_PATH() and FIND_LIBRARY() calls
|
||||
find_package(PkgConfig)
|
||||
pkg_check_modules(PC_LIBUSB libusb-1.0)
|
||||
ENDIF(NOT WIN32)
|
||||
|
||||
FIND_PATH(LIBUSB_INCLUDE_DIR libusb.h
|
||||
PATHS ${PC_LIBUSB_INCLUDEDIR} ${PC_LIBUSB_INCLUDE_DIRS})
|
||||
|
||||
FIND_LIBRARY(LIBUSB_LIBRARIES NAMES usb-1.0
|
||||
PATHS ${PC_LIBUSB_LIBDIR} ${PC_LIBUSB_LIBRARY_DIRS})
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
FIND_PACKAGE_HANDLE_STANDARD_ARGS(LIBUSB DEFAULT_MSG LIBUSB_LIBRARIES LIBUSB_INCLUDE_DIR)
|
||||
|
||||
MARK_AS_ADVANCED(LIBUSB_INCLUDE_DIR LIBUSB_LIBRARIES)
|
||||
|
||||
endif (LIBUSB_INCLUDE_DIR AND LIBUSB_LIBRARIES)
|
@ -1,25 +0,0 @@
|
||||
The C library "libftdi" is distributed under the
|
||||
GNU Library General Public License version 2.
|
||||
|
||||
A copy of the GNU Library General Public License (LGPL) is included
|
||||
in this distribution, in the file COPYING.LIB.
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
The C++ wrapper "ftdipp" is distributed under the GNU General
|
||||
Public License version 2 (with a special exception described below).
|
||||
|
||||
A copy of the GNU General Public License (GPL) is included
|
||||
in this distribution, in the file COPYING.GPL.
|
||||
|
||||
As a special exception, if other files instantiate templates or use macros
|
||||
or inline functions from this file, or you compile this file and link it
|
||||
with other works to produce a work based on this file, this file
|
||||
does not by itself cause the resulting work to be covered
|
||||
by the GNU General Public License.
|
||||
|
||||
However the source code for this file must still be made available
|
||||
in accordance with section (3) of the GNU General Public License.
|
||||
|
||||
This exception does not invalidate any other reasons why a work based
|
||||
on this file might be covered by the GNU General Public License.
|
@ -1,26 +0,0 @@
|
||||
--------------------------------------------------------------------
|
||||
libftdi version 0.99
|
||||
--------------------------------------------------------------------
|
||||
|
||||
libftdi - A library (using libusb) to talk to FTDI's UART/FIFO chips
|
||||
including the popular bitbang mode.
|
||||
|
||||
The following chips are supported:
|
||||
- FT4232H / FT2232H
|
||||
- FT232R / FT245R
|
||||
- FT2232L / FT2232D / FT2232C
|
||||
- FT232BM / FT245BM (and the BL/BQ variants)
|
||||
- FT8U232AM / FT8U245AM
|
||||
|
||||
The AUTHORS file contains a list of all the people
|
||||
that made libftdi possible what it is today.
|
||||
|
||||
Changes
|
||||
-------
|
||||
|
||||
You'll find the newest version of libftdi at:
|
||||
http://www.intra2net.com/en/developer/libftdi
|
||||
|
||||
--------------------------------------------------------------------
|
||||
www.intra2net.com 2003-201x Intra2net AG
|
||||
--------------------------------------------------------------------
|
@ -1,11 +0,0 @@
|
||||
To crosscompile for Win32 with mingw
|
||||
- Get and build libusb-win32-src-x.tar.gz from Sourceforge
|
||||
Version was "libusb-win32-src-0.1.12.1.tar.gz" for April 4, 2009
|
||||
- Compile like "make host_prefix=i386-mingw32msvc all". Your prefixes may vary.
|
||||
- Copy src/usb.h to /opt/cross/i386-mingw32msvc/include/
|
||||
- Copy *.a to /opt/cross/i386-mingw32msvc/lib/
|
||||
- Create a build directory like "mkdir build-win32", e.g in ../libftdi/
|
||||
- cd in that directory and run
|
||||
"cmake -DCMAKE_TOOLCHAIN_FILE=../Toolchain-mingw32.cmake .."
|
||||
- Copy src/ftdi.h to /opt/cross/i386-mingw32msvc/include/
|
||||
- Copy build-win32/src/*.a to /opt/cross/i386-mingw32msvc/lib/
|
@ -1,16 +0,0 @@
|
||||
*** TODO for 1.0 release ***
|
||||
Build related:
|
||||
- Rename the library and header file,
|
||||
so libftdi 0.x and 1.x can co-exist
|
||||
|
||||
API extentions:
|
||||
- TO DECIDE: Make ftdi structure opaque?
|
||||
|
||||
Misc:
|
||||
- Resolve TODO entries in ftdi_eeprom
|
||||
- Look into merging ftdi_eeprom and examples/eeprom
|
||||
|
||||
Documentation:
|
||||
- Mention libusb-1.0 dependency
|
||||
- Comparison between 1.0 and 0.19
|
||||
- Document the new EEPROM function
|
@ -1,4 +0,0 @@
|
||||
set(CMAKE_SYSTEM_NAME Linux)
|
||||
set(CMAKE_C_COMPILER gcc -m32)
|
||||
set(CMAKE_CXX_COMPILER g++ -m32)
|
||||
set(CMAKE_FIND_ROOT_PATH /usr/lib)
|
@ -1,16 +0,0 @@
|
||||
# the name of the target operating system
|
||||
SET(CMAKE_SYSTEM_NAME Windows)
|
||||
|
||||
# which compilers to use for C and C++
|
||||
SET(CMAKE_C_COMPILER i386-mingw32msvc-gcc)
|
||||
SET(CMAKE_CXX_COMPILER i386-mingw32msvc-g++)
|
||||
|
||||
# here is the target environment located
|
||||
SET(CMAKE_FIND_ROOT_PATH /opt/cross/i386-mingw32msvc )
|
||||
|
||||
# adjust the default behaviour of the FIND_XXX() commands:
|
||||
# search headers and libraries in the target environment, search
|
||||
# programs in the host environment
|
||||
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
|
||||
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
|
||||
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
|
@ -1,28 +0,0 @@
|
||||
include(FindSWIG)
|
||||
include(FindPythonLibs)
|
||||
include(FindPythonInterp)
|
||||
include(UseSWIG)
|
||||
|
||||
option(PYTHON_BINDINGS "Build python bindings via swig" ON)
|
||||
|
||||
if(PYTHON_BINDINGS AND SWIG_FOUND AND PYTHONLIBS_FOUND AND PYTHONINTERP_FOUND)
|
||||
INCLUDE_DIRECTORIES(BEFORE ${CMAKE_SOURCE_DIR}/src)
|
||||
INCLUDE_DIRECTORIES(${PYTHON_INCLUDE_PATH})
|
||||
LINK_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}/../src)
|
||||
|
||||
SWIG_ADD_MODULE(ftdi python ftdi.i)
|
||||
SWIG_LINK_LIBRARIES(ftdi ftdi ${PYTHON_LIBRARIES})
|
||||
|
||||
execute_process ( COMMAND ${PYTHON_EXECUTABLE} -c "import sys; print '%d.%d' % ( sys.version_info[0], sys.version_info[1] )"
|
||||
OUTPUT_VARIABLE PYTHON_VERSION
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE )
|
||||
|
||||
set ( SITEPACKAGE lib${LIB_SUFFIX}/python${PYTHON_VERSION}/site-packages )
|
||||
|
||||
INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/_ftdi.so DESTINATION ${SITEPACKAGE})
|
||||
INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/ftdi.py DESTINATION ${SITEPACKAGE})
|
||||
|
||||
message(STATUS "Building python bindings via swig. Will be installed under ${CMAKE_INSTALL_PREFIX}/${SITEPACKAGE}")
|
||||
else(PYTHON_BINDINGS AND SWIG_FOUND AND PYTHONLIBS_FOUND AND PYTHONINTERP_FOUND)
|
||||
message(STATUS "Not building python bindings")
|
||||
endif(PYTHON_BINDINGS AND SWIG_FOUND AND PYTHONLIBS_FOUND AND PYTHONINTERP_FOUND)
|
@ -1,88 +0,0 @@
|
||||
/* File: ftdi.i */
|
||||
|
||||
%module(docstring="Python interface to libftdi") ftdi
|
||||
|
||||
%include <typemaps.i>
|
||||
%include <cstring.i>
|
||||
|
||||
%typemap(in) unsigned char* = char*;
|
||||
|
||||
%ignore ftdi_write_data_async;
|
||||
%ignore ftdi_async_complete;
|
||||
|
||||
%immutable ftdi_version_info::version_str;
|
||||
%immutable ftdi_version_info::snapshot_str;
|
||||
|
||||
%rename("%(strip:[ftdi_])s") "";
|
||||
|
||||
%newobject ftdi_new;
|
||||
%typemap(newfree) struct ftdi_context *ftdi "ftdi_free($1);";
|
||||
%delobject ftdi_free;
|
||||
|
||||
%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)); %}
|
||||
%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);
|
||||
%clear struct ftdi_device_list **devlist;
|
||||
|
||||
%apply char *OUTPUT { char * manufacturer, char * description, char * serial };
|
||||
%cstring_bounded_output( char * manufacturer, 256 );
|
||||
%cstring_bounded_output( char * description, 256 );
|
||||
%cstring_bounded_output( char * serial, 256 );
|
||||
%typemap(default,noblock=1) int mnf_len, int desc_len, int serial_len { $1 = 256; }
|
||||
int ftdi_usb_get_strings(struct ftdi_context *ftdi, struct libusb_device *dev,
|
||||
char * manufacturer, int mnf_len,
|
||||
char * description, int desc_len,
|
||||
char * serial, int serial_len);
|
||||
%clear char * manufacturer, char * description, char * serial;
|
||||
%clear int mnf_len, int desc_len, int serial_len;
|
||||
|
||||
%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) %{ if(result<0) $2=0; $result = SWIG_Python_AppendOutput($result, PyString_FromStringAndSize((char*)$1, $2)); free($1); %}
|
||||
int ftdi_read_data(struct ftdi_context *ftdi, unsigned char *buf, int size);
|
||||
%clear (unsigned char *buf, int size);
|
||||
|
||||
%apply int *OUTPUT { unsigned int *chunksize };
|
||||
int ftdi_read_data_get_chunksize(struct ftdi_context *ftdi, unsigned int *chunksize);
|
||||
int ftdi_write_data_get_chunksize(struct ftdi_context *ftdi, unsigned int *chunksize);
|
||||
%clear unsigned int *chunksize;
|
||||
|
||||
%apply char *OUTPUT { unsigned char *pins };
|
||||
int ftdi_read_pins(struct ftdi_context *ftdi, unsigned char *pins);
|
||||
%clear unsigned char *pins;
|
||||
|
||||
%apply char *OUTPUT { unsigned char *latency };
|
||||
int ftdi_get_latency_timer(struct ftdi_context *ftdi, unsigned char *latency);
|
||||
%clear unsigned char *latency;
|
||||
|
||||
%apply short *OUTPUT { unsigned short *status };
|
||||
int ftdi_poll_modem_status(struct ftdi_context *ftdi, unsigned short *status);
|
||||
%clear unsigned short *status;
|
||||
|
||||
%apply int *OUTPUT { int* value };
|
||||
int ftdi_get_eeprom_value(struct ftdi_context *ftdi, enum ftdi_eeprom_value value_name, int* value);
|
||||
%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) %{ if(result<0) $2=0; $result = SWIG_Python_AppendOutput($result, PyString_FromStringAndSize((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);
|
||||
|
||||
%apply short *OUTPUT { unsigned short *eeprom_val };
|
||||
int ftdi_read_eeprom_location (struct ftdi_context *ftdi, int eeprom_addr, unsigned short *eeprom_val);
|
||||
%clear unsigned short *eeprom_val;
|
||||
|
||||
%apply int *OUTPUT { unsigned int *chipid };
|
||||
int ftdi_read_chipid(struct ftdi_context *ftdi, unsigned int *chipid);
|
||||
%clear unsigned int *chipid;
|
||||
|
||||
%include ftdi.h
|
||||
%{
|
||||
#include <ftdi.h>
|
||||
%}
|
||||
|
||||
%include ftdi_i.h
|
||||
%{
|
||||
#include <ftdi_i.h>
|
||||
%}
|
File diff suppressed because it is too large
Load Diff
@ -1,109 +0,0 @@
|
||||
Here we try to document what we know about the EEPROM Structure.
|
||||
|
||||
Even with a 93xx66 EEPROM, at maximum 256 Bytes are used
|
||||
|
||||
All important things happen in the first
|
||||
0x14(FT232/245), 0x16(FT2232CD), 0x18(FT232/245R) or 0x1a (FT2232H/4432H) bytes
|
||||
|
||||
Type | Use extra EEPROM space
|
||||
FT2XXB | No
|
||||
|
||||
Byte.BIT| TYPE_AM TYPE_BM TYPE_2232C TYPE_R TYPE_2232H TYPE_4232H
|
||||
00.0 | 0 0 channel_a_type channel_a_type 0
|
||||
00.1 | 0 0 channel_a_type channel_a_type 0
|
||||
00.2 | 0 0 channel_a_type high_current channel_a_type 0
|
||||
00.3 | 0 0 channel_a_driver channel_a_driver channel_a_driver channel_a_driver
|
||||
00.4 | 0 0 high_current_a 0 0 0
|
||||
00.5 | 0 0 0 0 0 0
|
||||
00.6 | 0 0 0 0 0 0
|
||||
00.7 | 0 0 0 0 SUSPEND_DBUS7 channel_c_driver
|
||||
|
||||
On TYPE_R 00.3 set mean D2XX, on other devices VCP
|
||||
|
||||
01.0 | 0 0 channel_b_type channel_b_type 0
|
||||
01.1 | 0 0 channel_b_type channel_b_type 0
|
||||
01.2 | 0 0 channel_b_type 0 channel_b_type 0
|
||||
01.3 | 0 0 channel_b_driver 0 channel_b_driver channel_b_driver
|
||||
01.4 | 0 0 high_current_b 0 0 0
|
||||
01.5 | 0 0 0 0 0 0
|
||||
01.6 | 0 0 0 0 0
|
||||
01.7 | 0 0 0 0 0 channel_d_driver
|
||||
|
||||
Fixme: Missing 4232H validation
|
||||
|
||||
02 | Vendor ID (VID) LSB (all)
|
||||
03 | Vendor ID (VID) MSB (all)
|
||||
04 | Product ID (PID) LSB (all)
|
||||
05 | Product ID (PID) MSB (all)
|
||||
06 | Device release number LSB (not tested on TYPE_4232H)
|
||||
07 | Device release number MSB (not tested on TYPE_4232H)
|
||||
|
|
||||
08.4 | Battery powered
|
||||
08.5 | Remote wakeup
|
||||
08.6 | Self powered: 1, bus powered: 0
|
||||
08.7 | Always 1
|
||||
|
|
||||
09 | Max power (mA/2)
|
||||
|
|
||||
Byte.BIT| TYPE_AM TYPE_BM TYPE_2232C TYPE_R TYPE_2232H TYPE_4232H
|
||||
0a.0 | 0 IsoIn IsoIn part A 0 0 0
|
||||
0a.1 | 0 IsoOut IsoOut part A 0 0 0
|
||||
0a.2 | 0 suspend_pull_down suspend_pull_down suspend_pull_down suspend_pull_down
|
||||
0a.3 | 0 use_serial use_serial use_serial
|
||||
0a.4 | 0 change_usb_version change_usb_version
|
||||
0a.5 | 0 0 IsoIn part B 0 0 0
|
||||
0a.6 | 0 0 IsoOut part B 0 0 0
|
||||
0a.7 | 0 - reserved
|
||||
|
||||
0b | TYPE_R Bitmask Invert, 0 else
|
||||
Byte.BIT| TYPE_4232H
|
||||
0b.4 | channel_a_rs485enable
|
||||
0b.5 | channel_b_rs485enable
|
||||
0b.6 | channel_c_rs485enable
|
||||
0b.7 | channel_d_rs485enable
|
||||
|
||||
Byte | TYPE_AM TYPE_BM TYPE_2232C TYPE_R TYPE_2232H TYPE_4232H
|
||||
0c | 0 USB-VER-LSB USB-VER-LSB 0 ? ?
|
||||
0d | 0 USB-VER-MSB USB-VER-MSB 0 ? ?
|
||||
(On several FT2232H different values were observed -> The value is unused
|
||||
if change USB version is not set, so it might contain garbage)
|
||||
|
||||
0e | OFFSET Vendor
|
||||
0f | Len VENDOR
|
||||
|
||||
10 | Offset Product
|
||||
11 | Length Product
|
||||
|
||||
12 | Offset Serial
|
||||
13 | Length Serial
|
||||
|
||||
Byte.BIT| TYPE_AM TYPE_BM TYPE_2232C TYPE_R TYPE_2232H TYPE_4232H
|
||||
14.3:0 | UA UA CHIP CBUS[0] AL A
|
||||
14.7:0 | UA UA CHIP CBUS[1] AH B
|
||||
15.3:0 | UA UA 0 CBUS[2] BL C
|
||||
15.7:0 | UA UA 0 CBUS[3] BH D
|
||||
16.3:0 | UA UA UA CBUS[4] 0 0
|
||||
16.7:0 | UA UA UA 0 0 0
|
||||
|
||||
CHIP values:
|
||||
0x46: EEPROM is a 93xx46
|
||||
0x56: EEPROM is a 93xx56
|
||||
0x66: EEPROM is a 93xx66
|
||||
|
||||
17 UA UA UA 0 0 0
|
||||
18 UA UA UA VENDOR CHIP CHIP
|
||||
19 UA UA UA VENDOR 0 0
|
||||
|
||||
1a UA (all)
|
||||
|
||||
|
||||
Additional fields after the serial string:
|
||||
0x00, 0x00 - reserved for "legacy port name prefix"
|
||||
0x00, 0x00 - reserved for plug and play options
|
||||
(Observed values with PnP == 0:
|
||||
0x02 0x03 0x01 0x00)
|
||||
|
||||
Note: The additional fields after the serial number string
|
||||
collide with the official FTDI formula from AN_121 regarding
|
||||
the start of the user area:
|
||||
"Start Address = the address following the last byte of SerialNumber string."
|
@ -1,28 +0,0 @@
|
||||
*** Checklist for a new libftdi release ***
|
||||
- Update ChangeLog and AUTHORS via git history
|
||||
|
||||
- Update version number in the following files:
|
||||
- CMakeLists.txt
|
||||
- README
|
||||
|
||||
- Run "make dist"
|
||||
|
||||
- Diff tarball to previous version, check if all
|
||||
important changes are in the ChangeLog
|
||||
|
||||
- Ensure all modifications are checked in
|
||||
|
||||
- Sign tarball, build .src.rpm and sign it, too
|
||||
|
||||
- Create git tag:
|
||||
- git tag -s -u 24F006F5 v0.XX
|
||||
- git tag -d latest-release ; git tag latest-release
|
||||
- git push --tags
|
||||
|
||||
- Website
|
||||
- Upload tarball and .src.rpm
|
||||
- Add ChangeLog to main page
|
||||
- Update URLs in download section
|
||||
- Generate API documentation and upload it
|
||||
|
||||
- Announce on mailinglist & freshmeat
|
@ -1,54 +0,0 @@
|
||||
option(EXAMPLES "Build example programs" ON)
|
||||
|
||||
if (EXAMPLES)
|
||||
# Includes
|
||||
include( ${CMAKE_CURRENT_SOURCE_DIR}
|
||||
${CMAKE_CURRENT_BINARY_DIR}
|
||||
)
|
||||
|
||||
message(STATUS "Building example programs.")
|
||||
|
||||
# Source includes
|
||||
include_directories(BEFORE ${CMAKE_SOURCE_DIR}/src)
|
||||
|
||||
# Targets
|
||||
add_executable(simple simple.c)
|
||||
add_executable(bitbang bitbang.c)
|
||||
add_executable(bitbang2 bitbang2.c)
|
||||
add_executable(bitbang_cbus bitbang_cbus.c)
|
||||
add_executable(bitbang_ft2232 bitbang_ft2232.c)
|
||||
add_executable(find_all find_all.c)
|
||||
add_executable(serial_test serial_test.c)
|
||||
add_executable(baud_test baud_test.c)
|
||||
add_executable(stream_test stream_test.c)
|
||||
add_executable(eeprom eeprom.c)
|
||||
|
||||
# Linkage
|
||||
target_link_libraries(simple ftdi)
|
||||
target_link_libraries(bitbang ftdi)
|
||||
target_link_libraries(bitbang2 ftdi)
|
||||
target_link_libraries(bitbang_cbus ftdi)
|
||||
target_link_libraries(bitbang_ft2232 ftdi)
|
||||
target_link_libraries(find_all ftdi)
|
||||
target_link_libraries(serial_test ftdi)
|
||||
target_link_libraries(baud_test ftdi)
|
||||
target_link_libraries(stream_test ftdi)
|
||||
target_link_libraries(eeprom ftdi)
|
||||
|
||||
# libftdi++ examples
|
||||
if(FTDI_BUILD_CPP)
|
||||
if(Boost_FOUND)
|
||||
message(STATUS "Building libftdi++ examples.")
|
||||
include_directories(BEFORE ${CMAKE_SOURCE_DIR}/ftdipp
|
||||
${Boost_INCLUDE_DIRS})
|
||||
|
||||
# Target
|
||||
add_executable(find_all_pp find_all_pp.cpp)
|
||||
|
||||
# Linkage
|
||||
target_link_libraries(find_all_pp ftdipp)
|
||||
endif(Boost_FOUND)
|
||||
endif(FTDI_BUILD_CPP)
|
||||
else(EXAMPLES)
|
||||
message(STATUS "Not building example programs.")
|
||||
endif(EXAMPLES)
|
@ -1,224 +0,0 @@
|
||||
/* baud_test.c
|
||||
*
|
||||
* test setting the baudrate and compare it with the expected runtime
|
||||
*
|
||||
* options:
|
||||
* -p <devicestring> defaults to "i:0x0403:0x6001" (this is the first FT232R with default id)
|
||||
* d:<devicenode> path of bus and device-node (e.g. "003/001") within usb device tree (usually at /proc/bus/usb/)
|
||||
* i:<vendor>:<product> first device with given vendor and product id,
|
||||
* ids can be decimal, octal (preceded by "0") or hex (preceded by "0x")
|
||||
* i:<vendor>:<product>:<index> as above with index being the number of the device (starting with 0)
|
||||
* if there are more than one
|
||||
* s:<vendor>:<product>:<serial> first device with given vendor id, product id and serial string
|
||||
* -d <datasize to send in bytes>
|
||||
* -b <baudrate> (divides by 16 if bitbang as taken from the ftdi datasheets)
|
||||
* -m <mode to use> r: serial a: async bitbang s:sync bitbang
|
||||
* -c <chunksize>
|
||||
*
|
||||
* (C) 2009 by Gerd v. Egidy <gerd.von.egidy@intra2net.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <sys/time.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <ftdi.h>
|
||||
|
||||
double get_prec_time()
|
||||
{
|
||||
struct timeval tv;
|
||||
double res;
|
||||
|
||||
gettimeofday(&tv,NULL);
|
||||
|
||||
res=tv.tv_sec;
|
||||
res+=((double)tv.tv_usec/1000000);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
struct ftdi_context *ftdi;
|
||||
int i, t;
|
||||
unsigned char *txbuf;
|
||||
unsigned char *rxbuf;
|
||||
double start, duration, plan;
|
||||
int retval= 0;
|
||||
|
||||
// default values
|
||||
int baud=9600;
|
||||
int set_baud;
|
||||
int datasize=100000;
|
||||
|
||||
char default_devicedesc[] = "i:0x0403:0x6001";
|
||||
char *devicedesc=default_devicedesc;
|
||||
int txchunksize=256;
|
||||
enum ftdi_mpsse_mode test_mode=BITMODE_BITBANG;
|
||||
|
||||
while ((t = getopt (argc, argv, "b:d:p:m:c:")) != -1)
|
||||
{
|
||||
switch (t)
|
||||
{
|
||||
case 'd':
|
||||
datasize = atoi (optarg);
|
||||
break;
|
||||
case 'm':
|
||||
switch (*optarg)
|
||||
{
|
||||
case 'r':
|
||||
// serial
|
||||
test_mode=BITMODE_RESET;
|
||||
break;
|
||||
case 'a':
|
||||
// async
|
||||
test_mode=BITMODE_BITBANG;
|
||||
break;
|
||||
case 's':
|
||||
// sync
|
||||
test_mode=BITMODE_SYNCBB;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case 'b':
|
||||
baud = atoi (optarg);
|
||||
break;
|
||||
case 'p':
|
||||
devicedesc=optarg;
|
||||
break;
|
||||
case 'c':
|
||||
txchunksize = atoi (optarg);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
txbuf=malloc(txchunksize);
|
||||
rxbuf=malloc(txchunksize);
|
||||
if (txbuf == NULL || rxbuf == NULL)
|
||||
{
|
||||
fprintf(stderr, "can't malloc\n");
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
if ((ftdi = ftdi_new()) == 0)
|
||||
{
|
||||
fprintf(stderr, "ftdi_new failed\n");
|
||||
retval = EXIT_FAILURE;
|
||||
goto done;
|
||||
}
|
||||
|
||||
if (ftdi_usb_open_string(ftdi, devicedesc) < 0)
|
||||
{
|
||||
fprintf(stderr,"Can't open ftdi device: %s\n",ftdi_get_error_string(ftdi));
|
||||
retval = EXIT_FAILURE;
|
||||
goto do_deinit;
|
||||
}
|
||||
|
||||
set_baud=baud;
|
||||
if (test_mode!=BITMODE_RESET)
|
||||
{
|
||||
// we do bitbang, so real baudrate / 16
|
||||
set_baud=baud/16;
|
||||
}
|
||||
|
||||
ftdi_set_baudrate(ftdi,set_baud);
|
||||
printf("real baudrate used: %d\n",(test_mode==BITMODE_RESET) ? ftdi->baudrate : ftdi->baudrate*16);
|
||||
|
||||
if (ftdi_set_bitmode(ftdi, 0xFF,test_mode) < 0)
|
||||
{
|
||||
fprintf(stderr,"Can't set mode: %s\n",ftdi_get_error_string(ftdi));
|
||||
retval = EXIT_FAILURE;
|
||||
goto do_close;
|
||||
}
|
||||
|
||||
if (test_mode==BITMODE_RESET)
|
||||
{
|
||||
// serial 8N1: 8 data bits, 1 startbit, 1 stopbit
|
||||
plan=((double)(datasize*10))/baud;
|
||||
}
|
||||
else
|
||||
{
|
||||
// bitbang means 8 bits at once
|
||||
plan=((double)datasize)/baud;
|
||||
}
|
||||
|
||||
printf("this test should take %.2f seconds\n",plan);
|
||||
|
||||
// prepare data to send: 0 and 1 bits alternating (except for serial start/stopbit):
|
||||
// maybe someone wants to look at this with a scope or logic analyzer
|
||||
for (i=0; i<txchunksize; i++)
|
||||
{
|
||||
if (test_mode==BITMODE_RESET)
|
||||
txbuf[i]=0xAA;
|
||||
else
|
||||
txbuf[i]=(i%2) ? 0xff : 0;
|
||||
}
|
||||
|
||||
if (ftdi_write_data_set_chunksize(ftdi, txchunksize) < 0 ||
|
||||
ftdi_read_data_set_chunksize(ftdi, txchunksize) < 0)
|
||||
{
|
||||
fprintf(stderr,"Can't set chunksize: %s\n",ftdi_get_error_string(ftdi));
|
||||
retval = EXIT_FAILURE;
|
||||
goto do_close;
|
||||
}
|
||||
|
||||
if (test_mode==BITMODE_SYNCBB)
|
||||
{
|
||||
// completely clear the receive buffer before beginning
|
||||
while (ftdi_read_data(ftdi, rxbuf, txchunksize)>0);
|
||||
}
|
||||
|
||||
start=get_prec_time();
|
||||
|
||||
// don't wait for more data to arrive, take what we get and keep on sending
|
||||
// yes, we really would like to have libusb 1.0+ with async read/write...
|
||||
ftdi->usb_read_timeout=1;
|
||||
|
||||
i=0;
|
||||
while (i < datasize)
|
||||
{
|
||||
int sendsize=txchunksize;
|
||||
if (i+sendsize > datasize)
|
||||
sendsize=datasize-i;
|
||||
|
||||
if ((sendsize=ftdi_write_data(ftdi, txbuf, sendsize)) < 0)
|
||||
{
|
||||
fprintf(stderr,"write failed at %d: %s\n",
|
||||
i, ftdi_get_error_string(ftdi));
|
||||
retval = EXIT_FAILURE;
|
||||
goto do_close;
|
||||
}
|
||||
|
||||
i+=sendsize;
|
||||
|
||||
if (test_mode==BITMODE_SYNCBB)
|
||||
{
|
||||
// read the same amount of data as sent
|
||||
ftdi_read_data(ftdi, rxbuf, sendsize);
|
||||
}
|
||||
}
|
||||
|
||||
duration=get_prec_time()-start;
|
||||
printf("and took %.4f seconds, this is %.0f baud or factor %.3f\n",duration,(plan*baud)/duration,plan/duration);
|
||||
do_close:
|
||||
ftdi_usb_close(ftdi);
|
||||
do_deinit:
|
||||
ftdi_free(ftdi);
|
||||
done:
|
||||
if(rxbuf)
|
||||
free(rxbuf);
|
||||
if(txbuf)
|
||||
free(txbuf);
|
||||
exit (retval);
|
||||
}
|
@ -1,87 +0,0 @@
|
||||
/* This program is distributed under the GPL, version 2 */
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#ifdef __WIN32__
|
||||
#define sleep(x) Sleep(x)
|
||||
#endif
|
||||
#include <ftdi.h>
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
struct ftdi_context *ftdi;
|
||||
int f,i;
|
||||
unsigned char buf[1];
|
||||
int retval = 0;
|
||||
|
||||
if ((ftdi = ftdi_new()) == 0)
|
||||
{
|
||||
fprintf(stderr, "ftdi_new failed\n");
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
f = ftdi_usb_open(ftdi, 0x0403, 0x6001);
|
||||
|
||||
if (f < 0 && f != -5)
|
||||
{
|
||||
fprintf(stderr, "unable to open ftdi device: %d (%s)\n", f, ftdi_get_error_string(ftdi));
|
||||
retval = 1;
|
||||
goto done;
|
||||
}
|
||||
|
||||
printf("ftdi open succeeded: %d\n",f);
|
||||
|
||||
printf("enabling bitbang mode\n");
|
||||
ftdi_set_bitmode(ftdi, 0xFF, BITMODE_BITBANG);
|
||||
|
||||
sleep(3);
|
||||
|
||||
buf[0] = 0x0;
|
||||
printf("turning everything on\n");
|
||||
f = ftdi_write_data(ftdi, buf, 1);
|
||||
if (f < 0)
|
||||
{
|
||||
fprintf(stderr,"write failed for 0x%x, error %d (%s)\n",buf[0],f, ftdi_get_error_string(ftdi));
|
||||
}
|
||||
|
||||
sleep(3);
|
||||
|
||||
buf[0] = 0xFF;
|
||||
printf("turning everything off\n");
|
||||
f = ftdi_write_data(ftdi, buf, 1);
|
||||
if (f < 0)
|
||||
{
|
||||
fprintf(stderr,"write failed for 0x%x, error %d (%s)\n",buf[0],f, ftdi_get_error_string(ftdi));
|
||||
}
|
||||
|
||||
sleep(3);
|
||||
|
||||
for (i = 0; i < 32; i++)
|
||||
{
|
||||
buf[0] = 0 | (0xFF ^ 1 << (i % 8));
|
||||
if ( i > 0 && (i % 8) == 0)
|
||||
{
|
||||
printf("\n");
|
||||
}
|
||||
printf("%02hhx ",buf[0]);
|
||||
fflush(stdout);
|
||||
f = ftdi_write_data(ftdi, buf, 1);
|
||||
if (f < 0)
|
||||
{
|
||||
fprintf(stderr,"write failed for 0x%x, error %d (%s)\n",buf[0],f, ftdi_get_error_string(ftdi));
|
||||
}
|
||||
sleep(1);
|
||||
}
|
||||
|
||||
printf("\n");
|
||||
|
||||
printf("disabling bitbang mode\n");
|
||||
ftdi_disable_bitbang(ftdi);
|
||||
|
||||
ftdi_usb_close(ftdi);
|
||||
done:
|
||||
ftdi_free(ftdi);
|
||||
|
||||
return retval;
|
||||
}
|
@ -1,92 +0,0 @@
|
||||
/* ftdi_out.c
|
||||
*
|
||||
* Output a (stream of) byte(s) in bitbang mode to the
|
||||
* ftdi245 chip that is (hopefully) attached.
|
||||
*
|
||||
* We have a little board that has a FT245BM chip and
|
||||
* the 8 outputs are connected to several different
|
||||
* things that we can turn on and off with this program.
|
||||
*
|
||||
* If you have an idea about hardware that can easily
|
||||
* interface onto an FTDI chip, I'd like to collect
|
||||
* ideas. If I find it worthwhile to make, I'll consider
|
||||
* making it, I'll even send you a prototype (against
|
||||
* cost-of-material) if you want.
|
||||
*
|
||||
* At "harddisk-recovery.nl" they have a little board that
|
||||
* controls the power to two harddrives and two fans.
|
||||
*
|
||||
* -- REW R.E.Wolff@BitWizard.nl
|
||||
*
|
||||
*
|
||||
*
|
||||
* This program was based on libftdi_example_bitbang2232.c
|
||||
* which doesn't carry an author or attribution header.
|
||||
*
|
||||
*
|
||||
* This program is distributed under the GPL, version 2.
|
||||
* Millions copies of the GPL float around the internet.
|
||||
*/
|
||||
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#ifdef __WIN32__
|
||||
#define usleep(x) Sleep((x+999)/1000)
|
||||
#endif
|
||||
#include <ftdi.h>
|
||||
|
||||
void ftdi_fatal (struct ftdi_context *ftdi, char *str)
|
||||
{
|
||||
fprintf (stderr, "%s: %s\n",
|
||||
str, ftdi_get_error_string (ftdi));
|
||||
ftdi_deinit(ftdi);
|
||||
exit (1);
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
struct ftdi_context *ftdi;
|
||||
int i, t;
|
||||
unsigned char data;
|
||||
int delay = 100000; /* 100 thousand microseconds: 1 tenth of a second */
|
||||
|
||||
while ((t = getopt (argc, argv, "d:")) != -1)
|
||||
{
|
||||
switch (t)
|
||||
{
|
||||
case 'd':
|
||||
delay = atoi (optarg);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if ((ftdi = ftdi_new()) == 0)
|
||||
{
|
||||
fprintf(stderr, "ftdi_bew failed\n");
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
if (ftdi_usb_open(ftdi, 0x0403, 0x6001) < 0)
|
||||
ftdi_fatal (ftdi, "Can't open ftdi device");
|
||||
|
||||
if (ftdi_set_bitmode(ftdi, 0xFF, BITMODE_BITBANG) < 0)
|
||||
ftdi_fatal (ftdi, "Can't enable bitbang");
|
||||
|
||||
for (i=optind; i < argc ; i++)
|
||||
{
|
||||
sscanf (argv[i], "%x", &t);
|
||||
data = t;
|
||||
if (ftdi_write_data(ftdi, &data, 1) < 0)
|
||||
{
|
||||
fprintf(stderr,"write failed for 0x%x: %s\n",
|
||||
data, ftdi_get_error_string(ftdi));
|
||||
}
|
||||
usleep(delay);
|
||||
}
|
||||
|
||||
ftdi_usb_close(ftdi);
|
||||
ftdi_free(ftdi);
|
||||
exit (0);
|
||||
}
|
@ -1,94 +0,0 @@
|
||||
/* bitbang_cbus.c
|
||||
|
||||
Example to use CBUS bitbang mode of newer chipsets.
|
||||
You must enable CBUS bitbang mode in the EEPROM first.
|
||||
|
||||
Thanks to Steve Brown <sbrown@ewol.com> for the
|
||||
the information how to do it.
|
||||
|
||||
The top nibble controls input/output and the bottom nibble
|
||||
controls the state of the lines set to output. The datasheet isn't clear
|
||||
what happens if you set a bit in the output register when that line is
|
||||
conditioned for input. This is described in more detail
|
||||
in the FT232R bitbang app note.
|
||||
|
||||
BITMASK
|
||||
CBUS Bits
|
||||
3210 3210
|
||||
xxxx xxxx
|
||||
| |------ Output Control 0->LO, 1->HI
|
||||
|----------- Input/Output 0->Input, 1->Output
|
||||
|
||||
Example:
|
||||
All pins to output with 0 bit high: 0xF1 (11110001)
|
||||
Bits 0 and 1 to input, 2 and 3 to output and masked high: 0xCC (11001100)
|
||||
|
||||
The input is standard "0x" hex notation.
|
||||
A carriage return terminates the program.
|
||||
|
||||
This program is distributed under the GPL, version 2
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
#include <ftdi.h>
|
||||
|
||||
int main(void)
|
||||
{
|
||||
struct ftdi_context *ftdi;
|
||||
int f;
|
||||
unsigned char buf[1];
|
||||
unsigned char bitmask;
|
||||
char input[10];
|
||||
|
||||
if ((ftdi = ftdi_new()) == 0)
|
||||
{
|
||||
fprintf(stderr, "ftdi_new failed\n");
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
f = ftdi_usb_open(ftdi, 0x0403, 0x6001);
|
||||
if (f < 0 && f != -5)
|
||||
{
|
||||
fprintf(stderr, "unable to open ftdi device: %d (%s)\n", f, ftdi_get_error_string(ftdi));
|
||||
ftdi_deinit(ftdi);
|
||||
exit(-1);
|
||||
}
|
||||
printf("ftdi open succeeded: %d\n",f);
|
||||
|
||||
while (1)
|
||||
{
|
||||
// Set bitmask from input
|
||||
fgets(input, sizeof(input) - 1, stdin);
|
||||
if (input[0] == '\n') break;
|
||||
bitmask = strtol(input, NULL, 0);
|
||||
printf("Using bitmask 0x%02x\n", bitmask);
|
||||
f = ftdi_set_bitmode(ftdi, bitmask, BITMODE_CBUS);
|
||||
if (f < 0)
|
||||
{
|
||||
fprintf(stderr, "set_bitmode failed for 0x%x, error %d (%s)\n", bitmask, f, ftdi_get_error_string(ftdi));
|
||||
ftdi_usb_close(ftdi);
|
||||
ftdi_deinit(ftdi);
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
// read CBUS
|
||||
f = ftdi_read_pins(ftdi, &buf[0]);
|
||||
if (f < 0)
|
||||
{
|
||||
fprintf(stderr, "read_pins failed, error %d (%s)\n", f, ftdi_get_error_string(ftdi));
|
||||
ftdi_usb_close(ftdi);
|
||||
ftdi_deinit(ftdi);
|
||||
exit(-1);
|
||||
}
|
||||
printf("Read returned 0x%01x\n", buf[0] & 0x0f);
|
||||
}
|
||||
printf("disabling bitbang mode\n");
|
||||
ftdi_disable_bitbang(ftdi);
|
||||
|
||||
ftdi_usb_close(ftdi);
|
||||
ftdi_free(ftdi);
|
||||
|
||||
return 0;
|
||||
}
|
@ -1,62 +0,0 @@
|
||||
[Basic Details]
|
||||
Device Type=6
|
||||
VID PID Type=0
|
||||
USB VID=0403
|
||||
USB PID=6001
|
||||
[USB Power Options]
|
||||
Bus Powered=1
|
||||
Self Powered=0
|
||||
Max Bus Power=44
|
||||
[USB Serial Number Control]
|
||||
Prefix=FT
|
||||
Use Fixed Serial Number=0
|
||||
Fixed Serial Number=FTDECZJT
|
||||
[USB Remote WakeUp]
|
||||
Enable Remote WakeUp=1
|
||||
[Windows Plug and Play]
|
||||
Enable Plug and Play=0
|
||||
[USB String Descriptors]
|
||||
Manufacturer=FTDI
|
||||
Product=USB Serial Converter
|
||||
[Programming Options]
|
||||
Only Program Blank Devices=0
|
||||
[BM Device Specific Options]
|
||||
USB Version Number=1
|
||||
Disable Serial Number=0
|
||||
IO Pin Pull Down in Suspend=0
|
||||
[Dual Device Specific Options A]
|
||||
RS 232 mode=1
|
||||
245 FIFO mode=0
|
||||
245 CPU FIFO mode=0
|
||||
OPTO Isolate mode=1
|
||||
High Current Drive=0
|
||||
[Dual Device Specific Options B]
|
||||
RS 232 mode=1
|
||||
245 FIFO mode=0
|
||||
245 CPU FIFO mode=0
|
||||
OPTO Isolate mode=0
|
||||
High Current Drive=0
|
||||
[Dual Device Driver Options A]
|
||||
Virtual Com Port Driver=1
|
||||
D2XX Driver=0
|
||||
[Dual Device Driver Options B]
|
||||
Virtual Com Port Driver=1
|
||||
D2XX Driver=0
|
||||
[R Device Specific Options]
|
||||
Invert TXD=0
|
||||
Invert RXD=0
|
||||
Invert RTS#=0
|
||||
Invert CTS#=0
|
||||
Invert DTR#=0
|
||||
Invert DSR#=0
|
||||
Invert DCD#=0
|
||||
Invert RI#=0
|
||||
C0 Signal=10
|
||||
C1 Signal=10
|
||||
C2 Signal=10
|
||||
C3 Signal=10
|
||||
C4 Signal=5
|
||||
Enable Ext Osc=0
|
||||
High Current I/O=0
|
||||
Load D2XX Driver=0
|
||||
In EndPoint Size=0
|
@ -1,109 +0,0 @@
|
||||
/* bitbang_ft2232.c
|
||||
|
||||
Output some flickering in bitbang mode to the FT2232
|
||||
|
||||
Thanks to max@koeln.ccc.de for fixing and extending
|
||||
the example for the second channel.
|
||||
|
||||
This program is distributed under the GPL, version 2
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#ifdef __WIN32__
|
||||
#define sleep(x) Sleep(x)
|
||||
#endif
|
||||
#include <ftdi.h>
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
struct ftdi_context *ftdi, *ftdi2;
|
||||
unsigned char buf[1];
|
||||
int f,i;
|
||||
|
||||
// Init 1. channel
|
||||
if ((ftdi = ftdi_new()) == 0)
|
||||
{
|
||||
fprintf(stderr, "ftdi_new failed\n");
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
ftdi_set_interface(ftdi, INTERFACE_A);
|
||||
f = ftdi_usb_open(ftdi, 0x0403, 0x6001);
|
||||
if (f < 0 && f != -5)
|
||||
{
|
||||
fprintf(stderr, "unable to open ftdi device: %d (%s)\n", f, ftdi_get_error_string(ftdi));
|
||||
ftdi_deinit(ftdi);
|
||||
exit(-1);
|
||||
}
|
||||
printf("ftdi open succeeded(channel 1): %d\n",f);
|
||||
|
||||
printf("enabling bitbang mode(channel 1)\n");
|
||||
ftdi_set_bitmode(ftdi, 0xFF, BITMODE_BITBANG);
|
||||
|
||||
// Init 2. channel
|
||||
if ((ftdi2 = ftdi_new()) == 0)
|
||||
{
|
||||
fprintf(stderr, "ftdi_new failed\n");
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
ftdi_set_interface(ftdi2, INTERFACE_B);
|
||||
f = ftdi_usb_open(ftdi2, 0x0403, 0x6001);
|
||||
if (f < 0 && f != -5)
|
||||
{
|
||||
fprintf(stderr, "unable to open ftdi device: %d (%s)\n", f, ftdi_get_error_string(ftdi2));
|
||||
ftdi_deinit(ftdi2);
|
||||
exit(-1);
|
||||
}
|
||||
printf("ftdi open succeeded(channel 2): %d\n",f);
|
||||
|
||||
printf("enabling bitbang mode (channel 2)\n");
|
||||
ftdi_set_bitmode(ftdi2, 0xFF, BITMODE_BITBANG);
|
||||
|
||||
// Write data
|
||||
printf("startloop\n");
|
||||
for (i = 0; i < 23; i++)
|
||||
{
|
||||
buf[0] = 0x1;
|
||||
printf("porta: %02i: 0x%02x \n",i,buf[0]);
|
||||
f = ftdi_write_data(ftdi, buf, 1);
|
||||
if (f < 0)
|
||||
fprintf(stderr,"write failed on channel 1 for 0x%x, error %d (%s)\n", buf[0], f, ftdi_get_error_string(ftdi));
|
||||
sleep(1);
|
||||
|
||||
buf[0] = 0x2;
|
||||
printf("porta: %02i: 0x%02x \n",i,buf[0]);
|
||||
f = ftdi_write_data(ftdi, buf, 1);
|
||||
if (f < 0)
|
||||
fprintf(stderr,"write failed on channel 1 for 0x%x, error %d (%s)\n", buf[0], f, ftdi_get_error_string(ftdi));
|
||||
sleep(1);
|
||||
|
||||
buf[0] = 0x1;
|
||||
printf("portb: %02i: 0x%02x \n",i,buf[0]);
|
||||
f = ftdi_write_data(ftdi2, buf, 1);
|
||||
if (f < 0)
|
||||
fprintf(stderr,"write failed on channel 2 for 0x%x, error %d (%s)\n", buf[0], f, ftdi_get_error_string(ftdi2));
|
||||
sleep(1);
|
||||
|
||||
buf[0] = 0x2;
|
||||
printf("portb: %02i: 0x%02x \n",i,buf[0]);
|
||||
f = ftdi_write_data(ftdi2, buf, 1);
|
||||
if (f < 0)
|
||||
fprintf(stderr,"write failed on channel 2 for 0x%x, error %d (%s)\n", buf[0], f, ftdi_get_error_string(ftdi2));
|
||||
sleep(1);
|
||||
}
|
||||
printf("\n");
|
||||
|
||||
printf("disabling bitbang mode(channel 1)\n");
|
||||
ftdi_disable_bitbang(ftdi);
|
||||
ftdi_usb_close(ftdi);
|
||||
ftdi_deinit(ftdi);
|
||||
|
||||
printf("disabling bitbang mode(channel 2)\n");
|
||||
ftdi_disable_bitbang(ftdi2);
|
||||
ftdi_usb_close(ftdi2);
|
||||
ftdi_free(ftdi2);
|
||||
|
||||
return 0;
|
||||
}
|
@ -1,299 +0,0 @@
|
||||
/* LIBFTDI EEPROM access example
|
||||
|
||||
This program is distributed under the GPL, version 2
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
#include <unistd.h>
|
||||
#include <getopt.h>
|
||||
#include <ftdi.h>
|
||||
|
||||
int read_decode_eeprom(struct ftdi_context *ftdi)
|
||||
{
|
||||
int i, j, f;
|
||||
int value;
|
||||
int size;
|
||||
unsigned char buf[256];
|
||||
|
||||
f = ftdi_read_eeprom(ftdi);
|
||||
if (f < 0)
|
||||
{
|
||||
fprintf(stderr, "ftdi_read_eeprom: %d (%s)\n",
|
||||
f, ftdi_get_error_string(ftdi));
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
ftdi_get_eeprom_value(ftdi, CHIP_SIZE, & value);
|
||||
if (value <0)
|
||||
{
|
||||
fprintf(stderr, "No EEPROM found or EEPROM empty\n");
|
||||
fprintf(stderr, "On empty EEPROM, use -w option to write default values\n");
|
||||
return -1;
|
||||
}
|
||||
fprintf(stderr, "Chip type %d ftdi_eeprom_size: %d\n", ftdi->type, value);
|
||||
if (ftdi->type == TYPE_R)
|
||||
size = 0xa0;
|
||||
else
|
||||
size = value;
|
||||
ftdi_get_eeprom_buf(ftdi, buf, size);
|
||||
for (i=0; i < size; i += 16)
|
||||
{
|
||||
fprintf(stdout,"0x%03x:", i);
|
||||
|
||||
for (j = 0; j< 8; j++)
|
||||
fprintf(stdout," %02x", buf[i+j]);
|
||||
fprintf(stdout," ");
|
||||
for (; j< 16; j++)
|
||||
fprintf(stdout," %02x", buf[i+j]);
|
||||
fprintf(stdout," ");
|
||||
for (j = 0; j< 8; j++)
|
||||
fprintf(stdout,"%c", isprint(buf[i+j])?buf[i+j]:'.');
|
||||
fprintf(stdout," ");
|
||||
for (; j< 16; j++)
|
||||
fprintf(stdout,"%c", isprint(buf[i+j])?buf[i+j]:'.');
|
||||
fprintf(stdout,"\n");
|
||||
}
|
||||
|
||||
f = ftdi_eeprom_decode(ftdi, 1);
|
||||
if (f < 0)
|
||||
{
|
||||
fprintf(stderr, "ftdi_eeprom_decode: %d (%s)\n",
|
||||
f, ftdi_get_error_string(ftdi));
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
struct ftdi_context *ftdi;
|
||||
int f, i;
|
||||
int vid = 0;
|
||||
int pid = 0;
|
||||
char const *desc = 0;
|
||||
char const *serial = 0;
|
||||
int erase = 0;
|
||||
int use_defaults = 0;
|
||||
int large_chip = 0;
|
||||
int do_write = 0;
|
||||
int retval = 0;
|
||||
int value;
|
||||
|
||||
if ((ftdi = ftdi_new()) == 0)
|
||||
{
|
||||
fprintf(stderr, "Failed to allocate ftdi structure :%s \n",
|
||||
ftdi_get_error_string(ftdi));
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
while ((i = getopt(argc, argv, "d::ev:p:l:P:S:w")) != -1)
|
||||
{
|
||||
switch (i)
|
||||
{
|
||||
case 'd':
|
||||
use_defaults = 1;
|
||||
if (optarg)
|
||||
large_chip = 0x66;
|
||||
break;
|
||||
case 'e':
|
||||
erase = 1;
|
||||
break;
|
||||
case 'v':
|
||||
vid = strtoul(optarg, NULL, 0);
|
||||
break;
|
||||
case 'p':
|
||||
pid = strtoul(optarg, NULL, 0);
|
||||
break;
|
||||
case 'P':
|
||||
desc = optarg;
|
||||
break;
|
||||
case 'S':
|
||||
serial = optarg;
|
||||
break;
|
||||
case 'w':
|
||||
do_write = 1;
|
||||
break;
|
||||
default:
|
||||
fprintf(stderr, "usage: %s [options]\n", *argv);
|
||||
fprintf(stderr, "\t-d[num] Work with default valuesfor 128 Byte "
|
||||
"EEPROM or for 256 Byte EEPROM if some [num] is given\n");
|
||||
fprintf(stderr, "\t-w write\n");
|
||||
fprintf(stderr, "\t-e erase\n");
|
||||
fprintf(stderr, "\t-v verbose decoding\n");
|
||||
fprintf(stderr, "\t-p <number> Search for device with PID == number\n");
|
||||
fprintf(stderr, "\t-v <number> Search for device with VID == number\n");
|
||||
fprintf(stderr, "\t-P <string? Search for device with given "
|
||||
"product description\n");
|
||||
fprintf(stderr, "\t-S <string? Search for device with given "
|
||||
"serial number\n");
|
||||
retval = -1;
|
||||
goto done;
|
||||
}
|
||||
}
|
||||
|
||||
// Select first interface
|
||||
ftdi_set_interface(ftdi, INTERFACE_ANY);
|
||||
|
||||
if (!vid && !pid && desc == NULL && serial == NULL)
|
||||
{
|
||||
struct ftdi_device_list *devlist, *curdev;
|
||||
int res;
|
||||
if ((res = ftdi_usb_find_all(ftdi, &devlist, 0, 0)) < 0)
|
||||
{
|
||||
fprintf(stderr, "No FTDI with default VID/PID found\n");
|
||||
retval = EXIT_FAILURE;
|
||||
goto do_deinit;
|
||||
}
|
||||
if (res > 1)
|
||||
{
|
||||
int i = 1;
|
||||
fprintf(stderr, "%d FTDI devices found: Only Readout on EEPROM done. ",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)",
|
||||
i, ftdi_get_error_string(ftdi));
|
||||
continue;
|
||||
}
|
||||
fprintf(stderr, "Decoded values of device %d:\n", i);
|
||||
read_decode_eeprom(ftdi);
|
||||
ftdi_usb_close(ftdi);
|
||||
}
|
||||
ftdi_list_free(&devlist);
|
||||
retval = EXIT_SUCCESS;
|
||||
goto do_deinit;
|
||||
}
|
||||
else if (res == 1)
|
||||
{
|
||||
f = ftdi_usb_open_dev(ftdi, devlist[0].dev);
|
||||
if (f<0)
|
||||
{
|
||||
fprintf(stderr, "Unable to open device %d: (%s)",
|
||||
i, ftdi_get_error_string(ftdi));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf(stderr, "No devices found\n");
|
||||
f = 0;
|
||||
}
|
||||
ftdi_list_free(&devlist);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Open device
|
||||
f = ftdi_usb_open_desc(ftdi, vid, pid, desc, serial);
|
||||
if (f < 0)
|
||||
{
|
||||
fprintf(stderr, "Device VID 0x%04x PID 0x%04x", vid, pid);
|
||||
if (desc)
|
||||
fprintf(stderr, " Desc %s", desc);
|
||||
if (serial)
|
||||
fprintf(stderr, " Serial %s", serial);
|
||||
fprintf(stderr, "\n");
|
||||
fprintf(stderr, "unable to open ftdi device: %d (%s)\n",
|
||||
f, ftdi_get_error_string(ftdi));
|
||||
|
||||
retval = -1;
|
||||
goto done;
|
||||
}
|
||||
}
|
||||
if (erase)
|
||||
{
|
||||
f = ftdi_erase_eeprom(ftdi); /* needed to determine EEPROM chip type */
|
||||
if (f < 0)
|
||||
{
|
||||
fprintf(stderr, "Erase failed: %s",
|
||||
ftdi_get_error_string(ftdi));
|
||||
retval = -2;
|
||||
goto done;
|
||||
}
|
||||
if (ftdi_get_eeprom_value(ftdi, CHIP_TYPE, & value) <0)
|
||||
{
|
||||
fprintf(stderr, "ftdi_get_eeprom_value: %d (%s)\n",
|
||||
f, ftdi_get_error_string(ftdi));
|
||||
}
|
||||
if (value == -1)
|
||||
fprintf(stderr, "No EEPROM\n");
|
||||
else if (value == 0)
|
||||
fprintf(stderr, "Internal EEPROM\n");
|
||||
else
|
||||
fprintf(stderr, "Found 93x%02x\n", value);
|
||||
retval = 0;
|
||||
goto done;
|
||||
}
|
||||
|
||||
if (use_defaults)
|
||||
{
|
||||
ftdi_eeprom_initdefaults(ftdi, NULL, NULL, NULL);
|
||||
if (ftdi_set_eeprom_value(ftdi, MAX_POWER, 500) <0)
|
||||
{
|
||||
fprintf(stderr, "ftdi_set_eeprom_value: %d (%s)\n",
|
||||
f, ftdi_get_error_string(ftdi));
|
||||
}
|
||||
if (large_chip)
|
||||
if (ftdi_set_eeprom_value(ftdi, CHIP_TYPE, 0x66) <0)
|
||||
{
|
||||
fprintf(stderr, "ftdi_set_eeprom_value: %d (%s)\n",
|
||||
f, ftdi_get_error_string(ftdi));
|
||||
}
|
||||
f=(ftdi_eeprom_build(ftdi));
|
||||
if (f < 0)
|
||||
{
|
||||
fprintf(stderr, "ftdi_eeprom_build: %d (%s)\n",
|
||||
f, ftdi_get_error_string(ftdi));
|
||||
retval = -1;
|
||||
goto done;
|
||||
}
|
||||
}
|
||||
else if (do_write)
|
||||
{
|
||||
ftdi_eeprom_initdefaults(ftdi, NULL, NULL, NULL);
|
||||
f = ftdi_erase_eeprom(ftdi);
|
||||
if (ftdi_set_eeprom_value(ftdi, MAX_POWER, 500) <0)
|
||||
{
|
||||
fprintf(stderr, "ftdi_set_eeprom_value: %d (%s)\n",
|
||||
f, ftdi_get_error_string(ftdi));
|
||||
}
|
||||
f = ftdi_erase_eeprom(ftdi);/* needed to determine EEPROM chip type */
|
||||
if (ftdi_get_eeprom_value(ftdi, CHIP_TYPE, & value) <0)
|
||||
{
|
||||
fprintf(stderr, "ftdi_get_eeprom_value: %d (%s)\n",
|
||||
f, ftdi_get_error_string(ftdi));
|
||||
}
|
||||
if (value == -1)
|
||||
fprintf(stderr, "No EEPROM\n");
|
||||
else if (value == 0)
|
||||
fprintf(stderr, "Internal EEPROM\n");
|
||||
else
|
||||
fprintf(stderr, "Found 93x%02x\n", value);
|
||||
f=(ftdi_eeprom_build(ftdi));
|
||||
if (f < 0)
|
||||
{
|
||||
fprintf(stderr, "Erase failed: %s",
|
||||
ftdi_get_error_string(ftdi));
|
||||
retval = -2;
|
||||
goto done;
|
||||
}
|
||||
f = ftdi_write_eeprom(ftdi);
|
||||
{
|
||||
fprintf(stderr, "ftdi_eeprom_decode: %d (%s)\n",
|
||||
f, ftdi_get_error_string(ftdi));
|
||||
retval = 1;
|
||||
goto done;
|
||||
}
|
||||
}
|
||||
retval = read_decode_eeprom(ftdi);
|
||||
done:
|
||||
ftdi_usb_close(ftdi);
|
||||
do_deinit:
|
||||
ftdi_free(ftdi);
|
||||
return retval;
|
||||
}
|
@ -1,54 +0,0 @@
|
||||
/* find_all.c
|
||||
|
||||
Example for ftdi_usb_find_all()
|
||||
|
||||
This program is distributed under the GPL, version 2
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <ftdi.h>
|
||||
|
||||
int main(void)
|
||||
{
|
||||
int ret, i;
|
||||
struct ftdi_context *ftdi;
|
||||
struct ftdi_device_list *devlist, *curdev;
|
||||
char manufacturer[128], description[128];
|
||||
int retval = EXIT_SUCCESS;
|
||||
|
||||
if ((ftdi = ftdi_new()) == 0)
|
||||
{
|
||||
fprintf(stderr, "ftdi_new failed\n");
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
if ((ret = ftdi_usb_find_all(ftdi, &devlist, 0, 0)) < 0)
|
||||
{
|
||||
fprintf(stderr, "ftdi_usb_find_all failed: %d (%s)\n", ret, ftdi_get_error_string(ftdi));
|
||||
retval = EXIT_FAILURE;
|
||||
goto do_deinit;
|
||||
}
|
||||
|
||||
printf("Number of FTDI devices found: %d\n", ret);
|
||||
|
||||
i = 0;
|
||||
for (curdev = devlist; curdev != NULL; i++)
|
||||
{
|
||||
printf("Checking device: %d\n", i);
|
||||
if ((ret = ftdi_usb_get_strings(ftdi, curdev->dev, manufacturer, 128, description, 128, NULL, 0)) < 0)
|
||||
{
|
||||
fprintf(stderr, "ftdi_usb_get_strings failed: %d (%s)\n", ret, ftdi_get_error_string(ftdi));
|
||||
retval = EXIT_FAILURE;
|
||||
goto done;
|
||||
}
|
||||
printf("Manufacturer: %s, Description: %s\n\n", manufacturer, description);
|
||||
curdev = curdev->next;
|
||||
}
|
||||
done:
|
||||
ftdi_list_free(&devlist);
|
||||
do_deinit:
|
||||
ftdi_free(ftdi);
|
||||
|
||||
return retval;
|
||||
}
|
@ -1,71 +0,0 @@
|
||||
/* final_all_pp.cpp
|
||||
|
||||
Simple libftdi-cpp usage
|
||||
|
||||
This program is distributed under the GPL, version 2
|
||||
*/
|
||||
|
||||
#include "ftdi.hpp"
|
||||
#include <iostream>
|
||||
#include <iomanip>
|
||||
#include <cstdlib>
|
||||
#include <cstring>
|
||||
using namespace Ftdi;
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
// Show help
|
||||
if (argc > 1)
|
||||
{
|
||||
if (strcmp(argv[1],"-h") == 0 || strcmp(argv[1],"--help") == 0)
|
||||
{
|
||||
std::cout << "Usage: " << argv[0] << " [-v VENDOR_ID] [-p PRODUCT_ID]" << std::endl;
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
}
|
||||
|
||||
// Parse args
|
||||
int vid = 0x0403, pid = 0x6010, tmp = 0;
|
||||
for (int i = 0; i < (argc - 1); i++)
|
||||
{
|
||||
if (strcmp(argv[i], "-v") == 0)
|
||||
if ((tmp = strtol(argv[++i], 0, 16)) >= 0)
|
||||
vid = tmp;
|
||||
|
||||
if (strcmp(argv[i], "-p") == 0)
|
||||
if ((tmp = strtol(argv[++i], 0, 16)) >= 0)
|
||||
pid = tmp;
|
||||
}
|
||||
|
||||
// Print header
|
||||
std::cout << std::hex << std::showbase
|
||||
<< "Found devices ( VID: " << vid << ", PID: " << pid << " )"
|
||||
<< std::endl
|
||||
<< "------------------------------------------------"
|
||||
<< std::endl << std::dec;
|
||||
|
||||
// Print whole list
|
||||
List* list = List::find_all(vid, pid);
|
||||
for (List::iterator it = list->begin(); it != list->end(); it++)
|
||||
{
|
||||
std::cout << "FTDI (" << &*it << "): "
|
||||
<< it->vendor() << ", "
|
||||
<< it->description() << ", "
|
||||
<< it->serial();
|
||||
|
||||
// Open test
|
||||
if(it->open() == 0)
|
||||
std::cout << " (Open OK)";
|
||||
else
|
||||
std::cout << " (Open FAILED)";
|
||||
|
||||
it->close();
|
||||
|
||||
std::cout << std::endl;
|
||||
|
||||
}
|
||||
|
||||
delete list;
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
@ -1,101 +0,0 @@
|
||||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
"""Python example program.
|
||||
|
||||
Complete program to demonstrate the usage
|
||||
of the swig generated python wrapper
|
||||
|
||||
You need to build and install the wrapper first"""
|
||||
|
||||
import os
|
||||
import ftdi
|
||||
import time
|
||||
|
||||
# initialize
|
||||
ftdic = ftdi.new()
|
||||
if ftdic == 0:
|
||||
print 'new failed: %d', ret
|
||||
os._exit( 1 )
|
||||
|
||||
|
||||
# list all devices
|
||||
ret, devlist = ftdi.usb_find_all( ftdic, 0x0403, 0x6001 )
|
||||
if ret < 0:
|
||||
print 'ftdi_usb_find_all failed: %d (%s)' % ( ret, ftdi.get_error_string( ftdic ) )
|
||||
os._exit( 1 )
|
||||
print 'Number of FTDI devices found: %d\n' % ret
|
||||
curnode = devlist
|
||||
i = 0
|
||||
while( curnode != None ):
|
||||
ret, manufacturer, description, serial = ftdi.usb_get_strings( ftdic, curnode.dev )
|
||||
if ret < 0:
|
||||
print 'ftdi_usb_get_strings failed: %d (%s)' % ( ret, ftdi.get_error_string( ftdic ) )
|
||||
os._exit( 1 )
|
||||
print 'Device #%d: manufacturer="%s" description="%s" serial="%s"\n' % ( i, manufacturer, description, serial )
|
||||
curnode = curnode.next
|
||||
i += 1
|
||||
|
||||
# open usb
|
||||
ret = ftdi.usb_open( ftdic, 0x0403, 0x6001 )
|
||||
if ret < 0:
|
||||
print 'unable to open ftdi device: %d (%s)' % ( ret, ftdi.get_error_string( ftdic ) )
|
||||
os._exit( 1 )
|
||||
|
||||
|
||||
# bitbang
|
||||
ret = ftdi.set_bitmode( ftdic, 0xff, ftdi.BITMODE_BITBANG )
|
||||
if ret < 0:
|
||||
print 'Cannot enable bitbang'
|
||||
os._exit( 1 )
|
||||
print 'turning everything on'
|
||||
ftdi.write_data( ftdic, chr(0xff), 1 )
|
||||
time.sleep( 1 )
|
||||
print 'turning everything off\n'
|
||||
ftdi.write_data( ftdic, chr(0x00), 1 )
|
||||
time.sleep( 1 )
|
||||
for i in range( 8 ):
|
||||
val = 2**i
|
||||
print 'enabling bit #%d (0x%02x)' % (i, val)
|
||||
ftdi.write_data( ftdic, chr(val), 1 )
|
||||
time.sleep ( 1 )
|
||||
ftdi.disable_bitbang( ftdic )
|
||||
print ''
|
||||
|
||||
|
||||
# read pins
|
||||
ret, pins = ftdi.read_pins( ftdic )
|
||||
print 'pins:',
|
||||
if ( ret == 0 ):
|
||||
print '%02x' % ord( pins[0] )
|
||||
print ''
|
||||
|
||||
|
||||
# read chip id
|
||||
ret, chipid = ftdi.read_chipid( ftdic )
|
||||
print 'FDTI chip id: %X\n' % chipid
|
||||
|
||||
|
||||
# read eeprom
|
||||
eeprom_addr = 1
|
||||
ret, eeprom_val = ftdi.read_eeprom_location( ftdic, eeprom_addr )
|
||||
if (ret==0):
|
||||
print 'eeprom @ %d: 0x%04x\n' % ( eeprom_addr, eeprom_val )
|
||||
|
||||
print 'complete eeprom:'
|
||||
ret = ftdi.read_eeprom( ftdic )
|
||||
size = 128
|
||||
ret, eeprom = ftdi.get_eeprom_buf ( ftdic, size )
|
||||
if ( ret == 0 ):
|
||||
for i in range( size ):
|
||||
print '%02x' % ord( eeprom[i] ),
|
||||
if ( i % 8 == 7 ):
|
||||
print ''
|
||||
|
||||
|
||||
# close usb
|
||||
ret = ftdi.usb_close( ftdic )
|
||||
if ret < 0:
|
||||
print 'unable to close ftdi device: %d (%s)' % ( ret, ftdi.get_error_string( ftdic ) )
|
||||
os._exit( 1 )
|
||||
ftdi.free( ftdic )
|
@ -1,28 +0,0 @@
|
||||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
"""Python example program.
|
||||
|
||||
Small program to demonstrate the usage
|
||||
of the swig generated python wrapper
|
||||
|
||||
You need to build and install the wrapper first"""
|
||||
|
||||
import ftdi
|
||||
|
||||
def main():
|
||||
"""Main program"""
|
||||
context = ftdi.new()
|
||||
|
||||
version_info = ftdi.get_library_version()
|
||||
print("[FTDI version] major: %d, minor: %d, micro: %d" \
|
||||
", version_str: %s, snapshot_str: %s" %
|
||||
(version_info.major, version_info.minor, version_info.micro,
|
||||
version_info.version_str, version_info.snapshot_str))
|
||||
|
||||
print("ftdi.usb_open(): %d" % ftdi.usb_open(context, 0x0403, 0x6010))
|
||||
print("ftdi.set_baudrate(): %d" % ftdi.set_baudrate(context, 9600))
|
||||
|
||||
ftdi.free(context)
|
||||
|
||||
main()
|
@ -1,182 +0,0 @@
|
||||
/* serial_test.c
|
||||
|
||||
Read/write data via serial I/O
|
||||
|
||||
This program is distributed under the GPL, version 2
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#ifdef __WIN32__
|
||||
#define sleep(x) Sleep(x)
|
||||
#endif
|
||||
#include <getopt.h>
|
||||
#include <signal.h>
|
||||
#include <ftdi.h>
|
||||
|
||||
static int exitRequested = 0;
|
||||
/*
|
||||
* sigintHandler --
|
||||
*
|
||||
* SIGINT handler, so we can gracefully exit when the user hits ctrl-C.
|
||||
*/
|
||||
static void
|
||||
sigintHandler(int signum)
|
||||
{
|
||||
exitRequested = 1;
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
struct ftdi_context *ftdi;
|
||||
unsigned char buf[1024];
|
||||
int f = 0, i;
|
||||
int vid = 0x403;
|
||||
int pid = 0;
|
||||
int baudrate = 115200;
|
||||
int interface = INTERFACE_ANY;
|
||||
int do_write = 0;
|
||||
unsigned int pattern = 0xffff;
|
||||
int retval = EXIT_FAILURE;
|
||||
|
||||
while ((i = getopt(argc, argv, "i:v:p:b:w::")) != -1)
|
||||
{
|
||||
switch (i)
|
||||
{
|
||||
case 'i': // 0=ANY, 1=A, 2=B, 3=C, 4=D
|
||||
interface = strtoul(optarg, NULL, 0);
|
||||
break;
|
||||
case 'v':
|
||||
vid = strtoul(optarg, NULL, 0);
|
||||
break;
|
||||
case 'p':
|
||||
pid = strtoul(optarg, NULL, 0);
|
||||
break;
|
||||
case 'b':
|
||||
baudrate = strtoul(optarg, NULL, 0);
|
||||
break;
|
||||
case 'w':
|
||||
do_write = 1;
|
||||
if (optarg)
|
||||
pattern = strtoul(optarg, NULL, 0);
|
||||
if (pattern > 0xff)
|
||||
{
|
||||
fprintf(stderr, "Please provide a 8 bit pattern\n");
|
||||
exit(-1);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
fprintf(stderr, "usage: %s [-i interface] [-v vid] [-p pid] [-b baudrate] [-w [pattern]]\n", *argv);
|
||||
exit(-1);
|
||||
}
|
||||
}
|
||||
|
||||
// Init
|
||||
if ((ftdi = ftdi_new()) == 0)
|
||||
{
|
||||
fprintf(stderr, "ftdi_new failed\n");
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
if (!vid && !pid && (interface == INTERFACE_ANY))
|
||||
{
|
||||
ftdi_set_interface(ftdi, INTERFACE_ANY);
|
||||
struct ftdi_device_list *devlist;
|
||||
int res;
|
||||
if ((res = ftdi_usb_find_all(ftdi, &devlist, 0, 0)) < 0)
|
||||
{
|
||||
fprintf(stderr, "No FTDI with default VID/PID found\n");
|
||||
goto do_deinit;
|
||||
}
|
||||
if (res == 1)
|
||||
{
|
||||
f = ftdi_usb_open_dev(ftdi, devlist[0].dev);
|
||||
if (f<0)
|
||||
{
|
||||
fprintf(stderr, "Unable to open device %d: (%s)",
|
||||
i, ftdi_get_error_string(ftdi));
|
||||
}
|
||||
}
|
||||
ftdi_list_free(&devlist);
|
||||
if (res > 1)
|
||||
{
|
||||
fprintf(stderr, "%d Devices found, please select Device with VID/PID\n", res);
|
||||
/* TODO: List Devices*/
|
||||
goto do_deinit;
|
||||
}
|
||||
if (res == 0)
|
||||
{
|
||||
fprintf(stderr, "No Devices found with default VID/PID\n");
|
||||
goto do_deinit;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Select interface
|
||||
ftdi_set_interface(ftdi, interface);
|
||||
|
||||
// Open device
|
||||
f = ftdi_usb_open(ftdi, vid, pid);
|
||||
}
|
||||
if (f < 0)
|
||||
{
|
||||
fprintf(stderr, "unable to open ftdi device: %d (%s)\n", f, ftdi_get_error_string(ftdi));
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
// Set baudrate
|
||||
f = ftdi_set_baudrate(ftdi, baudrate);
|
||||
if (f < 0)
|
||||
{
|
||||
fprintf(stderr, "unable to set baudrate: %d (%s)\n", f, ftdi_get_error_string(ftdi));
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
/* Set line parameters
|
||||
*
|
||||
* TODO: Make these parameters settable from the command line
|
||||
*
|
||||
* Parameters are choosen that sending a continous stream of 0x55
|
||||
* should give a square wave
|
||||
*
|
||||
*/
|
||||
f = ftdi_set_line_property(ftdi, 8, STOP_BIT_1, NONE);
|
||||
if (f < 0)
|
||||
{
|
||||
fprintf(stderr, "unable to set line parameters: %d (%s)\n", f, ftdi_get_error_string(ftdi));
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
if (do_write)
|
||||
for(i=0; i<1024; i++)
|
||||
buf[i] = pattern;
|
||||
|
||||
signal(SIGINT, sigintHandler);
|
||||
while (!exitRequested)
|
||||
{
|
||||
if (do_write)
|
||||
f = ftdi_write_data(ftdi, buf,
|
||||
(baudrate/512 >sizeof(buf))?sizeof(buf):
|
||||
(baudrate/512)?baudrate/512:1);
|
||||
else
|
||||
f = ftdi_read_data(ftdi, buf, sizeof(buf));
|
||||
if (f<0)
|
||||
sleep(1);
|
||||
else if(f> 0 && !do_write)
|
||||
{
|
||||
fprintf(stderr, "read %d bytes\n", f);
|
||||
fwrite(buf, f, 1, stdout);
|
||||
fflush(stderr);
|
||||
fflush(stdout);
|
||||
}
|
||||
}
|
||||
signal(SIGINT, SIG_DFL);
|
||||
retval = EXIT_SUCCESS;
|
||||
|
||||
ftdi_usb_close(ftdi);
|
||||
do_deinit:
|
||||
ftdi_free(ftdi);
|
||||
|
||||
return retval;
|
||||
}
|
@ -1,53 +0,0 @@
|
||||
/* simple.c
|
||||
|
||||
Simple libftdi usage example
|
||||
|
||||
This program is distributed under the GPL, version 2
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <ftdi.h>
|
||||
|
||||
int main(void)
|
||||
{
|
||||
int ret;
|
||||
struct ftdi_context *ftdi;
|
||||
struct ftdi_version_info version;
|
||||
if ((ftdi = ftdi_new()) == 0)
|
||||
{
|
||||
fprintf(stderr, "ftdi_new failed\n");
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
version = ftdi_get_library_version();
|
||||
printf("Initialized libftdi %s (major: %d, minor: %d, micro: %d, snapshot ver: %s)\n",
|
||||
version.version_str, version.major, version.minor, version.micro,
|
||||
version.snapshot_str);
|
||||
|
||||
if ((ret = ftdi_usb_open(ftdi, 0x0403, 0x6001)) < 0)
|
||||
{
|
||||
fprintf(stderr, "unable to open ftdi device: %d (%s)\n", ret, ftdi_get_error_string(ftdi));
|
||||
ftdi_free(ftdi);
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
// Read out FTDIChip-ID of R type chips
|
||||
if (ftdi->type == TYPE_R)
|
||||
{
|
||||
unsigned int chipid;
|
||||
printf("ftdi_read_chipid: %d\n", ftdi_read_chipid(ftdi, &chipid));
|
||||
printf("FTDI chipid: %X\n", chipid);
|
||||
}
|
||||
|
||||
if ((ret = ftdi_usb_close(ftdi)) < 0)
|
||||
{
|
||||
fprintf(stderr, "unable to close ftdi device: %d (%s)\n", ret, ftdi_get_error_string(ftdi));
|
||||
ftdi_free(ftdi);
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
ftdi_free(ftdi);
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
@ -1,358 +0,0 @@
|
||||
/* stream_test.c
|
||||
*
|
||||
* Test reading from FT2232H in synchronous FIFO mode.
|
||||
*
|
||||
* The FT2232H must supply data due to an appropriate circuit
|
||||
*
|
||||
* To check for skipped block with appended code,
|
||||
* a structure as follows is assumed
|
||||
* 1* uint32_t num (incremented in 0x4000 steps)
|
||||
* 3* uint32_t dont_care
|
||||
*
|
||||
* After start, data will be read in streaming until the program is aborted
|
||||
* Progess information wil be printed out
|
||||
* If a filename is given on the command line, the data read will be
|
||||
* written to that file
|
||||
*
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <getopt.h>
|
||||
#include <signal.h>
|
||||
#include <errno.h>
|
||||
#include <ftdi.h>
|
||||
void check_outfile(char *);
|
||||
|
||||
static FILE *outputFile;
|
||||
|
||||
static int check = 1;
|
||||
static int exitRequested = 0;
|
||||
/*
|
||||
* sigintHandler --
|
||||
*
|
||||
* SIGINT handler, so we can gracefully exit when the user hits ctrl-C.
|
||||
*/
|
||||
|
||||
static void
|
||||
sigintHandler(int signum)
|
||||
{
|
||||
exitRequested = 1;
|
||||
}
|
||||
|
||||
static void
|
||||
usage(const char *argv0)
|
||||
{
|
||||
fprintf(stderr,
|
||||
"Usage: %s [options...] \n"
|
||||
"Test streaming read from FT2232H\n"
|
||||
"[-P string] only look for product with given string\n"
|
||||
"[-n] don't check for special block structure\n"
|
||||
"\n"
|
||||
"If some filename is given, write data read to that file\n"
|
||||
"Progess information is printed each second\n"
|
||||
"Abort with ^C\n"
|
||||
"\n"
|
||||
"Options:\n"
|
||||
"\n"
|
||||
"Copyright (C) 2009 Micah Dowty <micah@navi.cx>\n"
|
||||
"Adapted for use with libftdi (C) 2010 Uwe Bonnes <bon@elektron.ikp.physik.tu-darmstadt.de>\n",
|
||||
argv0);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
static uint32_t start = 0;
|
||||
static uint32_t offset = 0;
|
||||
static uint64_t blocks = 0;
|
||||
static uint32_t skips = 0;
|
||||
static uint32_t n_err = 0;
|
||||
static int
|
||||
readCallback(uint8_t *buffer, int length, FTDIProgressInfo *progress, void *userdata)
|
||||
{
|
||||
if (length)
|
||||
{
|
||||
if (check)
|
||||
{
|
||||
int i,rem;
|
||||
uint32_t num;
|
||||
for (i= offset; i<length-16; i+=16)
|
||||
{
|
||||
num = *(uint32_t*) (buffer+i);
|
||||
if (start && (num != start +0x4000))
|
||||
{
|
||||
uint32_t delta = ((num-start)/0x4000)-1;
|
||||
fprintf(stderr, "Skip %7d blocks from 0x%08x to 0x%08x at blocks %10llu\n",
|
||||
delta, start -0x4000, num, (unsigned long long)blocks);
|
||||
n_err++;
|
||||
skips += delta;
|
||||
}
|
||||
blocks ++;
|
||||
start = num;
|
||||
}
|
||||
rem = length -i;
|
||||
if (rem >3)
|
||||
{
|
||||
num = *(uint32_t*) (buffer+i);
|
||||
if (start && (num != start +0x4000))
|
||||
{
|
||||
uint32_t delta = ((num-start)/0x4000)-1;
|
||||
fprintf(stderr, "Skip %7d blocks from 0x%08x to 0x%08x at blocks %10llu\n",
|
||||
delta, start -0x4000, num, (unsigned long long) blocks);
|
||||
n_err++;
|
||||
skips += delta;
|
||||
}
|
||||
start = num;
|
||||
}
|
||||
else if (rem)
|
||||
start += 0x4000;
|
||||
if (rem != 0)
|
||||
{
|
||||
blocks ++;
|
||||
offset = 16-rem;
|
||||
}
|
||||
}
|
||||
if (outputFile)
|
||||
{
|
||||
if (fwrite(buffer, length, 1, outputFile) != 1)
|
||||
{
|
||||
perror("Write error");
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (progress)
|
||||
{
|
||||
fprintf(stderr, "%10.02fs total time %9.3f MiB captured %7.1f kB/s curr rate %7.1f kB/s totalrate %d dropouts\n",
|
||||
progress->totalTime,
|
||||
progress->current.totalBytes / (1024.0 * 1024.0),
|
||||
progress->currentRate / 1024.0,
|
||||
progress->totalRate / 1024.0,
|
||||
n_err);
|
||||
}
|
||||
return exitRequested ? 1 : 0;
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
struct ftdi_context *ftdi;
|
||||
int err, c;
|
||||
FILE *of = NULL;
|
||||
char const *outfile = 0;
|
||||
outputFile =0;
|
||||
exitRequested = 0;
|
||||
char *descstring = NULL;
|
||||
int option_index;
|
||||
static struct option long_options[] = {{NULL},};
|
||||
|
||||
while ((c = getopt_long(argc, argv, "P:n", long_options, &option_index)) !=- 1)
|
||||
switch (c)
|
||||
{
|
||||
case -1:
|
||||
break;
|
||||
case 'P':
|
||||
descstring = optarg;
|
||||
break;
|
||||
case 'n':
|
||||
check = 0;
|
||||
break;
|
||||
default:
|
||||
usage(argv[0]);
|
||||
}
|
||||
|
||||
if (optind == argc - 1)
|
||||
{
|
||||
// Exactly one extra argument- a dump file
|
||||
outfile = argv[optind];
|
||||
}
|
||||
else if (optind < argc)
|
||||
{
|
||||
// Too many extra args
|
||||
usage(argv[0]);
|
||||
}
|
||||
|
||||
if ((ftdi = ftdi_new()) == 0)
|
||||
{
|
||||
fprintf(stderr, "ftdi_new failed\n");
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
if (ftdi_set_interface(ftdi, INTERFACE_A) < 0)
|
||||
{
|
||||
fprintf(stderr, "ftdi_set_interface failed\n");
|
||||
ftdi_free(ftdi);
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
if (ftdi_usb_open_desc(ftdi, 0x0403, 0x6010, descstring, NULL) < 0)
|
||||
{
|
||||
fprintf(stderr,"Can't open ftdi device: %s\n",ftdi_get_error_string(ftdi));
|
||||
ftdi_free(ftdi);
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
/* A timeout value of 1 results in may skipped blocks */
|
||||
if(ftdi_set_latency_timer(ftdi, 2))
|
||||
{
|
||||
fprintf(stderr,"Can't set latency, Error %s\n",ftdi_get_error_string(ftdi));
|
||||
ftdi_usb_close(ftdi);
|
||||
ftdi_free(ftdi);
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
/* if(ftdi_usb_purge_rx_buffer(ftdi) < 0)
|
||||
{
|
||||
fprintf(stderr,"Can't rx purge\n",ftdi_get_error_string(ftdi));
|
||||
return EXIT_FAILURE;
|
||||
}*/
|
||||
if (outfile)
|
||||
if ((of = fopen(outfile,"w+")) == 0)
|
||||
fprintf(stderr,"Can't open logfile %s, Error %s\n", outfile, strerror(errno));
|
||||
if (of)
|
||||
if (setvbuf(of, NULL, _IOFBF , 1<<16) == 0)
|
||||
outputFile = of;
|
||||
signal(SIGINT, sigintHandler);
|
||||
|
||||
err = ftdi_readstream(ftdi, readCallback, NULL, 8, 256);
|
||||
if (err < 0 && !exitRequested)
|
||||
exit(1);
|
||||
|
||||
if (outputFile) {
|
||||
fclose(outputFile);
|
||||
outputFile = NULL;
|
||||
}
|
||||
fprintf(stderr, "Capture ended.\n");
|
||||
|
||||
if (ftdi_set_bitmode(ftdi, 0xff, BITMODE_RESET) < 0)
|
||||
{
|
||||
fprintf(stderr,"Can't set synchronous fifo mode, Error %s\n",ftdi_get_error_string(ftdi));
|
||||
ftdi_usb_close(ftdi);
|
||||
ftdi_free(ftdi);
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
ftdi_usb_close(ftdi);
|
||||
ftdi_free(ftdi);
|
||||
signal(SIGINT, SIG_DFL);
|
||||
if (check && outfile)
|
||||
{
|
||||
if ((outputFile = fopen(outfile,"r")) == 0)
|
||||
{
|
||||
fprintf(stderr,"Can't open logfile %s, Error %s\n", outfile, strerror(errno));
|
||||
ftdi_usb_close(ftdi);
|
||||
ftdi_free(ftdi);
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
check_outfile(descstring);
|
||||
fclose(outputFile);
|
||||
}
|
||||
else if (check)
|
||||
fprintf(stderr,"%d errors of %llu blocks (%Le), %d (%Le) blocks skipped\n",
|
||||
n_err, (unsigned long long) blocks, (long double)n_err/(long double) blocks,
|
||||
skips, (long double)skips/(long double) blocks);
|
||||
exit (0);
|
||||
}
|
||||
|
||||
void check_outfile(char *descstring)
|
||||
{
|
||||
if(strcmp(descstring,"FT2232HTEST") == 0)
|
||||
{
|
||||
char buf0[1024];
|
||||
char buf1[1024];
|
||||
char bufr[1024];
|
||||
char *pa, *pb, *pc;
|
||||
unsigned int num_lines = 0, line_num = 1;
|
||||
int err_count = 0;
|
||||
unsigned int num_start, num_end;
|
||||
|
||||
pa = buf0;
|
||||
pb = buf1;
|
||||
pc = buf0;
|
||||
if(fgets(pa, 1023, outputFile) == NULL)
|
||||
{
|
||||
fprintf(stderr,"Empty output file\n");
|
||||
return;
|
||||
}
|
||||
while(fgets(pb, 1023, outputFile) != NULL)
|
||||
{
|
||||
num_lines++;
|
||||
unsigned int num_save = num_start;
|
||||
if( sscanf(pa,"%6u%94s%6u",&num_start, bufr,&num_end) !=3)
|
||||
{
|
||||
fprintf(stdout,"Format doesn't match at line %8d \"%s",
|
||||
num_lines, pa);
|
||||
err_count++;
|
||||
line_num = num_save +2;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((num_start+1)%100000 != num_end)
|
||||
{
|
||||
if (err_count < 20)
|
||||
fprintf(stdout,"Malformed line %d \"%s\"\n",
|
||||
num_lines, pa);
|
||||
err_count++;
|
||||
}
|
||||
else if(num_start != line_num)
|
||||
{
|
||||
if (err_count < 20)
|
||||
fprintf(stdout,"Skipping from %d to %d\n",
|
||||
line_num, num_start);
|
||||
err_count++;
|
||||
|
||||
}
|
||||
line_num = num_end;
|
||||
}
|
||||
pa = pb;
|
||||
pb = pc;
|
||||
pc = pa;
|
||||
}
|
||||
if(err_count)
|
||||
fprintf(stdout,"\n%d errors of %d data sets %f\n", err_count, num_lines, (double) err_count/(double)num_lines);
|
||||
else
|
||||
fprintf(stdout,"No errors for %d lines\n",num_lines);
|
||||
}
|
||||
else if(strcmp(descstring,"LLBBC10") == 0)
|
||||
{
|
||||
uint32_t block0[4];
|
||||
uint32_t block1[4];
|
||||
uint32_t *pa = block0;
|
||||
uint32_t *pb = block1;
|
||||
uint32_t *pc = block0;
|
||||
uint32_t start= 0;
|
||||
uint32_t nread = 0;
|
||||
int n_shown = 0;
|
||||
int n_errors = 0;
|
||||
if (fread(pa, sizeof(uint32_t), 4,outputFile) < 4)
|
||||
{
|
||||
fprintf(stderr,"Empty result file\n");
|
||||
return;
|
||||
}
|
||||
while(fread(pb, sizeof(uint32_t), 4,outputFile) != 0)
|
||||
{
|
||||
blocks++;
|
||||
nread = pa[0];
|
||||
if(start>0 && (nread != start))
|
||||
{
|
||||
if(n_shown < 30)
|
||||
{
|
||||
fprintf(stderr, "Skip %7d blocks from 0x%08x to 0x%08x at blocks %10llu \n",
|
||||
(nread-start)/0x4000, start -0x4000, nread, (unsigned long long) blocks);
|
||||
n_shown ++;
|
||||
}
|
||||
n_errors++;
|
||||
}
|
||||
else if (n_shown >0)
|
||||
n_shown--;
|
||||
start = nread + 0x4000;
|
||||
pa = pb;
|
||||
pb = pc;
|
||||
pc = pa;
|
||||
}
|
||||
if(n_errors)
|
||||
fprintf(stderr, "%d blocks wrong from %llu blocks read\n",
|
||||
n_errors, (unsigned long long) blocks);
|
||||
else
|
||||
fprintf(stderr, "%llu blocks all fine\n", (unsigned long long) blocks);
|
||||
}
|
||||
}
|
@ -1,41 +0,0 @@
|
||||
set(FTDI_BUILD_EEPROM False PARENT_SCOPE)
|
||||
|
||||
option(FTDI_EEPROM "Build ftdi_eeprom" ON)
|
||||
|
||||
if (FTDI_EEPROM)
|
||||
include(FindPkgConfig)
|
||||
pkg_check_modules(Confuse libconfuse)
|
||||
INCLUDE_DIRECTORIES(${Confuse_INCLUDE_DIRS})
|
||||
LINK_DIRECTORIES(${Confuse_LIBRARY_DIRS})
|
||||
SET(libs ${libs} ${Confuse_LIBRARIES})
|
||||
|
||||
if(Confuse_FOUND)
|
||||
set(FTDI_BUILD_EEPROM True PARENT_SCOPE)
|
||||
message(STATUS "Building ftdi_eeprom")
|
||||
|
||||
# Version defines
|
||||
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_BINARY_DIR}/ftdi_eeprom)
|
||||
|
||||
configure_file(
|
||||
"ftdi_eeprom_version.h.in"
|
||||
"${CMAKE_BINARY_DIR}/ftdi_eeprom/ftdi_eeprom_version.h"
|
||||
)
|
||||
|
||||
add_executable(ftdi_eeprom main.c)
|
||||
target_link_libraries(ftdi_eeprom ftdi)
|
||||
target_link_libraries(ftdi_eeprom ${Confuse_LIBRARIES})
|
||||
|
||||
else(Confuse_FOUND)
|
||||
message(STATUS "libConfuse not found, won't build ftdi_eeprom")
|
||||
endif(Confuse_FOUND)
|
||||
|
||||
else(FTDI_EEPROM)
|
||||
|
||||
message(STATUS "ftdi_eeprom build is disabled")
|
||||
|
||||
endif(FTDI_EEPROM)
|
@ -1,31 +0,0 @@
|
||||
vendor_id=0x0403 # Vendor ID
|
||||
product_id=0x6001 # Product ID
|
||||
|
||||
max_power=0 # Max. power consumption: value * 2 mA. Use 0 if self_powered = true.
|
||||
|
||||
###########
|
||||
# Strings #
|
||||
###########
|
||||
manufacturer="ACME Inc" # Manufacturer
|
||||
product="USB Serial Converter" # Product
|
||||
serial="08-15" # Serial
|
||||
|
||||
###########
|
||||
# Options #
|
||||
###########
|
||||
self_powered=true # Turn this off for bus powered
|
||||
remote_wakeup=false # Turn this on for remote wakeup feature
|
||||
use_serial=true # Use the serial number string
|
||||
|
||||
# Normally out don't have to change one of these flags
|
||||
in_is_isochronous=false # In Endpoint is Isochronous
|
||||
out_is_isochronous=false # Out Endpoint is Isochronous
|
||||
suspend_pull_downs=false # Enable suspend pull downs for lower power
|
||||
change_usb_version=false # Change USB Version
|
||||
usb_version=0x0200 # Only used when change_usb_version is enabled
|
||||
|
||||
########
|
||||
# Misc #
|
||||
########
|
||||
|
||||
filename="eeprom.new" # Filename, leave empty to skip file writing
|
@ -1,8 +0,0 @@
|
||||
#ifndef _FTDI_EEPROM_VERSION_H
|
||||
#define _FTDI_EEPROM_VERSION_H
|
||||
|
||||
#define EEPROM_MAJOR_VERSION @EEPROM_MAJOR_VERSION@
|
||||
#define EEPROM_MINOR_VERSION @EEPROM_MINOR_VERSION@
|
||||
#define EEPROM_VERSION_STRING "@EEPROM_VERSION_STRING@"
|
||||
|
||||
#endif
|
@ -1,381 +0,0 @@
|
||||
/***************************************************************************
|
||||
main.c - description
|
||||
-------------------
|
||||
begin : Mon Apr 7 12:05:22 CEST 2003
|
||||
copyright : (C) 2003-2011 by Intra2net AG and the libftdi developers
|
||||
email : opensource@intra2net.com
|
||||
***************************************************************************/
|
||||
|
||||
/***************************************************************************
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU General Public License version 2 as *
|
||||
* published by the Free Software Foundation. *
|
||||
* *
|
||||
***************************************************************************/
|
||||
|
||||
/*
|
||||
TODO:
|
||||
- Remove 128 bytes limit
|
||||
- Merge Uwe's eeprom tool. Current features:
|
||||
- Init eeprom defaults based upon eeprom type
|
||||
- Read -> Already there
|
||||
- Write -> Already there
|
||||
- Erase -> Already there
|
||||
- Decode on stdout
|
||||
- Ability to find device by PID/VID, product name or serial
|
||||
|
||||
TODO nice-to-have:
|
||||
- Out-of-the-box compatibility with FTDI's eeprom tool configuration files
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <confuse.h>
|
||||
#include <ftdi.h>
|
||||
#include <ftdi_eeprom_version.h>
|
||||
|
||||
static int str_to_cbus(char *str, int max_allowed)
|
||||
{
|
||||
#define MAX_OPTION 14
|
||||
const char* options[MAX_OPTION] = {
|
||||
"TXDEN", "PWREN", "RXLED", "TXLED", "TXRXLED", "SLEEP",
|
||||
"CLK48", "CLK24", "CLK12", "CLK6",
|
||||
"IO_MODE", "BITBANG_WR", "BITBANG_RD", "SPECIAL"};
|
||||
int i;
|
||||
max_allowed += 1;
|
||||
if (max_allowed > MAX_OPTION) max_allowed = MAX_OPTION;
|
||||
for (i=0; i<max_allowed; i++) {
|
||||
if (!(strcmp(options[i], str))) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
printf("WARNING: Invalid cbus option '%s'\n", str);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Set eeprom value
|
||||
*
|
||||
* \param ftdi pointer to ftdi_context
|
||||
* \param value_name Enum of the value to set
|
||||
* \param value Value to set
|
||||
*
|
||||
* Function will abort the program on error
|
||||
**/
|
||||
static void eeprom_set_value(struct ftdi_context *ftdi, enum ftdi_eeprom_value value_name, int value)
|
||||
{
|
||||
if (ftdi_set_eeprom_value(ftdi, value_name, value) < 0)
|
||||
{
|
||||
printf("Unable to set eeprom value %d: %s. Aborting\n", value_name, ftdi_get_error_string(ftdi));
|
||||
exit (-1);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Get eeprom value
|
||||
*
|
||||
* \param ftdi pointer to ftdi_context
|
||||
* \param value_name Enum of the value to get
|
||||
* \param value Value to get
|
||||
*
|
||||
* Function will abort the program on error
|
||||
**/
|
||||
static void eeprom_get_value(struct ftdi_context *ftdi, enum ftdi_eeprom_value value_name, int *value)
|
||||
{
|
||||
if (ftdi_get_eeprom_value(ftdi, value_name, value) < 0)
|
||||
{
|
||||
printf("Unable to get eeprom value %d: %s. Aborting\n", value_name, ftdi_get_error_string(ftdi));
|
||||
exit (-1);
|
||||
}
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
/*
|
||||
configuration options
|
||||
*/
|
||||
cfg_opt_t opts[] =
|
||||
{
|
||||
CFG_INT("vendor_id", 0, 0),
|
||||
CFG_INT("product_id", 0, 0),
|
||||
CFG_BOOL("self_powered", cfg_true, 0),
|
||||
CFG_BOOL("remote_wakeup", cfg_true, 0),
|
||||
CFG_BOOL("in_is_isochronous", cfg_false, 0),
|
||||
CFG_BOOL("out_is_isochronous", cfg_false, 0),
|
||||
CFG_BOOL("suspend_pull_downs", cfg_false, 0),
|
||||
CFG_BOOL("use_serial", cfg_false, 0),
|
||||
CFG_BOOL("change_usb_version", cfg_false, 0),
|
||||
CFG_INT("usb_version", 0, 0),
|
||||
CFG_INT("default_pid", 0x6001, 0),
|
||||
CFG_INT("max_power", 0, 0),
|
||||
CFG_STR("manufacturer", "Acme Inc.", 0),
|
||||
CFG_STR("product", "USB Serial Converter", 0),
|
||||
CFG_STR("serial", "08-15", 0),
|
||||
CFG_STR("filename", "", 0),
|
||||
CFG_BOOL("flash_raw", cfg_false, 0),
|
||||
CFG_BOOL("high_current", cfg_false, 0),
|
||||
CFG_STR_LIST("cbus0", "{TXDEN,PWREN,RXLED,TXLED,TXRXLED,SLEEP,CLK48,CLK24,CLK12,CLK6,IO_MODE,BITBANG_WR,BITBANG_RD,SPECIAL}", 0),
|
||||
CFG_STR_LIST("cbus1", "{TXDEN,PWREN,RXLED,TXLED,TXRXLED,SLEEP,CLK48,CLK24,CLK12,CLK6,IO_MODE,BITBANG_WR,BITBANG_RD,SPECIAL}", 0),
|
||||
CFG_STR_LIST("cbus2", "{TXDEN,PWREN,RXLED,TXLED,TXRXLED,SLEEP,CLK48,CLK24,CLK12,CLK6,IO_MODE,BITBANG_WR,BITBANG_RD,SPECIAL}", 0),
|
||||
CFG_STR_LIST("cbus3", "{TXDEN,PWREN,RXLED,TXLED,TXRXLED,SLEEP,CLK48,CLK24,CLK12,CLK6,IO_MODE,BITBANG_WR,BITBANG_RD,SPECIAL}", 0),
|
||||
CFG_STR_LIST("cbus4", "{TXDEN,PWRON,RXLED,TXLED,TX_RX_LED,SLEEP,CLK48,CLK24,CLK12,CLK6}", 0),
|
||||
CFG_BOOL("invert_txd", cfg_false, 0),
|
||||
CFG_BOOL("invert_rxd", cfg_false, 0),
|
||||
CFG_BOOL("invert_rts", cfg_false, 0),
|
||||
CFG_BOOL("invert_cts", cfg_false, 0),
|
||||
CFG_BOOL("invert_dtr", cfg_false, 0),
|
||||
CFG_BOOL("invert_dsr", cfg_false, 0),
|
||||
CFG_BOOL("invert_dcd", cfg_false, 0),
|
||||
CFG_BOOL("invert_ri", cfg_false, 0),
|
||||
CFG_END()
|
||||
};
|
||||
cfg_t *cfg;
|
||||
|
||||
/*
|
||||
normal variables
|
||||
*/
|
||||
int _read = 0, _erase = 0, _flash = 0;
|
||||
|
||||
int my_eeprom_size = 0;
|
||||
unsigned char *eeprom_buf = NULL;
|
||||
char *filename;
|
||||
int size_check;
|
||||
int i, argc_filename;
|
||||
FILE *fp;
|
||||
|
||||
struct ftdi_context *ftdi = NULL;
|
||||
|
||||
printf("\nFTDI eeprom generator v%s\n", EEPROM_VERSION_STRING);
|
||||
printf ("(c) Intra2net AG and the libftdi developers <opensource@intra2net.com>\n");
|
||||
|
||||
if (argc != 2 && argc != 3)
|
||||
{
|
||||
printf("Syntax: %s [commands] config-file\n", argv[0]);
|
||||
printf("Valid commands:\n");
|
||||
printf("--read-eeprom Read eeprom and write to -filename- from config-file\n");
|
||||
printf("--erase-eeprom Erase eeprom\n");
|
||||
printf("--flash-eeprom Flash eeprom\n");
|
||||
exit (-1);
|
||||
}
|
||||
|
||||
if (argc == 3)
|
||||
{
|
||||
if (strcmp(argv[1], "--read-eeprom") == 0)
|
||||
_read = 1;
|
||||
else if (strcmp(argv[1], "--erase-eeprom") == 0)
|
||||
_erase = 1;
|
||||
else if (strcmp(argv[1], "--flash-eeprom") == 0)
|
||||
_flash = 1;
|
||||
else
|
||||
{
|
||||
printf ("Can't open configuration file\n");
|
||||
exit (-1);
|
||||
}
|
||||
argc_filename = 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
argc_filename = 1;
|
||||
}
|
||||
|
||||
if ((fp = fopen(argv[argc_filename], "r")) == NULL)
|
||||
{
|
||||
printf ("Can't open configuration file\n");
|
||||
exit (-1);
|
||||
}
|
||||
fclose (fp);
|
||||
|
||||
cfg = cfg_init(opts, 0);
|
||||
cfg_parse(cfg, argv[argc_filename]);
|
||||
filename = cfg_getstr(cfg, "filename");
|
||||
|
||||
if (cfg_getbool(cfg, "self_powered") && cfg_getint(cfg, "max_power") > 0)
|
||||
printf("Hint: Self powered devices should have a max_power setting of 0.\n");
|
||||
|
||||
if ((ftdi = ftdi_new()) == 0)
|
||||
{
|
||||
fprintf(stderr, "Failed to allocate ftdi structure :%s \n",
|
||||
ftdi_get_error_string(ftdi));
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
if (_read > 0 || _erase > 0 || _flash > 0)
|
||||
{
|
||||
int vendor_id = cfg_getint(cfg, "vendor_id");
|
||||
int product_id = cfg_getint(cfg, "product_id");
|
||||
|
||||
i = ftdi_usb_open(ftdi, vendor_id, product_id);
|
||||
|
||||
if (i != 0)
|
||||
{
|
||||
int default_pid = cfg_getint(cfg, "default_pid");
|
||||
printf("Unable to find FTDI devices under given vendor/product id: 0x%X/0x%X\n", vendor_id, product_id);
|
||||
printf("Error code: %d (%s)\n", i, ftdi_get_error_string(ftdi));
|
||||
printf("Retrying with default FTDI pid=%#04x.\n", default_pid);
|
||||
|
||||
i = ftdi_usb_open(ftdi, 0x0403, default_pid);
|
||||
if (i != 0)
|
||||
{
|
||||
printf("Error: %s\n", ftdi->error_str);
|
||||
exit (-1);
|
||||
}
|
||||
}
|
||||
}
|
||||
ftdi_eeprom_initdefaults (ftdi, cfg_getstr(cfg, "manufacturer"),
|
||||
cfg_getstr(cfg, "product"),
|
||||
cfg_getstr(cfg, "serial"));
|
||||
|
||||
printf("FTDI read eeprom: %d\n", ftdi_read_eeprom(ftdi));
|
||||
eeprom_get_value(ftdi, CHIP_SIZE, &my_eeprom_size);
|
||||
// TODO: Do we know the eeprom size already?
|
||||
printf("EEPROM size: %d\n", my_eeprom_size);
|
||||
|
||||
if (_read > 0)
|
||||
{
|
||||
ftdi_eeprom_decode(ftdi, 0 /* debug: 1 */);
|
||||
|
||||
eeprom_buf = malloc(my_eeprom_size);
|
||||
ftdi_get_eeprom_buf(ftdi, eeprom_buf, my_eeprom_size);
|
||||
|
||||
if (eeprom_buf == NULL)
|
||||
{
|
||||
fprintf(stderr, "Malloc failed, aborting\n");
|
||||
goto cleanup;
|
||||
}
|
||||
if (filename != NULL && strlen(filename) > 0)
|
||||
{
|
||||
|
||||
FILE *fp = fopen (filename, "wb");
|
||||
fwrite (eeprom_buf, 1, my_eeprom_size, fp);
|
||||
fclose (fp);
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("Warning: Not writing eeprom, you must supply a valid filename\n");
|
||||
}
|
||||
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
eeprom_set_value(ftdi, VENDOR_ID, cfg_getint(cfg, "vendor_id"));
|
||||
eeprom_set_value(ftdi, PRODUCT_ID, cfg_getint(cfg, "product_id"));
|
||||
|
||||
eeprom_set_value(ftdi, SELF_POWERED, cfg_getbool(cfg, "self_powered"));
|
||||
eeprom_set_value(ftdi, REMOTE_WAKEUP, cfg_getbool(cfg, "remote_wakeup"));
|
||||
eeprom_set_value(ftdi, MAX_POWER, cfg_getint(cfg, "max_power"));
|
||||
|
||||
eeprom_set_value(ftdi, IN_IS_ISOCHRONOUS, cfg_getbool(cfg, "in_is_isochronous"));
|
||||
eeprom_set_value(ftdi, OUT_IS_ISOCHRONOUS, cfg_getbool(cfg, "out_is_isochronous"));
|
||||
eeprom_set_value(ftdi, SUSPEND_PULL_DOWNS, cfg_getbool(cfg, "suspend_pull_downs"));
|
||||
|
||||
eeprom_set_value(ftdi, USE_SERIAL, cfg_getbool(cfg, "use_serial"));
|
||||
eeprom_set_value(ftdi, USE_USB_VERSION, cfg_getbool(cfg, "change_usb_version"));
|
||||
eeprom_set_value(ftdi, USB_VERSION, cfg_getint(cfg, "usb_version"));
|
||||
|
||||
|
||||
eeprom_set_value(ftdi, HIGH_CURRENT, cfg_getbool(cfg, "high_current"));
|
||||
eeprom_set_value(ftdi, CBUS_FUNCTION_0, str_to_cbus(cfg_getstr(cfg, "cbus0"), 13));
|
||||
eeprom_set_value(ftdi, CBUS_FUNCTION_1, str_to_cbus(cfg_getstr(cfg, "cbus1"), 13));
|
||||
eeprom_set_value(ftdi, CBUS_FUNCTION_2, str_to_cbus(cfg_getstr(cfg, "cbus2"), 13));
|
||||
eeprom_set_value(ftdi, CBUS_FUNCTION_3, str_to_cbus(cfg_getstr(cfg, "cbus3"), 13));
|
||||
eeprom_set_value(ftdi, CBUS_FUNCTION_4, str_to_cbus(cfg_getstr(cfg, "cbus4"), 9));
|
||||
int invert = 0;
|
||||
if (cfg_getbool(cfg, "invert_rxd")) invert |= INVERT_RXD;
|
||||
if (cfg_getbool(cfg, "invert_txd")) invert |= INVERT_TXD;
|
||||
if (cfg_getbool(cfg, "invert_rts")) invert |= INVERT_RTS;
|
||||
if (cfg_getbool(cfg, "invert_cts")) invert |= INVERT_CTS;
|
||||
if (cfg_getbool(cfg, "invert_dtr")) invert |= INVERT_DTR;
|
||||
if (cfg_getbool(cfg, "invert_dsr")) invert |= INVERT_DSR;
|
||||
if (cfg_getbool(cfg, "invert_dcd")) invert |= INVERT_DCD;
|
||||
if (cfg_getbool(cfg, "invert_ri")) invert |= INVERT_RI;
|
||||
eeprom_set_value(ftdi, INVERT, invert);
|
||||
|
||||
eeprom_set_value(ftdi, CHANNEL_A_DRIVER, DRIVER_VCP);
|
||||
eeprom_set_value(ftdi, CHANNEL_B_DRIVER, DRIVER_VCP);
|
||||
eeprom_set_value(ftdi, CHANNEL_C_DRIVER, DRIVER_VCP);
|
||||
eeprom_set_value(ftdi, CHANNEL_D_DRIVER, DRIVER_VCP);
|
||||
eeprom_set_value(ftdi, CHANNEL_A_RS485, 0);
|
||||
eeprom_set_value(ftdi, CHANNEL_B_RS485, 0);
|
||||
eeprom_set_value(ftdi, CHANNEL_C_RS485, 0);
|
||||
eeprom_set_value(ftdi, CHANNEL_D_RS485, 0);
|
||||
|
||||
if (_erase > 0)
|
||||
{
|
||||
printf("FTDI erase eeprom: %d\n", ftdi_erase_eeprom(ftdi));
|
||||
}
|
||||
|
||||
size_check = ftdi_eeprom_build(ftdi);
|
||||
|
||||
if (size_check == -1)
|
||||
{
|
||||
printf ("Sorry, the eeprom can only contain 128 bytes (100 bytes for your strings).\n");
|
||||
printf ("You need to short your string by: %d bytes\n", size_check);
|
||||
goto cleanup;
|
||||
} else if (size_check < 0) {
|
||||
printf ("ftdi_eeprom_build(): error: %d\n", size_check);
|
||||
}
|
||||
else
|
||||
{
|
||||
printf ("Used eeprom space: %d bytes\n", my_eeprom_size-size_check);
|
||||
}
|
||||
|
||||
if (_flash > 0)
|
||||
{
|
||||
if (cfg_getbool(cfg, "flash_raw"))
|
||||
{
|
||||
if (filename != NULL && strlen(filename) > 0)
|
||||
{
|
||||
eeprom_buf = malloc(my_eeprom_size);
|
||||
FILE *fp = fopen(filename, "rb");
|
||||
fread(eeprom_buf, 1, my_eeprom_size, fp);
|
||||
fclose(fp);
|
||||
|
||||
ftdi_set_eeprom_buf(ftdi, eeprom_buf, my_eeprom_size);
|
||||
}
|
||||
}
|
||||
printf ("FTDI write eeprom: %d\n", ftdi_write_eeprom(ftdi));
|
||||
}
|
||||
|
||||
// Write to file?
|
||||
if (filename != NULL && strlen(filename) > 0 && !cfg_getbool(cfg, "flash_raw"))
|
||||
{
|
||||
fp = fopen(filename, "w");
|
||||
if (fp == NULL)
|
||||
{
|
||||
printf ("Can't write eeprom file.\n");
|
||||
exit (-1);
|
||||
}
|
||||
else
|
||||
printf ("Writing to file: %s\n", filename);
|
||||
|
||||
if (eeprom_buf == NULL)
|
||||
eeprom_buf = malloc(my_eeprom_size);
|
||||
ftdi_get_eeprom_buf(ftdi, eeprom_buf, my_eeprom_size);
|
||||
|
||||
fwrite(eeprom_buf, my_eeprom_size, 1, fp);
|
||||
fclose(fp);
|
||||
}
|
||||
|
||||
cleanup:
|
||||
if (eeprom_buf)
|
||||
free(eeprom_buf);
|
||||
if (_read > 0 || _erase > 0 || _flash > 0)
|
||||
{
|
||||
printf("FTDI close: %d\n", ftdi_usb_close(ftdi));
|
||||
}
|
||||
|
||||
ftdi_deinit (ftdi);
|
||||
ftdi_free (ftdi);
|
||||
|
||||
cfg_free(cfg);
|
||||
|
||||
printf("\n");
|
||||
return 0;
|
||||
}
|
@ -1,80 +0,0 @@
|
||||
# Check
|
||||
set(FTDI_BUILD_CPP False PARENT_SCOPE)
|
||||
|
||||
option(FTDIPP "Build C++ binding library libftdi++" ON)
|
||||
|
||||
if (FTDIPP)
|
||||
|
||||
if(Boost_FOUND)
|
||||
|
||||
# Includes
|
||||
include_directories(BEFORE ${CMAKE_CURRENT_BINARY_DIR}
|
||||
${CMAKE_CURRENT_SOURCE_DIR}
|
||||
${CMAKE_SOURCE_DIR}/src)
|
||||
|
||||
include_directories(${Boost_INCLUDE_DIRS})
|
||||
|
||||
# Targets
|
||||
set(cpp_sources ftdi.cpp)
|
||||
set(cpp_headers ftdi.hpp)
|
||||
|
||||
set(FTDI_BUILD_CPP True PARENT_SCOPE)
|
||||
message(STATUS "Building libftdi++")
|
||||
|
||||
# Shared library
|
||||
add_library(ftdipp SHARED ${cpp_sources})
|
||||
|
||||
math(EXPR VERSION_FIXUP "${MAJOR_VERSION} + 1") # Compatiblity with previous releases
|
||||
set_target_properties(ftdipp PROPERTIES VERSION ${VERSION_FIXUP}.${MINOR_VERSION}.0 SOVERSION 2)
|
||||
|
||||
# Static library
|
||||
add_library(ftdipp-static STATIC ${cpp_sources})
|
||||
set_target_properties(ftdipp-static PROPERTIES OUTPUT_NAME "ftdipp")
|
||||
|
||||
# Prevent clobbering each other during the build
|
||||
set_target_properties(ftdipp PROPERTIES CLEAN_DIRECT_OUTPUT 1)
|
||||
set_target_properties(ftdipp-static PROPERTIES CLEAN_DIRECT_OUTPUT 1)
|
||||
|
||||
# Dependencies
|
||||
target_link_libraries(ftdipp ftdi ${LIBUSB_LIBRARIES} ${BOOST_LIBRARIES})
|
||||
|
||||
# Install
|
||||
if(${UNIX})
|
||||
install( TARGETS ftdipp
|
||||
LIBRARY DESTINATION lib${LIB_SUFFIX}
|
||||
COMPONENT sharedlibs
|
||||
)
|
||||
install( TARGETS ftdipp-static
|
||||
ARCHIVE DESTINATION lib${LIB_SUFFIX}
|
||||
COMPONENT staticlibs
|
||||
)
|
||||
install( FILES ${cpp_headers}
|
||||
DESTINATION include/${PROJECT_NAME}
|
||||
COMPONENT headers
|
||||
)
|
||||
endif(${UNIX})
|
||||
|
||||
if(${WIN32})
|
||||
install( TARGETS ftdipp
|
||||
DESTINATION bin
|
||||
COMPONENT sharedlibs
|
||||
)
|
||||
install( TARGETS ftdipp-static
|
||||
DESTINATION bin
|
||||
COMPONENT staticlibs
|
||||
)
|
||||
install( FILES ${cpp_headers}
|
||||
DESTINATION include/${PROJECT_NAME}
|
||||
COMPONENT headers
|
||||
)
|
||||
endif(${WIN32})
|
||||
|
||||
else(Boost_FOUND)
|
||||
message(STATUS "Boost not found, won't build libftdi++")
|
||||
endif(Boost_FOUND)
|
||||
|
||||
else(FTDIPP)
|
||||
|
||||
message(STATUS "Not building libftdi++")
|
||||
|
||||
endif(FTDIPP)
|
@ -1,632 +0,0 @@
|
||||
/***************************************************************************
|
||||
ftdi.cpp - C++ wraper for libftdi
|
||||
-------------------
|
||||
begin : Mon Oct 13 2008
|
||||
copyright : (C) 2008 by Marek Vavruša
|
||||
email : opensource@intra2net.com and marek@vavrusa.com
|
||||
***************************************************************************/
|
||||
/*
|
||||
Copyright (C) 2008 by Marek Vavruša
|
||||
|
||||
The software in this package is distributed under the GNU General
|
||||
Public License version 2 (with a special exception described below).
|
||||
|
||||
A copy of GNU General Public License (GPL) is included in this distribution,
|
||||
in the file COPYING.GPL.
|
||||
|
||||
As a special exception, if other files instantiate templates or use macros
|
||||
or inline functions from this file, or you compile this file and link it
|
||||
with other works to produce a work based on this file, this file
|
||||
does not by itself cause the resulting work to be covered
|
||||
by the GNU General Public License.
|
||||
|
||||
However the source code for this file must still be made available
|
||||
in accordance with section (3) of the GNU General Public License.
|
||||
|
||||
This exception does not invalidate any other reasons why a work based
|
||||
on this file might be covered by the GNU General Public License.
|
||||
*/
|
||||
#include "ftdi.hpp"
|
||||
#include "ftdi_i.h"
|
||||
#include "ftdi.h"
|
||||
|
||||
namespace Ftdi
|
||||
{
|
||||
|
||||
class Context::Private
|
||||
{
|
||||
public:
|
||||
Private()
|
||||
: open(false), ftdi(0), dev(0)
|
||||
{
|
||||
ftdi = ftdi_new();
|
||||
}
|
||||
|
||||
~Private()
|
||||
{
|
||||
if (open)
|
||||
ftdi_usb_close(ftdi);
|
||||
|
||||
ftdi_free(ftdi);
|
||||
}
|
||||
|
||||
bool open;
|
||||
|
||||
struct ftdi_context* ftdi;
|
||||
struct libusb_device* dev;
|
||||
|
||||
std::string vendor;
|
||||
std::string description;
|
||||
std::string serial;
|
||||
};
|
||||
|
||||
/*! \brief Constructor.
|
||||
*/
|
||||
Context::Context()
|
||||
: d( new Private() )
|
||||
{
|
||||
}
|
||||
|
||||
/*! \brief Destructor.
|
||||
*/
|
||||
Context::~Context()
|
||||
{
|
||||
}
|
||||
|
||||
bool Context::is_open()
|
||||
{
|
||||
return d->open;
|
||||
}
|
||||
|
||||
int Context::open(int vendor, int product)
|
||||
{
|
||||
// Open device
|
||||
int ret = ftdi_usb_open(d->ftdi, vendor, product);
|
||||
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
return get_strings_and_reopen();
|
||||
}
|
||||
|
||||
int Context::open(int vendor, int product, const std::string& description, const std::string& serial, unsigned int index)
|
||||
{
|
||||
// translate empty strings to NULL
|
||||
// -> do not use them to find the device (vs. require an empty string to be set in the EEPROM)
|
||||
const char* c_description=NULL;
|
||||
const char* c_serial=NULL;
|
||||
if (!description.empty())
|
||||
c_description=description.c_str();
|
||||
if (!serial.empty())
|
||||
c_serial=serial.c_str();
|
||||
|
||||
int ret = ftdi_usb_open_desc_index(d->ftdi, vendor, product, c_description, c_serial, index);
|
||||
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
return get_strings_and_reopen();
|
||||
}
|
||||
|
||||
int Context::open(const std::string& description)
|
||||
{
|
||||
int ret = ftdi_usb_open_string(d->ftdi, description.c_str());
|
||||
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
return get_strings_and_reopen();
|
||||
}
|
||||
|
||||
int Context::open(struct libusb_device *dev)
|
||||
{
|
||||
if (dev != 0)
|
||||
d->dev = dev;
|
||||
|
||||
if (d->dev == 0)
|
||||
return -1;
|
||||
|
||||
return get_strings_and_reopen();
|
||||
}
|
||||
|
||||
int Context::close()
|
||||
{
|
||||
d->open = false;
|
||||
d->dev = 0;
|
||||
return ftdi_usb_close(d->ftdi);
|
||||
}
|
||||
|
||||
int Context::reset()
|
||||
{
|
||||
return ftdi_usb_reset(d->ftdi);
|
||||
}
|
||||
|
||||
int Context::flush(int mask)
|
||||
{
|
||||
int ret = 1;
|
||||
|
||||
if (mask & Input)
|
||||
ret &= ftdi_usb_purge_rx_buffer(d->ftdi);
|
||||
if (mask & Output)
|
||||
ret &= ftdi_usb_purge_tx_buffer(d->ftdi);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int Context::set_interface(enum ftdi_interface interface)
|
||||
{
|
||||
return ftdi_set_interface(d->ftdi, interface);
|
||||
}
|
||||
|
||||
void Context::set_usb_device(struct libusb_device_handle *dev)
|
||||
{
|
||||
ftdi_set_usbdev(d->ftdi, dev);
|
||||
d->dev = libusb_get_device(dev);
|
||||
}
|
||||
|
||||
int Context::set_baud_rate(int baudrate)
|
||||
{
|
||||
return ftdi_set_baudrate(d->ftdi, baudrate);
|
||||
}
|
||||
|
||||
int Context::set_line_property(enum ftdi_bits_type bits, enum ftdi_stopbits_type sbit, enum ftdi_parity_type parity)
|
||||
{
|
||||
return ftdi_set_line_property(d->ftdi, bits, sbit, parity);
|
||||
}
|
||||
|
||||
int Context::set_line_property(enum ftdi_bits_type bits, enum ftdi_stopbits_type sbit, enum ftdi_parity_type parity, enum ftdi_break_type break_type)
|
||||
{
|
||||
return ftdi_set_line_property2(d->ftdi, bits, sbit, parity, break_type);
|
||||
}
|
||||
|
||||
int Context::read(unsigned char *buf, int size)
|
||||
{
|
||||
return ftdi_read_data(d->ftdi, buf, size);
|
||||
}
|
||||
|
||||
int Context::set_read_chunk_size(unsigned int chunksize)
|
||||
{
|
||||
return ftdi_read_data_set_chunksize(d->ftdi, chunksize);
|
||||
}
|
||||
|
||||
int Context::read_chunk_size()
|
||||
{
|
||||
unsigned chunk = -1;
|
||||
if (ftdi_read_data_get_chunksize(d->ftdi, &chunk) < 0)
|
||||
return -1;
|
||||
|
||||
return chunk;
|
||||
}
|
||||
|
||||
int Context::write(unsigned char *buf, int size)
|
||||
{
|
||||
return ftdi_write_data(d->ftdi, buf, size);
|
||||
}
|
||||
|
||||
int Context::set_write_chunk_size(unsigned int chunksize)
|
||||
{
|
||||
return ftdi_write_data_set_chunksize(d->ftdi, chunksize);
|
||||
}
|
||||
|
||||
int Context::write_chunk_size()
|
||||
{
|
||||
unsigned chunk = -1;
|
||||
if (ftdi_write_data_get_chunksize(d->ftdi, &chunk) < 0)
|
||||
return -1;
|
||||
|
||||
return chunk;
|
||||
}
|
||||
|
||||
int Context::set_flow_control(int flowctrl)
|
||||
{
|
||||
return ftdi_setflowctrl(d->ftdi, flowctrl);
|
||||
}
|
||||
|
||||
int Context::set_modem_control(int mask)
|
||||
{
|
||||
int dtr = 0, rts = 0;
|
||||
|
||||
if (mask & Dtr)
|
||||
dtr = 1;
|
||||
if (mask & Rts)
|
||||
rts = 1;
|
||||
|
||||
return ftdi_setdtr_rts(d->ftdi, dtr, rts);
|
||||
}
|
||||
|
||||
int Context::set_dtr(bool state)
|
||||
{
|
||||
return ftdi_setdtr(d->ftdi, state);
|
||||
}
|
||||
|
||||
int Context::set_rts(bool state)
|
||||
{
|
||||
return ftdi_setrts(d->ftdi, state);
|
||||
}
|
||||
|
||||
int Context::set_latency(unsigned char latency)
|
||||
{
|
||||
return ftdi_set_latency_timer(d->ftdi, latency);
|
||||
}
|
||||
|
||||
unsigned Context::latency()
|
||||
{
|
||||
unsigned char latency = 0;
|
||||
ftdi_get_latency_timer(d->ftdi, &latency);
|
||||
return latency;
|
||||
}
|
||||
|
||||
unsigned short Context::poll_modem_status()
|
||||
{
|
||||
unsigned short status = 0;
|
||||
ftdi_poll_modem_status(d->ftdi, &status);
|
||||
return status;
|
||||
}
|
||||
|
||||
int Context::set_event_char(unsigned char eventch, unsigned char enable)
|
||||
{
|
||||
return ftdi_set_event_char(d->ftdi, eventch, enable);
|
||||
}
|
||||
|
||||
int Context::set_error_char(unsigned char errorch, unsigned char enable)
|
||||
{
|
||||
return ftdi_set_error_char(d->ftdi, errorch, enable);
|
||||
}
|
||||
|
||||
int Context::set_bitmode(unsigned char bitmask, unsigned char mode)
|
||||
{
|
||||
return ftdi_set_bitmode(d->ftdi, bitmask, mode);
|
||||
}
|
||||
|
||||
int Context::set_bitmode(unsigned char bitmask, enum ftdi_mpsse_mode mode)
|
||||
{
|
||||
return ftdi_set_bitmode(d->ftdi, bitmask, mode);
|
||||
}
|
||||
|
||||
int Context::bitbang_disable()
|
||||
{
|
||||
return ftdi_disable_bitbang(d->ftdi);
|
||||
}
|
||||
|
||||
int Context::read_pins(unsigned char *pins)
|
||||
{
|
||||
return ftdi_read_pins(d->ftdi, pins);
|
||||
}
|
||||
|
||||
char* Context::error_string()
|
||||
{
|
||||
return ftdi_get_error_string(d->ftdi);
|
||||
}
|
||||
|
||||
int Context::get_strings()
|
||||
{
|
||||
// Prepare buffers
|
||||
char vendor[512], desc[512], serial[512];
|
||||
|
||||
int ret = ftdi_usb_get_strings(d->ftdi, d->dev, vendor, 512, desc, 512, serial, 512);
|
||||
|
||||
if (ret < 0)
|
||||
return -1;
|
||||
|
||||
d->vendor = vendor;
|
||||
d->description = desc;
|
||||
d->serial = serial;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int Context::get_strings_and_reopen()
|
||||
{
|
||||
if ( d->dev == 0 )
|
||||
{
|
||||
d->dev = libusb_get_device(d->ftdi->usb_dev);
|
||||
}
|
||||
|
||||
// Get device strings (closes device)
|
||||
int ret=get_strings();
|
||||
if (ret < 0)
|
||||
{
|
||||
d->open = 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
// Reattach device
|
||||
ret = ftdi_usb_open_dev(d->ftdi, d->dev);
|
||||
d->open = (ret >= 0);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*! \brief Device strings properties.
|
||||
*/
|
||||
const std::string& Context::vendor()
|
||||
{
|
||||
return d->vendor;
|
||||
}
|
||||
|
||||
/*! \brief Device strings properties.
|
||||
*/
|
||||
const std::string& Context::description()
|
||||
{
|
||||
return d->description;
|
||||
}
|
||||
|
||||
/*! \brief Device strings properties.
|
||||
*/
|
||||
const std::string& Context::serial()
|
||||
{
|
||||
return d->serial;
|
||||
}
|
||||
|
||||
void Context::set_context(struct ftdi_context* context)
|
||||
{
|
||||
ftdi_free(d->ftdi);
|
||||
d->ftdi = context;
|
||||
}
|
||||
|
||||
void Context::set_usb_device(struct libusb_device *dev)
|
||||
{
|
||||
d->dev = dev;
|
||||
}
|
||||
|
||||
struct ftdi_context* Context::context()
|
||||
{
|
||||
return d->ftdi;
|
||||
}
|
||||
|
||||
class Eeprom::Private
|
||||
{
|
||||
public:
|
||||
Private()
|
||||
: context(0)
|
||||
{}
|
||||
|
||||
struct ftdi_eeprom eeprom;
|
||||
struct ftdi_context* context;
|
||||
};
|
||||
|
||||
Eeprom::Eeprom(Context* parent)
|
||||
: d ( new Private() )
|
||||
{
|
||||
d->context = parent->context();
|
||||
}
|
||||
|
||||
Eeprom::~Eeprom()
|
||||
{
|
||||
}
|
||||
|
||||
int Eeprom::init_defaults(char* manufacturer, char *product, char * serial)
|
||||
{
|
||||
return ftdi_eeprom_initdefaults(d->context, manufacturer, product, serial);
|
||||
}
|
||||
|
||||
int Eeprom::chip_id(unsigned int *chipid)
|
||||
{
|
||||
return ftdi_read_chipid(d->context, chipid);
|
||||
}
|
||||
|
||||
int Eeprom::build(unsigned char *output)
|
||||
{
|
||||
return ftdi_eeprom_build(d->context);
|
||||
}
|
||||
|
||||
int Eeprom::read(unsigned char *eeprom)
|
||||
{
|
||||
return ftdi_read_eeprom(d->context);
|
||||
}
|
||||
|
||||
int Eeprom::write(unsigned char *eeprom)
|
||||
{
|
||||
return ftdi_write_eeprom(d->context);
|
||||
}
|
||||
|
||||
int Eeprom::read_location(int eeprom_addr, unsigned short *eeprom_val)
|
||||
{
|
||||
return ftdi_read_eeprom_location(d->context, eeprom_addr, eeprom_val);
|
||||
}
|
||||
|
||||
int Eeprom::write_location(int eeprom_addr, unsigned short eeprom_val)
|
||||
{
|
||||
return ftdi_write_eeprom_location(d->context, eeprom_addr, eeprom_val);
|
||||
}
|
||||
|
||||
int Eeprom::erase()
|
||||
{
|
||||
return ftdi_erase_eeprom(d->context);
|
||||
}
|
||||
|
||||
class List::Private
|
||||
{
|
||||
public:
|
||||
Private(struct ftdi_device_list* _devlist)
|
||||
: devlist(_devlist)
|
||||
{}
|
||||
|
||||
~Private()
|
||||
{
|
||||
if(devlist)
|
||||
ftdi_list_free(&devlist);
|
||||
}
|
||||
|
||||
std::list<Context> list;
|
||||
struct ftdi_device_list* devlist;
|
||||
};
|
||||
|
||||
List::List(struct ftdi_device_list* devlist)
|
||||
: d( new Private(devlist) )
|
||||
{
|
||||
if (devlist != 0)
|
||||
{
|
||||
// Iterate list
|
||||
for (; devlist != 0; devlist = devlist->next)
|
||||
{
|
||||
Context c;
|
||||
c.set_usb_device(devlist->dev);
|
||||
c.get_strings();
|
||||
d->list.push_back(c);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
List::~List()
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Return begin iterator for accessing the contained list elements
|
||||
* @return Iterator
|
||||
*/
|
||||
List::iterator List::begin()
|
||||
{
|
||||
return d->list.begin();
|
||||
}
|
||||
|
||||
/**
|
||||
* Return end iterator for accessing the contained list elements
|
||||
* @return Iterator
|
||||
*/
|
||||
List::iterator List::end()
|
||||
{
|
||||
return d->list.end();
|
||||
}
|
||||
|
||||
/**
|
||||
* Return begin iterator for accessing the contained list elements
|
||||
* @return Const iterator
|
||||
*/
|
||||
List::const_iterator List::begin() const
|
||||
{
|
||||
return d->list.begin();
|
||||
}
|
||||
|
||||
/**
|
||||
* Return end iterator for accessing the contained list elements
|
||||
* @return Const iterator
|
||||
*/
|
||||
List::const_iterator List::end() const
|
||||
{
|
||||
return d->list.end();
|
||||
}
|
||||
|
||||
/**
|
||||
* Return begin reverse iterator for accessing the contained list elements
|
||||
* @return Reverse iterator
|
||||
*/
|
||||
List::reverse_iterator List::rbegin()
|
||||
{
|
||||
return d->list.rbegin();
|
||||
}
|
||||
|
||||
/**
|
||||
* Return end reverse iterator for accessing the contained list elements
|
||||
* @return Reverse iterator
|
||||
*/
|
||||
List::reverse_iterator List::rend()
|
||||
{
|
||||
return d->list.rend();
|
||||
}
|
||||
|
||||
/**
|
||||
* Return begin reverse iterator for accessing the contained list elements
|
||||
* @return Const reverse iterator
|
||||
*/
|
||||
List::const_reverse_iterator List::rbegin() const
|
||||
{
|
||||
return d->list.rbegin();
|
||||
}
|
||||
|
||||
/**
|
||||
* Return end reverse iterator for accessing the contained list elements
|
||||
* @return Const reverse iterator
|
||||
*/
|
||||
List::const_reverse_iterator List::rend() const
|
||||
{
|
||||
return d->list.rend();
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Get number of elements stored in the list
|
||||
* @return Number of elements
|
||||
*/
|
||||
List::ListType::size_type List::size() const
|
||||
{
|
||||
return d->list.size();
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if list is empty
|
||||
* @return True if empty, false otherwise
|
||||
*/
|
||||
bool List::empty() const
|
||||
{
|
||||
return d->list.empty();
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes all elements. Invalidates all iterators.
|
||||
* Do it in a non-throwing way and also make
|
||||
* sure we really free the allocated memory.
|
||||
*/
|
||||
void List::clear()
|
||||
{
|
||||
ListType().swap(d->list);
|
||||
|
||||
// Free device list
|
||||
if (d->devlist)
|
||||
{
|
||||
ftdi_list_free(&d->devlist);
|
||||
d->devlist = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Appends a copy of the element as the new last element.
|
||||
* @param element Value to copy and append
|
||||
*/
|
||||
void List::push_back(const Context& element)
|
||||
{
|
||||
d->list.push_back(element);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a copy of the element as the new first element.
|
||||
* @param element Value to copy and add
|
||||
*/
|
||||
void List::push_front(const Context& element)
|
||||
{
|
||||
d->list.push_front(element);
|
||||
}
|
||||
|
||||
/**
|
||||
* Erase one element pointed by iterator
|
||||
* @param pos Element to erase
|
||||
* @return Position of the following element (or end())
|
||||
*/
|
||||
List::iterator List::erase(iterator pos)
|
||||
{
|
||||
return d->list.erase(pos);
|
||||
}
|
||||
|
||||
/**
|
||||
* Erase a range of elements
|
||||
* @param beg Begin of range
|
||||
* @param end End of range
|
||||
* @return Position of the element after the erased range (or end())
|
||||
*/
|
||||
List::iterator List::erase(iterator beg, iterator end)
|
||||
{
|
||||
return d->list.erase(beg, end);
|
||||
}
|
||||
|
||||
List* List::find_all(int vendor, int product)
|
||||
{
|
||||
struct ftdi_device_list* dlist = 0;
|
||||
struct ftdi_context ftdi;
|
||||
ftdi_init(&ftdi);
|
||||
ftdi_usb_find_all(&ftdi, &dlist, vendor, product);
|
||||
ftdi_deinit(&ftdi);
|
||||
return new List(dlist);
|
||||
}
|
||||
|
||||
}
|
@ -1,217 +0,0 @@
|
||||
/***************************************************************************
|
||||
ftdi.hpp - C++ wrapper for libftdi
|
||||
-------------------
|
||||
begin : Mon Oct 13 2008
|
||||
copyright : (C) 2008 by Marek Vavruša
|
||||
email : opensource@intra2net.com and marek@vavrusa.com
|
||||
***************************************************************************/
|
||||
/*
|
||||
Copyright (C) 2008 by Marek Vavruša
|
||||
|
||||
The software in this package is distributed under the GNU General
|
||||
Public License version 2 (with a special exception described below).
|
||||
|
||||
A copy of GNU General Public License (GPL) is included in this distribution,
|
||||
in the file COPYING.GPL.
|
||||
|
||||
As a special exception, if other files instantiate templates or use macros
|
||||
or inline functions from this file, or you compile this file and link it
|
||||
with other works to produce a work based on this file, this file
|
||||
does not by itself cause the resulting work to be covered
|
||||
by the GNU General Public License.
|
||||
|
||||
However the source code for this file must still be made available
|
||||
in accordance with section (3) of the GNU General Public License.
|
||||
|
||||
This exception does not invalidate any other reasons why a work based
|
||||
on this file might be covered by the GNU General Public License.
|
||||
*/
|
||||
#ifndef __libftdi_hpp__
|
||||
#define __libftdi_hpp__
|
||||
|
||||
#include <list>
|
||||
#include <string>
|
||||
#include <boost/shared_ptr.hpp>
|
||||
#include <ftdi.h>
|
||||
|
||||
namespace Ftdi
|
||||
{
|
||||
|
||||
/* Forward declarations*/
|
||||
class List;
|
||||
class Eeprom;
|
||||
|
||||
/*! \brief FTDI device context.
|
||||
* Represents single FTDI device context.
|
||||
*/
|
||||
class Context
|
||||
{
|
||||
/* Friends */
|
||||
friend class Eeprom;
|
||||
friend class List;
|
||||
|
||||
public:
|
||||
/*! \brief Direction flags for flush().
|
||||
*/
|
||||
enum Direction
|
||||
{
|
||||
Input,
|
||||
Output
|
||||
};
|
||||
|
||||
/*! \brief Modem control flags.
|
||||
*/
|
||||
enum ModemCtl
|
||||
{
|
||||
Dtr,
|
||||
Rts
|
||||
};
|
||||
|
||||
/* Constructor, Destructor */
|
||||
Context();
|
||||
~Context();
|
||||
|
||||
/* Properties */
|
||||
Eeprom* eeprom();
|
||||
const std::string& vendor();
|
||||
const std::string& description();
|
||||
const std::string& serial();
|
||||
|
||||
/* Device manipulators */
|
||||
bool is_open();
|
||||
int open(struct libusb_device *dev = 0);
|
||||
int open(int vendor, int product);
|
||||
int open(int vendor, int product, const std::string& description, const std::string& serial = std::string(), unsigned int index=0);
|
||||
int open(const std::string& description);
|
||||
int close();
|
||||
int reset();
|
||||
int flush(int mask = Input|Output);
|
||||
int set_interface(enum ftdi_interface interface);
|
||||
void set_usb_device(struct libusb_device_handle *dev);
|
||||
|
||||
/* Line manipulators */
|
||||
int set_baud_rate(int baudrate);
|
||||
int set_line_property(enum ftdi_bits_type bits, enum ftdi_stopbits_type sbit, enum ftdi_parity_type parity);
|
||||
int set_line_property(enum ftdi_bits_type bits, enum ftdi_stopbits_type sbit, enum ftdi_parity_type parity, enum ftdi_break_type break_type);
|
||||
|
||||
/* I/O */
|
||||
int read(unsigned char *buf, int size);
|
||||
int write(unsigned char *buf, int size);
|
||||
int set_read_chunk_size(unsigned int chunksize);
|
||||
int set_write_chunk_size(unsigned int chunksize);
|
||||
int read_chunk_size();
|
||||
int write_chunk_size();
|
||||
|
||||
/* Async IO
|
||||
TODO: should wrap?
|
||||
int writeAsync(unsigned char *buf, int size);
|
||||
void asyncComplete(int wait_for_more);
|
||||
*/
|
||||
|
||||
/* Flow control */
|
||||
int set_event_char(unsigned char eventch, unsigned char enable);
|
||||
int set_error_char(unsigned char errorch, unsigned char enable);
|
||||
int set_flow_control(int flowctrl);
|
||||
int set_modem_control(int mask = Dtr|Rts);
|
||||
int set_latency(unsigned char latency);
|
||||
int set_dtr(bool state);
|
||||
int set_rts(bool state);
|
||||
|
||||
unsigned short poll_modem_status();
|
||||
unsigned latency();
|
||||
|
||||
/* BitBang mode */
|
||||
int set_bitmode(unsigned char bitmask, unsigned char mode);
|
||||
int set_bitmode(unsigned char bitmask, enum ftdi_mpsse_mode mode);
|
||||
int bitbang_disable();
|
||||
int read_pins(unsigned char *pins);
|
||||
|
||||
/* Misc */
|
||||
char* error_string();
|
||||
|
||||
protected:
|
||||
int get_strings();
|
||||
int get_strings_and_reopen();
|
||||
|
||||
/* Properties */
|
||||
struct ftdi_context* context();
|
||||
void set_context(struct ftdi_context* context);
|
||||
void set_usb_device(struct libusb_device *dev);
|
||||
|
||||
private:
|
||||
class Private;
|
||||
boost::shared_ptr<Private> d;
|
||||
};
|
||||
|
||||
/*! \brief Device EEPROM.
|
||||
*/
|
||||
class Eeprom
|
||||
{
|
||||
public:
|
||||
Eeprom(Context* parent);
|
||||
~Eeprom();
|
||||
|
||||
int init_defaults(char *manufacturer, char* product, char * serial);
|
||||
int chip_id(unsigned int *chipid);
|
||||
int build(unsigned char *output);
|
||||
|
||||
int read(unsigned char *eeprom);
|
||||
int write(unsigned char *eeprom);
|
||||
int read_location(int eeprom_addr, unsigned short *eeprom_val);
|
||||
int write_location(int eeprom_addr, unsigned short eeprom_val);
|
||||
int erase();
|
||||
|
||||
private:
|
||||
class Private;
|
||||
boost::shared_ptr<Private> d;
|
||||
};
|
||||
|
||||
/*! \brief Device list.
|
||||
*/
|
||||
class List
|
||||
{
|
||||
public:
|
||||
List(struct ftdi_device_list* devlist = 0);
|
||||
~List();
|
||||
|
||||
static List* find_all(int vendor, int product);
|
||||
|
||||
/// List type storing "Context" objects
|
||||
typedef std::list<Context> ListType;
|
||||
/// Iterator type for the container
|
||||
typedef ListType::iterator iterator;
|
||||
/// Const iterator type for the container
|
||||
typedef ListType::const_iterator const_iterator;
|
||||
/// Reverse iterator type for the container
|
||||
typedef ListType::reverse_iterator reverse_iterator;
|
||||
/// Const reverse iterator type for the container
|
||||
typedef ListType::const_reverse_iterator const_reverse_iterator;
|
||||
|
||||
iterator begin();
|
||||
iterator end();
|
||||
const_iterator begin() const;
|
||||
const_iterator end() const;
|
||||
|
||||
reverse_iterator rbegin();
|
||||
reverse_iterator rend();
|
||||
const_reverse_iterator rbegin() const;
|
||||
const_reverse_iterator rend() const;
|
||||
|
||||
ListType::size_type size() const;
|
||||
bool empty() const;
|
||||
void clear();
|
||||
|
||||
void push_back(const Context& element);
|
||||
void push_front(const Context& element);
|
||||
|
||||
iterator erase(iterator pos);
|
||||
iterator erase(iterator beg, iterator end);
|
||||
|
||||
private:
|
||||
class Private;
|
||||
boost::shared_ptr<Private> d;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
@ -1,3 +0,0 @@
|
||||
[Project]
|
||||
Manager=KDevCMakeManager
|
||||
Name=libftdi-1.0
|
@ -1,79 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
prefix=@prefix@
|
||||
exec_prefix=@exec_prefix@
|
||||
exec_prefix_set=no
|
||||
|
||||
usage()
|
||||
{
|
||||
cat <<EOF
|
||||
Usage: libftdi-config [OPTIONS] [LIBRARIES]
|
||||
Options:
|
||||
[--prefix[=DIR]]
|
||||
[--exec-prefix[=DIR]]
|
||||
[--version]
|
||||
[--libs]
|
||||
[--cflags]
|
||||
EOF
|
||||
exit $1
|
||||
}
|
||||
|
||||
if test $# -eq 0; then
|
||||
usage 1 1>&2
|
||||
fi
|
||||
|
||||
while test $# -gt 0; do
|
||||
case "$1" in
|
||||
-*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
|
||||
*) optarg= ;;
|
||||
esac
|
||||
|
||||
case $1 in
|
||||
--prefix=*)
|
||||
prefix=$optarg
|
||||
if test $exec_prefix_set = no ; then
|
||||
exec_prefix=$optarg
|
||||
fi
|
||||
;;
|
||||
--prefix)
|
||||
echo_prefix=yes
|
||||
;;
|
||||
--exec-prefix=*)
|
||||
exec_prefix=$optarg
|
||||
exec_prefix_set=yes
|
||||
;;
|
||||
--exec-prefix)
|
||||
echo_exec_prefix=yes
|
||||
;;
|
||||
--version)
|
||||
echo @VERSION@
|
||||
exit 0
|
||||
;;
|
||||
--cflags)
|
||||
if test "@includedir@" != /usr/include ; then
|
||||
includes="-I@includedir@"
|
||||
fi
|
||||
echo_cflags=yes
|
||||
;;
|
||||
--libs)
|
||||
echo_libs=yes
|
||||
;;
|
||||
*)
|
||||
usage 1 1>&2
|
||||
;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
|
||||
if test "$echo_prefix" = "yes"; then
|
||||
echo $prefix
|
||||
fi
|
||||
if test "$echo_exec_prefix" = "yes"; then
|
||||
echo $exec_prefix
|
||||
fi
|
||||
if test "$echo_cflags" = "yes"; then
|
||||
echo $includes
|
||||
fi
|
||||
if test "$echo_libs" = "yes"; then
|
||||
echo -L@libdir@ -lftdi @LIBS@
|
||||
fi
|
@ -1,25 +0,0 @@
|
||||
{
|
||||
'targets': [
|
||||
{
|
||||
'target_name': 'libftdi',
|
||||
'type': 'static_library',
|
||||
|
||||
'dependencies': [
|
||||
'../libusb/libusb.gyp:libusb'
|
||||
],
|
||||
'sources': [
|
||||
'src/ftdi.c',
|
||||
'src/ftdi_stream.c'
|
||||
],
|
||||
'include_dirs': [
|
||||
'.',
|
||||
'src'
|
||||
],
|
||||
'direct_dependent_settings': {
|
||||
'include_dirs': [
|
||||
'src',
|
||||
],
|
||||
},
|
||||
}
|
||||
]
|
||||
}
|
@ -1,28 +0,0 @@
|
||||
// PC-Lint 9.00 settings
|
||||
--iz:\usr\include\libusb-1.0
|
||||
--i../src
|
||||
--i../ftdipp
|
||||
|
||||
-emacro(527, ftdi_error_return) // ignore "unreachable code"
|
||||
-emacro(717, ftdi_error_return)
|
||||
|
||||
-epu // Pointer to unsigned/signed of the same type is ok
|
||||
|
||||
+fie // Allow enum to int conversion
|
||||
|
||||
-ecall(534, usb_close) // silence ignored return value from usb_close
|
||||
|
||||
// Disable bogus BOOST warnings
|
||||
-emacro(58,BOOST_ASSERT)
|
||||
-emacro(506, BOOST_FOREACH)
|
||||
-emacro(666, BOOST_FOREACH)
|
||||
-esym(666, BOOST_FOREACH)
|
||||
-emacro(1023, BOOST_FOREACH)
|
||||
-emacro(1793, BOOST_FOREACH)
|
||||
-esym(665, BOOST_FOREACH)
|
||||
-e123
|
||||
|
||||
// Don't complain we are running with -wlib(0)
|
||||
// as the boost headers can't be parsed properly
|
||||
-estring(686, -wlib(0))
|
||||
-wlib(0)
|
@ -1,14 +0,0 @@
|
||||
prefix=@prefix@
|
||||
exec_prefix=@exec_prefix@
|
||||
libdir=@libdir@
|
||||
includedir=@includedir@
|
||||
libusb_libs=@LIBUSB_1_0_LIBS@
|
||||
libusb_cflags=@LIBUSB_1_0_CFLAGS@
|
||||
|
||||
Name: libftdi
|
||||
Description: Library to program and control the FTDI USB controller
|
||||
Requires:
|
||||
Version: @VERSION@
|
||||
Libs: -L${libdir} -lftdi ${libusb_libs}
|
||||
Cflags: -I${includedir} ${libusb_cflags}
|
||||
|
@ -1,67 +0,0 @@
|
||||
Summary: Library to program and control the FTDI USB controller
|
||||
Name: libftdi
|
||||
Version: @VERSION@
|
||||
Release: 1
|
||||
License: LGPL for libftdi and GPLv2+linking exception for the C++ wrapper
|
||||
Group: System Environment/Libraries
|
||||
Vendor: Intra2net AG
|
||||
Source: http://www.intra2net.com/en/developer/libftdi/download/%{name}-%{version}.tar.gz
|
||||
Buildroot: /tmp/%{name}-%{version}-root
|
||||
Requires: libusb
|
||||
BuildRequires: libusb, libusb-devel, pkgconfig, doxygen
|
||||
Prefix: /usr
|
||||
URL: http://www.intra2net.com/en/developer/libftdi
|
||||
|
||||
%package devel
|
||||
Summary: Header files and static libraries for libftdi
|
||||
Group: Development/Libraries
|
||||
Requires: libftdi = %{version}, libusb-devel
|
||||
|
||||
%description
|
||||
Library to program and control the FTDI USB controller
|
||||
|
||||
%description devel
|
||||
Header files and static libraries for libftdi
|
||||
|
||||
%prep
|
||||
%setup -q
|
||||
|
||||
%build
|
||||
|
||||
PARAMS=""
|
||||
./configure --prefix=%{prefix} \
|
||||
--libdir=%{_libdir}
|
||||
%endif
|
||||
|
||||
make
|
||||
|
||||
%install
|
||||
make DESTDIR=$RPM_BUILD_ROOT install
|
||||
|
||||
# Remove example programs
|
||||
rm -f $RPM_BUILD_ROOT/usr/bin/simple
|
||||
rm -f $RPM_BUILD_ROOT/usr/bin/bitbang
|
||||
rm -f $RPM_BUILD_ROOT/usr/bin/bitbang2
|
||||
rm -f $RPM_BUILD_ROOT/usr/bin/bitbang_ft2232
|
||||
rm -f $RPM_BUILD_ROOT/usr/bin/bitbang_cbus
|
||||
rm -f $RPM_BUILD_ROOT/usr/bin/find_all
|
||||
rm -f $RPM_BUILD_ROOT/usr/bin/find_all_pp
|
||||
rm -f $RPM_BUILD_ROOT/usr/bin/serial_test
|
||||
rm -f $RPM_BUILD_ROOT/usr/bin/baud_test
|
||||
|
||||
%clean
|
||||
rm -fr $RPM_BUILD_ROOT
|
||||
|
||||
%files
|
||||
%defattr(-,root,root)
|
||||
%doc COPYING.LIB COPYING.GPL LICENSE
|
||||
%{_libdir}/libftdi*.so*
|
||||
|
||||
%files devel
|
||||
%defattr(-,root,root)
|
||||
%doc doc/html doc/man
|
||||
%{_bindir}/libftdi-config
|
||||
%{prefix}/include/*.h
|
||||
%{prefix}/include/*.hpp
|
||||
%{_libdir}/libftdi*.*a
|
||||
%{_libdir}/pkgconfig/*.pc
|
@ -1,11 +0,0 @@
|
||||
prefix=@prefix@
|
||||
exec_prefix=@exec_prefix@
|
||||
libdir=@libdir@
|
||||
includedir=@includedir@
|
||||
|
||||
Name: libftdipp
|
||||
Description: C++ wrapper for libftdi
|
||||
Requires: libftdi
|
||||
Version: @VERSION@
|
||||
Libs: -L${libdir} -lftdipp
|
||||
Cflags: -I${includedir}
|
@ -1,8 +0,0 @@
|
||||
# FTDI Devices: FT232BM/L/Q, FT245BM/L/Q, FT232RL/Q, FT245RL/Q, VNC1L with VDPS Firmware
|
||||
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", MODE="0664", GROUP="plugdev"
|
||||
|
||||
# FTDI Devices: FT2232C/D/L, FT2232HL/Q
|
||||
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6010", MODE="0664", GROUP="plugdev"
|
||||
|
||||
# FTDI Devices: FT4232HL/Q
|
||||
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6011", MODE="0664", GROUP="plugdev"
|
@ -1,21 +0,0 @@
|
||||
# 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)
|
||||
|
||||
# Dependencies
|
||||
set(CPACK_DEBIAN_PACKAGE_DEPENDS "libusb-0.1-4" PARENT_SCOPE)
|
||||
set(DEBIAN_PACKAGE_BUILDS_DEPENDS "cmake, libusb-dev" PARENT_SCOPE)
|
||||
|
||||
# Bundles
|
||||
message("-- Installing udev rules to /etc/udev/rules.d")
|
||||
install(FILES 99-libftdi.rules
|
||||
DESTINATION /etc/udev/rules.d)
|
||||
|
||||
endif("${PACKAGE}" STREQUAL "Debian")
|
||||
|
||||
# General RPM rules
|
||||
set(CPACK_RPM_PACKAGE_DEPENDS "libusb" PARENT_SCOPE)
|
@ -1,77 +0,0 @@
|
||||
# Includes
|
||||
include_directories(BEFORE ${CMAKE_CURRENT_BINARY_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})
|
||||
endif(${GIT_DESCRIBE_RESULT} STREQUAL 0)
|
||||
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 ftdi.c ftdi_stream.c)
|
||||
set(c_headers ftdi.h)
|
||||
|
||||
add_library(ftdi SHARED ${c_sources})
|
||||
|
||||
math(EXPR VERSION_FIXUP "${MAJOR_VERSION} + 1") # Compatiblity with previous releases
|
||||
set_target_properties(ftdi PROPERTIES VERSION ${VERSION_FIXUP}.${MINOR_VERSION}.0 SOVERSION 2)
|
||||
|
||||
# Static library
|
||||
add_library(ftdi-static STATIC ${c_sources})
|
||||
set_target_properties(ftdi-static PROPERTIES OUTPUT_NAME "ftdi")
|
||||
|
||||
# Prevent clobbering each other during the build
|
||||
set_target_properties(ftdi PROPERTIES CLEAN_DIRECT_OUTPUT 1)
|
||||
set_target_properties(ftdi-static PROPERTIES CLEAN_DIRECT_OUTPUT 1)
|
||||
|
||||
# Dependencies
|
||||
target_link_libraries(ftdi ${LIBUSB_LIBRARIES})
|
||||
|
||||
# Install
|
||||
if(${UNIX})
|
||||
|
||||
install( TARGETS ftdi
|
||||
LIBRARY DESTINATION lib${LIB_SUFFIX}
|
||||
COMPONENT sharedlibs
|
||||
)
|
||||
|
||||
install( TARGETS ftdi-static
|
||||
ARCHIVE DESTINATION lib${LIB_SUFFIX}
|
||||
COMPONENT staticlibs
|
||||
)
|
||||
|
||||
install( FILES ${c_headers}
|
||||
DESTINATION include/${PROJECT_NAME}
|
||||
COMPONENT headers
|
||||
)
|
||||
|
||||
endif(${UNIX})
|
||||
|
||||
if(${WIN32})
|
||||
|
||||
install( TARGETS ftdi
|
||||
DESTINATION bin
|
||||
COMPONENT sharedlibs
|
||||
)
|
||||
|
||||
install( TARGETS ftdi-static
|
||||
DESTINATION bin
|
||||
COMPONENT staticlibs
|
||||
)
|
||||
|
||||
install( FILES ${c_headers}
|
||||
DESTINATION include/${PROJECT_NAME}
|
||||
COMPONENT headers
|
||||
)
|
||||
|
||||
endif(${WIN32})
|
File diff suppressed because it is too large
Load Diff
@ -1,530 +0,0 @@
|
||||
/***************************************************************************
|
||||
ftdi.h - description
|
||||
-------------------
|
||||
begin : Fri Apr 4 2003
|
||||
copyright : (C) 2003-2011 by Intra2net AG and the libftdi developers
|
||||
email : opensource@intra2net.com
|
||||
***************************************************************************/
|
||||
|
||||
/***************************************************************************
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU Lesser General Public License *
|
||||
* version 2.1 as published by the Free Software Foundation; *
|
||||
* *
|
||||
***************************************************************************/
|
||||
|
||||
#ifndef __libftdi_h__
|
||||
#define __libftdi_h__
|
||||
|
||||
#include <libusb.h>
|
||||
|
||||
/** FTDI chip type */
|
||||
enum ftdi_chip_type { TYPE_AM=0, TYPE_BM=1, TYPE_2232C=2, TYPE_R=3, TYPE_2232H=4, TYPE_4232H=5, TYPE_232H=6 };
|
||||
/** Parity mode for ftdi_set_line_property() */
|
||||
enum ftdi_parity_type { NONE=0, ODD=1, EVEN=2, MARK=3, SPACE=4 };
|
||||
/** Number of stop bits for ftdi_set_line_property() */
|
||||
enum ftdi_stopbits_type { STOP_BIT_1=0, STOP_BIT_15=1, STOP_BIT_2=2 };
|
||||
/** Number of bits for ftdi_set_line_property() */
|
||||
enum ftdi_bits_type { BITS_7=7, BITS_8=8 };
|
||||
/** Break type for ftdi_set_line_property2() */
|
||||
enum ftdi_break_type { BREAK_OFF=0, BREAK_ON=1 };
|
||||
|
||||
/** MPSSE bitbang modes */
|
||||
enum ftdi_mpsse_mode
|
||||
{
|
||||
BITMODE_RESET = 0x00, /**< switch off bitbang mode, back to regular serial/FIFO */
|
||||
BITMODE_BITBANG= 0x01, /**< classical asynchronous bitbang mode, introduced with B-type chips */
|
||||
BITMODE_MPSSE = 0x02, /**< MPSSE mode, available on 2232x chips */
|
||||
BITMODE_SYNCBB = 0x04, /**< synchronous bitbang mode, available on 2232x and R-type chips */
|
||||
BITMODE_MCU = 0x08, /**< MCU Host Bus Emulation mode, available on 2232x chips */
|
||||
/* CPU-style fifo mode gets set via EEPROM */
|
||||
BITMODE_OPTO = 0x10, /**< Fast Opto-Isolated Serial Interface Mode, available on 2232x chips */
|
||||
BITMODE_CBUS = 0x20, /**< Bitbang on CBUS pins of R-type chips, configure in EEPROM before */
|
||||
BITMODE_SYNCFF = 0x40, /**< Single Channel Synchronous FIFO mode, available on 2232H chips */
|
||||
BITMODE_FT1284 = 0x80, /**< FT1284 mode, available on 232H chips */
|
||||
};
|
||||
|
||||
/** Port interface for chips with multiple interfaces */
|
||||
enum ftdi_interface
|
||||
{
|
||||
INTERFACE_ANY = 0,
|
||||
INTERFACE_A = 1,
|
||||
INTERFACE_B = 2,
|
||||
INTERFACE_C = 3,
|
||||
INTERFACE_D = 4
|
||||
};
|
||||
|
||||
/** Automatic loading / unloading of kernel modules */
|
||||
enum ftdi_module_detach_mode
|
||||
{
|
||||
AUTO_DETACH_SIO_MODULE = 0,
|
||||
DONT_DETACH_SIO_MODULE = 1
|
||||
};
|
||||
|
||||
/* Shifting commands IN MPSSE Mode*/
|
||||
#define MPSSE_WRITE_NEG 0x01 /* Write TDI/DO on negative TCK/SK edge*/
|
||||
#define MPSSE_BITMODE 0x02 /* Write bits, not bytes */
|
||||
#define MPSSE_READ_NEG 0x04 /* Sample TDO/DI on negative TCK/SK edge */
|
||||
#define MPSSE_LSB 0x08 /* LSB first */
|
||||
#define MPSSE_DO_WRITE 0x10 /* Write TDI/DO */
|
||||
#define MPSSE_DO_READ 0x20 /* Read TDO/DI */
|
||||
#define MPSSE_WRITE_TMS 0x40 /* Write TMS/CS */
|
||||
|
||||
/* FTDI MPSSE commands */
|
||||
#define SET_BITS_LOW 0x80
|
||||
/*BYTE DATA*/
|
||||
/*BYTE Direction*/
|
||||
#define SET_BITS_HIGH 0x82
|
||||
/*BYTE DATA*/
|
||||
/*BYTE Direction*/
|
||||
#define GET_BITS_LOW 0x81
|
||||
#define GET_BITS_HIGH 0x83
|
||||
#define LOOPBACK_START 0x84
|
||||
#define LOOPBACK_END 0x85
|
||||
#define TCK_DIVISOR 0x86
|
||||
/* H Type specific commands */
|
||||
#define DIS_DIV_5 0x8a
|
||||
#define EN_DIV_5 0x8b
|
||||
#define EN_3_PHASE 0x8c
|
||||
#define DIS_3_PHASE 0x8d
|
||||
#define CLK_BITS 0x8e
|
||||
#define CLK_BYTES 0x8f
|
||||
#define CLK_WAIT_HIGH 0x94
|
||||
#define CLK_WAIT_LOW 0x95
|
||||
#define EN_ADAPTIVE 0x96
|
||||
#define DIS_ADAPTIVE 0x97
|
||||
#define CLK_BYTES_OR_HIGH 0x9c
|
||||
#define CLK_BYTES_OR_LOW 0x0d
|
||||
/*FT232H specific commands */
|
||||
#define DRIVE_OPEN_COLLECTOR 0x9e
|
||||
/* Value Low */
|
||||
/* Value HIGH */ /*rate is 12000000/((1+value)*2) */
|
||||
#define DIV_VALUE(rate) (rate > 6000000)?0:((6000000/rate -1) > 0xffff)? 0xffff: (6000000/rate -1)
|
||||
|
||||
/* Commands in MPSSE and Host Emulation Mode */
|
||||
#define SEND_IMMEDIATE 0x87
|
||||
#define WAIT_ON_HIGH 0x88
|
||||
#define WAIT_ON_LOW 0x89
|
||||
|
||||
/* Commands in Host Emulation Mode */
|
||||
#define READ_SHORT 0x90
|
||||
/* Address_Low */
|
||||
#define READ_EXTENDED 0x91
|
||||
/* Address High */
|
||||
/* Address Low */
|
||||
#define WRITE_SHORT 0x92
|
||||
/* Address_Low */
|
||||
#define WRITE_EXTENDED 0x93
|
||||
/* Address High */
|
||||
/* Address Low */
|
||||
|
||||
/* Definitions for flow control */
|
||||
#define SIO_RESET 0 /* Reset the port */
|
||||
#define SIO_MODEM_CTRL 1 /* Set the modem control register */
|
||||
#define SIO_SET_FLOW_CTRL 2 /* Set flow control register */
|
||||
#define SIO_SET_BAUD_RATE 3 /* Set baud rate */
|
||||
#define SIO_SET_DATA 4 /* Set the data characteristics of the port */
|
||||
|
||||
#define FTDI_DEVICE_OUT_REQTYPE (LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_RECIPIENT_DEVICE | LIBUSB_ENDPOINT_OUT)
|
||||
#define FTDI_DEVICE_IN_REQTYPE (LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_RECIPIENT_DEVICE | LIBUSB_ENDPOINT_IN)
|
||||
|
||||
/* Requests */
|
||||
#define SIO_RESET_REQUEST SIO_RESET
|
||||
#define SIO_SET_BAUDRATE_REQUEST SIO_SET_BAUD_RATE
|
||||
#define SIO_SET_DATA_REQUEST SIO_SET_DATA
|
||||
#define SIO_SET_FLOW_CTRL_REQUEST SIO_SET_FLOW_CTRL
|
||||
#define SIO_SET_MODEM_CTRL_REQUEST SIO_MODEM_CTRL
|
||||
#define SIO_POLL_MODEM_STATUS_REQUEST 0x05
|
||||
#define SIO_SET_EVENT_CHAR_REQUEST 0x06
|
||||
#define SIO_SET_ERROR_CHAR_REQUEST 0x07
|
||||
#define SIO_SET_LATENCY_TIMER_REQUEST 0x09
|
||||
#define SIO_GET_LATENCY_TIMER_REQUEST 0x0A
|
||||
#define SIO_SET_BITMODE_REQUEST 0x0B
|
||||
#define SIO_READ_PINS_REQUEST 0x0C
|
||||
#define SIO_READ_EEPROM_REQUEST 0x90
|
||||
#define SIO_WRITE_EEPROM_REQUEST 0x91
|
||||
#define SIO_ERASE_EEPROM_REQUEST 0x92
|
||||
|
||||
|
||||
#define SIO_RESET_SIO 0
|
||||
#define SIO_RESET_PURGE_RX 1
|
||||
#define SIO_RESET_PURGE_TX 2
|
||||
|
||||
#define SIO_DISABLE_FLOW_CTRL 0x0
|
||||
#define SIO_RTS_CTS_HS (0x1 << 8)
|
||||
#define SIO_DTR_DSR_HS (0x2 << 8)
|
||||
#define SIO_XON_XOFF_HS (0x4 << 8)
|
||||
|
||||
#define SIO_SET_DTR_MASK 0x1
|
||||
#define SIO_SET_DTR_HIGH ( 1 | ( SIO_SET_DTR_MASK << 8))
|
||||
#define SIO_SET_DTR_LOW ( 0 | ( SIO_SET_DTR_MASK << 8))
|
||||
#define SIO_SET_RTS_MASK 0x2
|
||||
#define SIO_SET_RTS_HIGH ( 2 | ( SIO_SET_RTS_MASK << 8 ))
|
||||
#define SIO_SET_RTS_LOW ( 0 | ( SIO_SET_RTS_MASK << 8 ))
|
||||
|
||||
#define SIO_RTS_CTS_HS (0x1 << 8)
|
||||
|
||||
/* marker for unused usb urb structures
|
||||
(taken from libusb) */
|
||||
#define FTDI_URB_USERCONTEXT_COOKIE ((void *)0x1)
|
||||
|
||||
#ifdef __GNUC__
|
||||
#define DEPRECATED(func) func __attribute__ ((deprecated))
|
||||
#elif defined(_MSC_VER)
|
||||
#define DEPRECATED(func) __declspec(deprecated) func
|
||||
#else
|
||||
#pragma message("WARNING: You need to implement DEPRECATED for this compiler")
|
||||
#define DEPRECATED(func) func
|
||||
#endif
|
||||
|
||||
struct ftdi_transfer_control
|
||||
{
|
||||
int completed;
|
||||
unsigned char *buf;
|
||||
int size;
|
||||
int offset;
|
||||
struct ftdi_context *ftdi;
|
||||
struct libusb_transfer *transfer;
|
||||
};
|
||||
|
||||
/**
|
||||
\brief Main context structure for all libftdi functions.
|
||||
|
||||
Do not access directly if possible.
|
||||
*/
|
||||
struct ftdi_context
|
||||
{
|
||||
/* USB specific */
|
||||
/** libusb's context */
|
||||
struct libusb_context *usb_ctx;
|
||||
/** libusb's usb_dev_handle */
|
||||
struct libusb_device_handle *usb_dev;
|
||||
/** usb read timeout */
|
||||
int usb_read_timeout;
|
||||
/** usb write timeout */
|
||||
int usb_write_timeout;
|
||||
|
||||
/* FTDI specific */
|
||||
/** FTDI chip type */
|
||||
enum ftdi_chip_type type;
|
||||
/** baudrate */
|
||||
int baudrate;
|
||||
/** bitbang mode state */
|
||||
unsigned char bitbang_enabled;
|
||||
/** pointer to read buffer for ftdi_read_data */
|
||||
unsigned char *readbuffer;
|
||||
/** read buffer offset */
|
||||
unsigned int readbuffer_offset;
|
||||
/** number of remaining data in internal read buffer */
|
||||
unsigned int readbuffer_remaining;
|
||||
/** read buffer chunk size */
|
||||
unsigned int readbuffer_chunksize;
|
||||
/** write buffer chunk size */
|
||||
unsigned int writebuffer_chunksize;
|
||||
/** maximum packet size. Needed for filtering modem status bytes every n packets. */
|
||||
unsigned int max_packet_size;
|
||||
|
||||
/* FTDI FT2232C requirecments */
|
||||
/** FT2232C interface number: 0 or 1 */
|
||||
int interface; /* 0 or 1 */
|
||||
/** FT2232C index number: 1 or 2 */
|
||||
int index; /* 1 or 2 */
|
||||
/* Endpoints */
|
||||
/** FT2232C end points: 1 or 2 */
|
||||
int in_ep;
|
||||
int out_ep; /* 1 or 2 */
|
||||
|
||||
/** Bitbang mode. 1: (default) Normal bitbang mode, 2: FT2232C SPI bitbang mode */
|
||||
unsigned char bitbang_mode;
|
||||
|
||||
/** Decoded eeprom structure */
|
||||
struct ftdi_eeprom *eeprom;
|
||||
|
||||
/** String representation of last error */
|
||||
char *error_str;
|
||||
|
||||
/** Defines behavior in case a kernel module is already attached to the device */
|
||||
enum ftdi_module_detach_mode module_detach_mode;
|
||||
};
|
||||
|
||||
/**
|
||||
List all handled EEPROM values.
|
||||
Append future new values only at the end to provide API/ABI stability*/
|
||||
enum ftdi_eeprom_value
|
||||
{
|
||||
VENDOR_ID = 0,
|
||||
PRODUCT_ID = 1,
|
||||
SELF_POWERED = 2,
|
||||
REMOTE_WAKEUP = 3,
|
||||
IS_NOT_PNP = 4,
|
||||
SUSPEND_DBUS7 = 5,
|
||||
IN_IS_ISOCHRONOUS = 6,
|
||||
OUT_IS_ISOCHRONOUS = 7,
|
||||
SUSPEND_PULL_DOWNS = 8,
|
||||
USE_SERIAL = 9,
|
||||
USB_VERSION = 10,
|
||||
USE_USB_VERSION = 11,
|
||||
MAX_POWER = 12,
|
||||
CHANNEL_A_TYPE = 13,
|
||||
CHANNEL_B_TYPE = 14,
|
||||
CHANNEL_A_DRIVER = 15,
|
||||
CHANNEL_B_DRIVER = 16,
|
||||
CBUS_FUNCTION_0 = 17,
|
||||
CBUS_FUNCTION_1 = 18,
|
||||
CBUS_FUNCTION_2 = 19,
|
||||
CBUS_FUNCTION_3 = 20,
|
||||
CBUS_FUNCTION_4 = 21,
|
||||
CBUS_FUNCTION_5 = 22,
|
||||
CBUS_FUNCTION_6 = 23,
|
||||
CBUS_FUNCTION_7 = 24,
|
||||
CBUS_FUNCTION_8 = 25,
|
||||
CBUS_FUNCTION_9 = 26,
|
||||
HIGH_CURRENT = 27,
|
||||
HIGH_CURRENT_A = 28,
|
||||
HIGH_CURRENT_B = 29,
|
||||
INVERT = 30,
|
||||
GROUP0_DRIVE = 31,
|
||||
GROUP0_SCHMITT = 32,
|
||||
GROUP0_SLEW = 33,
|
||||
GROUP1_DRIVE = 34,
|
||||
GROUP1_SCHMITT = 35,
|
||||
GROUP1_SLEW = 36,
|
||||
GROUP2_DRIVE = 37,
|
||||
GROUP2_SCHMITT = 38,
|
||||
GROUP2_SLEW = 39,
|
||||
GROUP3_DRIVE = 40,
|
||||
GROUP3_SCHMITT = 41,
|
||||
GROUP3_SLEW = 42,
|
||||
CHIP_SIZE = 43,
|
||||
CHIP_TYPE = 44,
|
||||
POWER_SAVE = 45,
|
||||
CLOCK_POLARITY = 46,
|
||||
DATA_ORDER = 47,
|
||||
FLOW_CONTROL = 48,
|
||||
CHANNEL_C_DRIVER = 49,
|
||||
CHANNEL_D_DRIVER = 50,
|
||||
CHANNEL_A_RS485 = 51,
|
||||
CHANNEL_B_RS485 = 52,
|
||||
CHANNEL_C_RS485 = 53,
|
||||
CHANNEL_D_RS485 = 54,
|
||||
};
|
||||
|
||||
/**
|
||||
\brief list of usb devices created by ftdi_usb_find_all()
|
||||
*/
|
||||
struct ftdi_device_list
|
||||
{
|
||||
/** pointer to next entry */
|
||||
struct ftdi_device_list *next;
|
||||
/** pointer to libusb's usb_device */
|
||||
struct libusb_device *dev;
|
||||
};
|
||||
#define FT1284_CLK_IDLE_STATE 0x01
|
||||
#define FT1284_DATA_LSB 0x02 /* DS_FT232H 1.3 amd ftd2xx.h 1.0.4 disagree here*/
|
||||
#define FT1284_FLOW_CONTROL 0x04
|
||||
#define POWER_SAVE_DISABLE_H 0x80
|
||||
|
||||
#define USE_SERIAL_NUM 0x08
|
||||
enum ftdi_cbus_func {/* FIXME: Recheck value, especially the last */
|
||||
CBUS_TXDEN = 0, CBUS_PWREN = 1, CBUS_RXLED = 2, CBUS_TXLED = 3, CBUS_TXRXLED = 4,
|
||||
CBUS_SLEEP = 5, CBUS_CLK48 = 6, CBUS_CLK24 = 7, CBUS_CLK12 = 8, CBUS_CLK6 = 9,
|
||||
CBUS_IOMODE = 0xa, CBUS_BB_WR = 0xb, CBUS_BB_RD = 0xc, CBUS_BB = 0xd};
|
||||
|
||||
enum ftdi_cbush_func {/* FIXME: Recheck value, especially the last */
|
||||
CBUSH_TRISTATE = 0, CBUSH_RXLED = 1, CBUSH_TXLED = 2, CBUSH_TXRXLED = 3, CBUSH_PWREN = 4,
|
||||
CBUSH_SLEEP = 5, CBUSH_DRIVE_0 = 6, CBUSG_DRIVE1 = 7, CBUSH_IOMODE = 8, CBUSH_TXDEN = 9,
|
||||
CBUSH_CLK30 = 0xa, CBUSH_CLK15 = 0xb, CBUSH_CLK7_5 = 0xc};
|
||||
|
||||
/** Invert TXD# */
|
||||
#define INVERT_TXD 0x01
|
||||
/** Invert RXD# */
|
||||
#define INVERT_RXD 0x02
|
||||
/** Invert RTS# */
|
||||
#define INVERT_RTS 0x04
|
||||
/** Invert CTS# */
|
||||
#define INVERT_CTS 0x08
|
||||
/** Invert DTR# */
|
||||
#define INVERT_DTR 0x10
|
||||
/** Invert DSR# */
|
||||
#define INVERT_DSR 0x20
|
||||
/** Invert DCD# */
|
||||
#define INVERT_DCD 0x40
|
||||
/** Invert RI# */
|
||||
#define INVERT_RI 0x80
|
||||
|
||||
/** Interface Mode. */
|
||||
#define CHANNEL_IS_UART 0x0
|
||||
#define CHANNEL_IS_FIFO 0x1
|
||||
#define CHANNEL_IS_OPTO 0x2
|
||||
#define CHANNEL_IS_CPU 0x4
|
||||
#define CHANNEL_IS_FT1284 0x8
|
||||
|
||||
#define CHANNEL_IS_RS485 0x10
|
||||
|
||||
#define DRIVE_4MA 0
|
||||
#define DRIVE_8MA 1
|
||||
#define DRIVE_12MA 2
|
||||
#define DRIVE_16MA 3
|
||||
#define SLOW_SLEW 4
|
||||
#define IS_SCHMITT 8
|
||||
|
||||
/** Driver Type. */
|
||||
#define DRIVER_VCP 0x08
|
||||
#define DRIVER_VCPH 0x10 /* FT232H has moved the VCP bit */
|
||||
|
||||
#define USE_USB_VERSION_BIT 0x10
|
||||
|
||||
#define SUSPEND_DBUS7_BIT 0x80
|
||||
|
||||
/** High current drive. */
|
||||
#define HIGH_CURRENT_DRIVE 0x10
|
||||
#define HIGH_CURRENT_DRIVE_R 0x04
|
||||
|
||||
/**
|
||||
\brief Progress Info for streaming read
|
||||
*/
|
||||
struct size_and_time
|
||||
{
|
||||
uint64_t totalBytes;
|
||||
struct timeval time;
|
||||
};
|
||||
|
||||
typedef struct
|
||||
{
|
||||
struct size_and_time first;
|
||||
struct size_and_time prev;
|
||||
struct size_and_time current;
|
||||
double totalTime;
|
||||
double totalRate;
|
||||
double currentRate;
|
||||
} FTDIProgressInfo;
|
||||
|
||||
typedef int (FTDIStreamCallback)(uint8_t *buffer, int length,
|
||||
FTDIProgressInfo *progress, void *userdata);
|
||||
|
||||
/**
|
||||
* Provide libftdi version information
|
||||
* major: Library major version
|
||||
* minor: Library minor version
|
||||
* micro: Currently unused, ight get used for hotfixes.
|
||||
* version_str: Version as (static) string
|
||||
* snapshot_str: Git snapshot version if known. Otherwise "unknown" or empty string.
|
||||
*/
|
||||
struct ftdi_version_info
|
||||
{
|
||||
int major;
|
||||
int minor;
|
||||
int micro;
|
||||
const char *version_str;
|
||||
const char *snapshot_str;
|
||||
};
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
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);
|
||||
|
||||
void ftdi_deinit(struct ftdi_context *ftdi);
|
||||
void ftdi_free(struct ftdi_context *ftdi);
|
||||
void ftdi_set_usbdev (struct ftdi_context *ftdi, struct libusb_device_handle *usbdev);
|
||||
|
||||
struct ftdi_version_info ftdi_get_library_version();
|
||||
|
||||
int ftdi_usb_find_all(struct ftdi_context *ftdi, struct ftdi_device_list **devlist,
|
||||
int vendor, int product);
|
||||
void ftdi_list_free(struct ftdi_device_list **devlist);
|
||||
void ftdi_list_free2(struct ftdi_device_list *devlist);
|
||||
int ftdi_usb_get_strings(struct ftdi_context *ftdi, struct libusb_device *dev,
|
||||
char * manufacturer, int mnf_len,
|
||||
char * description, int desc_len,
|
||||
char * serial, int serial_len);
|
||||
|
||||
int ftdi_usb_open(struct ftdi_context *ftdi, int vendor, int product);
|
||||
int ftdi_usb_open_desc(struct ftdi_context *ftdi, int vendor, int product,
|
||||
const char* description, const char* serial);
|
||||
int ftdi_usb_open_desc_index(struct ftdi_context *ftdi, int vendor, int product,
|
||||
const char* description, const char* serial, unsigned int index);
|
||||
int ftdi_usb_open_dev(struct ftdi_context *ftdi, struct libusb_device *dev);
|
||||
int ftdi_usb_open_string(struct ftdi_context *ftdi, const char* description);
|
||||
|
||||
int ftdi_usb_close(struct ftdi_context *ftdi);
|
||||
int ftdi_usb_reset(struct ftdi_context *ftdi);
|
||||
int ftdi_usb_purge_rx_buffer(struct ftdi_context *ftdi);
|
||||
int ftdi_usb_purge_tx_buffer(struct ftdi_context *ftdi);
|
||||
int ftdi_usb_purge_buffers(struct ftdi_context *ftdi);
|
||||
|
||||
int ftdi_set_baudrate(struct ftdi_context *ftdi, int baudrate);
|
||||
int ftdi_set_line_property(struct ftdi_context *ftdi, enum ftdi_bits_type bits,
|
||||
enum ftdi_stopbits_type sbit, enum ftdi_parity_type parity);
|
||||
int ftdi_set_line_property2(struct ftdi_context *ftdi, enum ftdi_bits_type bits,
|
||||
enum ftdi_stopbits_type sbit, enum ftdi_parity_type parity,
|
||||
enum ftdi_break_type break_type);
|
||||
|
||||
int ftdi_read_data(struct ftdi_context *ftdi, unsigned char *buf, int size);
|
||||
int ftdi_read_data_set_chunksize(struct ftdi_context *ftdi, unsigned int chunksize);
|
||||
int ftdi_read_data_get_chunksize(struct ftdi_context *ftdi, unsigned int *chunksize);
|
||||
|
||||
int ftdi_write_data(struct ftdi_context *ftdi, unsigned char *buf, int size);
|
||||
int ftdi_write_data_set_chunksize(struct ftdi_context *ftdi, unsigned int chunksize);
|
||||
int ftdi_write_data_get_chunksize(struct ftdi_context *ftdi, unsigned int *chunksize);
|
||||
|
||||
int ftdi_readstream(struct ftdi_context *ftdi, FTDIStreamCallback *callback,
|
||||
void *userdata, int packetsPerTransfer, int numTransfers);
|
||||
struct ftdi_transfer_control *ftdi_write_data_submit(struct ftdi_context *ftdi, unsigned char *buf, int size);
|
||||
void ftdi_async_complete(struct ftdi_context *ftdi, int wait_for_more);
|
||||
|
||||
struct ftdi_transfer_control *ftdi_read_data_submit(struct ftdi_context *ftdi, unsigned char *buf, int size);
|
||||
int ftdi_transfer_data_done(struct ftdi_transfer_control *tc);
|
||||
|
||||
int ftdi_set_bitmode(struct ftdi_context *ftdi, unsigned char bitmask, unsigned char mode);
|
||||
int ftdi_disable_bitbang(struct ftdi_context *ftdi);
|
||||
int ftdi_read_pins(struct ftdi_context *ftdi, unsigned char *pins);
|
||||
|
||||
int ftdi_set_latency_timer(struct ftdi_context *ftdi, unsigned char latency);
|
||||
int ftdi_get_latency_timer(struct ftdi_context *ftdi, unsigned char *latency);
|
||||
|
||||
int ftdi_poll_modem_status(struct ftdi_context *ftdi, unsigned short *status);
|
||||
|
||||
/* flow control */
|
||||
int ftdi_setflowctrl(struct ftdi_context *ftdi, int flowctrl);
|
||||
int ftdi_setdtr_rts(struct ftdi_context *ftdi, int dtr, int rts);
|
||||
int ftdi_setdtr(struct ftdi_context *ftdi, int state);
|
||||
int ftdi_setrts(struct ftdi_context *ftdi, int state);
|
||||
|
||||
int ftdi_set_event_char(struct ftdi_context *ftdi, unsigned char eventch, unsigned char enable);
|
||||
int ftdi_set_error_char(struct ftdi_context *ftdi, unsigned char errorch, unsigned char enable);
|
||||
|
||||
/* init eeprom for the given FTDI type */
|
||||
int ftdi_eeprom_initdefaults(struct ftdi_context *ftdi,
|
||||
char * manufacturer, char *product,
|
||||
char * serial);
|
||||
int ftdi_eeprom_build(struct ftdi_context *ftdi);
|
||||
int ftdi_eeprom_decode(struct ftdi_context *ftdi, int verbose);
|
||||
|
||||
int ftdi_get_eeprom_value(struct ftdi_context *ftdi, enum ftdi_eeprom_value value_name, int* value);
|
||||
int ftdi_set_eeprom_value(struct ftdi_context *ftdi, enum ftdi_eeprom_value value_name, int value);
|
||||
|
||||
int ftdi_get_eeprom_buf(struct ftdi_context *ftdi, unsigned char * buf, int size);
|
||||
int ftdi_set_eeprom_buf(struct ftdi_context *ftdi, const unsigned char * buf, int size);
|
||||
|
||||
int ftdi_read_eeprom(struct ftdi_context *ftdi);
|
||||
int ftdi_read_chipid(struct ftdi_context *ftdi, unsigned int *chipid);
|
||||
int ftdi_write_eeprom(struct ftdi_context *ftdi);
|
||||
int ftdi_erase_eeprom(struct ftdi_context *ftdi);
|
||||
|
||||
int ftdi_read_eeprom_location (struct ftdi_context *ftdi, int eeprom_addr, unsigned short *eeprom_val);
|
||||
int ftdi_write_eeprom_location(struct ftdi_context *ftdi, int eeprom_addr, unsigned short eeprom_val);
|
||||
|
||||
char *ftdi_get_error_string(struct ftdi_context *ftdi);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __libftdi_h__ */
|
@ -1,130 +0,0 @@
|
||||
/***************************************************************************
|
||||
ftdi_i.h - description
|
||||
-------------------
|
||||
begin : Don Sep 9 2011
|
||||
copyright : (C) 2003-2011 by Intra2net AG and the libftdi developers
|
||||
email : opensource@intra2net.com
|
||||
***************************************************************************/
|
||||
|
||||
/***************************************************************************
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU Lesser General Public License *
|
||||
* version 2.1 as published by the Free Software Foundation; *
|
||||
* *
|
||||
***************************************************************************
|
||||
|
||||
Non public definitions here
|
||||
|
||||
*/
|
||||
|
||||
/* Even on 93xx66 at max 256 bytes are used (AN_121)*/
|
||||
#define FTDI_MAX_EEPROM_SIZE 256
|
||||
|
||||
/**
|
||||
\brief FTDI eeprom structure
|
||||
*/
|
||||
struct ftdi_eeprom
|
||||
{
|
||||
/** vendor id */
|
||||
int vendor_id;
|
||||
/** product id */
|
||||
int product_id;
|
||||
|
||||
/** Was the eeprom structure initialized for the actual
|
||||
connected device? **/
|
||||
int initialized_for_connected_device;
|
||||
|
||||
/** self powered */
|
||||
int self_powered;
|
||||
/** remote wakeup */
|
||||
int remote_wakeup;
|
||||
|
||||
int is_not_pnp;
|
||||
|
||||
/* Suspend on DBUS7 Low */
|
||||
int suspend_dbus7;
|
||||
|
||||
/** input in isochronous transfer mode */
|
||||
int in_is_isochronous;
|
||||
/** output in isochronous transfer mode */
|
||||
int out_is_isochronous;
|
||||
/** suspend pull downs */
|
||||
int suspend_pull_downs;
|
||||
|
||||
/** use serial */
|
||||
int use_serial;
|
||||
/** usb version */
|
||||
int usb_version;
|
||||
/** Use usb version on FT2232 devices*/
|
||||
int use_usb_version;
|
||||
/** maximum power */
|
||||
int max_power;
|
||||
|
||||
/** manufacturer name */
|
||||
char *manufacturer;
|
||||
/** product name */
|
||||
char *product;
|
||||
/** serial number */
|
||||
char *serial;
|
||||
|
||||
/* 2232D/H specific */
|
||||
/* Hardware type, 0 = RS232 Uart, 1 = 245 FIFO, 2 = CPU FIFO,
|
||||
4 = OPTO Isolate */
|
||||
int channel_a_type;
|
||||
int channel_b_type;
|
||||
/* Driver Type, 1 = VCP */
|
||||
int channel_a_driver;
|
||||
int channel_b_driver;
|
||||
int channel_c_driver;
|
||||
int channel_d_driver;
|
||||
/* 4232H specific */
|
||||
int channel_a_rs485enable;
|
||||
int channel_b_rs485enable;
|
||||
int channel_c_rs485enable;
|
||||
int channel_d_rs485enable;
|
||||
|
||||
/* Special function of FT232R/FT232H devices (and possibly others as well) */
|
||||
/** CBUS pin function. See CBUS_xxx defines. */
|
||||
int cbus_function[10];
|
||||
/** Select hight current drive on R devices. */
|
||||
int high_current;
|
||||
/** Select hight current drive on A channel (2232C */
|
||||
int high_current_a;
|
||||
/** Select hight current drive on B channel (2232C). */
|
||||
int high_current_b;
|
||||
/** Select inversion of data lines (bitmask). */
|
||||
int invert;
|
||||
|
||||
/*2232H/4432H Group specific values */
|
||||
/* Group0 is AL on 2322H and A on 4232H
|
||||
Group1 is AH on 2232H and B on 4232H
|
||||
Group2 is BL on 2322H and C on 4232H
|
||||
Group3 is BH on 2232H and C on 4232H*/
|
||||
int group0_drive;
|
||||
int group0_schmitt;
|
||||
int group0_slew;
|
||||
int group1_drive;
|
||||
int group1_schmitt;
|
||||
int group1_slew;
|
||||
int group2_drive;
|
||||
int group2_schmitt;
|
||||
int group2_slew;
|
||||
int group3_drive;
|
||||
int group3_schmitt;
|
||||
int group3_slew;
|
||||
|
||||
int powersave;
|
||||
|
||||
int clock_polarity;
|
||||
int data_order;
|
||||
int flow_control;
|
||||
|
||||
/** eeprom size in bytes. This doesn't get stored in the eeprom
|
||||
but is the only way to pass it to ftdi_eeprom_build. */
|
||||
int size;
|
||||
/* EEPROM Type 0x46 for 93xx46, 0x56 for 93xx56 and 0x66 for 93xx66*/
|
||||
int chip;
|
||||
unsigned char buf[FTDI_MAX_EEPROM_SIZE];
|
||||
};
|
||||
|
@ -1,295 +0,0 @@
|
||||
/***************************************************************************
|
||||
ftdi_stream.c - description
|
||||
-------------------
|
||||
copyright : (C) 2009 Micah Dowty 2010 Uwe Bonnes
|
||||
email : opensource@intra2net.com
|
||||
***************************************************************************/
|
||||
|
||||
/***************************************************************************
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU Lesser General Public License *
|
||||
* version 2.1 as published by the Free Software Foundation; *
|
||||
* *
|
||||
***************************************************************************/
|
||||
|
||||
/* Adapted from
|
||||
* fastftdi.c - A minimal FTDI FT232H interface for which supports bit-bang
|
||||
* mode, but focuses on very high-performance support for
|
||||
* synchronous FIFO mode. Requires libusb-1.0
|
||||
*
|
||||
* Copyright (C) 2009 Micah Dowty
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include "ftdi.h"
|
||||
|
||||
typedef struct
|
||||
{
|
||||
FTDIStreamCallback *callback;
|
||||
void *userdata;
|
||||
int packetsize;
|
||||
int activity;
|
||||
int result;
|
||||
FTDIProgressInfo progress;
|
||||
} FTDIStreamState;
|
||||
|
||||
/* Handle callbacks
|
||||
*
|
||||
* With Exit request, free memory and release the transfer
|
||||
*
|
||||
* state->result is only set when some error happens
|
||||
*/
|
||||
static void
|
||||
ftdi_readstream_cb(struct libusb_transfer *transfer)
|
||||
{
|
||||
FTDIStreamState *state = transfer->user_data;
|
||||
int packet_size = state->packetsize;
|
||||
|
||||
state->activity++;
|
||||
if (transfer->status == LIBUSB_TRANSFER_COMPLETED)
|
||||
{
|
||||
int i;
|
||||
uint8_t *ptr = transfer->buffer;
|
||||
int length = transfer->actual_length;
|
||||
int numPackets = (length + packet_size - 1) / packet_size;
|
||||
int res = 0;
|
||||
|
||||
for (i = 0; i < numPackets; i++)
|
||||
{
|
||||
int payloadLen;
|
||||
int packetLen = length;
|
||||
|
||||
if (packetLen > packet_size)
|
||||
packetLen = packet_size;
|
||||
|
||||
payloadLen = packetLen - 2;
|
||||
state->progress.current.totalBytes += payloadLen;
|
||||
|
||||
res = state->callback(ptr + 2, payloadLen,
|
||||
NULL, state->userdata);
|
||||
|
||||
ptr += packetLen;
|
||||
length -= packetLen;
|
||||
}
|
||||
if (res)
|
||||
{
|
||||
free(transfer->buffer);
|
||||
libusb_free_transfer(transfer);
|
||||
}
|
||||
else
|
||||
{
|
||||
transfer->status = -1;
|
||||
state->result = libusb_submit_transfer(transfer);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf(stderr, "unknown status %d\n",transfer->status);
|
||||
state->result = LIBUSB_ERROR_IO;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
Helper function to calculate (unix) time differences
|
||||
|
||||
\param a timeval
|
||||
\param b timeval
|
||||
*/
|
||||
static double
|
||||
TimevalDiff(const struct timeval *a, const struct timeval *b)
|
||||
{
|
||||
return (a->tv_sec - b->tv_sec) + 1e-6 * (a->tv_usec - b->tv_usec);
|
||||
}
|
||||
|
||||
/**
|
||||
Streaming reading of data from the device
|
||||
|
||||
Use asynchronous transfers in libusb-1.0 for high-performance
|
||||
streaming of data from a device interface back to the PC. This
|
||||
function continuously transfers data until either an error occurs
|
||||
or the callback returns a nonzero value. This function returns
|
||||
a libusb error code or the callback's return value.
|
||||
|
||||
For every contiguous block of received data, the callback will
|
||||
be invoked.
|
||||
|
||||
\param ftdi pointer to ftdi_context
|
||||
\param callback to user supplied function for one block of data
|
||||
\param userdata
|
||||
\param packetsPerTransfer number of packets per transfer
|
||||
\param numTransfers Number of transfers per callback
|
||||
|
||||
*/
|
||||
|
||||
int
|
||||
ftdi_readstream(struct ftdi_context *ftdi,
|
||||
FTDIStreamCallback *callback, void *userdata,
|
||||
int packetsPerTransfer, int numTransfers)
|
||||
{
|
||||
struct libusb_transfer **transfers;
|
||||
FTDIStreamState state = { callback, userdata, ftdi->max_packet_size, 1 };
|
||||
int bufferSize = packetsPerTransfer * ftdi->max_packet_size;
|
||||
int xferIndex;
|
||||
int err = 0;
|
||||
|
||||
/* Only FT2232H and FT232H know about the synchronous FIFO Mode*/
|
||||
if ((ftdi->type != TYPE_2232H) && (ftdi->type != TYPE_232H))
|
||||
{
|
||||
fprintf(stderr,"Device doesn't support synchronous FIFO mode\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* We don't know in what state we are, switch to reset*/
|
||||
if (ftdi_set_bitmode(ftdi, 0xff, BITMODE_RESET) < 0)
|
||||
{
|
||||
fprintf(stderr,"Can't reset mode\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Purge anything remaining in the buffers*/
|
||||
if (ftdi_usb_purge_buffers(ftdi) < 0)
|
||||
{
|
||||
fprintf(stderr,"Can't Purge\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Set up all transfers
|
||||
*/
|
||||
|
||||
transfers = calloc(numTransfers, sizeof *transfers);
|
||||
if (!transfers) {
|
||||
err = LIBUSB_ERROR_NO_MEM;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
for (xferIndex = 0; xferIndex < numTransfers; xferIndex++)
|
||||
{
|
||||
struct libusb_transfer *transfer;
|
||||
|
||||
transfer = libusb_alloc_transfer(0);
|
||||
transfers[xferIndex] = transfer;
|
||||
if (!transfer) {
|
||||
err = LIBUSB_ERROR_NO_MEM;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
libusb_fill_bulk_transfer(transfer, ftdi->usb_dev, ftdi->out_ep,
|
||||
malloc(bufferSize), bufferSize,
|
||||
ftdi_readstream_cb,
|
||||
&state, 0);
|
||||
|
||||
if (!transfer->buffer) {
|
||||
err = LIBUSB_ERROR_NO_MEM;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
transfer->status = -1;
|
||||
err = libusb_submit_transfer(transfer);
|
||||
if (err)
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
/* Start the transfers only when everything has been set up.
|
||||
* Otherwise the transfers start stuttering and the PC not
|
||||
* fetching data for several to several ten milliseconds
|
||||
* and we skip blocks
|
||||
*/
|
||||
if (ftdi_set_bitmode(ftdi, 0xff, BITMODE_SYNCFF) < 0)
|
||||
{
|
||||
fprintf(stderr,"Can't set synchronous fifo mode: %s\n",
|
||||
ftdi_get_error_string(ftdi));
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
/*
|
||||
* Run the transfers, and periodically assess progress.
|
||||
*/
|
||||
|
||||
gettimeofday(&state.progress.first.time, NULL);
|
||||
|
||||
do
|
||||
{
|
||||
FTDIProgressInfo *progress = &state.progress;
|
||||
const double progressInterval = 1.0;
|
||||
struct timeval timeout = { 0, ftdi->usb_read_timeout };
|
||||
struct timeval now;
|
||||
|
||||
int err = libusb_handle_events_timeout(ftdi->usb_ctx, &timeout);
|
||||
if (err == LIBUSB_ERROR_INTERRUPTED)
|
||||
/* restart interrupted events */
|
||||
err = libusb_handle_events_timeout(ftdi->usb_ctx, &timeout);
|
||||
if (!state.result)
|
||||
{
|
||||
state.result = err;
|
||||
}
|
||||
if (state.activity == 0)
|
||||
state.result = 1;
|
||||
else
|
||||
state.activity = 0;
|
||||
|
||||
// If enough time has elapsed, update the progress
|
||||
gettimeofday(&now, NULL);
|
||||
if (TimevalDiff(&now, &progress->current.time) >= progressInterval)
|
||||
{
|
||||
progress->current.time = now;
|
||||
progress->totalTime = TimevalDiff(&progress->current.time,
|
||||
&progress->first.time);
|
||||
|
||||
if (progress->prev.totalBytes)
|
||||
{
|
||||
// We have enough information to calculate rates
|
||||
|
||||
double currentTime;
|
||||
|
||||
currentTime = TimevalDiff(&progress->current.time,
|
||||
&progress->prev.time);
|
||||
|
||||
progress->totalRate =
|
||||
progress->current.totalBytes /progress->totalTime;
|
||||
progress->currentRate =
|
||||
(progress->current.totalBytes -
|
||||
progress->prev.totalBytes) / currentTime;
|
||||
}
|
||||
|
||||
state.callback(NULL, 0, progress, state.userdata);
|
||||
progress->prev = progress->current;
|
||||
|
||||
}
|
||||
} while (!state.result);
|
||||
|
||||
/*
|
||||
* Cancel any outstanding transfers, and free memory.
|
||||
*/
|
||||
|
||||
cleanup:
|
||||
fprintf(stderr, "cleanup\n");
|
||||
if (transfers)
|
||||
free(transfers);
|
||||
if (err)
|
||||
return err;
|
||||
else
|
||||
return state.result;
|
||||
}
|
||||
|
@ -1,11 +0,0 @@
|
||||
#ifndef FTDI_VERSION_INTERNAL_H
|
||||
#define FTDI_VERSION_INTERNAL_H
|
||||
|
||||
#define FTDI_MAJOR_VERSION 2
|
||||
#define FTDI_MINOR_VERSION 0
|
||||
#define FTDI_MICRO_VERSION 0
|
||||
|
||||
const char FTDI_VERSION_STRING[] = "";
|
||||
const char FTDI_SNAPSHOT_VERSION[] = "";
|
||||
|
||||
#endif
|
@ -1,11 +0,0 @@
|
||||
#ifndef FTDI_VERSION_INTERNAL_H
|
||||
#define FTDI_VERSION_INTERNAL_H
|
||||
|
||||
#define FTDI_MAJOR_VERSION @MAJOR_VERSION@
|
||||
#define FTDI_MINOR_VERSION @MINOR_VERSION@
|
||||
#define FTDI_MICRO_VERSION 0
|
||||
|
||||
const char FTDI_VERSION_STRING[] = "@VERSION_STRING@";
|
||||
const char FTDI_SNAPSHOT_VERSION[] = "@SNAPSHOT_VERSION@";
|
||||
|
||||
#endif
|
@ -1,30 +0,0 @@
|
||||
# Optional unit test
|
||||
|
||||
find_package(Boost COMPONENTS unit_test_framework)
|
||||
|
||||
if(Boost_UNIT_TEST_FRAMEWORK_FOUND)
|
||||
|
||||
message(STATUS "Building unit test")
|
||||
|
||||
enable_testing()
|
||||
|
||||
INCLUDE_DIRECTORIES(BEFORE ${CMAKE_SOURCE_DIR}/src ${Boost_INCLUDE_DIRS})
|
||||
|
||||
set(cpp_tests
|
||||
basic.cpp
|
||||
baudrate.cpp
|
||||
)
|
||||
|
||||
add_executable(test_libftdi ${cpp_tests})
|
||||
target_link_libraries(test_libftdi ftdi ${Boost_UNIT_TEST_FRAMEWORK_LIBRARIES})
|
||||
|
||||
add_test(test_libftdi test_libftdi)
|
||||
|
||||
# Add custom target so we run easily run "make check"
|
||||
add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND} DEPENDS test_libftdi)
|
||||
|
||||
else(Boost_UNIT_TEST_FRAMEWORK_FOUND)
|
||||
|
||||
message(STATUS "NOT building unit test (requires boost unit test framework)")
|
||||
|
||||
endif(Boost_UNIT_TEST_FRAMEWORK_FOUND)
|
@ -1,33 +0,0 @@
|
||||
/**@file
|
||||
@brief Test basic FTDI functionality
|
||||
|
||||
@author Thomas Jarosch
|
||||
*/
|
||||
|
||||
/***************************************************************************
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU Lesser General Public License *
|
||||
* version 2.1 as published by the Free Software Foundation; *
|
||||
* *
|
||||
***************************************************************************/
|
||||
|
||||
#define BOOST_TEST_DYN_LINK
|
||||
#define BOOST_TEST_MAIN
|
||||
#include <boost/test/unit_test.hpp>
|
||||
|
||||
#include <ftdi.h>
|
||||
|
||||
BOOST_AUTO_TEST_SUITE(Basic)
|
||||
|
||||
BOOST_AUTO_TEST_CASE(SimpleInit)
|
||||
{
|
||||
ftdi_context ftdi;
|
||||
|
||||
int rtn_init = ftdi_init(&ftdi);
|
||||
BOOST_REQUIRE_EQUAL(0, rtn_init);
|
||||
|
||||
ftdi_deinit(&ftdi);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_SUITE_END()
|
@ -1,267 +0,0 @@
|
||||
/**@file
|
||||
@brief Test baudrate calculator code
|
||||
|
||||
@author Thomas Jarosch and Uwe Bonnes
|
||||
*/
|
||||
|
||||
/***************************************************************************
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU Lesser General Public License *
|
||||
* version 2.1 as published by the Free Software Foundation; *
|
||||
* *
|
||||
***************************************************************************/
|
||||
|
||||
#include <ftdi.h>
|
||||
|
||||
#define BOOST_TEST_DYN_LINK
|
||||
#include <boost/test/unit_test.hpp>
|
||||
#include <boost/foreach.hpp>
|
||||
#include <vector>
|
||||
#include <map>
|
||||
#include <math.h>
|
||||
|
||||
using namespace std;
|
||||
|
||||
extern "C" int convert_baudrate_UT_export(int baudrate, struct ftdi_context *ftdi,
|
||||
unsigned short *value, unsigned short *index);
|
||||
|
||||
/// Basic initialization of libftdi for every test
|
||||
class BaseFTDIFixture
|
||||
{
|
||||
protected:
|
||||
ftdi_context *ftdi;
|
||||
|
||||
public:
|
||||
BaseFTDIFixture()
|
||||
: ftdi(NULL)
|
||||
{
|
||||
ftdi = ftdi_new();
|
||||
}
|
||||
|
||||
virtual ~BaseFTDIFixture()
|
||||
{
|
||||
delete ftdi;
|
||||
ftdi = NULL;
|
||||
}
|
||||
};
|
||||
|
||||
BOOST_FIXTURE_TEST_SUITE(Baudrate, BaseFTDIFixture)
|
||||
|
||||
/// Helper class to store the convert_baudrate_UT_export result
|
||||
struct calc_result
|
||||
{
|
||||
int actual_baudrate;
|
||||
unsigned short divisor;
|
||||
unsigned short fractional_bits;
|
||||
unsigned short clock;
|
||||
|
||||
calc_result(int actual, unsigned short my_divisor, unsigned short my_fractional_bits, unsigned short my_clock)
|
||||
: actual_baudrate(actual)
|
||||
, divisor(my_divisor)
|
||||
, fractional_bits(my_fractional_bits)
|
||||
, clock(my_clock)
|
||||
{
|
||||
}
|
||||
|
||||
calc_result()
|
||||
: actual_baudrate(0)
|
||||
, divisor(0)
|
||||
, fractional_bits(0)
|
||||
, clock(0)
|
||||
{
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief Test convert_baudrate code against a list of baud rates
|
||||
*
|
||||
* @param baudrates Baudrates to check
|
||||
**/
|
||||
static void test_baudrates(ftdi_context *ftdi, const map<int, calc_result> &baudrates)
|
||||
{
|
||||
typedef std::pair<int, calc_result> baudrate_type;
|
||||
BOOST_FOREACH(const baudrate_type &baudrate, baudrates)
|
||||
{
|
||||
unsigned short calc_value = 0, calc_index = 0;
|
||||
int calc_baudrate = convert_baudrate_UT_export(baudrate.first, ftdi, &calc_value, &calc_index);
|
||||
|
||||
const calc_result *res = &baudrate.second;
|
||||
|
||||
unsigned short divisor = calc_value & 0x3fff;
|
||||
unsigned short fractional_bits = (calc_value >> 14);
|
||||
unsigned short clock = (calc_index & 0x200) ? 120 : 48;
|
||||
|
||||
switch (ftdi->type)
|
||||
{
|
||||
case TYPE_232H:
|
||||
case TYPE_2232H:
|
||||
case TYPE_4232H:
|
||||
fractional_bits |= (calc_index & 0x100) ? 4 : 0;
|
||||
break;
|
||||
case TYPE_R:
|
||||
case TYPE_2232C:
|
||||
case TYPE_BM:
|
||||
fractional_bits |= (calc_index & 0x001) ? 4 : 0;
|
||||
break;
|
||||
default:;
|
||||
}
|
||||
|
||||
// Aid debugging since this test is a generic function
|
||||
BOOST_CHECK_MESSAGE(res->actual_baudrate == calc_baudrate && res->divisor == divisor && res->fractional_bits == fractional_bits
|
||||
&& res->clock == clock,
|
||||
"\n\nERROR: baudrate calculation failed for --" << baudrate.first << " baud--. Details below: ");
|
||||
|
||||
BOOST_CHECK_EQUAL(res->actual_baudrate, calc_baudrate);
|
||||
BOOST_CHECK_EQUAL(res->divisor, divisor);
|
||||
BOOST_CHECK_EQUAL(res->fractional_bits, fractional_bits);
|
||||
BOOST_CHECK_EQUAL(res->clock, clock);
|
||||
}
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(TypeAMFixedBaudrates)
|
||||
{
|
||||
ftdi->type = TYPE_AM;
|
||||
|
||||
map<int, calc_result> baudrates;
|
||||
baudrates[183] = calc_result(183, 16383, 0, 48);
|
||||
baudrates[300] = calc_result(300, 10000, 0, 48);
|
||||
baudrates[600] = calc_result(600, 5000, 0, 48);
|
||||
baudrates[1200] = calc_result(1200, 2500, 0, 48);
|
||||
baudrates[2400] = calc_result(2400, 1250, 0, 48);
|
||||
baudrates[4800] = calc_result(4800, 625, 0, 48);
|
||||
baudrates[9600] = calc_result(9600, 312, 1, 48);
|
||||
baudrates[19200] = calc_result(19200, 156, 2, 48);
|
||||
baudrates[38400] = calc_result(38400, 78, 3, 48);
|
||||
baudrates[57600] = calc_result(57554, 52, 3, 48);
|
||||
baudrates[115200] = calc_result(115385, 26, 0, 48);
|
||||
baudrates[230400] = calc_result(230769, 13, 0, 48);
|
||||
baudrates[460800] = calc_result(461538, 6, 1, 48);
|
||||
baudrates[921600] = calc_result(923077, 3, 2, 48);
|
||||
baudrates[1000000] = calc_result(1000000, 3, 0, 48);
|
||||
baudrates[1090512] = calc_result(1000000, 3, 0, 48);
|
||||
baudrates[1090909] = calc_result(1000000, 3, 0, 48);
|
||||
baudrates[1090910] = calc_result(1000000, 3, 0, 48);
|
||||
baudrates[1200000] = calc_result(1200000, 2, 1, 48);
|
||||
baudrates[1333333] = calc_result(1333333, 2, 2, 48);
|
||||
baudrates[1411764] = calc_result(1411765, 2, 3, 48);
|
||||
baudrates[1500000] = calc_result(1500000, 2, 0, 48);
|
||||
baudrates[2000000] = calc_result(1500000, 2, 0, 48);
|
||||
baudrates[3000000] = calc_result(3000000, 0, 0, 48);
|
||||
|
||||
test_baudrates(ftdi, baudrates);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(TypeBMFixedBaudrates)
|
||||
{
|
||||
// Unify testing of chips behaving the same
|
||||
std::vector<enum ftdi_chip_type> test_types;
|
||||
test_types.push_back(TYPE_BM);
|
||||
test_types.push_back(TYPE_2232C);
|
||||
test_types.push_back(TYPE_R);
|
||||
|
||||
map<int, calc_result> baudrates;
|
||||
baudrates[183] = calc_result(183, 16383, 7, 48);
|
||||
baudrates[184] = calc_result(184, 16304, 4, 48);
|
||||
baudrates[300] = calc_result(300, 10000, 0, 48);
|
||||
baudrates[600] = calc_result(600, 5000, 0, 48);
|
||||
baudrates[1200] = calc_result(1200, 2500, 0, 48);
|
||||
baudrates[2400] = calc_result(2400, 1250, 0, 48);
|
||||
baudrates[4800] = calc_result(4800, 625, 0, 48);
|
||||
baudrates[9600] = calc_result(9600, 312, 1, 48);
|
||||
baudrates[19200] = calc_result(19200, 156, 2, 48);
|
||||
baudrates[38400] = calc_result(38400, 78, 3, 48);
|
||||
baudrates[57600] = calc_result(57554, 52, 3, 48);
|
||||
baudrates[115200] = calc_result(115385, 26, 0, 48);
|
||||
baudrates[230400] = calc_result(230769, 13, 0, 48);
|
||||
baudrates[460800] = calc_result(461538, 6, 1, 48);
|
||||
baudrates[921600] = calc_result(923077, 3, 2, 48);
|
||||
baudrates[1000000] = calc_result(1000000, 3, 0, 48);
|
||||
baudrates[1050000] = calc_result(1043478, 2, 7, 48);
|
||||
baudrates[1400000] = calc_result(1411765, 2, 3, 48);
|
||||
baudrates[1500000] = calc_result(1500000, 2, 0, 48);
|
||||
baudrates[2000000] = calc_result(2000000, 1, 0, 48);
|
||||
baudrates[3000000] = calc_result(3000000, 0, 0, 48);
|
||||
|
||||
baudrates[(3000000*16/(2*16+15))-1] = calc_result(round(3000000/3.000), 3, 0, 48);
|
||||
baudrates[ 3000000*16/(2*16+15) ] = calc_result(round(3000000/3.000), 3, 0, 48);
|
||||
baudrates[(3000000*16/(2*16+15))+1] = calc_result(round(3000000/2.875), 2, 7, 48);
|
||||
baudrates[ 3000000*16/(2*16+13) ] = calc_result(round(3000000/2.875), 2, 7, 48);
|
||||
baudrates[(3000000*16/(2*16+13))+1] = calc_result(round(3000000/2.750), 2, 6, 48);
|
||||
baudrates[ 3000000*16/(2*16+11) ] = calc_result(round(3000000/2.750), 2, 6, 48);
|
||||
baudrates[(3000000*16/(2*16+11))+1] = calc_result(round(3000000/2.625), 2, 5, 48);
|
||||
baudrates[ 3000000*16/(2*16+ 9) ] = calc_result(round(3000000/2.625), 2, 5, 48);
|
||||
baudrates[(3000000*16/(2*16+ 9))+1] = calc_result(round(3000000/2.500), 2, 1, 48);
|
||||
baudrates[ 3000000*16/(2*16+ 7) ] = calc_result(round(3000000/2.500), 2, 1, 48);
|
||||
baudrates[(3000000*16/(2*16+ 7))+1] = calc_result(round(3000000/2.375), 2, 4, 48);
|
||||
baudrates[ 3000000*16/(2*16+ 5) ] = calc_result(round(3000000/2.375), 2, 4, 48);
|
||||
baudrates[(3000000*16/(2*16+ 5))+1] = calc_result(round(3000000/2.250), 2, 2, 48);
|
||||
baudrates[ 3000000*16/(2*16+ 3) ] = calc_result(round(3000000/2.250), 2, 2, 48);
|
||||
baudrates[(3000000*16/(2*16+ 3))+1] = calc_result(round(3000000/2.125), 2, 3, 48);
|
||||
baudrates[ 3000000*16/(2*16+ 1) ] = calc_result(round(3000000/2.125), 2, 3, 48);
|
||||
baudrates[(3000000*16/(2*16+ 1))+1] = calc_result(round(3000000/2.000), 2, 0, 48);
|
||||
|
||||
BOOST_FOREACH(const enum ftdi_chip_type &test_chip_type, test_types)
|
||||
{
|
||||
ftdi->type = test_chip_type;
|
||||
test_baudrates(ftdi, baudrates);
|
||||
}
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(TypeHFixedBaudrates)
|
||||
{
|
||||
// Unify testing of chips behaving the same
|
||||
std::vector<enum ftdi_chip_type> test_types;
|
||||
test_types.push_back(TYPE_2232H);
|
||||
test_types.push_back(TYPE_4232H);
|
||||
test_types.push_back(TYPE_232H);
|
||||
|
||||
map<int, calc_result> baudrates;
|
||||
baudrates[183] = calc_result(183, 16383, 7, 48);
|
||||
baudrates[184] = calc_result(184, 16304, 4, 48);
|
||||
baudrates[300] = calc_result(300, 10000, 0, 48);
|
||||
baudrates[600] = calc_result(600, 5000, 0, 48);
|
||||
baudrates[1200] = calc_result(1200, 10000, 0, 120);
|
||||
baudrates[2400] = calc_result(2400, 5000, 0, 120);
|
||||
baudrates[4800] = calc_result(4800, 2500, 0, 120);
|
||||
baudrates[9600] = calc_result(9600, 1250, 0, 120);
|
||||
baudrates[19200] = calc_result(19200, 625, 0, 120);
|
||||
baudrates[38400] = calc_result(38400, 312, 1, 120);
|
||||
baudrates[57600] = calc_result(57588, 208, 4, 120);
|
||||
baudrates[115200] = calc_result(115246, 104, 3, 120);
|
||||
baudrates[230400] = calc_result(230216, 52, 3, 120);
|
||||
baudrates[460800] = calc_result(461538, 26, 0, 120);
|
||||
baudrates[921600] = calc_result(923077, 13, 0, 120);
|
||||
baudrates[1000000] = calc_result(1000000, 12, 0, 120);
|
||||
baudrates[1000000] = calc_result(1000000, 12, 0, 120);
|
||||
baudrates[6000000] = calc_result(6000000, 2, 0, 120);
|
||||
baudrates[4173913] = calc_result(4173913, 2, 7, 120);
|
||||
baudrates[8000000] = calc_result(8000000, 1, 0, 120);
|
||||
baudrates[12000000] = calc_result(12000000, 0, 0, 120);
|
||||
|
||||
baudrates[(12000000*16/(2*16+15))-1] = calc_result(round(12000000/3.000), 3, 0, 120);
|
||||
baudrates[ 12000000*16/(2*16+15) ] = calc_result(round(12000000/3.000), 3, 0, 120);
|
||||
baudrates[(12000000*16/(2*16+15))+1] = calc_result(round(12000000/2.875), 2, 7, 120);
|
||||
baudrates[ 12000000*16/(2*16+13) ] = calc_result(round(12000000/2.875), 2, 7, 120);
|
||||
baudrates[(12000000*16/(2*16+13))+1] = calc_result(round(12000000/2.750), 2, 6, 120);
|
||||
baudrates[ 12000000*16/(2*16+11) ] = calc_result(round(12000000/2.750), 2, 6, 120);
|
||||
baudrates[(12000000*16/(2*16+11))+1] = calc_result(round(12000000/2.625), 2, 5, 120);
|
||||
baudrates[ 12000000*16/(2*16+ 9) ] = calc_result(round(12000000/2.625), 2, 5, 120);
|
||||
baudrates[(12000000*16/(2*16+ 9))+1] = calc_result(round(12000000/2.500), 2, 1, 120);
|
||||
baudrates[ 12000000*16/(2*16+ 7) ] = calc_result(round(12000000/2.500), 2, 1, 120);
|
||||
baudrates[(12000000*16/(2*16+ 7))+1] = calc_result(round(12000000/2.375), 2, 4, 120);
|
||||
baudrates[ 12000000*16/(2*16+ 5) ] = calc_result(round(12000000/2.375), 2, 4, 120);
|
||||
baudrates[(12000000*16/(2*16+ 5))+1] = calc_result(round(12000000/2.250), 2, 2, 120);
|
||||
baudrates[ 12000000*16/(2*16+ 3) ] = calc_result(round(12000000/2.250), 2, 2, 120);
|
||||
baudrates[(12000000*16/(2*16+ 3))+1] = calc_result(round(12000000/2.125), 2, 3, 120);
|
||||
baudrates[ 12000000*16/(2*16+ 1) ] = calc_result(round(12000000/2.125), 2, 3, 120);
|
||||
baudrates[(12000000*16/(2*16+ 1))+1] = calc_result(round(12000000/2.000), 2, 0, 120);
|
||||
|
||||
BOOST_FOREACH(const enum ftdi_chip_type &test_chip_type, test_types)
|
||||
{
|
||||
ftdi->type = test_chip_type;
|
||||
test_baudrates(ftdi, baudrates);
|
||||
}
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_SUITE_END()
|
@ -1,34 +0,0 @@
|
||||
---
|
||||
Checks: "-*,\
|
||||
boost-*,\
|
||||
bugprone-*,\
|
||||
-bugprone-easily-swappable-parameters,\
|
||||
-bugprone-narrowing-conversions,\
|
||||
-bugprone-signed-char-misuse,\
|
||||
-bugprone-switch-missing-default-case,\
|
||||
clang-analyzer-*,\
|
||||
-clang-analyzer-core.NullDereference,\
|
||||
-clang-analyzer-deadcode.DeadStores,\
|
||||
-clang-analyzer-optin.portability.UnixAPI,\
|
||||
-clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling,\
|
||||
-clang-analyzer-security.insecureAPI.strcpy,\
|
||||
-clang-analyzer-unix.Malloc,\
|
||||
misc-*,\
|
||||
-misc-no-recursion,\
|
||||
-misc-include-cleaner,\
|
||||
modernize-*,\
|
||||
-modernize-macro-to-enum,\
|
||||
performance-*,\
|
||||
-performance-no-int-to-ptr,\
|
||||
-performance-type-promotion-in-math-fn,\
|
||||
portability-*,\
|
||||
readability-*,\
|
||||
-readability-braces-around-statements,\
|
||||
-readability-else-after-return,\
|
||||
-readability-identifier-length,\
|
||||
-readability-function-cognitive-complexity,\
|
||||
-readability-isolate-declaration,\
|
||||
-readability-magic-numbers,\
|
||||
"
|
||||
#WarningsAsErrors: "*"
|
||||
...
|
@ -1,3 +0,0 @@
|
||||
[codespell]
|
||||
skip = strerror.c,AUTHORS
|
||||
ignore-words-list = numer,ser,xwindows
|
7
lib/libusb/.gitattributes
vendored
7
lib/libusb/.gitattributes
vendored
@ -1,7 +0,0 @@
|
||||
*.ac eol=lf
|
||||
*.am eol=lf
|
||||
*.bat eol=crlf
|
||||
*.sh eol=lf
|
||||
.gitattributes export-ignore
|
||||
.gitignore export-ignore
|
||||
INSTALL_WIN.txt eol=crlf
|
26
lib/libusb/.github/cifuzz.yml
vendored
26
lib/libusb/.github/cifuzz.yml
vendored
@ -1,26 +0,0 @@
|
||||
name: CIFuzz
|
||||
on: [pull_request]
|
||||
jobs:
|
||||
Fuzzing:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Build Fuzzers
|
||||
id: build
|
||||
uses: google/oss-fuzz/infra/cifuzz/actions/build_fuzzers@master
|
||||
with:
|
||||
oss-fuzz-project-name: 'libusb'
|
||||
dry-run: false
|
||||
language: c
|
||||
- name: Run Fuzzers
|
||||
uses: google/oss-fuzz/infra/cifuzz/actions/run_fuzzers@master
|
||||
with:
|
||||
oss-fuzz-project-name: 'libusb'
|
||||
fuzz-seconds: 600
|
||||
dry-run: false
|
||||
language: c
|
||||
- name: Upload Crash
|
||||
uses: actions/upload-artifact@v1
|
||||
if: failure() && steps.build.outcome == 'success'
|
||||
with:
|
||||
name: artifacts
|
||||
path: ./out/artifacts
|
50
lib/libusb/.github/workflows/linux.yml
vendored
50
lib/libusb/.github/workflows/linux.yml
vendored
@ -1,50 +0,0 @@
|
||||
name: linux
|
||||
|
||||
# Controls when the action will run. Triggers the workflow on push or pull request
|
||||
# events but only for the master branch
|
||||
on: [push, pull_request]
|
||||
|
||||
# A workflow run is made up of one or more jobs that can run
|
||||
# sequentially or in parallel
|
||||
jobs:
|
||||
# This workflow contains a single job called "build"
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
# Steps represent a sequence of tasks that will be executed as part of the job
|
||||
steps:
|
||||
# Checks-out your repository under $GITHUB_WORKSPACE, so your job
|
||||
# can access it
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
- name: setup prerequisites
|
||||
run: |
|
||||
sudo apt update
|
||||
sudo apt install autoconf automake libtool libudev-dev m4
|
||||
|
||||
- name: bootstrap
|
||||
run: ./bootstrap.sh
|
||||
|
||||
- name: netlink
|
||||
# Disable tests for netlink as it doesn't seem to work in the CI environment.
|
||||
run: .private/ci-build.sh --build-dir build-netlink --no-test -- --disable-udev
|
||||
|
||||
- name: udev
|
||||
run: .private/ci-build.sh --build-dir build-udev -- --enable-udev
|
||||
|
||||
- name: debug-log
|
||||
run: .private/ci-build.sh --build-dir build-debug -- --enable-debug-log
|
||||
|
||||
- name: disable-log
|
||||
run: .private/ci-build.sh --build-dir build-nolog -- --disable-log
|
||||
|
||||
- uses: mymindstorm/setup-emsdk@v13
|
||||
|
||||
- run: npm ci
|
||||
working-directory: tests/webusb-test-shim
|
||||
|
||||
- name: emscripten
|
||||
run: emconfigure .private/ci-build.sh --build-dir build-emscripten -- --host=wasm32-unknown-emscripten
|
||||
|
||||
- name: umockdev test
|
||||
run: .private/ci-container-build.sh docker.io/amd64/ubuntu:rolling
|
36
lib/libusb/.github/workflows/macos.yml
vendored
36
lib/libusb/.github/workflows/macos.yml
vendored
@ -1,36 +0,0 @@
|
||||
name: macOS
|
||||
|
||||
# Controls when the action will run. Triggers the workflow on push or pull request
|
||||
# events but only for the master branch
|
||||
on: [push, pull_request]
|
||||
|
||||
# A workflow run is made up of one or more jobs that can run
|
||||
# sequentially or in parallel
|
||||
jobs:
|
||||
# This workflow contains a single job called "build"
|
||||
build:
|
||||
runs-on: macos-latest
|
||||
|
||||
# Steps represent a sequence of tasks that will be executed as part of the job
|
||||
steps:
|
||||
# Checks-out your repository under $GITHUB_WORKSPACE, so your job
|
||||
# can access it
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
- name: setup prerequisites
|
||||
shell: bash
|
||||
run: |
|
||||
brew update
|
||||
brew install autoconf automake libtool m4
|
||||
|
||||
- name: bootstrap
|
||||
shell: bash
|
||||
run: ./bootstrap.sh
|
||||
|
||||
- name: compile
|
||||
shell: bash
|
||||
run: .private/ci-build.sh --build-dir build
|
||||
|
||||
- name: Xcode
|
||||
shell: bash
|
||||
run: cd Xcode && xcodebuild -project libusb.xcodeproj
|
23
lib/libusb/.github/workflows/msys2.yml
vendored
23
lib/libusb/.github/workflows/msys2.yml
vendored
@ -1,23 +0,0 @@
|
||||
name: MSYS2 build
|
||||
on: [push, pull_request]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: windows-latest
|
||||
defaults:
|
||||
run:
|
||||
shell: msys2 {0}
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: msys2/setup-msys2@v2
|
||||
with:
|
||||
msystem: MINGW64
|
||||
update: true
|
||||
install: git mingw-w64-x86_64-cc mingw-w64-x86_64-autotools
|
||||
- name: bootstrap
|
||||
run: ./bootstrap.sh
|
||||
- name: Build
|
||||
# GCC on MSYS2 doesn't have ASAN support (but Clang does).
|
||||
run: ./.private/ci-build.sh --build-dir build-msys2 --no-asan
|
||||
- name: Build with logging disabled
|
||||
run: ./.private/ci-build.sh --build-dir build-msys2-nolog --no-asan -- --disable-log
|
25
lib/libusb/.github/workflows/msys2_clang32.yml
vendored
25
lib/libusb/.github/workflows/msys2_clang32.yml
vendored
@ -1,25 +0,0 @@
|
||||
name: MSYS2 clang32 build
|
||||
on: [push, pull_request]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: windows-latest
|
||||
defaults:
|
||||
run:
|
||||
shell: msys2 {0}
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: msys2/setup-msys2@v2
|
||||
with:
|
||||
msystem: clang32
|
||||
update: true
|
||||
install: git mingw-w64-clang-i686-cc mingw-w64-clang-i686-autotools
|
||||
- name: CI-Build
|
||||
run: |
|
||||
echo 'Running in MSYS2!'
|
||||
./bootstrap.sh
|
||||
# Disabling tests as there is some issue that prevents libtool from
|
||||
# finalizing its executable wrappers.
|
||||
# Perhaps this one https://github.com/msys2/MSYS2-packages/issues/1351
|
||||
# but it only occurs on clang32 configuration.
|
||||
./.private/ci-build.sh --build-dir build-msys2-clang32 --no-test
|
21
lib/libusb/.github/workflows/msys2_clang64.yml
vendored
21
lib/libusb/.github/workflows/msys2_clang64.yml
vendored
@ -1,21 +0,0 @@
|
||||
name: MSYS2 clang64 build
|
||||
on: [push, pull_request]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: windows-latest
|
||||
defaults:
|
||||
run:
|
||||
shell: msys2 {0}
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: msys2/setup-msys2@v2
|
||||
with:
|
||||
msystem: clang64
|
||||
update: true
|
||||
install: git mingw-w64-clang-x86_64-cc mingw-w64-clang-x86_64-autotools
|
||||
- name: CI-Build
|
||||
run: |
|
||||
echo 'Running in MSYS2!'
|
||||
./bootstrap.sh
|
||||
./.private/ci-build.sh --build-dir build-msys2-clang64
|
84
lib/libusb/.gitignore
vendored
84
lib/libusb/.gitignore
vendored
@ -1,84 +0,0 @@
|
||||
.deps
|
||||
.libs
|
||||
Makefile
|
||||
Makefile.in
|
||||
!doc/Makefile.in
|
||||
*.la
|
||||
*.lo
|
||||
*.o
|
||||
*.js
|
||||
!/tests/webusb-test-shim/*.js
|
||||
*.wasm
|
||||
*.html
|
||||
libtool
|
||||
ltmain.sh
|
||||
missing
|
||||
stamp-h1
|
||||
m4/
|
||||
autom4te.cache
|
||||
INSTALL
|
||||
install-sh
|
||||
depcomp
|
||||
configure
|
||||
aclocal.m4
|
||||
compile
|
||||
test-driver
|
||||
config.guess
|
||||
config.h*
|
||||
!msvc/config.h
|
||||
!android/config.h
|
||||
!Xcode/config.h
|
||||
.vs
|
||||
config.log
|
||||
config.status
|
||||
config.sub
|
||||
*.swp
|
||||
doxygen.cfg
|
||||
examples/listdevs
|
||||
examples/xusb
|
||||
examples/dpfp
|
||||
examples/dpfp_threaded
|
||||
examples/fxload
|
||||
examples/hotplugtest
|
||||
examples/sam3u_benchmark
|
||||
examples/testlibusb
|
||||
tests/init_context
|
||||
tests/macos
|
||||
tests/set_option
|
||||
tests/stress
|
||||
tests/stress_mt
|
||||
tests/*.log
|
||||
tests/*.trs
|
||||
android/libs
|
||||
android/obj
|
||||
*.exe
|
||||
*.pc
|
||||
doc/api-1.0
|
||||
*.plg
|
||||
*.ncb
|
||||
*.opt
|
||||
Debug
|
||||
Release
|
||||
Debug-MT
|
||||
Release-MT
|
||||
*.db
|
||||
*.user
|
||||
*.suo
|
||||
*.sdf
|
||||
*.opensdf
|
||||
*.patch
|
||||
*~
|
||||
*.orig
|
||||
.dirstamp
|
||||
.amend
|
||||
.DS_Store
|
||||
Xcode/build
|
||||
xcshareddata
|
||||
xcuserdata
|
||||
*.xcuserdatad
|
||||
*.xccheckout
|
||||
*.xcscmblueprint
|
||||
*.xcworkspace
|
||||
build/
|
||||
tags
|
||||
cscope.out
|
@ -1,5 +0,0 @@
|
||||
This directory contains private internal scripts used by the libusb
|
||||
project maintainers.
|
||||
|
||||
These scripts are not intended for general usage and will not be
|
||||
exported when producing release archives.
|
@ -1,26 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -eu
|
||||
|
||||
buildsys="${1}-${Platform}"
|
||||
|
||||
if [ "${buildsys}" == "MinGW-Win32" ]; then
|
||||
export PATH="/c/mingw-w64/i686-6.3.0-posix-dwarf-rt_v5-rev1/mingw32/bin:${PATH}"
|
||||
elif [ "${buildsys}" == "MinGW-x64" ]; then
|
||||
export PATH="/c/mingw-w64/x86_64-8.1.0-posix-seh-rt_v6-rev0/mingw64/bin:${PATH}"
|
||||
fi
|
||||
|
||||
builddir="build-${buildsys}"
|
||||
installdir="${PWD}/libusb-${buildsys}"
|
||||
|
||||
cd libusb
|
||||
|
||||
echo "Bootstrapping ..."
|
||||
./bootstrap.sh
|
||||
echo ""
|
||||
|
||||
extra_args=""
|
||||
if [ "${Configuration}" == "Release" ]; then
|
||||
extra_args="--no-asan"
|
||||
fi
|
||||
exec .private/ci-build.sh --build-dir "${builddir}" --install ${extra_args} -- "--prefix=${installdir}"
|
@ -1,54 +0,0 @@
|
||||
#!/bin/sh
|
||||
# produce the MinGW binary files for snapshots
|
||||
# !!!THIS SCRIPT IS FOR INTERNAL DEVELOPER USE ONLY!!!
|
||||
|
||||
PWD=`pwd`
|
||||
cd ..
|
||||
date=`date +%Y.%m.%d`
|
||||
target=e:/dailies/$date
|
||||
mkdir -p $target/include/libusb-1.0
|
||||
cp -v libusb/libusb-1.0.def $target
|
||||
cp -v libusb/libusb.h $target/include/libusb-1.0
|
||||
|
||||
#
|
||||
# 32 bit binaries
|
||||
#
|
||||
target=e:/dailies/$date/MinGW32
|
||||
git clean -fdx
|
||||
# Not using debug (-g) in CFLAGS DRAMATICALLY reduces the size of the binaries
|
||||
export CFLAGS="-O2 -m32"
|
||||
export LDFLAGS="-m32"
|
||||
export RCFLAGS="--target=pe-i386"
|
||||
export DLLTOOLFLAGS="-m i386 -f --32"
|
||||
echo `pwd`
|
||||
(glibtoolize --version) < /dev/null > /dev/null 2>&1 && LIBTOOLIZE=glibtoolize || LIBTOOLIZE=libtoolize
|
||||
$LIBTOOLIZE --copy --force || exit 1
|
||||
aclocal || exit 1
|
||||
autoheader || exit 1
|
||||
autoconf || exit 1
|
||||
automake -a -c || exit 1
|
||||
./configure
|
||||
make -j2
|
||||
mkdir -p $target/static
|
||||
mkdir -p $target/dll
|
||||
cp -v libusb/.libs/libusb-1.0.a $target/static
|
||||
cp -v libusb/.libs/libusb-1.0.dll $target/dll
|
||||
cp -v libusb/.libs/libusb-1.0.dll.a $target/dll
|
||||
make clean -j2
|
||||
|
||||
#
|
||||
# 64 bit binaries
|
||||
#
|
||||
target=e:/dailies/$date/MinGW64
|
||||
export CFLAGS="-O2"
|
||||
export LDFLAGS=""
|
||||
export RCFLAGS=""
|
||||
export DLLTOOLFLAGS=""
|
||||
./configure
|
||||
make -j2
|
||||
mkdir -p $target/static
|
||||
mkdir -p $target/dll
|
||||
cp -v libusb/.libs/libusb-1.0.a $target/static
|
||||
cp -v libusb/.libs/libusb-1.0.dll $target/dll
|
||||
cp -v libusb/.libs/libusb-1.0.dll.a $target/dll
|
||||
cd $PWD
|
@ -1,92 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -e
|
||||
|
||||
builddir=
|
||||
scriptdir=$(dirname $(readlink -f "$0"))
|
||||
install=no
|
||||
test=yes
|
||||
asan=yes
|
||||
|
||||
while [ $# -gt 0 ]; do
|
||||
case "$1" in
|
||||
--build-dir)
|
||||
if [ $# -lt 2 ]; then
|
||||
echo "ERROR: missing argument for --build-dir option" >&2
|
||||
exit 1
|
||||
fi
|
||||
builddir=$2
|
||||
shift 2
|
||||
;;
|
||||
--install)
|
||||
install=yes
|
||||
shift
|
||||
;;
|
||||
--no-test)
|
||||
test=no
|
||||
shift
|
||||
;;
|
||||
--no-asan)
|
||||
asan=no
|
||||
shift
|
||||
;;
|
||||
--)
|
||||
shift
|
||||
break;
|
||||
;;
|
||||
*)
|
||||
echo "ERROR: Unexpected argument: $1" >&2
|
||||
exit 1
|
||||
esac
|
||||
done
|
||||
|
||||
if [ -z "${builddir}" ]; then
|
||||
echo "ERROR: --build-dir option not specified" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ -e "${builddir}" ]; then
|
||||
echo "ERROR: directory entry named '${builddir}' already exists" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
mkdir "${builddir}"
|
||||
cd "${builddir}"
|
||||
|
||||
cflags="-O2"
|
||||
|
||||
# enable extra warnings
|
||||
cflags+=" -Winline"
|
||||
cflags+=" -Wmissing-include-dirs"
|
||||
cflags+=" -Wnested-externs"
|
||||
cflags+=" -Wpointer-arith"
|
||||
cflags+=" -Wredundant-decls"
|
||||
cflags+=" -Wswitch-enum"
|
||||
|
||||
# enable address sanitizer
|
||||
if [ "${asan}" = "yes" ]; then
|
||||
cflags+=" -fsanitize=address"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "Configuring ..."
|
||||
CFLAGS="${cflags}" CXXFLAGS="${cflags}" ../configure --enable-examples-build --enable-tests-build "$@"
|
||||
|
||||
echo ""
|
||||
echo "Building ..."
|
||||
make -j4 -k
|
||||
|
||||
if [ "${test}" = "yes" ]; then
|
||||
# Load custom shim for WebUSB tests that simulates Web environment.
|
||||
export NODE_OPTIONS="--require ${scriptdir}/../tests/webusb-test-shim/"
|
||||
if ! make check ; then
|
||||
cat tests/test-suite.log
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ "${install}" = "yes" ]; then
|
||||
echo ""
|
||||
echo "Installing ..."
|
||||
make install
|
||||
fi
|
@ -1,67 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -eu
|
||||
|
||||
# keep container around if $DEBUG is set
|
||||
[ -n "${DEBUG:-}" ] || OPTS="--rm"
|
||||
|
||||
if type podman >/dev/null 2>&1; then
|
||||
RUNC=podman
|
||||
else
|
||||
RUNC="sudo docker"
|
||||
fi
|
||||
|
||||
MOUNT_MODE=":ro"
|
||||
|
||||
$RUNC run --interactive ${RUNC_OPTIONS:-} ${OPTS:-} --volume `pwd`:/source${MOUNT_MODE:-} ${1:-docker.io/amd64/ubuntu:rolling} /bin/bash << EOF
|
||||
set -ex
|
||||
|
||||
# avoid meson exit code 125; https://github.com/containers/podman/issues/11540
|
||||
trap '[ \$? -eq 0 ] || exit 1' EXIT
|
||||
|
||||
# go-faster apt
|
||||
echo 'Acquire::Languages "none";' > /etc/apt/apt.conf.d/90nolanguages
|
||||
|
||||
# upgrade
|
||||
export DEBIAN_FRONTEND=noninteractive
|
||||
apt-get update
|
||||
apt-get install -y eatmydata
|
||||
eatmydata apt-get -y --purge dist-upgrade
|
||||
|
||||
# install build and test dependencies
|
||||
eatmydata apt-get install -y make libtool libudev-dev pkg-config umockdev libumockdev-dev
|
||||
|
||||
# run build as user
|
||||
useradd build
|
||||
su -s /bin/bash - build << EOG
|
||||
set -ex
|
||||
|
||||
mkdir "/tmp/builddir"
|
||||
cd "/tmp/builddir"
|
||||
|
||||
CFLAGS="-O2"
|
||||
|
||||
# enable extra warnings
|
||||
CFLAGS+=" -Winline"
|
||||
CFLAGS+=" -Wmissing-include-dirs"
|
||||
CFLAGS+=" -Wnested-externs"
|
||||
CFLAGS+=" -Wpointer-arith"
|
||||
CFLAGS+=" -Wredundant-decls"
|
||||
CFLAGS+=" -Wswitch-enum"
|
||||
export CFLAGS
|
||||
|
||||
export CXXFLAGS="\${CFLAGS}"
|
||||
|
||||
echo ""
|
||||
echo "Configuring ..."
|
||||
/source/configure --enable-examples-build --enable-tests-build
|
||||
|
||||
echo ""
|
||||
echo "Building ..."
|
||||
make -j4 -k
|
||||
|
||||
echo ""
|
||||
echo "Running umockdev tests ..."
|
||||
tests/umockdev
|
||||
EOG
|
||||
EOF
|
@ -1,32 +0,0 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Detect amended commits and warn user if .amend is missing
|
||||
#
|
||||
# To have git run this script on commit, create a "post-rewrite" text file in
|
||||
# .git/hooks/ with the following content:
|
||||
# #!/bin/sh
|
||||
# if [ -x .private/post-rewrite.sh ]; then
|
||||
# . .private/post-rewrite.sh
|
||||
# fi
|
||||
#
|
||||
# NOTE: These versioning hooks are intended to be used *INTERNALLY* by the
|
||||
# libusb development team and are NOT intended to solve versioning for any
|
||||
# derivative branch, such as one you would create for private development.
|
||||
#
|
||||
|
||||
if [ -n "$LIBUSB_SKIP_NANO" ]; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
case "$1" in
|
||||
amend)
|
||||
# Check if a .amend exists. If none, create one and warn user to re-commit.
|
||||
if [ -f .amend ]; then
|
||||
rm .amend
|
||||
else
|
||||
echo "Amend commit detected, but no .amend file - One has now been created."
|
||||
echo "Please re-commit as is (amend), so that the version number is correct."
|
||||
touch .amend
|
||||
fi ;;
|
||||
*) ;;
|
||||
esac
|
@ -1,52 +0,0 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Sets the nano version according to the number of commits on this branch, as
|
||||
# well as the branch offset.
|
||||
#
|
||||
# To have git run this script on commit, first make sure you change
|
||||
# BRANCH_OFFSET to 60000 or higher, then create a "pre-commit" text file in
|
||||
# .git/hooks/ with the following content:
|
||||
# #!/bin/sh
|
||||
# if [ -x .private/pre-commit.sh ]; then
|
||||
# . .private/pre-commit.sh
|
||||
# fi
|
||||
#
|
||||
# NOTE: These versioning hooks are intended to be used *INTERNALLY* by the
|
||||
# libusb development team and are NOT intended to solve versioning for any
|
||||
# derivative branch, such as one you would create for private development.
|
||||
#
|
||||
# Should you wish to reuse these scripts for your own versioning, in your own
|
||||
# private branch, we kindly ask you to first set BRANCH_OFFSET to 60000, or
|
||||
# higher, as any offset below below 60000 is *RESERVED* for libusb official
|
||||
# usage.
|
||||
|
||||
################################################################################
|
||||
## YOU *MUST* SET THE FOLLOWING TO 60000 OR HIGHER IF YOU REUSE THIS SCRIPT ##
|
||||
################################################################################
|
||||
BRANCH_OFFSET=10000
|
||||
################################################################################
|
||||
|
||||
if [ -n "$LIBUSB_SKIP_NANO" ]; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if [ "$BASH_VERSION" = '' ]; then
|
||||
TYPE_CMD="type git >/dev/null 2>&1"
|
||||
else
|
||||
TYPE_CMD="type -P git &>/dev/null"
|
||||
fi
|
||||
|
||||
eval $TYPE_CMD || { echo "git command not found. Aborting." >&2; exit 1; }
|
||||
|
||||
NANO=`git log --oneline | wc -l`
|
||||
NANO=`expr $NANO + $BRANCH_OFFSET`
|
||||
# Amended commits need to have the nano corrected. Current versions of git hooks
|
||||
# only allow detection of amending post commit, so we require a .amend file,
|
||||
# which will be created post commit with a user warning if none exists when an
|
||||
# amend is detected.
|
||||
if [ -f .amend ]; then
|
||||
NANO=`expr $NANO - 1`
|
||||
fi
|
||||
echo "setting nano to $NANO"
|
||||
echo "#define LIBUSB_NANO $NANO" > libusb/version_nano.h
|
||||
git add libusb/version_nano.h
|
@ -1,43 +0,0 @@
|
||||
libusb 1.0 Windows binary snapshot - README
|
||||
|
||||
*********************************************************************
|
||||
* The latest version of this snapshot can always be downloaded at: *
|
||||
* https://github.com/libusb/libusb/releases *
|
||||
*********************************************************************
|
||||
|
||||
o Visual Studio:
|
||||
- Open existing or create a new project for your application
|
||||
- Copy libusb.h, from the include\libusb-1.0\ directory, into your project and
|
||||
make sure that the location where the file reside appears in the 'Additional
|
||||
Include Directories' section (Configuration Properties -> C/C++ -> General).
|
||||
- Copy the relevant .lib file from MS32\ or MS64\ and add 'libusb-1.0.lib' to
|
||||
your 'Additional Dependencies' (Configuration Properties -> Linker -> Input)
|
||||
Also make sure that the directory where libusb-1.0.lib resides is added to
|
||||
'Additional Library Directories' (Configuration Properties -> Linker
|
||||
-> General)
|
||||
- By default, static libusb statically links against the CRT and the dll build
|
||||
dynamically links against CRT. You need to rebuild libusb from source to
|
||||
change this if required by your application.
|
||||
- Compile and run your application. If you use the DLL version of libusb-1.0,
|
||||
remember that the DLL needs to be in the DLL search path of your application.
|
||||
|
||||
o MinGW/cygwin
|
||||
- Copy libusb.h, from include/libusb-1.0/ to your default include directory,
|
||||
and copy the MinGW32/ or MinGW64/ .a files to your default library directory.
|
||||
Or, if you don't want to use the default locations, make sure that you feed
|
||||
the relevant -I and -L options to the compiler.
|
||||
- Add the '-lusb-1.0' linker option when compiling.
|
||||
|
||||
o Additional information:
|
||||
- The libusb 1.0 API documentation can be accessed at:
|
||||
http://api.libusb.info
|
||||
- For some libusb samples (including source), please have a look in examples/
|
||||
- For additional information on the libusb 1.0 Windows backend please visit:
|
||||
http://windows.libusb.info
|
||||
- Using the UsbDk backend is now a run-time choice rather than a compile-time
|
||||
choice. For additional information, including example usage, please visit:
|
||||
http://windows.libusb.info/#Driver_Installation
|
||||
- The MinGW and MS generated DLLs are fully interchangeable, provided that you
|
||||
use the import libs provided or generate one from the .def also provided.
|
||||
- If you find any issue, please visit https://libusb.info/ and check the
|
||||
Support section
|
@ -1,58 +0,0 @@
|
||||
language: c
|
||||
|
||||
git:
|
||||
depth: 1
|
||||
|
||||
matrix:
|
||||
include:
|
||||
- os: linux
|
||||
dist: focal
|
||||
compiler: clang
|
||||
- os: linux
|
||||
dist: focal
|
||||
compiler: gcc
|
||||
- os: linux
|
||||
dist: bionic
|
||||
compiler: clang
|
||||
- os: linux
|
||||
dist: bionic
|
||||
compiler: gcc
|
||||
- os: linux
|
||||
dist: xenial
|
||||
compiler: clang
|
||||
- os: linux
|
||||
dist: xenial
|
||||
compiler: gcc
|
||||
- os: osx
|
||||
osx_image: xcode12.2
|
||||
compiler: clang
|
||||
- os: osx
|
||||
osx_image: xcode11.3
|
||||
compiler: clang
|
||||
- os: osx
|
||||
osx_image: xcode9.4
|
||||
compiler: clang
|
||||
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- autoconf
|
||||
- automake
|
||||
- libtool
|
||||
- libudev-dev
|
||||
- m4
|
||||
homebrew:
|
||||
packages:
|
||||
- autoconf
|
||||
- automake
|
||||
- libtool
|
||||
- m4
|
||||
|
||||
before_script:
|
||||
- ./bootstrap.sh
|
||||
|
||||
script:
|
||||
- if [ "$TRAVIS_OS_NAME" = "linux" ]; then .private/ci-build.sh --build-dir build-netlink -- --disable-udev; fi
|
||||
- if [ "$TRAVIS_OS_NAME" = "linux" ]; then .private/ci-build.sh --build-dir build-udev -- --enable-udev; fi
|
||||
- if [ "$TRAVIS_OS_NAME" = "osx" ]; then .private/ci-build.sh --build-dir build; fi
|
||||
- if [ "$TRAVIS_OS_NAME" = "osx" ]; then cd Xcode && xcodebuild -project libusb.xcodeproj; fi
|
@ -1,224 +0,0 @@
|
||||
Copyright © 2001 Johannes Erdfelt <johannes@erdfelt.com>
|
||||
Copyright © 2007-2009 Daniel Drake <dsd@gentoo.org>
|
||||
Copyright © 2010-2012 Peter Stuge <peter@stuge.se>
|
||||
Copyright © 2008-2016 Nathan Hjelm <hjelmn@users.sourceforge.net>
|
||||
Copyright © 2009-2013 Pete Batard <pete@akeo.ie>
|
||||
Copyright © 2009-2013 Ludovic Rousseau <ludovic.rousseau@gmail.com>
|
||||
Copyright © 2010-2012 Michael Plante <michael.plante@gmail.com>
|
||||
Copyright © 2011-2013 Hans de Goede <hdegoede@redhat.com>
|
||||
Copyright © 2012-2013 Martin Pieuchot <mpi@openbsd.org>
|
||||
Copyright © 2012-2013 Toby Gray <toby.gray@realvnc.com>
|
||||
Copyright © 2013-2018 Chris Dickens <christopher.a.dickens@gmail.com>
|
||||
|
||||
Other contributors:
|
||||
Aaron Luft
|
||||
Adam Korcz
|
||||
Addison Crump
|
||||
Adrian Bunk
|
||||
Adrien Destugues
|
||||
Akshay Jaggi
|
||||
Alan Ott
|
||||
Alan Stern
|
||||
Aleksandr Mezin
|
||||
Alexander Mot
|
||||
Alexander Pyhalov
|
||||
Alexander Schlarb
|
||||
Alexander Stein
|
||||
Alex Feinman
|
||||
Alex Vatchenko
|
||||
Andrew Aldridge
|
||||
Andrew Fernandes
|
||||
Andrew Goodney
|
||||
Andy Chunyu
|
||||
Andy McFadden
|
||||
Angus Gratton
|
||||
Anil Nair
|
||||
Ankur Verma
|
||||
Anthony Clay
|
||||
Antonio Ospite
|
||||
Artem Egorkine
|
||||
Aurelien Jarno
|
||||
Axel Gembe
|
||||
Aymeric Vincent
|
||||
Baruch Siach
|
||||
Bastien Nocera
|
||||
Bei Zhang
|
||||
Bence Csokas
|
||||
Benjamin Berg
|
||||
Benjamin Dobell
|
||||
Bohdan Tymkiv
|
||||
Brad Smith
|
||||
Brent Rector
|
||||
Bruno Harbulot
|
||||
Carl Karsten
|
||||
Christophe Zeitouny
|
||||
Chris Zhu
|
||||
Chunyu Xie
|
||||
Colin Walters
|
||||
Craig Hutchinson
|
||||
Dave Camarillo
|
||||
David Engraf
|
||||
Davidlohr Bueso
|
||||
David Moore
|
||||
Dmitry Fleytman
|
||||
Dmitry Kostjuchenko
|
||||
Dmitry Zakablukov
|
||||
Dominik Boehi
|
||||
Doug Johnston
|
||||
Edgar Fuß
|
||||
Evan Hunter
|
||||
Evan Miller
|
||||
Fabrice Fontaine
|
||||
Federico Manzan
|
||||
Felipe Balbi
|
||||
Florian Albrechtskirchinger
|
||||
Francesco Montorsi
|
||||
Francisco Facioni
|
||||
Francis Hart
|
||||
Frank Li
|
||||
Frederik Carlier
|
||||
Freek Dijkstra
|
||||
Gaurav Gupta
|
||||
Graeme Gill
|
||||
Greg Kroah-Hartman
|
||||
Gustavo Zacarias
|
||||
Haidong Zheng
|
||||
Hans Ulrich Niedermann
|
||||
Harry Mallon
|
||||
Hector Martin
|
||||
Hoi-Ho Chan
|
||||
Ido Yariv
|
||||
Igor Anokhin
|
||||
Ihor Dutchak
|
||||
Ilya Konstantinov
|
||||
Ingvar Stepanyan
|
||||
Jakub Klama
|
||||
James Hanko
|
||||
Jeffrey Nichols
|
||||
Jie Zhang
|
||||
Jim Chen
|
||||
Johann Richard
|
||||
John Keeping
|
||||
John Sheu
|
||||
Jonas Malaco
|
||||
Jonathon Jongsma
|
||||
Joost Muller
|
||||
Josh Gao
|
||||
Joshua Blake
|
||||
Joshua Hou
|
||||
Joshua M. Clulow
|
||||
Juan Cruz Viotti
|
||||
Julian Scheel
|
||||
Justin Bischoff
|
||||
Karsten Koenig
|
||||
Keith Ahluwalia
|
||||
Kenjiro Tsuji
|
||||
Kimura Masaru
|
||||
Konrad Rzepecki
|
||||
Kuangye Guo
|
||||
Lars Kanis
|
||||
Lars Wirzenius
|
||||
Lei Chen
|
||||
Léo Lam
|
||||
Liang Yunwang
|
||||
Lonnie Abelbeck
|
||||
Luca Longinotti
|
||||
Luz Paz
|
||||
Mac Wang
|
||||
Marco Trevisan (Treviño)
|
||||
Marcus Meissner
|
||||
Mario Kleiner
|
||||
Mark Kuo
|
||||
Markus Heidelberg
|
||||
Martin Ettl
|
||||
Martin Koegler
|
||||
Martin Ling
|
||||
Martin Thierer
|
||||
Mathias Hjärtström
|
||||
Matthew Stapleton
|
||||
Matthias Bolte
|
||||
Michael Dickens
|
||||
Michel Zou
|
||||
Mike Frysinger
|
||||
Mikhail Gusarov
|
||||
Mikolaj Kucharski
|
||||
Morgan Leborgne
|
||||
Moritz Fischer
|
||||
Nancy Li
|
||||
Nia Alarie
|
||||
Nicholas Corgan
|
||||
Niklas Gürtler
|
||||
Omri Iluz
|
||||
Orhan aib Kavrakoglu
|
||||
Orin Eman
|
||||
Ozkan Sezer
|
||||
Pablo Prietz
|
||||
Patrick Stewart
|
||||
Paul Cercueil
|
||||
Paul Fertser
|
||||
Paul Qureshi
|
||||
Pekka Nikander
|
||||
Petr Pazourek
|
||||
Philémon Favrod
|
||||
Pino Toscano
|
||||
Rob Walker
|
||||
Romain Vimont
|
||||
Roman Kalashnikov
|
||||
Rosen Penev
|
||||
Ryan Hileman
|
||||
Ryan Metcalfe
|
||||
Ryan Schmidt
|
||||
Saleem Rashid
|
||||
Sameeh Jubran
|
||||
Sean McBride
|
||||
Sebastian Pipping
|
||||
Sebastian von Ohr
|
||||
Sergey Serb
|
||||
Shawn Hoffman
|
||||
Simon Chan
|
||||
Simon Haggett
|
||||
Simon Newton
|
||||
Slash Gordon
|
||||
Stefan Agner
|
||||
Stefan Tauner
|
||||
Steinar H. Gunderson
|
||||
Stephen Groat
|
||||
Sylvain Fasel
|
||||
Theo Buehler
|
||||
Thomas Röfer
|
||||
Tim Hutt
|
||||
Tim Roberts
|
||||
Tobias Klauser
|
||||
Toby Peterson
|
||||
Tormod Volden
|
||||
Trygve Laugstøl
|
||||
Uri Lublin
|
||||
Uwe Bonnes
|
||||
Vasily Khoruzhick
|
||||
Vegard Storheil Eriksen
|
||||
Venkatesh Shukla
|
||||
Vianney le Clément de Saint-Marcq
|
||||
Victor Toso
|
||||
Vinicius Tinti
|
||||
Vitali Lovich
|
||||
Vladimir Beloborodov
|
||||
William Orr
|
||||
William Skellenger
|
||||
Xiaofan Chen
|
||||
Yegor Yefremov
|
||||
Zeng Guang
|
||||
Zhiqiang Liu
|
||||
Zoltán Kovács
|
||||
Сергей Валерьевич
|
||||
Ларионов Даниил
|
||||
Роман Донченко
|
||||
jonner
|
||||
orbitcowboy
|
||||
osy
|
||||
parafin
|
||||
RipleyTom
|
||||
Seneral
|
||||
saur0n
|
||||
SomeAlphabetGuy
|
||||
winterrace
|
||||
xloem
|
@ -1,504 +0,0 @@
|
||||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
Version 2.1, February 1999
|
||||
|
||||
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
[This is the first released version of the Lesser GPL. It also counts
|
||||
as the successor of the GNU Library Public License, version 2, hence
|
||||
the version number 2.1.]
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
Licenses are intended to guarantee your freedom to share and change
|
||||
free software--to make sure the software is free for all its users.
|
||||
|
||||
This license, the Lesser General Public License, applies to some
|
||||
specially designated software packages--typically libraries--of the
|
||||
Free Software Foundation and other authors who decide to use it. You
|
||||
can use it too, but we suggest you first think carefully about whether
|
||||
this license or the ordinary General Public License is the better
|
||||
strategy to use in any particular case, based on the explanations below.
|
||||
|
||||
When we speak of free software, we are referring to freedom of use,
|
||||
not price. Our General Public Licenses are designed to make sure that
|
||||
you have the freedom to distribute copies of free software (and charge
|
||||
for this service if you wish); that you receive source code or can get
|
||||
it if you want it; that you can change the software and use pieces of
|
||||
it in new free programs; and that you are informed that you can do
|
||||
these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
distributors to deny you these rights or to ask you to surrender these
|
||||
rights. These restrictions translate to certain responsibilities for
|
||||
you if you distribute copies of the library or if you modify it.
|
||||
|
||||
For example, if you distribute copies of the library, whether gratis
|
||||
or for a fee, you must give the recipients all the rights that we gave
|
||||
you. You must make sure that they, too, receive or can get the source
|
||||
code. If you link other code with the library, you must provide
|
||||
complete object files to the recipients, so that they can relink them
|
||||
with the library after making changes to the library and recompiling
|
||||
it. And you must show them these terms so they know their rights.
|
||||
|
||||
We protect your rights with a two-step method: (1) we copyright the
|
||||
library, and (2) we offer you this license, which gives you legal
|
||||
permission to copy, distribute and/or modify the library.
|
||||
|
||||
To protect each distributor, we want to make it very clear that
|
||||
there is no warranty for the free library. Also, if the library is
|
||||
modified by someone else and passed on, the recipients should know
|
||||
that what they have is not the original version, so that the original
|
||||
author's reputation will not be affected by problems that might be
|
||||
introduced by others.
|
||||
|
||||
Finally, software patents pose a constant threat to the existence of
|
||||
any free program. We wish to make sure that a company cannot
|
||||
effectively restrict the users of a free program by obtaining a
|
||||
restrictive license from a patent holder. Therefore, we insist that
|
||||
any patent license obtained for a version of the library must be
|
||||
consistent with the full freedom of use specified in this license.
|
||||
|
||||
Most GNU software, including some libraries, is covered by the
|
||||
ordinary GNU General Public License. This license, the GNU Lesser
|
||||
General Public License, applies to certain designated libraries, and
|
||||
is quite different from the ordinary General Public License. We use
|
||||
this license for certain libraries in order to permit linking those
|
||||
libraries into non-free programs.
|
||||
|
||||
When a program is linked with a library, whether statically or using
|
||||
a shared library, the combination of the two is legally speaking a
|
||||
combined work, a derivative of the original library. The ordinary
|
||||
General Public License therefore permits such linking only if the
|
||||
entire combination fits its criteria of freedom. The Lesser General
|
||||
Public License permits more lax criteria for linking other code with
|
||||
the library.
|
||||
|
||||
We call this license the "Lesser" General Public License because it
|
||||
does Less to protect the user's freedom than the ordinary General
|
||||
Public License. It also provides other free software developers Less
|
||||
of an advantage over competing non-free programs. These disadvantages
|
||||
are the reason we use the ordinary General Public License for many
|
||||
libraries. However, the Lesser license provides advantages in certain
|
||||
special circumstances.
|
||||
|
||||
For example, on rare occasions, there may be a special need to
|
||||
encourage the widest possible use of a certain library, so that it becomes
|
||||
a de-facto standard. To achieve this, non-free programs must be
|
||||
allowed to use the library. A more frequent case is that a free
|
||||
library does the same job as widely used non-free libraries. In this
|
||||
case, there is little to gain by limiting the free library to free
|
||||
software only, so we use the Lesser General Public License.
|
||||
|
||||
In other cases, permission to use a particular library in non-free
|
||||
programs enables a greater number of people to use a large body of
|
||||
free software. For example, permission to use the GNU C Library in
|
||||
non-free programs enables many more people to use the whole GNU
|
||||
operating system, as well as its variant, the GNU/Linux operating
|
||||
system.
|
||||
|
||||
Although the Lesser General Public License is Less protective of the
|
||||
users' freedom, it does ensure that the user of a program that is
|
||||
linked with the Library has the freedom and the wherewithal to run
|
||||
that program using a modified version of the Library.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow. Pay close attention to the difference between a
|
||||
"work based on the library" and a "work that uses the library". The
|
||||
former contains code derived from the library, whereas the latter must
|
||||
be combined with the library in order to run.
|
||||
|
||||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License Agreement applies to any software library or other
|
||||
program which contains a notice placed by the copyright holder or
|
||||
other authorized party saying it may be distributed under the terms of
|
||||
this Lesser General Public License (also called "this License").
|
||||
Each licensee is addressed as "you".
|
||||
|
||||
A "library" means a collection of software functions and/or data
|
||||
prepared so as to be conveniently linked with application programs
|
||||
(which use some of those functions and data) to form executables.
|
||||
|
||||
The "Library", below, refers to any such software library or work
|
||||
which has been distributed under these terms. A "work based on the
|
||||
Library" means either the Library or any derivative work under
|
||||
copyright law: that is to say, a work containing the Library or a
|
||||
portion of it, either verbatim or with modifications and/or translated
|
||||
straightforwardly into another language. (Hereinafter, translation is
|
||||
included without limitation in the term "modification".)
|
||||
|
||||
"Source code" for a work means the preferred form of the work for
|
||||
making modifications to it. For a library, complete source code means
|
||||
all the source code for all modules it contains, plus any associated
|
||||
interface definition files, plus the scripts used to control compilation
|
||||
and installation of the library.
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running a program using the Library is not restricted, and output from
|
||||
such a program is covered only if its contents constitute a work based
|
||||
on the Library (independent of the use of the Library in a tool for
|
||||
writing it). Whether that is true depends on what the Library does
|
||||
and what the program that uses the Library does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Library's
|
||||
complete source code as you receive it, in any medium, provided that
|
||||
you conspicuously and appropriately publish on each copy an
|
||||
appropriate copyright notice and disclaimer of warranty; keep intact
|
||||
all the notices that refer to this License and to the absence of any
|
||||
warranty; and distribute a copy of this License along with the
|
||||
Library.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy,
|
||||
and you may at your option offer warranty protection in exchange for a
|
||||
fee.
|
||||
|
||||
2. You may modify your copy or copies of the Library or any portion
|
||||
of it, thus forming a work based on the Library, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
|
||||
a) The modified work must itself be a software library.
|
||||
|
||||
b) You must cause the files modified to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
c) You must cause the whole of the work to be licensed at no
|
||||
charge to all third parties under the terms of this License.
|
||||
|
||||
d) If a facility in the modified Library refers to a function or a
|
||||
table of data to be supplied by an application program that uses
|
||||
the facility, other than as an argument passed when the facility
|
||||
is invoked, then you must make a good faith effort to ensure that,
|
||||
in the event an application does not supply such function or
|
||||
table, the facility still operates, and performs whatever part of
|
||||
its purpose remains meaningful.
|
||||
|
||||
(For example, a function in a library to compute square roots has
|
||||
a purpose that is entirely well-defined independent of the
|
||||
application. Therefore, Subsection 2d requires that any
|
||||
application-supplied function or table used by this function must
|
||||
be optional: if the application does not supply it, the square
|
||||
root function must still compute square roots.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Library,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Library, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote
|
||||
it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Library.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Library
|
||||
with the Library (or with a work based on the Library) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
3. You may opt to apply the terms of the ordinary GNU General Public
|
||||
License instead of this License to a given copy of the Library. To do
|
||||
this, you must alter all the notices that refer to this License, so
|
||||
that they refer to the ordinary GNU General Public License, version 2,
|
||||
instead of to this License. (If a newer version than version 2 of the
|
||||
ordinary GNU General Public License has appeared, then you can specify
|
||||
that version instead if you wish.) Do not make any other change in
|
||||
these notices.
|
||||
|
||||
Once this change is made in a given copy, it is irreversible for
|
||||
that copy, so the ordinary GNU General Public License applies to all
|
||||
subsequent copies and derivative works made from that copy.
|
||||
|
||||
This option is useful when you wish to copy part of the code of
|
||||
the Library into a program that is not a library.
|
||||
|
||||
4. You may copy and distribute the Library (or a portion or
|
||||
derivative of it, under Section 2) in object code or executable form
|
||||
under the terms of Sections 1 and 2 above provided that you accompany
|
||||
it with the complete corresponding machine-readable source code, which
|
||||
must be distributed under the terms of Sections 1 and 2 above on a
|
||||
medium customarily used for software interchange.
|
||||
|
||||
If distribution of object code is made by offering access to copy
|
||||
from a designated place, then offering equivalent access to copy the
|
||||
source code from the same place satisfies the requirement to
|
||||
distribute the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
5. A program that contains no derivative of any portion of the
|
||||
Library, but is designed to work with the Library by being compiled or
|
||||
linked with it, is called a "work that uses the Library". Such a
|
||||
work, in isolation, is not a derivative work of the Library, and
|
||||
therefore falls outside the scope of this License.
|
||||
|
||||
However, linking a "work that uses the Library" with the Library
|
||||
creates an executable that is a derivative of the Library (because it
|
||||
contains portions of the Library), rather than a "work that uses the
|
||||
library". The executable is therefore covered by this License.
|
||||
Section 6 states terms for distribution of such executables.
|
||||
|
||||
When a "work that uses the Library" uses material from a header file
|
||||
that is part of the Library, the object code for the work may be a
|
||||
derivative work of the Library even though the source code is not.
|
||||
Whether this is true is especially significant if the work can be
|
||||
linked without the Library, or if the work is itself a library. The
|
||||
threshold for this to be true is not precisely defined by law.
|
||||
|
||||
If such an object file uses only numerical parameters, data
|
||||
structure layouts and accessors, and small macros and small inline
|
||||
functions (ten lines or less in length), then the use of the object
|
||||
file is unrestricted, regardless of whether it is legally a derivative
|
||||
work. (Executables containing this object code plus portions of the
|
||||
Library will still fall under Section 6.)
|
||||
|
||||
Otherwise, if the work is a derivative of the Library, you may
|
||||
distribute the object code for the work under the terms of Section 6.
|
||||
Any executables containing that work also fall under Section 6,
|
||||
whether or not they are linked directly with the Library itself.
|
||||
|
||||
6. As an exception to the Sections above, you may also combine or
|
||||
link a "work that uses the Library" with the Library to produce a
|
||||
work containing portions of the Library, and distribute that work
|
||||
under terms of your choice, provided that the terms permit
|
||||
modification of the work for the customer's own use and reverse
|
||||
engineering for debugging such modifications.
|
||||
|
||||
You must give prominent notice with each copy of the work that the
|
||||
Library is used in it and that the Library and its use are covered by
|
||||
this License. You must supply a copy of this License. If the work
|
||||
during execution displays copyright notices, you must include the
|
||||
copyright notice for the Library among them, as well as a reference
|
||||
directing the user to the copy of this License. Also, you must do one
|
||||
of these things:
|
||||
|
||||
a) Accompany the work with the complete corresponding
|
||||
machine-readable source code for the Library including whatever
|
||||
changes were used in the work (which must be distributed under
|
||||
Sections 1 and 2 above); and, if the work is an executable linked
|
||||
with the Library, with the complete machine-readable "work that
|
||||
uses the Library", as object code and/or source code, so that the
|
||||
user can modify the Library and then relink to produce a modified
|
||||
executable containing the modified Library. (It is understood
|
||||
that the user who changes the contents of definitions files in the
|
||||
Library will not necessarily be able to recompile the application
|
||||
to use the modified definitions.)
|
||||
|
||||
b) Use a suitable shared library mechanism for linking with the
|
||||
Library. A suitable mechanism is one that (1) uses at run time a
|
||||
copy of the library already present on the user's computer system,
|
||||
rather than copying library functions into the executable, and (2)
|
||||
will operate properly with a modified version of the library, if
|
||||
the user installs one, as long as the modified version is
|
||||
interface-compatible with the version that the work was made with.
|
||||
|
||||
c) Accompany the work with a written offer, valid for at
|
||||
least three years, to give the same user the materials
|
||||
specified in Subsection 6a, above, for a charge no more
|
||||
than the cost of performing this distribution.
|
||||
|
||||
d) If distribution of the work is made by offering access to copy
|
||||
from a designated place, offer equivalent access to copy the above
|
||||
specified materials from the same place.
|
||||
|
||||
e) Verify that the user has already received a copy of these
|
||||
materials or that you have already sent this user a copy.
|
||||
|
||||
For an executable, the required form of the "work that uses the
|
||||
Library" must include any data and utility programs needed for
|
||||
reproducing the executable from it. However, as a special exception,
|
||||
the materials to be distributed need not include anything that is
|
||||
normally distributed (in either source or binary form) with the major
|
||||
components (compiler, kernel, and so on) of the operating system on
|
||||
which the executable runs, unless that component itself accompanies
|
||||
the executable.
|
||||
|
||||
It may happen that this requirement contradicts the license
|
||||
restrictions of other proprietary libraries that do not normally
|
||||
accompany the operating system. Such a contradiction means you cannot
|
||||
use both them and the Library together in an executable that you
|
||||
distribute.
|
||||
|
||||
7. You may place library facilities that are a work based on the
|
||||
Library side-by-side in a single library together with other library
|
||||
facilities not covered by this License, and distribute such a combined
|
||||
library, provided that the separate distribution of the work based on
|
||||
the Library and of the other library facilities is otherwise
|
||||
permitted, and provided that you do these two things:
|
||||
|
||||
a) Accompany the combined library with a copy of the same work
|
||||
based on the Library, uncombined with any other library
|
||||
facilities. This must be distributed under the terms of the
|
||||
Sections above.
|
||||
|
||||
b) Give prominent notice with the combined library of the fact
|
||||
that part of it is a work based on the Library, and explaining
|
||||
where to find the accompanying uncombined form of the same work.
|
||||
|
||||
8. You may not copy, modify, sublicense, link with, or distribute
|
||||
the Library except as expressly provided under this License. Any
|
||||
attempt otherwise to copy, modify, sublicense, link with, or
|
||||
distribute the Library is void, and will automatically terminate your
|
||||
rights under this License. However, parties who have received copies,
|
||||
or rights, from you under this License will not have their licenses
|
||||
terminated so long as such parties remain in full compliance.
|
||||
|
||||
9. You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Library or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Library (or any work based on the
|
||||
Library), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Library or works based on it.
|
||||
|
||||
10. Each time you redistribute the Library (or any work based on the
|
||||
Library), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute, link with or modify the Library
|
||||
subject to these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties with
|
||||
this License.
|
||||
|
||||
11. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot
|
||||
distribute so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you
|
||||
may not distribute the Library at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Library by
|
||||
all those who receive copies directly or indirectly through you, then
|
||||
the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Library.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under any
|
||||
particular circumstance, the balance of the section is intended to apply,
|
||||
and the section as a whole is intended to apply in other circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
12. If the distribution and/or use of the Library is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Library under this License may add
|
||||
an explicit geographical distribution limitation excluding those countries,
|
||||
so that distribution is permitted only in or among countries not thus
|
||||
excluded. In such case, this License incorporates the limitation as if
|
||||
written in the body of this License.
|
||||
|
||||
13. The Free Software Foundation may publish revised and/or new
|
||||
versions of the Lesser General Public License from time to time.
|
||||
Such new versions will be similar in spirit to the present version,
|
||||
but may differ in detail to address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Library
|
||||
specifies a version number of this License which applies to it and
|
||||
"any later version", you have the option of following the terms and
|
||||
conditions either of that version or of any later version published by
|
||||
the Free Software Foundation. If the Library does not specify a
|
||||
license version number, you may choose any version ever published by
|
||||
the Free Software Foundation.
|
||||
|
||||
14. If you wish to incorporate parts of the Library into other free
|
||||
programs whose distribution conditions are incompatible with these,
|
||||
write to the author to ask for permission. For software which is
|
||||
copyrighted by the Free Software Foundation, write to the Free
|
||||
Software Foundation; we sometimes make exceptions for this. Our
|
||||
decision will be guided by the two goals of preserving the free status
|
||||
of all derivatives of our free software and of promoting the sharing
|
||||
and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
|
||||
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
|
||||
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
|
||||
OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
|
||||
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
|
||||
LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
|
||||
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
|
||||
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
|
||||
AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
|
||||
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
|
||||
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
|
||||
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
|
||||
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
|
||||
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
|
||||
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
|
||||
DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Libraries
|
||||
|
||||
If you develop a new library, and you want it to be of the greatest
|
||||
possible use to the public, we recommend making it free software that
|
||||
everyone can redistribute and change. You can do so by permitting
|
||||
redistribution under these terms (or, alternatively, under the terms of the
|
||||
ordinary General Public License).
|
||||
|
||||
To apply these terms, attach the following notices to the library. It is
|
||||
safest to attach them to the start of each source file to most effectively
|
||||
convey the exclusion of warranty; and each file should have at least the
|
||||
"copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the library's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or your
|
||||
school, if any, to sign a "copyright disclaimer" for the library, if
|
||||
necessary. Here is a sample; alter the names:
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the
|
||||
library `Frob' (a library for tweaking knobs) written by James Random Hacker.
|
||||
|
||||
<signature of Ty Coon>, 1 April 1990
|
||||
Ty Coon, President of Vice
|
||||
|
||||
That's all there is to it!
|
||||
|
||||
|
@ -1,351 +0,0 @@
|
||||
For detailed information about the changes below, please see the git log
|
||||
or visit: http://log.libusb.info
|
||||
|
||||
2024-01-31: v1.0.27
|
||||
* New libusb_init_context API to replace libusb_init
|
||||
* New libusb_get_max_alt_packet_size API
|
||||
* New libusb_get_platform_descriptor API (BOS)
|
||||
* Allow setting log callback with libusb_set_option/libusb_init_context
|
||||
* New WebAssembly + WebUSB backend using Emscripten
|
||||
* Fix regression in libusb_set_interface_alt_setting
|
||||
* Fix sync transfer completion race and use-after-free
|
||||
* Fix hotplug exit ordering
|
||||
* Linux: NO_DEVICE_DISCOVERY option set per context
|
||||
* macOS: Fix missing device list cleanup locking
|
||||
* macOS: Do not clear device data toggle for newer OS versions
|
||||
* macOS: Fix running binaries on older OS than build host
|
||||
* Windows: Allow claiming multiple associated interfaces
|
||||
* Windows: Ignore non-configured devices instead of waiting
|
||||
* Windows: Improved root hub detection
|
||||
|
||||
2022-04-10: v1.0.26
|
||||
* Fix regression with transfer free's after closing device
|
||||
* Fix regression with destroyed context if API is misused
|
||||
* Workaround for applications using missing default context
|
||||
* Fix hotplog enumeration regression
|
||||
* Fix Windows isochronous transfer regression since 1.0.24
|
||||
* Fix macOS exit crash in some multi-context cases
|
||||
* Build fixes for various platforms and configurations
|
||||
* Fix Windows HID multi-interface product string retrieval
|
||||
* Update isochronous OUT packet actual lengths on Windows
|
||||
* Add interface bound checking for broken devices
|
||||
* Add umockdev tests on Linux
|
||||
|
||||
2022-01-31: v1.0.25
|
||||
* Linux: Fix regression with some particular devices
|
||||
* Linux: Fix regression with libusb_handle_events_timeout_completed()
|
||||
* Linux: Fix regression with cpu usage in libusb_bulk_transfer
|
||||
* Darwin (macOS): Add support for detaching kernel drivers with authorization.
|
||||
* Darwin (macOS): Do not drop partial data on timeout.
|
||||
* Darwin (macOS): Silence pipe error in set_interface_alt_setting().
|
||||
* Windows: Fix HID backend missing byte
|
||||
* Windows: Fix segfault with libusbk driver
|
||||
* Windows: Fix regression when using libusb0 driver
|
||||
* Windows: Support LIBUSB_TRANSFER_ADD_ZERO_PACKET on winusb
|
||||
* New NO_DEVICE_DISCOVERY option replaces WEAK_AUTHORITY option
|
||||
* Various other bug fixes and improvements
|
||||
|
||||
2020-12-09: v1.0.24
|
||||
* Add new platform abstraction (#252)
|
||||
* Add Null POSIX backend
|
||||
* Add support for eventfd
|
||||
* Add support for thread IDs on Haiku, NetBSD and Solaris
|
||||
* New API libusb_hotplug_get_user_data()
|
||||
* Darwin (macOS): Fix race condition that results in segmentation fault (#701)
|
||||
* Darwin (macOS): Fix stale descriptor information post reset (#733)
|
||||
* Darwin (macOS): use IOUSBDevice as darwin_device_class explicitly (#693)
|
||||
* Linux: Drop support for kernel older than 2.6.32
|
||||
* Linux: Provide an event thread name (#689)
|
||||
* Linux: Wait until all URBs have been reaped before freeing them (#607)
|
||||
* NetBSD: Recognize device timeouts (#710)
|
||||
* OpenBSD: Allow opening ugen devices multiple times (#763)
|
||||
* OpenBSD: Support libusb_get_port_number() (#764)
|
||||
* SunOS: Fix a memory leak (#756)
|
||||
* SunOS: Various fixes (#627, #628, #629)
|
||||
* Windows: Add Visual Studio 2019 support
|
||||
* Windows: Drop support for WinCE and Visual Studio older than 2013
|
||||
* Windows: Drop support for Windows XP
|
||||
* Windows: Support building all examples using Visual Studio (#151)
|
||||
* Documentation fixes and improvements
|
||||
* Various other bug fixes and improvements
|
||||
|
||||
2019-08-28: v1.0.23
|
||||
* Add German translation (#446)
|
||||
* Add Hungarian translation (#493)
|
||||
* Android: Improved support for Android
|
||||
* BSD: Remove infinite recursion in OpenBSD backend
|
||||
* configure.ac: Fix detection of clock_gettime library (#439)
|
||||
* Core: abandon synchronous transfers when device closure is detected.
|
||||
* Core: fix error in handling the removal of file descriptors while handling
|
||||
events.
|
||||
* Darwin(macOS): Switch from using ResetDevice to USBDeviceReEnumerate (#455)
|
||||
* Darwin(macOS): Remove code that changed the device class used (#428)
|
||||
* Darwin(macOS): Reduce hotplug timeout to 1ms (from 5s)
|
||||
* New API libusb_set_log_cb() to redirect global and per context log
|
||||
messages to the provided log handling function
|
||||
* New API libusb_wrap_sys_device to allow the user to specify the
|
||||
usb device to use.
|
||||
* Solaris: Break infinite recursion in backend clock_gettime
|
||||
* Solaris: Enable timerfd on sunos when available
|
||||
* Windows: Add support for isochronous transfers with WinUSB
|
||||
* Various other bug fixes and improvements
|
||||
|
||||
2018-03-24: v1.0.22
|
||||
* New libusb_set_option() API
|
||||
* Fix transfer timeout not being cleared upon resubmission
|
||||
* Report super speed plus devices on modern Linux and macOS
|
||||
* Darwin: Improve support for macOS Sierra and High Sierra
|
||||
* Darwin: SDK fixes and improvements
|
||||
* Linux: Let initialization succeed when no devices are present
|
||||
* Linux: Mark internal file descriptors with CLOEXEC flag
|
||||
* Solaris: Add support for attach/detach kernel driver
|
||||
* Windows: Add dynamic UsbDk backend selection
|
||||
* Windows: Add isochronous transfer support via libusbK
|
||||
* Windows: Add Visual Studio 2017 support
|
||||
* Windows: Fix enumeration problems on Windows 8 and later
|
||||
* Windows: Major rework of poll() emulation
|
||||
* Windows: Numerous HID API fixes
|
||||
* Windows: Support cancellation of individual transfers (Vista and later)
|
||||
* Various other bug fixes and improvements
|
||||
|
||||
2016-10-01: v1.0.21
|
||||
* Core: Refactor code related to transfer flags and timeout handling
|
||||
* Darwin: Ignore root hub simulation devices
|
||||
* Darwin: Improved support for OS X El Capitan
|
||||
* Darwin: Work around devices with buggy endpoint descriptors
|
||||
* Darwin: Do not use objc_registerThreadWithCollector after its deprecation
|
||||
* Darwin: Use C11 atomics on 10.12+ as the OS atomics are now deprecated
|
||||
* Linux: Support preallocating kernel memory for zerocopy USB
|
||||
* Linux: Deal with receiving POLLERR before all transfers have completed
|
||||
* Solaris: Add solaris backend
|
||||
* Windows: Add Visual Studio 2015 support
|
||||
* Windows: Add usbdk backend
|
||||
* Prevent attempts to recursively handle events
|
||||
* Fix race condition in handle_timeout()
|
||||
* Allow transferred argument to be optional in bulk APIs
|
||||
* Various other bug fixes and improvements
|
||||
|
||||
2015-09-13: v1.0.20
|
||||
* Add Haiku support
|
||||
* Fix multiple memory and resource leaks (#16, #52, #76, #81)
|
||||
* Fix possible deadlock when executing transfer callback
|
||||
* New libusb_free_pollfds() API
|
||||
* Darwin: Fix devices not being detected on OS X 10.8 (#48)
|
||||
* Linux: Allow larger isochronous transfer submission (#23)
|
||||
* Windows: Fix broken builds Cygwin/MinGW builds and compiler warnings
|
||||
* Windows: Fix broken bus number lookup
|
||||
* Windows: Improve submission of control requests for composite devices
|
||||
* Examples: Add two-stage load support to fxload (#12)
|
||||
* Correctly report cancellations due to timeouts
|
||||
* Improve efficiency of event handling
|
||||
* Improve speed of transfer submission in multi-threaded environments
|
||||
* Various other bug fixes and improvements
|
||||
The (#xx) numbers are libusb issue numbers, see ie:
|
||||
https://github.com/libusb/libusb/issues/16
|
||||
|
||||
2014-05-30: v1.0.19
|
||||
* Add support for USB bulk streams on Linux and Mac OS X (#11)
|
||||
* Windows: Add AMD and Intel USB-3.0 root hub support
|
||||
* Windows: Fix USB 3.0 speed detection on Windows 8 or later (#10)
|
||||
* Added Russian translation for libusb_strerror strings
|
||||
* All: Various small fixes and cleanups
|
||||
|
||||
2014-01-25: v1.0.18
|
||||
* Fix multiple memory leaks
|
||||
* Fix a crash when HID transfers return no data on Windows
|
||||
* Ensure all pending events are consumed
|
||||
* Improve Android and ucLinux support
|
||||
* Multiple Windows improvements (error logging, VS2013, VIA xHCI support)
|
||||
* Multiple OS X improvements (broken compilation, SIGFPE, 64bit support)
|
||||
|
||||
2013-09-06: v1.0.17
|
||||
* Hotplug callbacks now always get passed a libusb_context, even if it is
|
||||
the default context. Previously NULL would be passed for the default context,
|
||||
but since the first context created is the default context, and most apps
|
||||
use only 1 context, this meant that apps explicitly creating a context would
|
||||
still get passed NULL
|
||||
* Android: Add .mk files to build with the Android NDK
|
||||
* Darwin: Add Xcode project
|
||||
* Darwin: Fix crash on unplug (#121)
|
||||
* Linux: Fix hang (deadlock) on libusb_exit
|
||||
* Linux: Fix libusb build failure with --disable-udev (#124)
|
||||
* Linux: Fix libusb_get_device_list() hang with --disable-udev (#130)
|
||||
* OpenBSD: Update OpenBSD backend with support for control transfers to
|
||||
non-ugen(4) devices and make get_configuration() no longer generate I/O.
|
||||
Note that using this libusb version on OpenBSD requires using
|
||||
OpenBSD 5.3-current or later. Users of older OpenBSD versions are advised
|
||||
to stay with the libusb shipped with OpenBSD (mpi)
|
||||
* Windows: fix libusb_dll_2010.vcxproj link errors (#129)
|
||||
* Various other bug fixes and improvements
|
||||
|
||||
2013-07-11: v1.0.16
|
||||
* Add hotplug support for Darwin and Linux (#9)
|
||||
* Add superspeed endpoint companion descriptor support (#15)
|
||||
* Add BOS descriptor support (#15)
|
||||
* Make descriptor parsing code more robust
|
||||
* New libusb_get_port_numbers API, this is libusb_get_port_path without
|
||||
the unnecessary context parameter, libusb_get_port_path is now deprecated
|
||||
* New libusb_strerror API (#14)
|
||||
* New libusb_set_auto_detach_kernel_driver API (#17)
|
||||
* Improve topology API docs (#95)
|
||||
* Logging now use a single write call per log-message, avoiding log-message
|
||||
"interlacing" when using multiple threads.
|
||||
* Android: use Android logging when building on Android (#101)
|
||||
* Darwin: make libusb_reset reenumerate device on descriptors change (#89)
|
||||
* Darwin: add support for the LIBUSB_TRANSFER_ADD_ZERO_PACKET flag (#91)
|
||||
* Darwin: add a device cache (#112, #114)
|
||||
* Examples: Add sam3u_benchmark isochronous example by Harald Welte (#109)
|
||||
* Many other bug fixes and improvements
|
||||
The (#xx) numbers are libusbx issue numbers, see ie:
|
||||
https://github.com/libusbx/libusbx/issues/9
|
||||
|
||||
2013-04-15: v1.0.15
|
||||
* Improve transfer cancellation and avoid short read failures on broken descriptors
|
||||
* Filter out 8-bit characters in libusb_get_string_descriptor_ascii()
|
||||
* Add WinCE support
|
||||
* Add library stress tests
|
||||
* Add Cypress FX3 firmware upload support for fxload sample
|
||||
* Add HID and kernel driver detach support capabilities detection
|
||||
* Add SuperSpeed detection on OS X
|
||||
* Fix bInterval value interpretation on OS X
|
||||
* Fix issues with autoclaim, composite HID devices, interface autoclaim and
|
||||
early abort in libusb_close() on Windows. Also add VS2012 solution files.
|
||||
* Improve fd event handling on Linux
|
||||
* Other bug fixes and improvements
|
||||
|
||||
2012-09-26: v1.0.14
|
||||
* Reverts the previous API change with regards to bMaxPower.
|
||||
If this doesn't matter to you, you are encouraged to keep using v1.0.13,
|
||||
as it will use the same attribute as v2.0, to be released soon.
|
||||
* Note that LIBUSB_API_VERSION is *decreased* to 0x010000FF and the previous
|
||||
guidelines with regards to concurrent use of MaxPower/bMaxPower still apply.
|
||||
|
||||
2012-09-20: v1.0.13
|
||||
* [MAJOR] Fix a typo in the API with struct libusb_config_descriptor where
|
||||
MaxPower was used instead of bMaxPower, as defined in the specs. If your
|
||||
application was accessing the MaxPower attribute, and you need to maintain
|
||||
compatibility with libusb or older versions, see APPENDIX A below.
|
||||
* Fix broken support for the 0.1 -> 1.0 libusb-compat layer
|
||||
* Fix unwanted cancellation of pending timeouts as well as major timeout related bugs
|
||||
* Fix handling of HID and composite devices on Windows
|
||||
* Introduce LIBUSB_API_VERSION macro
|
||||
* Add Cypress FX/FX2 firmware upload sample, based on fxload from
|
||||
http://linux-hotplug.sourceforge.net
|
||||
* Add libusb0 (libusb-win32) and libusbK driver support on Windows. Note that while
|
||||
the drivers allow it, isochronous transfers are not supported yet in libusb. Also
|
||||
not supported yet is the use of libusb-win32 filter drivers on composite interfaces
|
||||
* Add support for the new get_capabilities ioctl on Linux and avoid unnecessary
|
||||
splitting of bulk transfers
|
||||
* Improve support for newer Intel and Renesas USB 3.0 controllers on Windows
|
||||
* Harmonize the device number for root hubs across platforms
|
||||
* Other bug fixes and improvements
|
||||
|
||||
2012-06-15: v1.0.12
|
||||
* Fix a potential major regression with pthread on Linux
|
||||
* Fix missing thread ID from debug log output on cygwin
|
||||
* Fix possible crash when using longjmp and MinGW's gcc 4.6
|
||||
* Add topology calls: libusb_get_port_number(), libusb_get_parent() & libusb_get_port_path()
|
||||
* Add toggleable debug, using libusb_set_debug() or the LIBUSB_DEBUG environment variable
|
||||
* Define log levels in libusb.h and set timestamp origin to first libusb_init() call
|
||||
* All logging is now sent to to stderr (info was sent to stdout previously)
|
||||
* Update log messages severity and avoid polluting log output on OS-X
|
||||
* Add HID driver support on Windows
|
||||
* Enable interchangeability of MSVC and MinGW DLLs
|
||||
* Additional bug fixes and improvements
|
||||
|
||||
2012-05-08: v1.0.11
|
||||
* Revert removal of critical Windows event handling that was introduced in 1.0.10
|
||||
* Fix a possible deadlock in Windows when submitting transfers
|
||||
* Add timestamped logging
|
||||
* Add NetBSD support (experimental) and BSD libusb_get_device_speed() data
|
||||
* Add bootstrap.sh alongside autogen.sh (bootstrap.sh doesn't invoke configure)
|
||||
* Search for device nodes in /dev for Android support
|
||||
* Other bug fixes
|
||||
|
||||
2012-04-17: v1.0.10
|
||||
* Public release
|
||||
* Add libusb_get_version
|
||||
* Add Visual Studio 2010 project files
|
||||
* Some Windows code cleanup
|
||||
* Fix xusb sample warnings
|
||||
|
||||
2012-04-02: v1.0.9
|
||||
* First libusbx release
|
||||
* Add libusb_get_device_speed (all, except BSD) and libusb_error_name
|
||||
* Add Windows support (WinUSB driver only)
|
||||
* Add OpenBSD support
|
||||
* Add xusb sample
|
||||
* Tons of bug fixes
|
||||
|
||||
2010-05-07: v1.0.8
|
||||
* Bug fixes
|
||||
|
||||
2010-04-19: v1.0.7
|
||||
* Bug fixes and documentation tweaks
|
||||
* Add more interface class definitions
|
||||
|
||||
2009-11-22: v1.0.6
|
||||
* Bug fixes
|
||||
* Increase libusb_handle_events() timeout to 60s for powersaving
|
||||
|
||||
2009-11-15: v1.0.5
|
||||
* Use timerfd when available for timer management
|
||||
* Small fixes/updates
|
||||
|
||||
2009-11-06: v1.0.4 release
|
||||
* Bug fixes including transfer locking to fix some potential threading races
|
||||
* More flexibility with clock types on Linux
|
||||
* Use new bulk continuation tracking in Linux 2.6.32 for improved handling
|
||||
of short/failed transfers
|
||||
|
||||
2009-08-27: v1.0.3 release
|
||||
* Bug fixes
|
||||
* Add libusb_get_max_iso_packet_size()
|
||||
|
||||
2009-06-13: v1.0.2 release
|
||||
* Bug fixes
|
||||
|
||||
2009-05-12: v1.0.1 release
|
||||
* Bug fixes
|
||||
* Darwin backend
|
||||
|
||||
2008-12-13: v1.0.0 release
|
||||
* Bug fixes
|
||||
|
||||
2008-11-21: v0.9.4 release
|
||||
* Bug fixes
|
||||
* Add libusb_attach_kernel_driver()
|
||||
|
||||
2008-08-23: v0.9.3 release
|
||||
* Bug fixes
|
||||
|
||||
2008-07-19: v0.9.2 release
|
||||
* Bug fixes
|
||||
|
||||
2008-06-28: v0.9.1 release
|
||||
* Bug fixes
|
||||
* Introduce contexts to the API
|
||||
* Compatibility with new Linux kernel features
|
||||
|
||||
2008-05-25: v0.9.0 release
|
||||
* First libusb-1.0 beta release
|
||||
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
APPENDIX A - How to maintain code compatibility with versions of libusb and
|
||||
libusb that use MaxPower:
|
||||
|
||||
If you must to maintain compatibility with versions of the library that aren't
|
||||
using the bMaxPower attribute in struct libusb_config_descriptor, the
|
||||
recommended way is to use the new LIBUSB_API_VERSION macro with an #ifdef.
|
||||
For instance, if your code was written as follows:
|
||||
|
||||
if (dev->config[0].MaxPower < 250)
|
||||
|
||||
Then you should modify it to have:
|
||||
|
||||
#if defined(LIBUSB_API_VERSION) && (LIBUSB_API_VERSION >= 0x01000100)
|
||||
if (dev->config[0].bMaxPower < 250)
|
||||
#else
|
||||
if (dev->config[0].MaxPower < 250)
|
||||
#endif
|
@ -1,25 +0,0 @@
|
||||
Contributing to libusb
|
||||
**********************
|
||||
|
||||
For larger changes or API changes/extensions it may be wise to first
|
||||
discuss on the mailing list or in the issue tracker before larger
|
||||
coding efforts are initiated.
|
||||
|
||||
If you extend or change the API make sure documentation is updated.
|
||||
Please run make -C doc and check for any Doxygen warnings.
|
||||
|
||||
Commit messages should be formatted to 72 chars width and have a
|
||||
free-standing summary line. See for instance "Commit Guidelines" on
|
||||
https://git-scm.com/book/en/v2/Distributed-Git-Contributing-to-a-Project
|
||||
or https://cbea.ms/git-commit/ about how to make well-formed commit
|
||||
messages.
|
||||
|
||||
Put detailed information in the commit message itself, which will end
|
||||
up in the git history. On the other hand the description that you fill
|
||||
in the GitHub pull request web page does not go anywhere.
|
||||
|
||||
For copyright reasons it is preferable to have your full name in the
|
||||
commit author field. Do not update the AUTHOR file yourself, the
|
||||
maintainers will update it as part of the release preparation.
|
||||
|
||||
Please don't touch version_nano.h in your patches or pull requests.
|
@ -1,52 +0,0 @@
|
||||
Installation Instructions for Windows
|
||||
*************************************
|
||||
|
||||
If you are compiling for MinGW or cygwin, please refer to the INSTALL file,
|
||||
which is automatically generated by autotools (e.g. running bootstrap.sh).
|
||||
|
||||
If you are using Microsoft Visual Studio:
|
||||
- Using Visual Studio 2022, open /msvc/libusb.sln
|
||||
- If you want to debug the library, uncomment the ENABLE_DEBUG_LOGGING define
|
||||
in msvc/config.h
|
||||
- Select your configuration and compile the project.
|
||||
- To target a specific toolset (previous version of Visual Studio), either
|
||||
edit PlatformToolset in /msvc/Configuration.Base.props, or supply the value
|
||||
to msbuild on the command line.
|
||||
- For example, to build for VS2015 (from a different version):
|
||||
msbuild -p:PlatformToolset=v140,Platform=x64,Configuration=Release libusb.sln
|
||||
|
||||
Installing and building libusb via vcpkg
|
||||
****************************************
|
||||
|
||||
You can download and install libusb using the vcpkg dependency manager:
|
||||
|
||||
git clone https://github.com/Microsoft/vcpkg.git
|
||||
cd vcpkg
|
||||
./bootstrap-vcpkg.bat
|
||||
./vcpkg integrate install
|
||||
vcpkg install libusb
|
||||
|
||||
The libusb port in vcpkg is kept up to date by Microsoft team members and
|
||||
community contributors. If the version is out of date, please create an issue
|
||||
or pull request (https://github.com/Microsoft/vcpkg) on the vcpkg repository.
|
||||
|
||||
Destination directories
|
||||
***********************
|
||||
|
||||
The binaries are located at:
|
||||
/build/<PlatformToolset>/<Platform>/<Configuration>/(lib|dll)/libusb-1.0.(lib|dll)
|
||||
For example: /build/v143/x64/Release/dll/libusb-1.0.dll
|
||||
|
||||
Troubleshooting
|
||||
***************
|
||||
|
||||
If the compilation process complains about missing libraries, ensure that the
|
||||
default library paths for your project points to the relevant directories.
|
||||
If needed, these libraries can be obtained by installing the latest Windows
|
||||
SDK.
|
||||
|
||||
Links
|
||||
*****
|
||||
|
||||
Additional information related to the Windows backend:
|
||||
http://windows.libusb.info
|
123
lib/libusb/KEYS
123
lib/libusb/KEYS
@ -1,123 +0,0 @@
|
||||
This file contains the PGP keys of libusb release managers.
|
||||
|
||||
Users:
|
||||
pgp < KEYS
|
||||
or
|
||||
gpg --import KEYS
|
||||
|
||||
Maintainers:
|
||||
pgp -kxa <your name> and append it to this file.
|
||||
or
|
||||
(pgpk -ll <your name> && pgpk -xa <your name>) >> this file.
|
||||
or
|
||||
(gpg --list-sigs <your name> && gpg --armor --export <your name>) >> this file.
|
||||
|
||||
pub rsa4096 2020-06-23 [SC]
|
||||
C68187379B23DE9EFC46651E2C80FF56C6830A0E
|
||||
uid [ultimate] Tormod Volden <debian.tormod@gmail.com>
|
||||
sub rsa4096 2020-06-23 [E]
|
||||
sub rsa4096 2020-06-23 [S]
|
||||
|
||||
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
||||
|
||||
mQINBF7yPL0BEADQc/2dx8H7a7r1SGYph5hmkszs0O9V/43m8XhNnbnFraXjmbEv
|
||||
xm2wE6AuR301mjAqYSt/mphmH54z4GBbgmLBrK8TGdhlK0K11PeSudRN4jsLs+U3
|
||||
ErtkAHODmzyg7QiW3GWudP/lJQRSqNBoadeOdOsKMoJxm7T2a9fyyf8FR/FfShjv
|
||||
NB62jSWq0x0WnglI/V/ZOi/mOnqoggCoWXLzwqbKasicvfNsTPJIsjiu24US6mif
|
||||
nRllMWr/6aHyCOX6+x6PsQ35NF5C5B7b0c1fY7zU/UiM/JBF4HDf7jltzTIjHjho
|
||||
jTwcEkCVmunW+jSwjsLcr/zkOsu1re0W/VJJNXOhSnNUDpM7t9FeSfJ0LGlXYnGI
|
||||
5ZUCQ8w4RcKmkHYhepCjDVWYkCmxmTgO7LaAXZ5S0GeOoSDsvHNHYywAXNmB6A0s
|
||||
3kv/8i3wT8K1w9972eYW+NA6T7BfdbNk/EKxZQ74eezpRWDDPEl/zehoHQoPO3m1
|
||||
N2b06nnSKLv263IJAPdpLPUJowYdWnvmw/wyakeBMRJdI1FsDkEdI2KAvQxRKHfU
|
||||
/cTtMEJuGGR5qyze4jMHUuVqSvEsoXmSA2OLcWeZyn12jfd0CrGbCZ7jZ0R7Q1Ab
|
||||
cZ7hPsLKtgKHKyrmAdlmTgpOb2Kk2LP4ar0tuDa02YcFFAAWdRY9pORI+wARAQAB
|
||||
tCdUb3Jtb2QgVm9sZGVuIDx0b3Jtb2Qudm9sZGVuQGdtYWlsLmNvbT6JAlAEEwEI
|
||||
ADsCGwMFCwkIBwMFFQoJCAsFFgIDAQACHgECF4AWIQTGgYc3myPenvxGZR4sgP9W
|
||||
xoMKDgUCXvI9hAIZAQAKCRAsgP9WxoMKDpcrD/i7ejrtzMGhDbB+IS5vvoK/Vk+s
|
||||
Oszn+Bi4kjq+S4wv93gByDQy5L8YHSecKS60Qi0XW3VP7qoMXaI10oo0+4pZjheM
|
||||
Lz38Xh7nOhnmzKzyPgB9sg/KuuSvcy6dZZ120ye035uckO3qDIvrV6rG9sx9EV8d
|
||||
rOKppgpXBhCC52bFp45S6bbWRLQrKlmWDNdMSQcknt86ntSqxNJDdbKoxL0JxSI8
|
||||
mB+XrM7TZvyP9eA0ZVy55cbm0ZwU2beJty72GB0Niz0ZiGWeoBcuotDkpAwou7/B
|
||||
Worgonw5yLMjL4NatZXRhym7YTNvKVovLwuG7krScghDCuGo1VswHyRi8xkkuvJ2
|
||||
YS51UBpvLsrDeLlBNd8JzL/FuBgFohkXzXjezx3gEUJe0+mc4gPdHULh8q9suRvF
|
||||
ewOuQshiqvRUacuKNYglqnxqM4aJxqO0BCNDofgnu8JYk+llXzKT5bKiIXHDMWwd
|
||||
eq9Y4NJzruAAilqM0tc1iI+qDmD4SabEjAmGREPeirVrASfrZFrOKBwF0PQE9fVN
|
||||
PsXdYCHhfXLjlEFVv5pmJkhw3euFoxDz3auZ6OhGo1ffCOZ62On5joiIRhhGQ57l
|
||||
qpW3W2Ph9TmWLRtOwR7DgiP/qUCrngBmk+Vl3KdwmSECDTXnFFKtOIHHomHEziEV
|
||||
wnjxNpVBwrvZZZkPiF0EExEIAB0WIQQsLnerYFFdSZykiO+jLYR2uvQdDAUCXvJG
|
||||
mgAKCRCjLYR2uvQdDNyVAJ9qmD3ioM5cVU3t7h4YSb6FuZ7CvQCggtBzoovIo6UJ
|
||||
WsMd6NvtKXSVsii0J1Rvcm1vZCBWb2xkZW4gPGRlYmlhbi50b3Jtb2RAZ21haWwu
|
||||
Y29tPokCTgQTAQgAOBYhBMaBhzebI96e/EZlHiyA/1bGgwoOBQJe8jy9AhsDBQsJ
|
||||
CAcDBRUKCQgLBRYCAwEAAh4BAheAAAoJECyA/1bGgwoOFdQP/R3oBQ/fQTFoaRVK
|
||||
Q7KOp0MI2Bo1l9kRYnjj+CxlFUIEKTs06AER55IUpt1bjh4drldLVwaFP8rx/V5A
|
||||
62Z2yvIAhkrEKRFkTEbdnfH5S23VF9T8n2L4nZ6L0VBK8bgdZsiTKWk4aVy4YdQG
|
||||
yUC8mcXq1beZS8WiL7X/aH81uO+Bwaszmwgi2/NHEGdTuE1jUIslWyOHGhEe5Ygo
|
||||
+mEltm+PLdZJ9dJAEI3fWYl0Y+5y+eDNBBNXEsTiZ0R/7xFakcT2AWSnRPxbllJk
|
||||
4tG8FTlnSU8WY3VODec0L04UFJE64Ywupae0Xqc7ycJNk72FG3VEDgQhZC6e/L+a
|
||||
vSgCvzI9U8mdypxS9znyYblCGigR46M/CMzUp6oA78u3cHPUyL2fVYMm6FcQN1Bv
|
||||
nIlDSgHZJjFdpmAqYPvs+LR4+8dLXgwUKdIufka8yLJ2W3x5HQMtqBkgL8QqJTt1
|
||||
PdDbAaZdA1RHPJU2rE7sBI5EOOnQJu1cdFMOAXQR7BUad2au5IJ2oxy+z1fsZZeh
|
||||
1X8OjypTQuKrQA3oAgaAERu/qRC4c6SKG8bMMR+3tf6NVWlYS+gK2wGxXCM5DuEJ
|
||||
LYlHj2vQ/xeauq9MR23rgufVrmmnPEawMnsM5dD2ArR9FIq+sOAeZM/SJQC/I5Zf
|
||||
uM+khtkurI63QMKLxzJAJjeS/gmliF0EExEIAB0WIQQsLnerYFFdSZykiO+jLYR2
|
||||
uvQdDAUCXvJGowAKCRCjLYR2uvQdDIIVAKDcEF7MFwV/xjr7M5bTkSITiLfn/gCe
|
||||
OTXlJl/vmuXHcJl7GOPkxr5Lrbu5Ag0EXvI8vQEQAN4TW0AbNnnQ4ZeVJZWYsfBW
|
||||
dFkN42092q3herQuYRxzrEqqgwdVXplIQYKJKGdKmsBQGuqY4eXktz5EXSFPk6Ui
|
||||
YrDD6WffQoJOpZPYWB70clWSSvz+moSQSNyMOT+DhZ//CZ74YiOJTE4844HuzmkG
|
||||
lg+zS9cKKAYcz+KICKWxRaTfX/LtXKZBF3QSSy8qxCM9PipoO8bblQBGnY8rzneQ
|
||||
vAXuhsGgbtjR+o23owWHbFZKgvphsXgnmx6brJoY1o5x4qXpGrpG6XzNYp2zd3RJ
|
||||
0+8R6OIoukil/x3TGSFFp4cp2Nahb8XxV8neZ7Ng8O0+/P7sMJxPm0wuU8+DEnpB
|
||||
F6/bI1hvMNvF20dhWzpChOmArJQRZbCDM+EouZhAbh3T0n/5bx4EBezCMpDSO90V
|
||||
n0Uy3KAHbf6QohCt0PEmRSZkrGPFs3fSzuP4U8cWa07sUL02CW/pTn2i96fGgh+F
|
||||
+SfY1E56vN2Rzv7OSrbD+cNai9E4gwDGElX9ML/O3lTOok9cfSvbFxXr0ALnLCAT
|
||||
u1bI/f4Ohu9yQy4sYR+FSMNBaQmbb213PpoT5rNdn5XT/v067r8iWQlwi48a7IIM
|
||||
TNsTSGSNiBm3UoETipqQZVrgbk4gEwPsf/6BB9e2H0GSY7XBBcQb99UGQ9k88ieQ
|
||||
3jinfc2Mj8bIqCcRqwnNABEBAAGJAjYEGAEIACAWIQTGgYc3myPenvxGZR4sgP9W
|
||||
xoMKDgUCXvI8vQIbDAAKCRAsgP9WxoMKDuYcD/4rd2U6ca2/mQmNGoT2r315j2j0
|
||||
ej61a3BwoL42dX+0SgbjstIhpHo4Ng0b6MAvsA7Y6RX2P0FnBhxHQhkBUu0EbtfU
|
||||
Pewxn1WPn7qdXHLh/U3JBTWFgIvaRaqEoUVx1FAaShOex77rgwL+7NZyATSLNaW9
|
||||
J3NBY4LaKIHeqEbyHnIs9NAdnaDXxwXjTwvlz5rAbBG6r2uoUca95rWkAi/iT9D2
|
||||
cki5ouq7Lk6SGLOZAzeilKB81UsjryHmiJ1tzOWdpVTYw1Y0c30qDH/EgylmTscU
|
||||
+e4cFYo7ZqJeVXM8fNDMnU89UhOzArMgKNZEijfnUE/1qqLKNK3BRoaQrISZkYdF
|
||||
AILOfvE4yfoQxJ0joA5RJmGg1BoBsCxh6Bm25bwr9fckf2no42bG9E6a7Ib8Stkl
|
||||
MMkzdSL+6ei8wMZ/EJAGa7JYXu8wHR6fZ1bgpzbS3zejO1qReNrs+zyyT+tMHTT2
|
||||
Ax2HUpBokbPSjT6ZgWNj5XZJAPSF9S+f073D0Zr8051VU5cnI+TfGzK1OLiAcVNx
|
||||
cKM6cjSH40MUWFzHuRjlNnqrVWLcYHje8KhmfHRc6LzLR0yjz4RCfLhUnf/56Zz+
|
||||
kDGYEAOdx3mon/RG8q1yQZc0Uz3xr6+tV8jUJOaeTxvEVa6dwncBBma2BJIeVOFk
|
||||
fgu0j2XHDAKcyhnG97kCDQRe8j3JARAAs11IfLfybhdX3yjbVzxPiJ3RzkFZBbHy
|
||||
YcL8NJYdpxOGEK5pLu7zOe7z+TQpW4mMfQunbHreABunjCPuZwvME4ekQva/pky7
|
||||
S9ajdsm1HMVpoXNQ0cSD+WTkiJaDJC6LFH6+XDzrUK7Kp/6NGKCSwU5xXmZudSVd
|
||||
pCNuziE+KQ5qEXPT6P7H+1TLNKgZvxmksHA76+/ZahpVTCgVVMpTmlRa3jnH0MoN
|
||||
v5fwUMuC7fx09zdqb09D1bBcjrTltVcO6Ij8yUnw5DaQS8y8boIsIIK9YaJHk7uI
|
||||
o1qzilT7a71GKmz1Cs90qmLvRpN8nJGY6q28BXyM68E1Wx7x720IgXTR/JL/j3dB
|
||||
Yggil3GGdBLEwVPtAy8VeeiNGsJe1ZmYUYMc6rgOjghWZogjI5mJOqOXOs3Iilic
|
||||
sRTySCP4x7uRquWWlNNyeVE17ScGiUqsNCyzzwQ3MKbASswNrKnu0iIBfdYyWF+w
|
||||
iyB+kr8o23QMA7TIJnRj++ShOSeoPNg0wOns97Yj4VobSvWBmiX+VjFWkhOQFY9Q
|
||||
eFibQX3iBcSUBZh4eilQMWOx4vD9usBF9NsvrZKvIXrQI456BsTzoKFspqlka9y4
|
||||
YISw3fbGjfOSNXab2R5xEkHX8fF/u8Xs897kVIi/imRrVSgmzf3X4QdTLQJ2MdhH
|
||||
02lhlYdkvecAEQEAAYkEawQYAQgAIBYhBMaBhzebI96e/EZlHiyA/1bGgwoOBQJe
|
||||
8j3JAhsCAj8JECyA/1bGgwoOwXMgBBkBCAAdFiEEnH6pSTnGnE+8Pb+oqgY5B577
|
||||
YbkFAl7yPckACgkQqgY5B577YbkUig/3XOT/88S0edOfgNfFtntAYCj4w3NztXiR
|
||||
ClFQFohRupjP7h6y24VgKD1I0595fCGs9YKl9MiI9PAxNUVdKD6WOcjrRL6B8eMh
|
||||
xle4MefL4UK5kvUKTn2QqE8GgwAqgFkn0wbdOOxPVmGtJ3tuS5Hok9nn9RHUkeMK
|
||||
vOeRHx38NyozjZxoUJ+3gFngliM1BKlR3Dq1XlvXz/7fWKzl3AkneLHfca/0yzB6
|
||||
7qvs3G6q0btyZqjp0GSrGSVUnqpK670b1l6DQd6raej76RPq8OsxP1DkfwVsyNQV
|
||||
/EN0atj+MsruUPBbesZ5oP/XFrQkjjDDIGhbmg0xB9Bxp8v+y9EiFB9LC4nmLvw9
|
||||
gn2cK3j1JXdiKUVWzPMKdUrZ/Y5lksrn6a326zDOJZwT4/XYiclgM+vKQb1RWdXv
|
||||
bz3oTpSyeCdKZQ845aNM1Q8AHJ2NVlGBbiMsFTmKnM/wcU8+6saWflF0JeiNgal0
|
||||
wcGvmkossrOVQZh10959HT8Eb4Vzgf0MD4YATmM6CbGxv1tuDxhK12e8MDsI7wul
|
||||
M5ODLWpb3zwgLU/O3IeinbRlr30lhvnTzgdYx5CgYqUYUm/MSb0+vWpr67smoBbR
|
||||
pWi4j2zcTtay/iNL9pFCLFegkJtXwLehh8sgEj28c/jOH2XEfOgEEniVM57dFONm
|
||||
n5ba3xTKRSS8D/44K3JJSPi2urzO+wXtcbZ1QSWypTV8dI7zLImySMmBtU7GEKLe
|
||||
y8klXAQBnzyKTFrsS60A0JiNGbzw75kAi2677jgvEtzz0QAxvJUCianFT9QCqcxQ
|
||||
okh/W8klVaJGLucAD5CRTLc9F4TNGV1jsHf90McWWf/bKANz875PZUDqMDtQ6hqH
|
||||
Udn4AxVaLn1dAqn2ae3DQK043jViy7IivilQLLo5mmkGLs0bPQZgG4OBB0mgzS8Z
|
||||
t2/3zJUvS/ygea0vqMzleEMlBJXWMyh6S8upEJVGdJfuMfRbOpvRBXZULLKwBVLn
|
||||
/vcB6QianT31AtxpWRtXjk52DxrqP85jMZtrlXWECmOanNM41cN/hoVVcXYLYYrt
|
||||
f8ZYM4cjB744M3XqCjh8aw8p8sg/sMQ4yJMlLuS6tGR/4WS1EU+Rq3ukg5jFfAQ/
|
||||
PfXrj4iCFjUBD4CnRAQIXhPCqMl6hFMZw61BpKFpZNLlJ205R+elqGBbrLibhu3u
|
||||
RAeFxk23S035hxBZnC2CDQL7zLwnzk1DPx6ywS6ky2qENwISR9tNldehFuPHXnSf
|
||||
5/DxUzfWd2Tj35vxZDhKjJ1HiT3o++HKCRX9cP/cALsd5zvIxSVN6RRCUI2U8N+b
|
||||
k5/dfKNq8Q4FX9TZFSBnWudih+bT74v5f4LwhidPgOiYugiLoJh2ZqIVvQ==
|
||||
=5EaQ
|
||||
-----END PGP PUBLIC KEY BLOCK-----
|
@ -1,50 +0,0 @@
|
||||
AUTOMAKE_OPTIONS = dist-bzip2 no-dist-gzip
|
||||
ACLOCAL_AMFLAGS = -I m4
|
||||
EXTRA_DIST = INSTALL_WIN.txt PORTING doc/libusb.png \
|
||||
android msvc Xcode
|
||||
SUBDIRS = libusb
|
||||
|
||||
if BUILD_EXAMPLES
|
||||
SUBDIRS += examples
|
||||
endif
|
||||
|
||||
if BUILD_TESTS
|
||||
SUBDIRS += tests
|
||||
endif
|
||||
|
||||
pkgconfigdir = $(libdir)/pkgconfig
|
||||
pkgconfig_DATA = libusb-1.0.pc
|
||||
|
||||
# The package name is libusb-1.0, but we want the distribution
|
||||
# to be created as libusb-x.y.z instead of libusb-1.0-x.y.z
|
||||
distdir = libusb-$(VERSION)
|
||||
|
||||
# Ensure any generated docs are cleaned out
|
||||
# We need this here because make does not recurse into doc/
|
||||
clean-local:
|
||||
rm -rf doc/$(DOXYGEN_HTMLDIR)
|
||||
|
||||
# Use dist-hook to accomplish the following things for the dist recipe:
|
||||
# 1) Remove the GitHub Markdown from the README file
|
||||
# 2) Remove the .gitattributes file from the msvc directory
|
||||
dist-hook:
|
||||
chmod u+w $(distdir)/README $(distdir)/msvc
|
||||
$(SED) -i.orig -e '/Build Status/d' $(distdir)/README
|
||||
$(SED) -i.orig -e '/^$$/N;/^\n$$/D' $(distdir)/README
|
||||
$(SED) -i.orig -e 's/\[\([A-Z]*\)\](\1)/\1/' $(distdir)/README
|
||||
rm -f $(distdir)/README.orig
|
||||
rm -f $(distdir)/msvc/.gitattributes
|
||||
|
||||
reldir = .release/$(distdir)
|
||||
sfurl = frs.sourceforge.net:/home/frs/project/libusb/libusb-1.0
|
||||
.PHONY: dist-upload
|
||||
dist-upload: dist
|
||||
rm -rf $(reldir)
|
||||
mkdir -p $(reldir)
|
||||
cp $(distdir).tar.bz2 $(reldir)
|
||||
if [ -z "$$SF_USER" ]; then \
|
||||
rsync -rv $(reldir) $(sfurl); \
|
||||
else \
|
||||
rsync -rv $(reldir) $$SF_USER@$(sfurl); \
|
||||
fi
|
||||
rm -rf $(reldir)
|
@ -1,2 +0,0 @@
|
||||
For the latest libusb news, please refer to the ChangeLog file, or visit:
|
||||
https://libusb.info
|
@ -1,94 +0,0 @@
|
||||
PORTING LIBUSB TO OTHER PLATFORMS
|
||||
|
||||
Introduction
|
||||
============
|
||||
|
||||
This document is aimed at developers wishing to port libusb to unsupported
|
||||
platforms. I believe the libusb API is OS-independent, so by supporting
|
||||
multiple operating systems we pave the way for cross-platform USB device
|
||||
drivers.
|
||||
|
||||
Implementation-wise, the basic idea is that you provide an interface to
|
||||
libusb's internal "backend" API, which performs the appropriate operations on
|
||||
your target platform.
|
||||
|
||||
In terms of USB I/O, your backend provides functionality to submit
|
||||
asynchronous transfers (synchronous transfers are implemented in the higher
|
||||
layers, based on the async interface). Your backend must also provide
|
||||
functionality to cancel those transfers.
|
||||
|
||||
Your backend must also provide an event handling function to "reap" ongoing
|
||||
transfers and process their results.
|
||||
|
||||
The backend must also provide standard functions for other USB operations,
|
||||
e.g. setting configuration, obtaining descriptors, etc.
|
||||
|
||||
|
||||
File descriptors for I/O polling
|
||||
================================
|
||||
|
||||
For libusb to work, your event handling function obviously needs to be called
|
||||
at various points in time. Your backend must provide a set of file descriptors
|
||||
which libusb and its users can pass to poll() or select() to determine when
|
||||
it is time to call the event handling function.
|
||||
|
||||
On Linux, this is easy: the usbfs kernel interface exposes a file descriptor
|
||||
which can be passed to poll(). If something similar is not true for your
|
||||
platform, you can emulate this using an internal library thread to reap I/O as
|
||||
necessary, and a pipe() with the main library to raise events. The file
|
||||
descriptor of the pipe can then be provided to libusb as an event source.
|
||||
|
||||
|
||||
Interface semantics and documentation
|
||||
=====================================
|
||||
|
||||
Documentation of the backend interface can be found in libusbi.h inside the
|
||||
usbi_os_backend structure definition.
|
||||
|
||||
Your implementations of these functions will need to call various internal
|
||||
libusb functions, prefixed with "usbi_". Documentation for these functions
|
||||
can be found in the .c files where they are implemented.
|
||||
|
||||
You probably want to skim over *all* the documentation before starting your
|
||||
implementation. For example, you probably need to allocate and store private
|
||||
OS-specific data for device handles, but the documentation for the mechanism
|
||||
for doing so is probably not the first thing you will see.
|
||||
|
||||
The Linux backend acts as a good example - view it as a reference
|
||||
implementation which you should try to match the behaviour of.
|
||||
|
||||
|
||||
Getting started
|
||||
===============
|
||||
|
||||
1. Modify configure.ac to detect your platform appropriately (see the OS_LINUX
|
||||
stuff for an example).
|
||||
|
||||
2. Implement your backend in the libusb/os/ directory, modifying
|
||||
libusb/os/Makefile.am appropriately.
|
||||
|
||||
3. Add preprocessor logic to the top of libusb/core.c to statically assign the
|
||||
right usbi_backend for your platform.
|
||||
|
||||
4. Produce and test your implementation.
|
||||
|
||||
5. Send your implementation to libusb-devel mailing list.
|
||||
|
||||
|
||||
Implementation difficulties? Questions?
|
||||
=======================================
|
||||
|
||||
If you encounter difficulties porting libusb to your platform, please raise
|
||||
these issues on the libusb-devel mailing list. Where possible and sensible, I
|
||||
am interested in solving problems preventing libusb from operating on other
|
||||
platforms.
|
||||
|
||||
The libusb-devel mailing list is also a good place to ask questions and
|
||||
make suggestions about the internal API. Hopefully we can produce some
|
||||
better documentation based on your questions and other input.
|
||||
|
||||
You are encouraged to get involved in the process; if the library needs
|
||||
some infrastructure additions/modifications to better support your platform,
|
||||
you are encouraged to make such changes (in cleanly distinct patch
|
||||
submissions). Even if you do not make such changes yourself, please do raise
|
||||
the issues on the mailing list at the very minimum.
|
@ -1,33 +0,0 @@
|
||||
# libusb
|
||||
|
||||
[](https://travis-ci.org/libusb/libusb)
|
||||
[](https://ci.appveyor.com/project/LudovicRousseau/libusb)
|
||||
[](https://scan.coverity.com/projects/libusb-libusb)
|
||||
|
||||
libusb is a library for USB device access from Linux, macOS,
|
||||
Windows, OpenBSD/NetBSD, Haiku, Solaris userspace, and WebAssembly
|
||||
via WebUSB.
|
||||
It is written in C (Haiku backend in C++) and licensed under the GNU
|
||||
Lesser General Public License version 2.1 or, at your option, any later
|
||||
version (see [COPYING](COPYING)).
|
||||
|
||||
libusb is abstracted internally in such a way that it can hopefully
|
||||
be ported to other operating systems. Please see the [PORTING](PORTING)
|
||||
file for more information.
|
||||
|
||||
libusb homepage:
|
||||
https://libusb.info/
|
||||
|
||||
Developers will wish to consult the API documentation:
|
||||
http://api.libusb.info
|
||||
|
||||
Use the mailing list for questions, comments, etc:
|
||||
http://mailing-list.libusb.info
|
||||
|
||||
- Hans de Goede <hdegoede@redhat.com>
|
||||
- Xiaofan Chen <xiaofanc@gmail.com>
|
||||
- Ludovic Rousseau <ludovic.rousseau@gmail.com>
|
||||
- Nathan Hjelm <hjelmn@cs.unm.edu>
|
||||
- Chris Dickens <christopher.a.dickens@gmail.com>
|
||||
|
||||
(Please use the mailing list rather than mailing developers directly)
|
@ -1,41 +0,0 @@
|
||||
Notes related to git compilation:
|
||||
--------------------------------
|
||||
|
||||
If you retrieved the libusb repository from git and are using a gcc based
|
||||
toolchain, be mindful that you should have the autotools installed (autoconf,
|
||||
automake) and will need to run either ./autogen.sh or ./bootstrap.sh to produce
|
||||
the configure file.
|
||||
|
||||
The difference between autogen.sh and bootstrap.sh is that the former invokes
|
||||
configure with a default set of options, and will therefore generate a Makefile,
|
||||
whereas the latter does not invoke configure at all. If using autogen.sh, note
|
||||
that you can also append options, that will be passed as is to configure.
|
||||
|
||||
macOS-specific notes:
|
||||
-------------------
|
||||
|
||||
Starting with Xcode 4.3, neither Xcode.app nor the Xcode 'command line tools'
|
||||
includes autotools and so running either autogen.sh or bootstrap.sh will result
|
||||
in the message:
|
||||
|
||||
libtoolize or glibtoolize was not found! Please install libtool.
|
||||
|
||||
To proceed, you must find and install it from somewhere.
|
||||
|
||||
Alternatively, you can use the Xcode project at Xcode/libusb.xcodeproj.
|
||||
|
||||
Notes related to submitting new developments:
|
||||
--------------------------------------------
|
||||
|
||||
If you submit a new development to libusb (eg: new backend), that is unlikely
|
||||
to fit in a couple of small patches, we would kindly suggest that you create a
|
||||
public account on github, if you don't have one already, and then fork a new
|
||||
libusb repository under this account from https://github.com/libusb/libusb.
|
||||
|
||||
Then you can create a git branch for your work, that we will be able to better
|
||||
reference and test.
|
||||
|
||||
We also suggest that, if you are planning to bring in a large development, you
|
||||
try to involve the libusb community early by letting the mailing list know, as
|
||||
you may find that other people might be eager to help you out.
|
||||
See http://mailing-list.libusb.info for details on how to join the mailing list.
|
@ -1 +0,0 @@
|
||||
README
|
@ -1,2 +0,0 @@
|
||||
Please see the libusb roadmap by visiting:
|
||||
https://github.com/libusb/libusb/milestones?direction=asc&sort=due_date&state=open
|
@ -1,92 +0,0 @@
|
||||
//
|
||||
// libusb Xcode configuration file
|
||||
// Copyright © 2012 Pete Batard <pete@akeo.ie>
|
||||
// For more information, please visit: <https://libusb.info>
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Lesser General Public
|
||||
// License as published by the Free Software Foundation; either
|
||||
// version 2.1 of the License, or (at your option) any later version.
|
||||
//
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
// Lesser General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Lesser General Public
|
||||
// License along with this library; if not, write to the Free Software
|
||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
// Use GNU11 dialect.
|
||||
GCC_C_LANGUAGE_STANDARD = gnu11
|
||||
|
||||
// Don't search user paths with <> style #includes.
|
||||
ALWAYS_SEARCH_USER_PATHS = NO
|
||||
|
||||
// Enable weak references for Objective-C
|
||||
CLANG_ENABLE_OBJC_WEAK = YES
|
||||
|
||||
// Allocate even uninitialized global variables in the data section of the object file, rather than generating them as common blocks. This has the effect that if the same variable is declared (without 'extern') in two different compilations, you will get an error when you link them.
|
||||
GCC_NO_COMMON_BLOCKS = YES
|
||||
|
||||
// Keep private symbols private. The first setting is -fvisibility=hidden, the second is -fvisibility-inlines-hidden.
|
||||
GCC_SYMBOLS_PRIVATE_EXTERN = YES
|
||||
GCC_INLINES_ARE_PRIVATE_EXTERN = YES
|
||||
|
||||
// Compiler errors.
|
||||
GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES
|
||||
|
||||
// Compiler warnings.
|
||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES
|
||||
GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = YES
|
||||
GCC_WARN_ABOUT_MISSING_NEWLINE = YES
|
||||
GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES
|
||||
GCC_WARN_ABOUT_RETURN_TYPE = YES
|
||||
GCC_WARN_FOUR_CHARACTER_CONSTANTS = YES
|
||||
GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES
|
||||
GCC_WARN_SHADOW = YES
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES
|
||||
GCC_WARN_UNKNOWN_PRAGMAS = YES
|
||||
GCC_WARN_UNUSED_FUNCTION = YES
|
||||
GCC_WARN_UNUSED_LABEL = YES
|
||||
GCC_WARN_UNUSED_PARAMETER = YES
|
||||
GCC_WARN_UNUSED_VARIABLE = YES
|
||||
CLANG_WARN_ASSIGN_ENUM = YES
|
||||
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES
|
||||
CLANG_WARN_BOOL_CONVERSION = YES
|
||||
CLANG_WARN_COMMA = YES
|
||||
CLANG_WARN_CONSTANT_CONVERSION = YES
|
||||
CLANG_WARN_DOCUMENTATION_COMMENTS = YES
|
||||
CLANG_WARN_EMPTY_BODY = YES
|
||||
CLANG_WARN_ENUM_CONVERSION = YES
|
||||
CLANG_WARN_FLOAT_CONVERSION = YES
|
||||
CLANG_WARN_INFINITE_RECURSION = YES
|
||||
CLANG_WARN_INT_CONVERSION = YES
|
||||
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES
|
||||
CLANG_WARN_STRICT_PROTOTYPES = YES
|
||||
CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES
|
||||
CLANG_WARN_COMPLETION_HANDLER_MISUSE = YES
|
||||
CLANG_WARN_IMPLICIT_FALLTHROUGH = YES
|
||||
CLANG_WARN_FRAMEWORK_INCLUDE_PRIVATE_FROM_PUBLIC = YES
|
||||
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES
|
||||
CLANG_WARN_SEMICOLON_BEFORE_METHOD_BODY = YES
|
||||
GCC_WARN_SIGN_COMPARE = YES
|
||||
CLANG_WARN__EXIT_TIME_DESTRUCTORS = YES
|
||||
GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES
|
||||
GCC_WARN_HIDDEN_VIRTUAL_FUNCTIONS = YES
|
||||
CLANG_WARN_ATOMIC_IMPLICIT_SEQ_CST = YES
|
||||
CLANG_WARN_OBJC_IMPLICIT_ATOMIC_PROPERTIES = YES
|
||||
CLANG_WARN_OBJC_INTERFACE_IVARS = YES
|
||||
GCC_WARN_STRICT_SELECTOR_MATCH = YES
|
||||
CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES
|
||||
CLANG_WARN_UNREACHABLE_CODE = YES
|
||||
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES
|
||||
CLANG_WARN_SUSPICIOUS_MOVE = YES
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES
|
||||
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES
|
||||
GCC_WARN_UNDECLARED_SELECTOR = YES
|
||||
|
||||
// Static analyzer warnings.
|
||||
CLANG_ANALYZER_NONNULL = YES
|
||||
CLANG_ANALYZER_SECURITY_FLOATLOOPCOUNTER = YES
|
||||
CLANG_ANALYZER_SECURITY_INSECUREAPI_RAND = YES
|
@ -1,31 +0,0 @@
|
||||
/* config.h. Manually generated for Xcode. */
|
||||
|
||||
#include <AvailabilityMacros.h>
|
||||
|
||||
/* Define to the attribute for default visibility. */
|
||||
#define DEFAULT_VISIBILITY __attribute__ ((visibility ("default")))
|
||||
|
||||
/* Define to 1 to enable message logging. */
|
||||
#define ENABLE_LOGGING 1
|
||||
|
||||
/* On 10.6 and later, use newly available pthread_threadid_np() function */
|
||||
#if MAC_OS_X_VERSION_MIN_REQUIRED >= 1060
|
||||
/* Define to 1 if you have the 'pthread_threadid_np' function. */
|
||||
#define HAVE_PTHREAD_THREADID_NP 1
|
||||
#endif
|
||||
|
||||
/* Define to 1 if the system has the type `nfds_t'. */
|
||||
#define HAVE_NFDS_T 1
|
||||
|
||||
/* Define to 1 if you have the <sys/time.h> header file. */
|
||||
#define HAVE_SYS_TIME_H 1
|
||||
|
||||
/* Define to 1 if compiling for a POSIX platform. */
|
||||
#define PLATFORM_POSIX 1
|
||||
|
||||
/* Define to the attribute for enabling parameter checks on printf-like
|
||||
functions. */
|
||||
#define PRINTF_FORMAT(a, b) __attribute__ ((__format__ (__printf__, a, b)))
|
||||
|
||||
/* Enable GNU extensions. */
|
||||
#define _GNU_SOURCE 1
|
@ -1,32 +0,0 @@
|
||||
//
|
||||
// libusb Xcode configuration file
|
||||
// Copyright © 2012 Pete Batard <pete@akeo.ie>
|
||||
// For more information, please visit: <https://libusb.info>
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Lesser General Public
|
||||
// License as published by the Free Software Foundation; either
|
||||
// version 2.1 of the License, or (at your option) any later version.
|
||||
//
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
// Lesser General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Lesser General Public
|
||||
// License along with this library; if not, write to the Free Software
|
||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
#include "common.xcconfig"
|
||||
|
||||
// Embed debug symbols in binary itself.
|
||||
DEBUG_INFORMATION_FORMAT = dwarf
|
||||
|
||||
// No optimizations in debug.
|
||||
GCC_OPTIMIZATION_LEVEL = 0
|
||||
|
||||
//
|
||||
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) DEBUG=1
|
||||
|
||||
// No need for Universal Binaries in debug.
|
||||
ONLY_ACTIVE_ARCH = YES
|
@ -1,21 +0,0 @@
|
||||
//
|
||||
// libusb Xcode configuration file
|
||||
// Copyright © 2012 Pete Batard <pete@akeo.ie>
|
||||
// For more information, please visit: <https://libusb.info>
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Lesser General Public
|
||||
// License as published by the Free Software Foundation; either
|
||||
// version 2.1 of the License, or (at your option) any later version.
|
||||
//
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
// Lesser General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Lesser General Public
|
||||
// License along with this library; if not, write to the Free Software
|
||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
PRODUCT_NAME = libusb-1.0.0
|
||||
LD_DYLIB_INSTALL_NAME = @rpath/libusb-1.0.0.dylib
|
File diff suppressed because it is too large
Load Diff
@ -1,21 +0,0 @@
|
||||
//
|
||||
// libusb Xcode configuration file
|
||||
// Copyright © 2012 Pete Batard <pete@akeo.ie>
|
||||
// For more information, please visit: <https://libusb.info>
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Lesser General Public
|
||||
// License as published by the Free Software Foundation; either
|
||||
// version 2.1 of the License, or (at your option) any later version.
|
||||
//
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
// Lesser General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Lesser General Public
|
||||
// License along with this library; if not, write to the Free Software
|
||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
#include "debug.xcconfig"
|
||||
#include "libusb.xcconfig"
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user