1010#![ allow( non_camel_case_types) ]
1111
1212use byteorder:: { NativeEndian , ReadBytesExt , WriteBytesExt } ;
13- use libc:: c_int;
1413use nix;
1514use std:: io:: Cursor ;
16- use std:: marker:: PhantomData ;
1715use std:: mem;
1816use std:: os:: unix:: prelude:: * ;
1917use std:: ptr;
@@ -34,24 +32,24 @@ pub struct i2c_msg {
3432
3533bitflags ! {
3634 struct I2CFunctions : u32 {
37- const I2C_FUNC_I2C = 0x00000001 ;
38- const I2C_FUNC_10BIT_ADDR = 0x00000002 ;
39- const I2C_FUNC_PROTOCOL_MANGLING = 0x00000004 ; /* I2C_M_IGNORE_NAK etc. */
40- const I2C_FUNC_SMBUS_PEC = 0x00000008 ;
41- const I2C_FUNC_NOSTART = 0x00000010 ; /* I2C_M_NOSTART */
42- const I2C_FUNC_SMBUS_BLOCK_PROC_CALL = 0x00008000 ; /* SMBus 2.0 */
43- const I2C_FUNC_SMBUS_QUICK = 0x00010000 ;
44- const I2C_FUNC_SMBUS_READ_BYTE = 0x00020000 ;
45- const I2C_FUNC_SMBUS_WRITE_BYTE = 0x00040000 ;
46- const I2C_FUNC_SMBUS_READ_BYTE_DATA = 0x00080000 ;
47- const I2C_FUNC_SMBUS_WRITE_BYTE_DATA = 0x00100000 ;
48- const I2C_FUNC_SMBUS_READ_WORD_DATA = 0x00200000 ;
49- const I2C_FUNC_SMBUS_WRITE_WORD_DATA = 0x00400000 ;
50- const I2C_FUNC_SMBUS_PROC_CALL = 0x00800000 ;
51- const I2C_FUNC_SMBUS_READ_BLOCK_DATA = 0x01000000 ;
52- const I2C_FUNC_SMBUS_WRITE_BLOCK_DATA = 0x02000000 ;
53- const I2C_FUNC_SMBUS_READ_I2C_BLOCK = 0x04000000 ; /* I2C-like block xfer */
54- const I2C_FUNC_SMBUS_WRITE_I2C_BLOCK = 0x08000000 ; /* w/ 1-byte reg. addr. */
35+ const I2C_FUNC_I2C = 0x0000_0001 ;
36+ const I2C_FUNC_10BIT_ADDR = 0x0000_0002 ;
37+ const I2C_FUNC_PROTOCOL_MANGLING = 0x0000_0004 ; /* I2C_M_IGNORE_NAK etc. */
38+ const I2C_FUNC_SMBUS_PEC = 0x0000_0008 ;
39+ const I2C_FUNC_NOSTART = 0x0000_0010 ; /* I2C_M_NOSTART */
40+ const I2C_FUNC_SMBUS_BLOCK_PROC_CALL = 0x0000_8000 ; /* SMBus 2.0 */
41+ const I2C_FUNC_SMBUS_QUICK = 0x0001_0000 ;
42+ const I2C_FUNC_SMBUS_READ_BYTE = 0x0002_0000 ;
43+ const I2C_FUNC_SMBUS_WRITE_BYTE = 0x0004_0000 ;
44+ const I2C_FUNC_SMBUS_READ_BYTE_DATA = 0x0008_0000 ;
45+ const I2C_FUNC_SMBUS_WRITE_BYTE_DATA = 0x0010_0000 ;
46+ const I2C_FUNC_SMBUS_READ_WORD_DATA = 0x0020_0000 ;
47+ const I2C_FUNC_SMBUS_WRITE_WORD_DATA = 0x0040_0000 ;
48+ const I2C_FUNC_SMBUS_PROC_CALL = 0x0080_0000 ;
49+ const I2C_FUNC_SMBUS_READ_BLOCK_DATA = 0x0100_0000 ;
50+ const I2C_FUNC_SMBUS_WRITE_BLOCK_DATA = 0x0200_0000 ;
51+ const I2C_FUNC_SMBUS_READ_I2C_BLOCK = 0x0400_0000 ; /* I2C-like block xfer */
52+ const I2C_FUNC_SMBUS_WRITE_I2C_BLOCK = 0x0800_0000 ; /* w/ 1-byte reg. addr. */
5553
5654 const I2C_FUNC_SMBUS_BYTE = ( I2CFunctions :: I2C_FUNC_SMBUS_READ_BYTE . bits |
5755 I2CFunctions :: I2C_FUNC_SMBUS_WRITE_BYTE . bits) ;
@@ -164,7 +162,7 @@ mod ioctl {
164162
165163pub fn i2c_set_slave_address ( fd : RawFd , slave_address : u16 ) -> Result < ( ) , nix:: Error > {
166164 unsafe {
167- ioctl:: set_i2c_slave_address ( fd, slave_address as i32 ) ?;
165+ ioctl:: set_i2c_slave_address ( fd, i32:: from ( slave_address ) ) ?;
168166 }
169167 Ok ( ( ) )
170168}
@@ -178,9 +176,9 @@ unsafe fn i2c_smbus_access(
178176) -> Result < ( ) , I2CError > {
179177 let mut args = i2c_smbus_ioctl_data {
180178 read_write : read_write as u8 ,
181- command : command ,
179+ command,
182180 size : size as u32 ,
183- data : data ,
181+ data,
184182 } ;
185183
186184 // remove type information
@@ -189,9 +187,10 @@ unsafe fn i2c_smbus_access(
189187
190188#[ inline]
191189pub fn i2c_smbus_write_quick ( fd : RawFd , bit : bool ) -> Result < ( ) , I2CError > {
192- let read_write = match bit {
193- true => I2CSMBusReadWrite :: I2C_SMBUS_READ ,
194- false => I2CSMBusReadWrite :: I2C_SMBUS_WRITE ,
190+ let read_write = if bit {
191+ I2CSMBusReadWrite :: I2C_SMBUS_READ
192+ } else {
193+ I2CSMBusReadWrite :: I2C_SMBUS_WRITE
195194 } ;
196195 unsafe {
197196 i2c_smbus_access (
@@ -258,9 +257,8 @@ pub fn i2c_smbus_write_byte_data(fd: RawFd, register: u8, value: u8) -> Result<(
258257 register,
259258 I2CSMBusSize :: I2C_SMBUS_BYTE_DATA ,
260259 & mut data,
261- ) ? ;
260+ )
262261 }
263- Ok ( ( ) )
264262}
265263
266264#[ inline]
@@ -295,9 +293,8 @@ pub fn i2c_smbus_write_word_data(fd: RawFd, register: u8, value: u16) -> Result<
295293 register,
296294 I2CSMBusSize :: I2C_SMBUS_WORD_DATA ,
297295 & mut data,
298- ) ?;
299- } ;
300- Ok ( ( ) )
296+ )
297+ }
301298}
302299
303300#[ inline]
@@ -364,23 +361,30 @@ pub fn i2c_smbus_read_i2c_block_data(
364361}
365362
366363#[ inline]
367- pub fn i2c_smbus_write_block_data ( fd : RawFd , register : u8 , values : & [ u8 ] ) -> Result < ( ) , I2CError > {
364+ fn copy_to_i2c_block_data ( values : & [ u8 ] , max_size : usize ) -> i2c_smbus_data {
368365 let mut data = i2c_smbus_data:: empty ( ) ;
369- let len: usize = if values. len ( ) > 32 { 32 } else { values. len ( ) } ;
366+ let len: usize = if values. len ( ) > max_size {
367+ max_size
368+ } else {
369+ values. len ( )
370+ } ;
370371 data. block [ 0 ] = len as u8 ;
371- for i in 1 ..( len + 1 ) {
372- data. block [ i] = values[ i - 1 ] ;
373- }
372+ data. block [ 1 ..=len] . copy_from_slice ( & values[ ..len] ) ;
373+ data
374+ }
375+
376+ #[ inline]
377+ pub fn i2c_smbus_write_block_data ( fd : RawFd , register : u8 , values : & [ u8 ] ) -> Result < ( ) , I2CError > {
378+ let mut data = copy_to_i2c_block_data ( & values, 32 ) ;
374379 unsafe {
375380 i2c_smbus_access (
376381 fd,
377382 I2CSMBusReadWrite :: I2C_SMBUS_WRITE ,
378383 register,
379384 I2CSMBusSize :: I2C_SMBUS_BLOCK_DATA ,
380385 & mut data,
381- ) ? ;
386+ )
382387 }
383- Ok ( ( ) )
384388}
385389
386390#[ inline]
@@ -389,22 +393,16 @@ pub fn i2c_smbus_write_i2c_block_data(
389393 register : u8 ,
390394 values : & [ u8 ] ,
391395) -> Result < ( ) , I2CError > {
392- let mut data = i2c_smbus_data:: empty ( ) ;
393- let len: usize = if values. len ( ) > 32 { 32 } else { values. len ( ) } ;
394- data. block [ 0 ] = len as u8 ;
395- for i in 1 ..( len + 1 ) {
396- data. block [ i] = values[ i - 1 ] ;
397- }
396+ let mut data = copy_to_i2c_block_data ( & values, 32 ) ;
398397 unsafe {
399398 i2c_smbus_access (
400399 fd,
401400 I2CSMBusReadWrite :: I2C_SMBUS_WRITE ,
402401 register,
403402 I2CSMBusSize :: I2C_SMBUS_I2C_BLOCK_DATA ,
404403 & mut data,
405- ) ? ;
404+ )
406405 }
407- Ok ( ( ) )
408406}
409407
410408#[ inline]
@@ -413,12 +411,7 @@ pub fn i2c_smbus_process_call_block(
413411 register : u8 ,
414412 values : & [ u8 ] ,
415413) -> Result < Vec < u8 > , I2CError > {
416- let mut data = i2c_smbus_data:: empty ( ) ;
417- let len: usize = if values. len ( ) > 31 { 31 } else { values. len ( ) } ;
418- data. block [ 0 ] = len as u8 ;
419- for i in 1 ..( len + 1 ) {
420- data. block [ i] = values[ i - 1 ] ;
421- }
414+ let mut data = copy_to_i2c_block_data ( & values, 31 ) ;
422415 unsafe {
423416 i2c_smbus_access (
424417 fd,
0 commit comments