88
99#![ allow( dead_code) ]
1010
11+ use nix;
1112use std:: io;
1213use std:: marker:: PhantomData ;
13- use std:: mem;
1414use std:: os:: unix:: prelude:: * ;
1515use super :: SpiModeFlags ;
1616
1717fn 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
2121fn 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
217217pub 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