1

我正在使用zynq-microzed板,我想GPIO访问kernel space.

谁能告诉我我该如何尝试这样做?

4

2 回答 2

1

*注意:这是来自 Zynq-7000。我相信大体上是一样的。

假设您使用的是设备树,这是一个示例条目(在设备树中):

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

并且您需要在驱动程序中声明您与 devicetree 条目兼容(查看其他驱动程序以查看该行的放置位置):

.compatible = "gpio-control"

在您的驱动程序中,包含#include <linux/gpio.h>并从设备树中读取引脚:

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;
}

请求使用 GPIO:

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

并设定它的方向:

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

然后,像这样设置值:

gpio_set_value(pin, 1);

对于输入:

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

完成后释放 GPIO(包括出错时!):

gpio_free(pin);

归根结底,一个好方法是grep围绕内核查找执行所需操作的驱动程序。事实上grep -r gpio <<kernel_source>>,这个答案会告诉你一切等等。

于 2015-07-16T12:12:36.647 回答
0

检查以下链接:在此处输入链接描述

总结:

有一个使用 GPIO 的包含文件:

#include <linux/gpio.h>

GPIO 必须在使用前分配:

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

GPIO 可以通过以下方式返回到系统:

void gpio_free(unsigned int gpio);

将 GPIO 配置为输入/输出:

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

操作:

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

问候。

于 2017-01-17T15:53:26.350 回答