From 4f02678b73a09b9095c8368f13fb99201de516dd Mon Sep 17 00:00:00 2001 From: Ole-Jeger Hoffstuen Date: Fri, 3 May 2024 09:27:52 +0200 Subject: [PATCH 1/5] Prototype implementation. Seems to work on raspberry pi 5 with software i2c. --- src/linux.rs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/linux.rs b/src/linux.rs index 4e855037..c7555387 100644 --- a/src/linux.rs +++ b/src/linux.rs @@ -300,8 +300,17 @@ impl<'a> I2CTransfer<'a> for LinuxI2CDevice { /// Issue the provided sequence of I2C transactions fn transfer(&mut self, messages: &'a mut [Self::Message]) -> Result { + let msg_type = |flag: u16| flag & I2CMessageFlags::READ.bits(); + let mut prev_msg_type = !msg_type(messages[0].flags); for msg in messages.iter_mut() { msg.addr = self.slave_address; + + let cur_msg_type = msg_type(msg.flags); + if prev_msg_type == cur_msg_type { + msg.flags |= I2CMessageFlags::NO_START.bits(); + } else { + prev_msg_type = cur_msg_type; + } } ffi::i2c_rdwr(self.as_raw_fd(), messages).map_err(From::from) } From 65feddc3c1848c0827d9a1240249075b480674dc Mon Sep 17 00:00:00 2001 From: Ole-Jeger Hoffstuen Date: Tue, 7 May 2024 10:36:23 +0200 Subject: [PATCH 2/5] Updated msg_type to be more readable --- src/linux.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/linux.rs b/src/linux.rs index c7555387..ae2bfba3 100644 --- a/src/linux.rs +++ b/src/linux.rs @@ -301,15 +301,15 @@ impl<'a> I2CTransfer<'a> for LinuxI2CDevice { /// Issue the provided sequence of I2C transactions fn transfer(&mut self, messages: &'a mut [Self::Message]) -> Result { let msg_type = |flag: u16| flag & I2CMessageFlags::READ.bits(); - let mut prev_msg_type = !msg_type(messages[0].flags); + let mut prev_msg_type = messages.first().map(|m| msg_type(m.flags)); for msg in messages.iter_mut() { msg.addr = self.slave_address; let cur_msg_type = msg_type(msg.flags); - if prev_msg_type == cur_msg_type { + if prev_msg_type.is_some_and(|prev| prev == cur_msg_type) { msg.flags |= I2CMessageFlags::NO_START.bits(); } else { - prev_msg_type = cur_msg_type; + prev_msg_type = Some(cur_msg_type); } } ffi::i2c_rdwr(self.as_raw_fd(), messages).map_err(From::from) From 57bd54c9942804583f687b45d5e1952ebc553e7c Mon Sep 17 00:00:00 2001 From: Ole-Jeger Hoffstuen Date: Tue, 7 May 2024 15:16:55 +0200 Subject: [PATCH 3/5] I must not have been thinking straight when comitting that last one --- src/linux.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/linux.rs b/src/linux.rs index ae2bfba3..a84fd265 100644 --- a/src/linux.rs +++ b/src/linux.rs @@ -301,7 +301,7 @@ impl<'a> I2CTransfer<'a> for LinuxI2CDevice { /// Issue the provided sequence of I2C transactions fn transfer(&mut self, messages: &'a mut [Self::Message]) -> Result { let msg_type = |flag: u16| flag & I2CMessageFlags::READ.bits(); - let mut prev_msg_type = messages.first().map(|m| msg_type(m.flags)); + let mut prev_msg_type = None; for msg in messages.iter_mut() { msg.addr = self.slave_address; From 636d056004d09e1b62b714fa42bb2122f3fbdac7 Mon Sep 17 00:00:00 2001 From: Ole-Jeger Hoffstuen <2663525+ohunter@users.noreply.github.com> Date: Tue, 7 May 2024 16:00:22 +0200 Subject: [PATCH 4/5] fixed support MSRV for 1.65.0 Co-authored-by: Nick Stevens --- src/linux.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/linux.rs b/src/linux.rs index a84fd265..5f253909 100644 --- a/src/linux.rs +++ b/src/linux.rs @@ -306,7 +306,7 @@ impl<'a> I2CTransfer<'a> for LinuxI2CDevice { msg.addr = self.slave_address; let cur_msg_type = msg_type(msg.flags); - if prev_msg_type.is_some_and(|prev| prev == cur_msg_type) { + if prev_msg_type.map(|prev| prev == cur_msg_type).unwrap_or_default() { msg.flags |= I2CMessageFlags::NO_START.bits(); } else { prev_msg_type = Some(cur_msg_type); From 1f391497e707a2d62d33a41e58cd93d604fe1c18 Mon Sep 17 00:00:00 2001 From: Ole-Jeger Hoffstuen Date: Wed, 8 May 2024 10:25:21 +0200 Subject: [PATCH 5/5] fixed formatting issues --- src/linux.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/linux.rs b/src/linux.rs index 5f253909..1c68be37 100644 --- a/src/linux.rs +++ b/src/linux.rs @@ -306,7 +306,10 @@ impl<'a> I2CTransfer<'a> for LinuxI2CDevice { msg.addr = self.slave_address; let cur_msg_type = msg_type(msg.flags); - if prev_msg_type.map(|prev| prev == cur_msg_type).unwrap_or_default() { + if prev_msg_type + .map(|prev| prev == cur_msg_type) + .unwrap_or_default() + { msg.flags |= I2CMessageFlags::NO_START.bits(); } else { prev_msg_type = Some(cur_msg_type);