Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Named GPIOs in DeviceTree

I am trying to create a device tree for an embedded system, and would like to expose a few GPIOs to userspace. These are not and should not be used by kernel drivers. For instance, there is a USB device soldered to the board that is controlled by a user-space driver. It has a GPIO reset line, which the userspace library needs to access.

I would like these to be exposed by name in sysfs somewhere so that userspace can access /sys/class/gpio/usbreset instead of needing to know the magic gpio number and needing to specifically "export" it. I have tried setting it up as a GPIO hog, which initializes the GPIO, but its name does not appear in sysfs, and the gpio cannot be exported when it is hogged. I know that I can pick another kernel driver type such as LED, but it is not an LED, and this does not seem very clean to me.

What is the right way to export a named GPIO in sysfs?

like image 833
FazJaxton Avatar asked Apr 22 '16 20:04

FazJaxton


2 Answers

You can use the "gpio-leds" type in the devtree. Make sure you have CONFIG_LEDS_GPIO in your kernel. Set up your devtree as described in Documentation/devicetree/bindings/leds/leds-gpio.txt. I know, it says "LED", but the driver just wiggles the GPIO, and doesn't care what's hooked up to it.

Example devtree entry (copied from the docs):

run-control {
        compatible = "gpio-leds";
        red {
                gpios = <&mpc8572 6 GPIO_ACTIVE_HIGH>;
                default-state = "off";
        };
        green {
                gpios = <&mpc8572 7 GPIO_ACTIVE_HIGH>;
                default-state = "on";
        };
};

Those entries will be accessible by name in sysfs, and you can manipulate them from userspace there.

like image 58
Jonah Avatar answered Oct 22 '22 17:10

Jonah


I propose writing a simple kernel module to ask for the GPIO and then exporting a link, the link can be named and hence suitable for your request.

https://www.kernel.org/doc/Documentation/gpio/sysfs.txt

from the link above:

After the GPIO has been exported, gpiod_export_link() allows creating symlinks from elsewhere in sysfs to the GPIO sysfs node. Drivers can use this to provide the interface under their own device in sysfs with a descriptive name

like image 24
Omer Dagan Avatar answered Oct 01 '22 19:10

Omer Dagan