8
8
9
9
#![ allow( dead_code) ]
10
10
11
+ use nix;
11
12
use std:: io;
12
13
use std:: marker:: PhantomData ;
13
- use std:: mem;
14
14
use std:: os:: unix:: prelude:: * ;
15
15
use super :: SpiModeFlags ;
16
16
17
17
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 )
19
19
}
20
20
21
21
fn from_nix_result < T > ( res : :: nix:: Result < T > ) -> io:: Result < T > {
@@ -123,26 +123,26 @@ mod ioctl {
123
123
const SPI_IOC_NR_MAX_SPEED_HZ : u8 = 4 ;
124
124
const SPI_IOC_NR_MODE32 : u8 = 5 ;
125
125
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 ) ;
130
130
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 ) ;
133
133
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 ) ;
136
136
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 ) ;
139
139
140
140
// NOTE: this macro works for single transfers but cannot properly
141
141
// calculate size for multi transfer whose length we will not know
142
142
// until runtime. We fallback to using the underlying ioctl for that
143
143
// 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) ;
146
146
}
147
147
148
148
/// Representation of a spidev transfer that is shared
@@ -161,10 +161,10 @@ pub fn set_mode(fd: RawFd, mode: SpiModeFlags) -> io::Result<()> {
161
161
// added until later kernels. This provides a reasonable story
162
162
// for forwards and backwards compatibility
163
163
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 ) } ) ) ;
165
165
} else {
166
166
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) } ) ) ;
168
168
}
169
169
Ok ( ( ) )
170
170
}
@@ -215,10 +215,8 @@ pub fn transfer(fd: RawFd, transfer: &mut SpidevTransfer) -> io::Result<()> {
215
215
}
216
216
217
217
pub fn transfer_multiple ( fd : RawFd , transfers : & mut [ SpidevTransfer ] ) -> io:: Result < ( ) > {
218
- let tot_size = transfers. len ( ) * mem:: size_of :: < SpidevTransfer > ( ) ;
219
-
220
218
try!( from_nix_result ( unsafe {
221
- ioctl:: spidev_transfer_buf ( fd, transfers. as_mut_ptr ( ) , tot_size )
219
+ ioctl:: spidev_transfer_buf ( fd, transfers)
222
220
} ) ) ;
223
221
Ok ( ( ) )
224
222
}
0 commit comments