Skip to content

Commit a48b485

Browse files
authored
Merge pull request #39 from arcnmx/fix-block-methods
Fix block methods
2 parents 8641b2f + 4a70a79 commit a48b485

File tree

4 files changed

+44
-4
lines changed

4 files changed

+44
-4
lines changed

src/core.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,12 @@ pub trait I2CDevice {
102102
/// Comm byte. The amount of data is specified in the Count byte.
103103
fn smbus_write_block_data(&mut self, register: u8, values: &[u8]) -> Result<(), Self::Error>;
104104

105+
/// Write a block of up to 32 bytes from a device
106+
///
107+
/// Uses write_i2c_block_data instead write_block_data.
108+
fn smbus_write_i2c_block_data(&mut self, register: u8, values: &[u8]) -> Result<(), Self::Error>;
109+
105110
/// Select a register, send 1 to 31 bytes of data to it, and reads
106111
/// 1 to 31 bytes of data from it.
107-
fn smbus_process_block(&mut self, register: u8, values: &[u8]) -> Result<(), Self::Error>;
112+
fn smbus_process_block(&mut self, register: u8, values: &[u8]) -> Result<Vec<u8>, Self::Error>;
108113
}

src/ffi.rs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -403,3 +403,29 @@ pub fn i2c_smbus_write_i2c_block_data(fd: RawFd,
403403
});
404404
Ok(())
405405
}
406+
407+
#[inline]
408+
pub fn i2c_smbus_process_call_block(fd: RawFd, register: u8, values: &[u8]) -> Result<Vec<u8>, I2CError> {
409+
let mut data = i2c_smbus_data::empty();
410+
let len: usize = if values.len() > 31 {
411+
31
412+
} else {
413+
values.len()
414+
};
415+
data.block[0] = len as u8;
416+
for i in 1..(len + 1) {
417+
data.block[i] = values[i - 1];
418+
}
419+
try!(unsafe {
420+
i2c_smbus_access(fd,
421+
I2CSMBusReadWrite::I2C_SMBUS_WRITE,
422+
register,
423+
I2CSMBusSize::I2C_SMBUS_BLOCK_PROC_CALL,
424+
&mut data)
425+
});
426+
427+
// create a vector from the data in the block starting at byte
428+
// 1 and ending after count bytes after that
429+
let count = data.block[0];
430+
Ok((&data.block[1..(count + 1) as usize]).to_vec())
431+
}

src/linux.rs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -210,9 +210,14 @@ impl I2CDevice for LinuxI2CDevice {
210210
ffi::i2c_smbus_write_block_data(self.as_raw_fd(), register, values).map_err(From::from)
211211
}
212212

213+
/// Write a block of up to 32 bytes from a device via i2c_smbus_i2c_write_block_data
214+
fn smbus_write_i2c_block_data(&mut self, register: u8, values: &[u8]) -> Result<(), LinuxI2CError> {
215+
ffi::i2c_smbus_write_i2c_block_data(self.as_raw_fd(), register, values).map_err(From::from)
216+
}
217+
213218
/// Select a register, send 1 to 31 bytes of data to it, and reads
214219
/// 1 to 31 bytes of data from it.
215-
fn smbus_process_block(&mut self, register: u8, values: &[u8]) -> Result<(), LinuxI2CError> {
216-
ffi::i2c_smbus_write_i2c_block_data(self.as_raw_fd(), register, values).map_err(From::from)
220+
fn smbus_process_block(&mut self, register: u8, values: &[u8]) -> Result<Vec<u8>, LinuxI2CError> {
221+
ffi::i2c_smbus_process_call_block(self.as_raw_fd(), register, values).map_err(From::from)
217222
}
218223
}

src/mock.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,11 +88,15 @@ impl I2CDevice for MockI2CDevice {
8888
unimplemented!()
8989
}
9090

91-
fn smbus_process_block(&mut self, _register: u8, _values: &[u8]) -> I2CResult<()> {
91+
fn smbus_process_block(&mut self, _register: u8, _values: &[u8]) -> I2CResult<Vec<u8>> {
9292
unimplemented!()
9393
}
9494

9595
fn smbus_read_i2c_block_data(&mut self, _register: u8, _len: u8) -> I2CResult<Vec<u8>> {
9696
unimplemented!()
9797
}
98+
99+
fn smbus_write_i2c_block_data(&mut self, _register: u8, _values: &[u8]) -> I2CResult<()> {
100+
unimplemented!()
101+
}
98102
}

0 commit comments

Comments
 (0)