试图编写简单的字符设备驱动程序后,我现在希望编写一个字符设备驱动程序来访问嵌入式Linux板(如Beagleboard)上的GPIO引脚。我有兴趣编写一个模块"mygpiomodule"
,它在加载时必须出现在/dev/mygpiomodule
中,以便从用户空间读取,写入访问GPIO。我不希望从用户空间访问GPIO。我想这样做是因为我第一次尝试编写可以与某些外设进行交互的模块。我想将一些LED插入端口并试图打开或关闭它们。从内核空间进行GPIO访问
我该如何尝试这样做?
感谢
米尔
试图编写简单的字符设备驱动程序后,我现在希望编写一个字符设备驱动程序来访问嵌入式Linux板(如Beagleboard)上的GPIO引脚。我有兴趣编写一个模块"mygpiomodule"
,它在加载时必须出现在/dev/mygpiomodule
中,以便从用户空间读取,写入访问GPIO。我不希望从用户空间访问GPIO。我想这样做是因为我第一次尝试编写可以与某些外设进行交互的模块。我想将一些LED插入端口并试图打开或关闭它们。从内核空间进行GPIO访问
我该如何尝试这样做?
感谢
米尔
幸运编写的Linux驱动程序是不是过于复杂,虽然有点多,可这个论坛内授课。然而好消息是,网络上有很多可用的资源可以很好地解释你想要做的事情。这里只是我用过的几个(甚至是制作GPIO/LED控制驱动程序),它们确实提供了可用的源代码,并且可以用作驱动程序的基础。
Free Software Magazine article
Linux Documentation Project article
的Linux非常 “TinkerToy” 性质提供了很大的灵活性。例如,你可以考虑让你的驱动程序也连接到“/ proc”文件系统(使用create_proc_entry()API),这样你就可以访问你的驱动程序,而无需通过简单的“echo YOURSTRING>/proc/mygpiomodule“字符串到您的驱动程序。从驱动程序读取将使用“猫/ proc/mygpiomodule”。上面的链接还包括这样做的例子。这可以帮助您进行测试,并在需要时通过启动脚本访问您的驱动程序。
需要一些时间来审查我上面列出的文章/书籍,当然谷歌更多,如果你需要。继续前进,编译并运行一些示例,然后您将快速加速。
Linux内核允许您轻松“玩”GPIO。
有一个包含文件与工作的GPIO:
#include <linux/gpio.h>
的GPIO必须在使用前,虽然目前的实现并不强制这个要求进行分配。基本配置功能是:
int gpio_request(unsigned int gpio, const char *label);
的GPIO参数指示GPIO是必需的,而标签关联与它一个字符串,以后可以出现在sysfs。通常的惯例适用:零返回代码表示成功;否则返回值将是一个负的错误号。一个GPIO可以返回到系统:
void gpio_free(unsigned int 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
如果你只想从一个内核驱动切换几个GPIO位,那么你可能不希望使用用户omotto“中提到的gpio_xxx的API,因为意主要是为了允许其他驱动程序通过名称访问GPIO,并提供对用户空间的访问。 davroslyrad的快速和肮脏的解决方案将更适合你。