1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
//! Rust FFI bindings to the [FTDI D2XX drivers].
//!
//! This crate is **just** the C bindings.
//! There is a separate crate, [libftd2xx], which provides safe wrappers around
//! the unsafe C bindings.
//!
//! # Usage
//! Simply add this crate as a dependency in your `Cargo.toml`.
//! The static library is distributed in this crate with permission from FTDI.
//!
//! ```toml
//! [dependencies]
//! libftd2xx-ffi = "~0.2.1"
//! ```
//!
//! The default feature set will use pre-generated bindings.
//! This is only available for Windows x86_64 and Linux x86_64 platforms.
//!
//! The bindings can also be generated during compilation using the [bindgen]
//! feature flag.
//! ```toml
//! [dependencies]
//! libftd2xx-ffi = { version = "~0.2.1", features = ["bindgen"] }
//! ```
//!
//! Bindgen has additional dependencies that must be installed in order to
//! compile successfully, see the [bindgen requirements] page for more details.
//!
//! # Supported Targets
//!
//! * `x86_64-pc-windows-msvc`
//! * `x86_64-unknown-linux-gnu`
//! * `x86_64-unknown-linux-musl`
//!
//! # References
//!
//! * [D2XX Programmers Guide V1.4]
//! * [D2XX Drivers Download Page]
//!
//! # Troubleshooting
//! ## Unknown Device on Linux
//! Remove the VCP FTDI driver.
//! ```bash
//! sudo rmmod ftdi_sio
//! sudo rmmod usbserial
//! ```
//! See [FTDI Drivers Installation Guide for Linux] for more details.
//!
//! # License
//! FTDI provides the D2XX driver as a compiled library and a header file.
//! These files can be found within the `libftd2xx_src` directory.
//!
//! The code within the `libftd2xx_src` directory is licensed by FTDI.
//! Please see the [Driver License Terms] page for their license.
//!
//! All code outside of the `libftd2xx_src` directory is MIT licensed.
//!
//! # Maintainers Notes
//! ## README Generation
//! The README file is generated with [cargo-readme].
//!
//! ```bash
//! cargo install cargo-readme
//! cargo readme > README.md
//! ```
//!
//! ## Pre-generated Bindings
//! The pre-generated bindings are generated by compiling this crate, then
//! copying the `bindings.rs` file from the build output.
//!
//! The Windows bindings were run through `dos2unix` to normalize line endings
//! and make it easier to diff the generated bindings.
//!
//! [bindgen requirements]: https://rust-lang.github.io/rust-bindgen/requirements.html
//! [bindgen]: https://github.com/rust-lang/rust-bindgen
//! [cargo-readme]: https://github.com/livioribeiro/cargo-readme
//! [D2XX Drivers Download Page]: https://www.ftdichip.com/Drivers/D2XX.htm
//! [D2xx Programmers Guide V1.4]: https://www.ftdichip.com/Support/Documents/ProgramGuides/D2XX_Programmer's_Guide(FT_000071).pdf
//! [Driver License Terms]: https://www.ftdichip.com/Drivers/FTDriverLicenceTerms.htm
//! [FTDI D2XX drivers]: https://www.ftdichip.com/Drivers/D2XX.htm
//! [FTDI Drivers Installation Guide for Linux]: http://www.ftdichip.cn/Support/Documents/AppNotes/AN_220_FTDI_Drivers_Installation_Guide_for_Linux.pdf
//! [libftd2xx]: https://github.com/newAM/libftd2xx-rs
//! [Rust Edition Guide]: https://doc.rust-lang.org/edition-guide/rust-2018/platform-and-target-support/musl-support-for-fully-static-binaries.html
#![doc(html_root_url = "https://docs.rs/libftd2xx-ffi/0.2.1")]
#![allow(non_upper_case_globals)]
#![allow(non_camel_case_types)]
#![allow(non_snake_case)]

use cfg_if::cfg_if;

cfg_if! {
    if #[cfg(feature = "bindgen")] {
        include!(concat!(env!("OUT_DIR"), "/bindings.rs"));
    } else if #[cfg(all(target_os = "linux", target_arch = "x86_64"))] {
        include!("bindings_linux_x64.rs");
    } else if #[cfg(all(target_os = "windows", target_arch = "x86_64"))] {
        include!("bindings_windows_x64.rs");
    } else {
        std::compile_error!(
            "No pre-generated bindings avaliable for this target.",
        );
    }
}