【问题标题】:GPIO access from kernel space从内核空间访问 GPIO
【发布时间】:2012-02-08 13:52:08
【问题描述】:

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

我应该如何尝试这样做?

谢谢
米尔

【问题讨论】:

    标签: linux-kernel linux-device-driver


    【解决方案1】:

    幸运的是,编写 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 搜索更多内容。继续深入研究,编译并运行一些示例,您将很快上手。

    【讨论】:

      【解决方案2】:

      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 内核如何使用一条线;这是通过这些功能完成的:

      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_direction_output() 设置输出 GPIO 的值,但是,如果已知 GPIO 已经处于输出模式,则 gpio_set_value() 可能更有效:

      void gpio_set_value(unsigned int gpio, int value);
      

      欲了解更多信息,请查看此链接:enter link description here

      【讨论】:

        【解决方案3】:

        如果您只想从内核驱动程序切换几个 GPIO 位,那么您可能不想使用用户 'omotto' 提到的 gpio_xxx API,因为这主要是为了允许其他驱动程序通过名称,以及提供对用户空间的访问。 davroslyrad 的快速而简单的解决方案更适合您。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-06-30
          • 2018-05-22
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多