@@ -19,23 +19,23 @@ use byteorder::{NativeEndian, ReadBytesExt, WriteBytesExt};
19
19
pub type I2CError = nix:: Error ;
20
20
21
21
bitflags ! {
22
- flags I2CMsgFlags : u16 {
22
+ struct I2CMsgFlags : u16 {
23
23
/// this is a ten bit chip address
24
- const I2C_M_TEN = 0x0010 ,
24
+ const I2C_M_TEN = 0x0010 ;
25
25
/// read data, from slave to master
26
- const I2C_M_RD = 0x0001 ,
26
+ const I2C_M_RD = 0x0001 ;
27
27
/// if I2C_FUNC_PROTOCOL_MANGLING
28
- const I2C_M_STOP = 0x8000 ,
28
+ const I2C_M_STOP = 0x8000 ;
29
29
/// if I2C_FUNC_NOSTART
30
- const I2C_M_NOSTART = 0x4000 ,
30
+ const I2C_M_NOSTART = 0x4000 ;
31
31
/// if I2C_FUNC_PROTOCOL_MANGLING
32
- const I2C_M_REV_DIR_ADDR = 0x2000 ,
32
+ const I2C_M_REV_DIR_ADDR = 0x2000 ;
33
33
/// if I2C_FUNC_PROTOCOL_MANGLING
34
- const I2C_M_IGNORE_NAK = 0x1000 ,
34
+ const I2C_M_IGNORE_NAK = 0x1000 ;
35
35
/// if I2C_FUNC_PROTOCOL_MANGLING
36
- const I2C_M_NO_RD_ACK = 0x0800 ,
36
+ const I2C_M_NO_RD_ACK = 0x0800 ;
37
37
/// length will be first received byte
38
- const I2C_M_RECV_LEN = 0x0400 ,
38
+ const I2C_M_RECV_LEN = 0x0400 ;
39
39
}
40
40
}
41
41
@@ -52,44 +52,44 @@ struct i2c_msg {
52
52
}
53
53
54
54
bitflags ! {
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) ;
93
93
}
94
94
}
95
95
@@ -151,7 +151,7 @@ const I2C_RDRW_IOCTL_MAX_MSGS: u8 = 42;
151
151
152
152
/// This is the structure as used in the I2C_SMBUS ioctl call
153
153
#[ repr( C ) ]
154
- struct i2c_smbus_ioctl_data {
154
+ pub struct i2c_smbus_ioctl_data {
155
155
// __u8 read_write;
156
156
read_write : u8 ,
157
157
// __u8 command;
@@ -171,15 +171,18 @@ struct i2c_rdwr_ioctl_data {
171
171
nmsgs : u32 ,
172
172
}
173
173
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
+
176
182
177
183
pub fn i2c_set_slave_address ( fd : RawFd , slave_address : u16 ) -> Result < ( ) , nix:: Error > {
178
184
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 )
183
186
} ) ;
184
187
Ok ( ( ) )
185
188
}
@@ -198,8 +201,7 @@ unsafe fn i2c_smbus_access(fd: RawFd,
198
201
} ;
199
202
200
203
// 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)
203
205
}
204
206
205
207
#[ inline]
0 commit comments