【问题标题】:How to access GPIO from kernel space? (zynq-microzed board)如何从内核空间访问 GPIO? (zynq-microized 板)
【发布时间】:2017-01-17 23:53:26
【问题描述】:

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

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

【问题讨论】:

  • 这取决于硬件。请描述您的硬件。
  • @ken,我有 zynq-microzed board (ARM)。
  • 你需要检查你的内核版本和arch/platform/board是否符合Linux对GPIO的约定。请参阅lxr.free-electrons.com/source/Documentation/gpio.txt?v=3.0 例如 Atmel ARM 有 at91_gpio 例程,然后在以后的 3.x 内核中切换到使用通用 gpio 例程。

标签: linux-kernel linux-device-driver zynq


【解决方案1】:

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

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

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

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

.compatible = "gpio-control"

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

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 &lt;&lt;kernel_source&gt;&gt; 会在这个答案中告诉你一切等等。

【讨论】:

    【解决方案2】:

    查看以下链接:enter link description here

    总结:

    有一个用于处理 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);
    

    问候。

    【讨论】:

      猜你喜欢
      • 2012-02-08
      • 1970-01-01
      • 1970-01-01
      • 2012-05-17
      • 2018-01-01
      • 2013-01-21
      • 1970-01-01
      • 1970-01-01
      • 2014-04-27
      相关资源
      最近更新 更多