Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux kernel 如何从内核空间访问GPIO?(zynq微型板)_Linux Kernel_Linux Device Driver_Zynq - Fatal编程技术网

Linux kernel 如何从内核空间访问GPIO?(zynq微型板)

Linux kernel 如何从内核空间访问GPIO?(zynq微型板),linux-kernel,linux-device-driver,zynq,Linux Kernel,Linux Device Driver,Zynq,我正在使用zynq microzedboard,我想用内核空间访问GPIO。 有人能告诉我怎么做吗?*注意:这是Zynq-7000的。我相信基本上是一样的 假设您正在使用devicetree,这是一个示例条目(在devicetree中): 在驱动程序中,包括#包括,并从设备树读取pin码: gpio-device { compatible = "gpio-control"; gpios = <&gpio0 54 0>; //(Add 32 to get the

我正在使用
zynq microzed
board,我想用
内核空间访问
GPIO


有人能告诉我怎么做吗?

*注意:这是Zynq-7000的。我相信基本上是一样的

假设您正在使用devicetree,这是一个示例条目(在devicetree中):

在驱动程序中,包括
#包括
,并从设备树读取pin码:

gpio-device {
    compatible = "gpio-control";
    gpios = <&gpio0 54 0>; //(Add 32 to get the actual pin number. This is GPIO 86)
};
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;
}
并设置它的方向:

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后释放它(包括出错时!):


一天结束时,一个好的方法是围绕内核
grep
,找到做你想做的事情的驱动程序。事实上,
grep-r gpio
将告诉您这个答案中的所有内容以及更多内容。

检查以下链接:

总结:

有一个用于使用GPIOs的包含文件:

#include <linux/gpio.h>
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);

注意。

这取决于硬件。请描述您的硬件。@ken,我有zynq microzed board(ARM)。您需要检查您的内核版本和arch/platform/board是否符合GPIO的Linux约定。例如,Atmel ARM拥有AT91GPIO例程,然后在后来的3.x内核中切换到使用通用gpio例程。
int gpio_request(unsigned int gpio, const char *label);
void gpio_free(unsigned int 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);