From 7e9f1ffffbaf5b9dc7a044a546e53fa03b7e57e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20Jos=C3=A9=20Pereira?= Date: Wed, 27 Nov 2024 16:59:36 -0300 Subject: [PATCH 1/4] led: Move to use new gpio_cdev over sysfs_gpio MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Patrick José Pereira --- src/led.rs | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/src/led.rs b/src/led.rs index df435e31d..d249329e7 100644 --- a/src/led.rs +++ b/src/led.rs @@ -1,11 +1,11 @@ use std::{thread::sleep, time::Duration}; -use linux_embedded_hal::{sysfs_gpio::Direction, Pin}; +use linux_embedded_hal::gpio_cdev::{Chip, LineHandle, LineRequestFlags}; use crate::peripherals::{AnyHardware, LedBehaviour, PeripheralClass, PeripheralInfo, Peripherals}; pub struct LedController { - pub leds: Vec, + pub leds: Vec, pub info: PeripheralInfo, } @@ -26,7 +26,7 @@ impl AnyHardware for LedController { } pub struct LedControllerBuilder { - pub pins: Vec, + pub pins: Vec, pub info: PeripheralInfo, } @@ -42,7 +42,7 @@ impl LedControllerBuilder { } /// Adds a GPIO pin to control an LED. - pub fn add_led_pin(mut self, pin_number: u64) -> Self { + pub fn add_led_pin(mut self, pin_number: u32) -> Self { self.pins.push(pin_number); self } @@ -65,12 +65,18 @@ impl LedControllerBuilder { self = self.configure_navigator(); } + let mut chip = Chip::new("/dev/gpiochip0").unwrap(); for &pin_number in &self.pins { - let pin = Pin::new(pin_number); - pin.export().expect("Failed to export LED pin"); - sleep(Duration::from_millis(60)); - pin.set_direction(Direction::Out) - .expect("Failed to set direction"); + let pin = chip + .get_line(pin_number) + .unwrap() + .request( + LineRequestFlags::OUTPUT, + 1, + &format!("user-led-{pin_number}"), + ) + .expect("Failed to request LED pin"); + sleep(Duration::from_millis(30)); pin.set_value(1).expect("Failed to set initial LED value"); leds.push(pin); } From 61be79432fe56bfe4e492d7ae94207e54df7c840 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20Jos=C3=A9=20Pereira?= Date: Wed, 27 Nov 2024 17:48:40 -0300 Subject: [PATCH 2/4] pca9685: Move to use new gpio_cdev over sysfs_gpio MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Patrick José Pereira --- src/pca9685.rs | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/src/pca9685.rs b/src/pca9685.rs index a8b599765..130ba9988 100644 --- a/src/pca9685.rs +++ b/src/pca9685.rs @@ -1,13 +1,16 @@ use std::{error::Error, thread::sleep, time::Duration}; -use linux_embedded_hal::{sysfs_gpio::Direction, I2cdev, Pin}; +use linux_embedded_hal::{ + gpio_cdev::{Chip, LineHandle, LineRequestFlags}, + I2cdev, +}; use pwm_pca9685::{Address as PwmAddress, Channel, Pca9685}; use crate::peripherals::{AnyHardware, PeripheralClass, PeripheralInfo, Peripherals, PwmBehaviour}; pub struct Pca9685Device { pwm: Pca9685, - oe_pin: Pin, + oe_pin: LineHandle, info: PeripheralInfo, } @@ -30,7 +33,7 @@ impl AnyHardware for Pca9685Device { pub struct Pca9685DeviceBuilder { i2c_bus: String, address: PwmAddress, - oe_pin_number: u64, + oe_pin_number: u32, info: PeripheralInfo, } @@ -72,7 +75,7 @@ impl Pca9685DeviceBuilder { /// # Arguments /// /// * `pin_number` - The GPIO pin number for OE. - pub fn with_oe_pin(mut self, pin_number: u64) -> Self { + pub fn with_oe_pin(mut self, pin_number: u32) -> Self { self.oe_pin_number = pin_number; self } @@ -89,10 +92,14 @@ impl Pca9685DeviceBuilder { let mut pwm = Pca9685::new(device, self.address).expect("Failed to open PWM controller"); let oe_pin = { - let pin = Pin::new(self.oe_pin_number); - pin.export()?; - sleep(Duration::from_millis(60)); - pin.set_direction(Direction::High)?; + let mut chip = Chip::new("/dev/gpiochip0")?; + let pin = chip + .get_line(self.oe_pin_number) + .unwrap() + .request(LineRequestFlags::OUTPUT, 1, "oe-pin-pca9685") + .expect("Failed to request OE pin"); + sleep(Duration::from_millis(30)); + pin.set_value(1)?; pin }; @@ -110,12 +117,9 @@ impl Pca9685DeviceBuilder { impl PwmBehaviour for Pca9685Device { fn enable_output(&mut self, enable: bool) -> Result<(), Box> { - let value = if enable { - Direction::Low - } else { - Direction::High - }; // Active low OE pin - self.oe_pin.set_direction(value).unwrap(); + // Active low OE pin + let value = if enable { 0 } else { 1 }; + self.oe_pin.set_value(value).unwrap(); Ok(()) } From abf2ea78e0541755b63b7029b0e1484c77e40a95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20Jos=C3=A9=20Pereira?= Date: Thu, 28 Nov 2024 06:36:29 -0300 Subject: [PATCH 3/4] leak: Move to use new gpio_cdev over sysfs_gpio MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Patrick José Pereira --- src/leak.rs | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/src/leak.rs b/src/leak.rs index 5dbbee886..675fc9067 100644 --- a/src/leak.rs +++ b/src/leak.rs @@ -1,11 +1,11 @@ use std::{error::Error, thread::sleep, time::Duration}; -use linux_embedded_hal::sysfs_gpio::{Direction, Pin}; +use linux_embedded_hal::gpio_cdev::{Chip, LineHandle, LineRequestFlags}; use crate::peripherals::{AnyHardware, LeakSensor, PeripheralClass, PeripheralInfo, Peripherals}; pub struct LeakDetector { - pin: Pin, + pin: LineHandle, info: PeripheralInfo, } @@ -26,7 +26,7 @@ impl AnyHardware for LeakDetector { } pub struct LeakBuilder { - pin_number: u64, + pin_number: u32, info: PeripheralInfo, } @@ -46,7 +46,7 @@ impl LeakBuilder { /// # Arguments /// /// * `pin_number` - The GPIO pin number. - pub fn with_pin(mut self, pin_number: u64) -> Self { + pub fn with_pin(mut self, pin_number: u32) -> Self { self.pin_number = pin_number; self } @@ -57,10 +57,17 @@ impl LeakBuilder { } pub fn build(self) -> Result> { - let pin = Pin::new(self.pin_number); - pin.export()?; - sleep(Duration::from_millis(60)); - pin.set_direction(Direction::In)?; + let pin = { + let mut chip = Chip::new("/dev/gpiochip0")?; + let pin = chip + .get_line(self.pin_number) + .unwrap() + .request(LineRequestFlags::INPUT, 1, "pin-leak") + .expect("Failed to configure LEAK pin"); + sleep(Duration::from_millis(30)); + pin + }; + Ok(LeakDetector { pin, info: self.info, From 0b4742e30ec2a228670100d9d447b388f2e55ccc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20Jos=C3=A9=20Pereira?= Date: Sun, 8 Dec 2024 06:05:55 -0300 Subject: [PATCH 4/4] icm20689: Move to use new gpio_cdev over sysfs_gpio MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Patrick José Pereira --- src/icm20689.rs | 32 +++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/src/icm20689.rs b/src/icm20689.rs index 9492c0287..fed0434ad 100644 --- a/src/icm20689.rs +++ b/src/icm20689.rs @@ -1,16 +1,19 @@ -use std::error::Error; +use std::{error::Error, thread::sleep, time::Duration}; use icm20689::{self, Builder as ImuBuilder, SpiInterface, ICM20689}; use linux_embedded_hal::spidev::{SpiModeFlags, SpidevOptions}; -use linux_embedded_hal::sysfs_gpio::Direction; -use linux_embedded_hal::{Delay, Pin, Spidev}; +use linux_embedded_hal::{ + gpio_cdev::{Chip, LineRequestFlags}, + CdevPin, +}; +use linux_embedded_hal::{Delay, Spidev}; use crate::peripherals::{ AccelerometerSensor, AnyHardware, GyroscopeSensor, PeripheralClass, PeripheralInfo, Peripherals, }; pub struct Icm20689Device { - imu: ICM20689>, + imu: ICM20689>, info: PeripheralInfo, } @@ -36,7 +39,7 @@ impl AnyHardware for Icm20689Device { pub struct Icm20689Builder { spi_device: String, - cs_pin_number: u64, + cs_pin_number: u32, info: PeripheralInfo, } @@ -67,7 +70,7 @@ impl Icm20689Builder { /// # Arguments /// /// * `pin_number` - The SPI pin number (e.g., 16). - pub fn with_cs_pin(mut self, pin_number: u64) -> Self { + pub fn with_cs_pin(mut self, pin_number: u32) -> Self { self.cs_pin_number = pin_number; self } @@ -86,11 +89,18 @@ impl Icm20689Builder { .build(); spi.configure(&options)?; - let cs_pin = Pin::new(self.cs_pin_number); - cs_pin.export()?; - std::thread::sleep(std::time::Duration::from_millis(60)); - cs_pin.set_direction(Direction::Out)?; - cs_pin.set_value(1)?; + let cs_pin = { + let mut chip = Chip::new("/dev/gpiochip0").unwrap(); + let line = chip + .get_line(self.cs_pin_number) + .unwrap() + .request(LineRequestFlags::OUTPUT, 1, "cs-icm20689") + .expect("Failed to request CS pin"); + let pin = CdevPin::new(line)?; + sleep(Duration::from_millis(30)); + pin.set_value(1)?; + pin + }; let mut imu = ImuBuilder::new_spi(spi, cs_pin);