Skip to content

Commit 91800ce

Browse files
committed
Use Spidev 0.5.2
This allows using the delay transfer support.
1 parent 9734075 commit 91800ce

File tree

2 files changed

+20
-54
lines changed

2 files changed

+20
-54
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ sysfs_gpio = { version = "0.6.1", optional = true }
2929
i2cdev = { version = "0.5.1", optional = true }
3030
nb = "1"
3131
serialport = { version = "4.2.0", default-features = false }
32-
spidev = { version = "0.5.1", optional = true }
32+
spidev = { version = "0.5.2", optional = true }
3333
nix = "0.23.1"
3434

3535
[dev-dependencies]

src/spi.rs

Lines changed: 19 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -8,25 +8,20 @@ use std::io;
88
use std::ops;
99
use std::path::Path;
1010

11-
use crate::Delay;
12-
use spidev::SpidevTransfer;
13-
1411
/// Newtype around [`spidev::Spidev`] that implements the `embedded-hal` traits
1512
///
16-
/// [`spidev::Spidev`]: https://docs.rs/spidev/0.5.spidev/spidev/struct.Spidev.html
17-
pub struct Spidev(pub spidev::Spidev, Delay);
13+
/// [`spidev::Spidev`]: https://docs.rs/spidev/0.5.2/spidev/struct.Spidev.html
14+
pub struct Spidev(pub spidev::Spidev);
1815

1916
impl Spidev {
2017
/// See [`spidev::Spidev::open`][0] for details.
2118
///
22-
/// [0]: https://docs.rs/spidev/0.5.spidev/spidev/struct.Spidev.html#method.open
19+
/// [0]: https://docs.rs/spidev/0.5.2/spidev/struct.Spidev.html#method.open
2320
pub fn open<P>(path: P) -> Result<Self, SPIError>
2421
where
2522
P: AsRef<Path>,
2623
{
27-
spidev::Spidev::open(path)
28-
.map(|spidev| Spidev(spidev, Delay {}))
29-
.map_err(|e| e.into())
24+
spidev::Spidev::open(path).map(Spidev).map_err(|e| e.into())
3025
}
3126
}
3227

@@ -46,10 +41,10 @@ impl ops::DerefMut for Spidev {
4641

4742
mod embedded_hal_impl {
4843
use super::*;
49-
use embedded_hal::delay::DelayUs;
5044
use embedded_hal::spi::ErrorType;
5145
use embedded_hal::spi::{Operation as SpiOperation, SpiBus, SpiDevice};
5246
use spidev::SpidevTransfer;
47+
use std::convert::TryInto;
5348
use std::io::{Read, Write};
5449

5550
impl ErrorType for Spidev {
@@ -88,62 +83,33 @@ mod embedded_hal_impl {
8883
&mut self,
8984
operations: &mut [SpiOperation<'_, u8>],
9085
) -> Result<(), Self::Error> {
91-
let mut spidev_ops: Vec<Operation> = vec![];
92-
let mut spidev_transfers: Vec<SpidevTransfer> = vec![];
93-
94-
for op in operations {
95-
match op {
96-
SpiOperation::Read(buf) => spidev_transfers.push(SpidevTransfer::read(buf)),
97-
SpiOperation::Write(buf) => spidev_transfers.push(SpidevTransfer::write(buf)),
98-
SpiOperation::Transfer(read, write) => {
99-
spidev_transfers.push(SpidevTransfer::read_write(write, read))
100-
}
86+
let mut transfers: Vec<_> = operations
87+
.iter_mut()
88+
.map(|op| match op {
89+
SpiOperation::Read(buf) => SpidevTransfer::read(buf),
90+
SpiOperation::Write(buf) => SpidevTransfer::write(buf),
91+
SpiOperation::Transfer(read, write) => SpidevTransfer::read_write(write, read),
10192
SpiOperation::TransferInPlace(buf) => {
10293
let tx = unsafe {
10394
let p = buf.as_ptr();
10495
std::slice::from_raw_parts(p, buf.len())
10596
};
106-
spidev_transfers.push(SpidevTransfer::read_write(tx, buf))
97+
SpidevTransfer::read_write(tx, buf)
10798
}
10899
SpiOperation::DelayUs(us) => {
109-
if !spidev_transfers.is_empty() {
110-
let mut transfers: Vec<SpidevTransfer> = vec![];
111-
std::mem::swap(&mut transfers, &mut spidev_transfers);
112-
spidev_ops.push(Operation::Transfers(transfers));
113-
}
114-
spidev_ops.push(Operation::Delay(us.to_owned()));
115-
}
116-
}
117-
}
118-
119-
if !spidev_transfers.is_empty() {
120-
spidev_ops.push(Operation::Transfers(spidev_transfers));
121-
}
122-
123-
for op in spidev_ops {
124-
match op {
125-
Operation::Transfers(mut transfers) => {
126-
self.0
127-
.transfer_multiple(&mut transfers)
128-
.map_err(|err| SPIError { err })?;
129-
self.flush()?;
130-
}
131-
Operation::Delay(us) => {
132-
self.1.delay_us(us);
100+
SpidevTransfer::delay((*us).try_into().unwrap_or(u16::MAX))
133101
}
134-
}
135-
}
136-
102+
})
103+
.collect();
104+
self.0
105+
.transfer_multiple(&mut transfers)
106+
.map_err(|err| SPIError { err })?;
107+
self.flush()?;
137108
Ok(())
138109
}
139110
}
140111
}
141112

142-
enum Operation<'a, 'b> {
143-
Transfers(Vec<SpidevTransfer<'a, 'b>>),
144-
Delay(u32),
145-
}
146-
147113
/// Error type wrapping [io::Error](io::Error) to implement [embedded_hal::spi::ErrorKind]
148114
#[derive(Debug)]
149115
pub struct SPIError {

0 commit comments

Comments
 (0)