I am using a iMX93 QS93, In the device tree I configured the gpio as an input line as you can see below
gpio-keys {
compatible = "gpio-keys";
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_gpio_pmic>;
// nPBOUT Line Input
power_button_npbout {
label = "nPBOUT";
gpios = <&gpio2 18 GPIO_ACTIVE_LOW>;
linux,code = <KEY_RESTART>;
debounce-interval = <0>;
//interrupt-parent = <&gpio2>;
//interrupts = <18 IRQ_TYPE_EDGE_BOTH>;
};
};
And here the Pin Multiplexing configuration:
pinctrl_gpio_pmic: gpio_pmicgrp {
fsl,pins = <
MX93_PAD_GPIO_IO18__GPIO2_IO18 0x1c0
>;
};
I am building my image using yocto and after the successful build, I run the image in the target and tried to export the gpio by running `echo 50 > /sys/class/gpio/export`. The export fails with the error :
-bash: echo: write error: Device or resource busy
The `gpioinfo` shows this line under `gpiochip0 - 32lines:`
line 18: unnamed input active-low consumer=nPBOUT
The output of `cat /sys/kernel/debug/gpio` shows :
gpio-0 ( |scl ) out lo
gpio-1 ( |sda ) in lo
gpio-2 ( |scl ) out lo
gpio-3 ( |sda ) in lo
gpio-9 ( |PSHOLD ) out lo
gpiochip0: GPIOs 32-63, parent: platform/43810080.gpio, 43810080.gpio:
gpio-50 ( |nPBOUT ) in hi IRQ ACTIVE LOW
gpio-60 ( |sda ) in lo
gpio-61 ( |scl ) out lo
gpiochip1: GPIOs 64-95, parent: platform/43820080.gpio, 43820080.gpio:
gpiochip2: GPIOs 96-127, parent: platform/43830080.gpio, 43830080.gpio:
Am writing C++ code to interact with gpios, I wanted to test this input gpio by export it and read it value but I can't. Could anyone help me out to be able to read the value of the gpio (I am connecting the gpio pin to GND and 3.3V pins for testing)
I changed my device tree to use gpio-controller `insteag gpio-keys` and `gpio-leds`, like you see below
&gpio1 {
gpio-pwr_pshold {
line-name = "PWR_PSHOLD";
gpios = <&gpio1 9 GPIO_ACTIVE_HIGH>;
output-high;
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_gpio_pwr_pshold>;
};
};
&gpio2 {
gpio-pwr_pbout {
line-name = "PWR_PBOUT";
gpios = <&gpio2 18 GPIO_ACTIVE_LOW>;
input;
interrupts = <18 IRQ_TYPE_EDGE_BOTH>; // Generate an interrupt on both rising and falling edges
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_gpio_pwr_pbout>;
};
gpio-usr_pbout {
line-name = "USR_PBOUT";
gpios = <&gpio2 20 GPIO_ACTIVE_LOW>;
input;
interrupts = <20 IRQ_TYPE_EDGE_BOTH>; // Generate an interrupt on both edges
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_gpio_usr_pbout>;
};
};
gpioget gives me "pin" inactive.
I wanted to write a C++ code to control these pins: toggle value to output gpio, get value from input gpios and be able to watch the input lines because I want to detect from a button if it is long/short press etc.
I am trying to use libgpiod v2.0, but I can't find some examples for this purpose using libgpiod 2.0 or later.
Could anyone help me in this ?
HI @LAAZIBI!
You are declaring wrong your device tree please check the official documentation.
Best Regards!
Chavira