【问题标题】:Why there is `gpio_request` instead of `request_region` in raspberry pi driver?为什么树莓派驱动程序中有`gpio_request`而不是`request_region`?
【发布时间】:2015-09-16 06:04:01
【问题描述】:

LDD3一书中,如果一个驱动想要控制CPU的引脚,它应该调用request_region()函数来声明端口的使用。

然而,当我想在我的树莓派上实现一个简单的驱动模块时,我在this example 中发现端口请求是由gpio_request() 函数实现的。

为什么以及何时需要使用gpio_request() 而不是request_region()?而且,这两个功能的不同用途是什么。

顺便说一句:我逐页搜索LDD3,但我找不到任何关于GPIO的线索……为什么没有任何关于GPIO的介绍?是因为2.6内核版本的原因吗?

【问题讨论】:

    标签: linux linux-kernel raspberry-pi driver gpio


    【解决方案1】:

    在LDD3一书中,如果一个驱动程序想要控制CPU的引脚,它应该调用request_region()函数来声明端口的使用。

    首先,“端口”这个词是模棱两可的,需要上下文。端口可以​​指物理连接器(例如 USB 端口)或逻辑连接(例如 TCP 端口)。

    您对 request_region() 的理解存在缺陷。该例程用于管理 I/O 地址空间。您的问题被标记为raspberry-p1,它使用 ARM 处理器并且没有要管理的 I/O 地址空间。 ARM 处理器使用内存映射设备寄存器。您可以在设备驱动程序中使用 request_mem_region() 来获取该外设寄存器块的内存地址。

    每个 GPIO 由一个或多个控制寄存器中的位位置控制。这些寄存器将由整个 GPIO 子系统处理。 (还有一个用于多路复用管脚的低层(更靠近硬件)管脚控制驱动程序,即可以分配给外围设备或用作 GPIO 的管脚。)

    GPIO(或引脚控制)子系统的驱动程序应为 SoC 的 GPIO 控制寄存器的内存地址执行 request_mem_region()gpio_request() 将管理从属于寄存器管理的单个引脚。

    请注意,request_mem_region()gpio_request() 在设备驱动程序中的使用并不相互排斥。例如,USB 控制器的驱动程序将 request_mem_region() 为其控制寄存器的内存地址。它可能还必须 gpio_request() 用于控制 USB 连接器电源的引脚(假设这是通过控制器外部逻辑控制电源的方式)。

    为什么没有对 GPIO 的介绍?是因为2.6内核版本的原因吗?

    在 Linux 中使用 GPIO 的约定出现在 2007 年的 Documentation/gpio.h 中,版本为 2.6.22。通用(即标准化而不是特定于平台)GPIO 支持在几年后的 2.6.3x(?) 版本中出现在 Linux 内核中。在此之前(甚至之后),每个平台(例如 SoC 制造商)都有自己的一套例程来访问(并且可能管理)GPIO。

    LDD3 声称是 2.6.10 内核的最新版本。此外,这本书可能以 x86 为中心(因为 Linux 起源于 x86),而 x86 处理器通常没有 GPIO。

    【讨论】:

    • 是不是说我请求gpio的时候也可以使用request_mem_region()
    • 您的假设问题模棱两可。这些例程供驱动程序分配资源。 gpio_request() 专用于一个 GPIO 引脚。 request_mem_region() 专用于存在映射设备寄存器的内存。那么您的问题与哪些设备寄存器有关?
    猜你喜欢
    • 2019-02-28
    • 2019-02-14
    • 1970-01-01
    • 2022-12-05
    • 1970-01-01
    • 1970-01-01
    • 2014-08-25
    • 2023-03-04
    • 1970-01-01
    相关资源
    最近更新 更多