Uzair
Uzair

Reputation: 119

How to access GPIO from kernel space? (zynq-microzed board)

I am using zynq-microzed board and I want to access GPIO with kernel space.

Can anyone please tell me how can i attempt doing this?

Upvotes: 1

Views: 3184

Answers (2)

omotto
omotto

Reputation: 1879

Check the following link: enter link description here

Summarizing:

There is an include file for working with GPIOs:

#include <linux/gpio.h>

GPIOs must be allocated before use:

int gpio_request(unsigned int gpio, const char *label);

And GPIO can be returned to the system with:

void gpio_free(unsigned int gpio);

Configure GPIO as Input/Output:

int gpio_direction_input(unsigned int gpio);
int gpio_direction_output(unsigned int gpio, int value);

Operations:

int gpio_get_value(unsigned int gpio);
void gpio_set_value(unsigned int gpio, int value);

Regards.

Upvotes: 0

lenguador
lenguador

Reputation: 486

*NOTE: This is from the Zynq-7000. I believe it's largely the same.

Assuming you're using a devicetree, this is an example entry (in the devicetree):

gpio-device {
    compatible = "gpio-control";
    gpios = <&gpio0 54 0>; //(Add 32 to get the actual pin number. This is GPIO 86)
};

And you need to state in the driver that you're compatible with the devicetree entry (look at other drivers to see where to put this line):

.compatible = "gpio-control"

In your driver, include #include <linux/gpio.h> and read the pin from the devicetree:

struct device_node *np = pdev->dev.of_node;
int pin;

pin = of_get_gpio(np, 0);
if (pin < 0) {
    pr_err("failed to get GPIO from device tree\n");
    return -1;
}

Request the use of the GPIO:

int ret = gpio_request(pin, "Some name"); //Name it whatever you want

And set it's direction:

int ret = gpio_direction_output(pin, 0); //The second parameter is the initial value. 0 is low, 1 is high.

Afterwards, set the value like so:

gpio_set_value(pin, 1);

For input:

ret = gpio_direction_input(pin);
value = gpio_get_value(pin);

Free the GPIO when you're finished with it (including on error!):

gpio_free(pin);

At the end of the day, a good method is to grep around the kernel to find drivers that do what you want. In fact grep -r gpio <<kernel_source>> will tell you everything in this answer and more.

Upvotes: 1

Related Questions