1# Rust Spidev 2 3[](https://github.com/rust-embedded/rust-spidev/actions) 4[](https://crates.io/crates/spidev) 5[](https://github.com/rust-embedded/rust-spidev/blob/master/README.md#license) 6 7 8[Documentation](https://docs.rs/spidev) 9 10The Rust `spidev` seeks to provide full access to the Linux spidev 11device in Rust without the need to wrap any C code or directly make 12low-level system calls. The documentation for the spidev interace can 13be found at <https://www.kernel.org/doc/Documentation/spi/spidev>. 14 15## Example/API 16 17The following is not an exhaustive demonstration of the Spidev 18interface but provides a pretty good idea of how to use the library in 19practice. 20 21```rust 22extern crate spidev; 23use std::io; 24use std::io::prelude::*; 25use spidev::{Spidev, SpidevOptions, SpidevTransfer, SpiModeFlags}; 26 27fn create_spi() -> io::Result<Spidev> { 28 let mut spi = Spidev::open("/dev/spidev0.0")?; 29 let options = SpidevOptions::new() 30 .bits_per_word(8) 31 .max_speed_hz(20_000) 32 .mode(SpiModeFlags::SPI_MODE_0) 33 .build(); 34 spi.configure(&options)?; 35 Ok(spi) 36} 37 38/// perform half duplex operations using Read and Write traits 39fn half_duplex(spi: &mut Spidev) -> io::Result<()> { 40 let mut rx_buf = [0_u8; 10]; 41 spi.write(&[0x01, 0x02, 0x03])?; 42 spi.read(&mut rx_buf)?; 43 println!("{:?}", rx_buf); 44 Ok(()) 45} 46 47/// Perform full duplex operations using Ioctl 48fn full_duplex(spi: &mut Spidev) -> io::Result<()> { 49 // "write" transfers are also reads at the same time with 50 // the read having the same length as the write 51 let tx_buf = [0x01, 0x02, 0x03]; 52 let mut rx_buf = [0; 3]; 53 { 54 let mut transfer = SpidevTransfer::read_write(&tx_buf, &mut rx_buf); 55 spi.transfer(&mut transfer)?; 56 } 57 println!("{:?}", rx_buf); 58 Ok(()) 59} 60 61fn main() { 62 let mut spi = create_spi().unwrap(); 63 println!("{:?}", half_duplex(&mut spi).unwrap()); 64 println!("{:?}", full_duplex(&mut spi).unwrap()); 65} 66``` 67 68## Features 69 70The following features are implemented and planned for the library: 71 72- [x] Implement the Read trait 73- [x] Implement the Write trait 74- [x] Support for full-duplex transfers 75- [x] Support for configuring spidev device 76- [x] Support for querying spidev configuration state 77 78## Minimum Supported Rust Version (MSRV) 79 80This crate is guaranteed to compile on stable Rust 1.69.0 and up. It *might* 81compile with older versions but that may change in any new patch release. 82 83## Cross Compiling 84 85Most likely, the machine you are running on is not your development 86machine (although it could be). In those cases, you will need to 87cross-compile. The following basic instructions should work for the 88raspberry pi or beaglebone black: 89 901. Install rust and cargo 912. Install an appropriate cross compiler. On an Ubuntu system, this 92 can be done by doing `sudo apt-get install g++-arm-linux-gnueabihf`. 933. Build or install rust for your target. This is necessary in order 94 to have libstd available for your target. For arm-linux-gnueabihf, 95 you can find binaries at <https://github.com/japaric/ruststrap>. 96 With this approach or building it yourself, you will need to copy 97 the ${rust}/lib/rustlib/arm-unknown-linux-gnueabihf to your system 98 rust library folder (it is namespaced by triple, so it shouldn't 99 break anything). 1004. Tell cargo how to link by adding the lines below to your 101 ~/.cargo/config file. 1025. Run your build `cargo build --target=arm-unknown-linux-gnueabi`. 103 104The following snippet added to my ~/.cargo/config worked for me: 105 106``` 107[target.arm-unknown-linux-gnueabihf] 108linker = "arm-linux-gnueabihf-gcc" 109``` 110 111## License 112 113Licensed under either of 114 115- Apache License, Version 2.0 ([LICENSE-APACHE](LICENSE-APACHE) or 116 <http://www.apache.org/licenses/LICENSE-2.0>) 117- MIT license ([LICENSE-MIT](LICENSE-MIT) or <http://opensource.org/licenses/MIT>) 118 119at your option. 120 121### Contribution 122 123Unless you explicitly state otherwise, any contribution intentionally submitted 124for inclusion in the work by you, as defined in the Apache-2.0 license, shall be 125dual licensed as above, without any additional terms or conditions. 126 127## Code of Conduct 128 129Contribution to this crate is organized under the terms of the [Rust Code of 130Conduct][CoC], the maintainer of this crate, the [Embedded Linux Team][team], promises 131to intervene to uphold that code of conduct. 132 133[CoC]: CODE_OF_CONDUCT.md 134[team]: https://github.com/rust-embedded/wg#the-embedded-linux-team 135