Skip to content

Commit 8b25b6b

Browse files
committed
Update to using nix 0.14 as a dependency
This solves a number of issues and pulls in a variety of changes and improvements to the ioctl macros provided by nix. Signed-off-by: Paul Osborne <[email protected]>
1 parent 1f29a61 commit 8b25b6b

File tree

2 files changed

+19
-21
lines changed

2 files changed

+19
-21
lines changed

Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,6 @@ half-duplex SPI access, and full-duplex SPI access.
1414
"""
1515

1616
[dependencies]
17-
libc = "0.2.2"
18-
nix = "0.6.0"
17+
libc = "0.2"
1918
bitflags = "1.0"
19+
nix = "0.14"

src/spidevioctl.rs

Lines changed: 17 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,14 @@
88

99
#![allow(dead_code)]
1010

11+
use nix;
1112
use std::io;
1213
use std::marker::PhantomData;
13-
use std::mem;
1414
use std::os::unix::prelude::*;
1515
use super::SpiModeFlags;
1616

1717
fn from_nix_error(err: ::nix::Error) -> io::Error {
18-
io::Error::from_raw_os_error(err.errno() as i32)
18+
io::Error::from_raw_os_error(err.as_errno().unwrap_or_else(|| nix::errno::Errno::UnknownErrno) as i32)
1919
}
2020

2121
fn from_nix_result<T>(res: ::nix::Result<T>) -> io::Result<T> {
@@ -123,26 +123,26 @@ mod ioctl {
123123
const SPI_IOC_NR_MAX_SPEED_HZ: u8 = 4;
124124
const SPI_IOC_NR_MODE32: u8 = 5;
125125

126-
ioctl!(read get_mode_u8 with SPI_IOC_MAGIC, SPI_IOC_NR_MODE; u8);
127-
ioctl!(read get_mode_u32 with SPI_IOC_MAGIC, SPI_IOC_NR_MODE; u32);
128-
ioctl!(write set_mode_u8 with SPI_IOC_MAGIC, SPI_IOC_NR_MODE; u8);
129-
ioctl!(write set_mode_u32 with SPI_IOC_MAGIC, SPI_IOC_NR_MODE32; u32);
126+
ioctl_read!(get_mode_u8, SPI_IOC_MAGIC, SPI_IOC_NR_MODE, u8);
127+
ioctl_read!(get_mode_u32, SPI_IOC_MAGIC, SPI_IOC_NR_MODE32, u32);
128+
ioctl_write_ptr!(set_mode, SPI_IOC_MAGIC, SPI_IOC_NR_MODE, u8);
129+
ioctl_write_ptr!(set_mode32, SPI_IOC_MAGIC, SPI_IOC_NR_MODE32, u32);
130130

131-
ioctl!(read get_lsb_first with SPI_IOC_MAGIC, SPI_IOC_NR_LSB_FIRST; u8);
132-
ioctl!(write set_lsb_first with SPI_IOC_MAGIC, SPI_IOC_NR_LSB_FIRST; u8);
131+
ioctl_read!(get_lsb_first, SPI_IOC_MAGIC, SPI_IOC_NR_LSB_FIRST, u8);
132+
ioctl_write_ptr!(set_lsb_first, SPI_IOC_MAGIC, SPI_IOC_NR_LSB_FIRST, u8);
133133

134-
ioctl!(read get_bits_per_word with SPI_IOC_MAGIC, SPI_IOC_NR_BITS_PER_WORD; u8);
135-
ioctl!(write set_bits_per_word with SPI_IOC_MAGIC, SPI_IOC_NR_BITS_PER_WORD; u8);
134+
ioctl_read!(get_bits_per_word, SPI_IOC_MAGIC, SPI_IOC_NR_BITS_PER_WORD, u8);
135+
ioctl_write_ptr!(set_bits_per_word, SPI_IOC_MAGIC, SPI_IOC_NR_BITS_PER_WORD, u8);
136136

137-
ioctl!(read get_max_speed_hz with SPI_IOC_MAGIC, SPI_IOC_NR_MAX_SPEED_HZ; u32);
138-
ioctl!(write set_max_speed_hz with SPI_IOC_MAGIC, SPI_IOC_NR_MAX_SPEED_HZ; u32);
137+
ioctl_read!(get_max_speed_hz, SPI_IOC_MAGIC, SPI_IOC_NR_MAX_SPEED_HZ, u32);
138+
ioctl_write_ptr!(set_max_speed_hz, SPI_IOC_MAGIC, SPI_IOC_NR_MAX_SPEED_HZ, u32);
139139

140140
// NOTE: this macro works for single transfers but cannot properly
141141
// calculate size for multi transfer whose length we will not know
142142
// until runtime. We fallback to using the underlying ioctl for that
143143
// use case.
144-
ioctl!(write spidev_transfer with SPI_IOC_MAGIC, SPI_IOC_NR_TRANSFER; spi_ioc_transfer);
145-
ioctl!(write buf spidev_transfer_buf with SPI_IOC_MAGIC, SPI_IOC_NR_TRANSFER; spi_ioc_transfer);
144+
ioctl_write_ptr!(spidev_transfer, SPI_IOC_MAGIC, SPI_IOC_NR_TRANSFER, spi_ioc_transfer);
145+
ioctl_write_buf!(spidev_transfer_buf, SPI_IOC_MAGIC, SPI_IOC_NR_TRANSFER, spi_ioc_transfer);
146146
}
147147

148148
/// Representation of a spidev transfer that is shared
@@ -161,10 +161,10 @@ pub fn set_mode(fd: RawFd, mode: SpiModeFlags) -> io::Result<()> {
161161
// added until later kernels. This provides a reasonable story
162162
// for forwards and backwards compatibility
163163
if (mode.bits & 0xFFFFFF00) != 0 {
164-
try!(from_nix_result(unsafe { ioctl::set_mode_u32(fd, &mode.bits) }));
164+
try!(from_nix_result(unsafe { ioctl::set_mode32(fd, &mode.bits) }));
165165
} else {
166166
let bits: u8 = mode.bits as u8;
167-
try!(from_nix_result(unsafe { ioctl::set_mode_u8(fd, &bits) }));
167+
try!(from_nix_result(unsafe { ioctl::set_mode(fd, &bits) }));
168168
}
169169
Ok(())
170170
}
@@ -215,10 +215,8 @@ pub fn transfer(fd: RawFd, transfer: &mut SpidevTransfer) -> io::Result<()> {
215215
}
216216

217217
pub fn transfer_multiple(fd: RawFd, transfers: &mut [SpidevTransfer]) -> io::Result<()> {
218-
let tot_size = transfers.len() * mem::size_of::<SpidevTransfer>();
219-
220218
try!(from_nix_result(unsafe {
221-
ioctl::spidev_transfer_buf(fd, transfers.as_mut_ptr(), tot_size)
219+
ioctl::spidev_transfer_buf(fd, transfers)
222220
}));
223221
Ok(())
224222
}

0 commit comments

Comments
 (0)