从内核空间访问GPIO

时间:2012-01-12 08:54:46

标签: linux-kernel linux-device-driver

在尝试编写一个简单的char设备驱动程序之后,我现在希望编写一个char设备驱动程序来访问嵌入式Linux板上的GPIO引脚,例如Beagleboard。我有兴趣编写一个模块"mygpiomodule",它在加载时必须出现在/dev/mygpiomodule中,以便从用户空间读取,写入访问GPIO。我不希望从用户空间访问GPIO。我想这是我第一次尝试编写一个可以与某些外设接口的模块。我想将一些LED粘在端口上并尝试打开或关闭它们。

我该如何尝试这样做?

感谢
米尔

3 个答案:

答案 0 :(得分:5)

幸运的是,编写Linux驱动程序并不是太复杂,尽管在这个论坛中可以教授的内容有点多。然而,好消息是网上有很多资源可以很好地解释你想要做什么。以下是我使用的几个(甚至用​​于制作GPIO / LED控制驱动程序),它们确实提供了可用的源代码,可以作为驱动程序的基础。

Free Software Magazine article

Linux Documentation Project article

O'Reilly Linux Drivers book

Linux Journal article

Linux的“TinkerToy”特性提供了很大的灵活性。例如,您可以考虑将驱动程序附加到“/ proc”文件系统(使用create_proc_entry()API),这样您就可以通过“echo YOU​​RSTRING> /”来访问驱动程序而无需编写专用应用程序。 proc / mygpiomodule“你的驱动程序的字符串。要从驱动程序中读取,请使用“cat / proc / mygpiomodule”。上面的链接也包括这样做的例子。如果您需要,可以通过启动脚本测试和访问驱动程序。

请花点时间查看我上面列出的文章/书籍,如果需要,还可以查看Google。继续潜入,然后编译并运行一些示例,你会很快加快速度。

答案 1 :(得分:4)

Linux内核允许你玩"播放"很容易使用GPIO。

有一个用于处理GPIO的包含文件:

#include <linux/gpio.h>

必须在使用前分配GPIO,但当前实施不会强制执行此要求。基本分配功能是:

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

gpio参数指示需要哪个GPIO,而label将字符串与之关联,以后可以在sysfs中显示。通常的惯例适用:零返回代码表示成功;否则返回值将为负错误号。可以使用以下命令将GPIO返回到系统:

void gpio_free(unsigned int gpio);

某些GPIO用于输出,其他GPIO用于输入。可以在任一模式下使用适当接线的GPIO,但在任何给定时间只有一个方向有效。内核代码必须告知GPIO内核如何使用线路;用这些功能完成:

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

在任何一种情况下,gpio都是GPIO号。在输出情况下,还必须指定GPIO的值(零或一); GPIO将作为通话的一部分进行相应设置。对于这两个函数,返回值也是零或负的错误号。 (适当能力)GPIO的方向可以随时更改。

对于输入GPIO,可以使用以下内容读取当前值:

int gpio_get_value(unsigned int gpio);

此函数返回提供的gpio的值;它没有提供返回错误代码的规定。假设(几乎在所有情况下都是正确的)在调用gpio_direction_input()时会发现任何错误,因此检查该函数的返回值很重要。

设置输出GPIO的值总是可以使用gpio_direction_output()来完成,但是,如果已知GPIO已经处于输出模式,gpio_set_value()可能会更高效:

void gpio_set_value(unsigned int gpio, int value);

有关详细信息,请访问以下链接:enter link description here

答案 2 :(得分:0)

如果您只想从内核驱动程序切换一些GPIO位,那么您可能不希望使用用户'omotto'提到的gpio_xxx API,因为这主要是为了让其他驱动程序能够访问GPIO名称,以及提供对用户空间的访问权限。 davroslyrad的快速解决方案更适合您。

相关问题