为什么在 raspberry pi 驱动程序中有 `gpio_request` 而不是 `request_region`?

Why there is `gpio_request` instead of `request_region` in raspberry pi driver?

LDD3一书中,如果一个驱动要控制CPU的管脚,需要调用request_region()函数来声明端口。

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

为什么以及何时需要使用 gpio_request() 而不是 request_region()?并且,这两个函数的目的有什么不同。

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

In the book LDD3, if one driver want to control the pins of CPU, it should call request_region() function to declare the usage of the ports.

首先,"port"这个词有歧义,需要上下文。端口可以​​指物理连接器(例如 USB 端口)或逻辑连接(例如 TCP 端口)。

您对 request_region() 的理解有问题。该例程用于管理I/O 地址space。您的问题带有 raspberry-p1 标记,它使用 ARM 处理器并且没有要管理的 I/O 地址 space。 ARM 处理器使用内存映射设备寄存器。您将在设备驱动程序中使用 request_mem_region() 作为该外设寄存器块的内存地址。

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

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

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

why there is no any introductions to GPIO? Is it because of the 2.6 kernel version?

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

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