@@ -19,23 +19,23 @@ use byteorder::{NativeEndian, ReadBytesExt, WriteBytesExt};
1919pub type I2CError = nix:: Error ;
2020
2121bitflags ! {
22- flags I2CMsgFlags : u16 {
22+ struct I2CMsgFlags : u16 {
2323 /// this is a ten bit chip address
24- const I2C_M_TEN = 0x0010 ,
24+ const I2C_M_TEN = 0x0010 ;
2525 /// read data, from slave to master
26- const I2C_M_RD = 0x0001 ,
26+ const I2C_M_RD = 0x0001 ;
2727 /// if I2C_FUNC_PROTOCOL_MANGLING
28- const I2C_M_STOP = 0x8000 ,
28+ const I2C_M_STOP = 0x8000 ;
2929 /// if I2C_FUNC_NOSTART
30- const I2C_M_NOSTART = 0x4000 ,
30+ const I2C_M_NOSTART = 0x4000 ;
3131 /// if I2C_FUNC_PROTOCOL_MANGLING
32- const I2C_M_REV_DIR_ADDR = 0x2000 ,
32+ const I2C_M_REV_DIR_ADDR = 0x2000 ;
3333 /// if I2C_FUNC_PROTOCOL_MANGLING
34- const I2C_M_IGNORE_NAK = 0x1000 ,
34+ const I2C_M_IGNORE_NAK = 0x1000 ;
3535 /// if I2C_FUNC_PROTOCOL_MANGLING
36- const I2C_M_NO_RD_ACK = 0x0800 ,
36+ const I2C_M_NO_RD_ACK = 0x0800 ;
3737 /// length will be first received byte
38- const I2C_M_RECV_LEN = 0x0400 ,
38+ const I2C_M_RECV_LEN = 0x0400 ;
3939 }
4040}
4141
@@ -52,44 +52,44 @@ struct i2c_msg {
5252}
5353
5454bitflags ! {
55- flags I2CFunctions : u32 {
56- const I2C_FUNC_I2C = 0x00000001 ,
57- const I2C_FUNC_10BIT_ADDR = 0x00000002 ,
58- const I2C_FUNC_PROTOCOL_MANGLING = 0x00000004 , /* I2C_M_IGNORE_NAK etc. */
59- const I2C_FUNC_SMBUS_PEC = 0x00000008 ,
60- const I2C_FUNC_NOSTART = 0x00000010 , /* I2C_M_NOSTART */
61- const I2C_FUNC_SMBUS_BLOCK_PROC_CALL = 0x00008000 , /* SMBus 2.0 */
62- const I2C_FUNC_SMBUS_QUICK = 0x00010000 ,
63- const I2C_FUNC_SMBUS_READ_BYTE = 0x00020000 ,
64- const I2C_FUNC_SMBUS_WRITE_BYTE = 0x00040000 ,
65- const I2C_FUNC_SMBUS_READ_BYTE_DATA = 0x00080000 ,
66- const I2C_FUNC_SMBUS_WRITE_BYTE_DATA = 0x00100000 ,
67- const I2C_FUNC_SMBUS_READ_WORD_DATA = 0x00200000 ,
68- const I2C_FUNC_SMBUS_WRITE_WORD_DATA = 0x00400000 ,
69- const I2C_FUNC_SMBUS_PROC_CALL = 0x00800000 ,
70- const I2C_FUNC_SMBUS_READ_BLOCK_DATA = 0x01000000 ,
71- const I2C_FUNC_SMBUS_WRITE_BLOCK_DATA = 0x02000000 ,
72- const I2C_FUNC_SMBUS_READ_I2C_BLOCK = 0x04000000 , /* I2C-like block xfer */
73- const I2C_FUNC_SMBUS_WRITE_I2C_BLOCK = 0x08000000 , /* w/ 1-byte reg. addr. */
74-
75- const I2C_FUNC_SMBUS_BYTE = ( I2C_FUNC_SMBUS_READ_BYTE . bits |
76- I2C_FUNC_SMBUS_WRITE_BYTE . bits) ,
77- const I2C_FUNC_SMBUS_BYTE_DATA = ( I2C_FUNC_SMBUS_READ_BYTE_DATA . bits |
78- I2C_FUNC_SMBUS_WRITE_BYTE_DATA . bits) ,
79- const I2C_FUNC_SMBUS_WORD_DATA = ( I2C_FUNC_SMBUS_READ_WORD_DATA . bits |
80- I2C_FUNC_SMBUS_WRITE_WORD_DATA . bits) ,
81- const I2C_FUNC_SMBUS_BLOCK_DATA = ( I2C_FUNC_SMBUS_READ_BLOCK_DATA . bits |
82- I2C_FUNC_SMBUS_WRITE_BLOCK_DATA . bits) ,
83- const I2C_FUNC_SMBUS_I2C_BLOCK = ( I2C_FUNC_SMBUS_READ_I2C_BLOCK . bits |
84- I2C_FUNC_SMBUS_WRITE_I2C_BLOCK . bits) ,
85- const I2C_FUNC_SMBUS_EMUL = ( I2C_FUNC_SMBUS_QUICK . bits |
86- I2C_FUNC_SMBUS_BYTE . bits |
87- I2C_FUNC_SMBUS_BYTE_DATA . bits |
88- I2C_FUNC_SMBUS_WORD_DATA . bits |
89- I2C_FUNC_SMBUS_PROC_CALL . bits |
90- I2C_FUNC_SMBUS_WRITE_BLOCK_DATA . bits |
91- I2C_FUNC_SMBUS_I2C_BLOCK . bits |
92- I2C_FUNC_SMBUS_PEC . bits) ,
55+ struct I2CFunctions : u32 {
56+ const I2C_FUNC_I2C = 0x00000001 ;
57+ const I2C_FUNC_10BIT_ADDR = 0x00000002 ;
58+ const I2C_FUNC_PROTOCOL_MANGLING = 0x00000004 ; /* I2C_M_IGNORE_NAK etc. */
59+ const I2C_FUNC_SMBUS_PEC = 0x00000008 ;
60+ const I2C_FUNC_NOSTART = 0x00000010 ; /* I2C_M_NOSTART */
61+ const I2C_FUNC_SMBUS_BLOCK_PROC_CALL = 0x00008000 ; /* SMBus 2.0 */
62+ const I2C_FUNC_SMBUS_QUICK = 0x00010000 ;
63+ const I2C_FUNC_SMBUS_READ_BYTE = 0x00020000 ;
64+ const I2C_FUNC_SMBUS_WRITE_BYTE = 0x00040000 ;
65+ const I2C_FUNC_SMBUS_READ_BYTE_DATA = 0x00080000 ;
66+ const I2C_FUNC_SMBUS_WRITE_BYTE_DATA = 0x00100000 ;
67+ const I2C_FUNC_SMBUS_READ_WORD_DATA = 0x00200000 ;
68+ const I2C_FUNC_SMBUS_WRITE_WORD_DATA = 0x00400000 ;
69+ const I2C_FUNC_SMBUS_PROC_CALL = 0x00800000 ;
70+ const I2C_FUNC_SMBUS_READ_BLOCK_DATA = 0x01000000 ;
71+ const I2C_FUNC_SMBUS_WRITE_BLOCK_DATA = 0x02000000 ;
72+ const I2C_FUNC_SMBUS_READ_I2C_BLOCK = 0x04000000 ; /* I2C-like block xfer */
73+ const I2C_FUNC_SMBUS_WRITE_I2C_BLOCK = 0x08000000 ; /* w/ 1-byte reg. addr. */
74+
75+ const I2C_FUNC_SMBUS_BYTE = ( I2CFunctions :: I2C_FUNC_SMBUS_READ_BYTE . bits |
76+ I2CFunctions :: I2C_FUNC_SMBUS_WRITE_BYTE . bits) ;
77+ const I2C_FUNC_SMBUS_BYTE_DATA = ( I2CFunctions :: I2C_FUNC_SMBUS_READ_BYTE_DATA . bits |
78+ I2CFunctions :: I2C_FUNC_SMBUS_WRITE_BYTE_DATA . bits) ;
79+ const I2C_FUNC_SMBUS_WORD_DATA = ( I2CFunctions :: I2C_FUNC_SMBUS_READ_WORD_DATA . bits |
80+ I2CFunctions :: I2C_FUNC_SMBUS_WRITE_WORD_DATA . bits) ;
81+ const I2C_FUNC_SMBUS_BLOCK_DATA = ( I2CFunctions :: I2C_FUNC_SMBUS_READ_BLOCK_DATA . bits |
82+ I2CFunctions :: I2C_FUNC_SMBUS_WRITE_BLOCK_DATA . bits) ;
83+ const I2C_FUNC_SMBUS_I2C_BLOCK = ( I2CFunctions :: I2C_FUNC_SMBUS_READ_I2C_BLOCK . bits |
84+ I2CFunctions :: I2C_FUNC_SMBUS_WRITE_I2C_BLOCK . bits) ;
85+ const I2C_FUNC_SMBUS_EMUL = ( I2CFunctions :: I2C_FUNC_SMBUS_QUICK . bits |
86+ I2CFunctions :: I2C_FUNC_SMBUS_BYTE . bits |
87+ I2CFunctions :: I2C_FUNC_SMBUS_BYTE_DATA . bits |
88+ I2CFunctions :: I2C_FUNC_SMBUS_WORD_DATA . bits |
89+ I2CFunctions :: I2C_FUNC_SMBUS_PROC_CALL . bits |
90+ I2CFunctions :: I2C_FUNC_SMBUS_WRITE_BLOCK_DATA . bits |
91+ I2CFunctions :: I2C_FUNC_SMBUS_I2C_BLOCK . bits |
92+ I2CFunctions :: I2C_FUNC_SMBUS_PEC . bits) ;
9393 }
9494}
9595
@@ -151,7 +151,7 @@ const I2C_RDRW_IOCTL_MAX_MSGS: u8 = 42;
151151
152152/// This is the structure as used in the I2C_SMBUS ioctl call
153153#[ repr( C ) ]
154- struct i2c_smbus_ioctl_data {
154+ pub struct i2c_smbus_ioctl_data {
155155 // __u8 read_write;
156156 read_write : u8 ,
157157 // __u8 command;
@@ -171,15 +171,18 @@ struct i2c_rdwr_ioctl_data {
171171 nmsgs : u32 ,
172172}
173173
174- ioctl ! ( bad ioctl_set_i2c_slave_address with I2C_SLAVE ) ;
175- ioctl ! ( bad ioctl_i2c_smbus with I2C_SMBUS ) ;
174+ mod ioctl {
175+ use super :: { I2C_SLAVE , I2C_SMBUS } ;
176+ pub use super :: i2c_smbus_ioctl_data;
177+
178+ ioctl ! ( bad write_int set_i2c_slave_address with I2C_SLAVE ) ;
179+ ioctl ! ( bad write_ptr i2c_smbus with I2C_SMBUS ; i2c_smbus_ioctl_data) ;
180+ }
181+
176182
177183pub fn i2c_set_slave_address ( fd : RawFd , slave_address : u16 ) -> Result < ( ) , nix:: Error > {
178184 try!( unsafe {
179- // NOTE: the generated ioctl call expected as pointer to a u8 but
180- // we just want to provide the u8 directly, so we just cast to a pointer.
181- // This is correct behavior.
182- ioctl_set_i2c_slave_address ( fd, slave_address as * mut u8 )
185+ ioctl:: set_i2c_slave_address ( fd, slave_address as i32 )
183186 } ) ;
184187 Ok ( ( ) )
185188}
@@ -198,8 +201,7 @@ unsafe fn i2c_smbus_access(fd: RawFd,
198201 } ;
199202
200203 // remove type information
201- let p_args: * mut u8 = mem:: transmute ( & mut args) ;
202- ioctl_i2c_smbus ( fd, p_args) . map ( drop)
204+ ioctl:: i2c_smbus ( fd, & mut args) . map ( drop)
203205}
204206
205207#[ inline]
0 commit comments