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

Dou*_* Su 5 linux driver linux-kernel gpio raspberry-pi

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

但是,当我想在我的Raspberry Pi上实现一个简单的驱动程序模块时,我在本例中发现端口的请求是由gpio_request()函数实现的.

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

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

saw*_*ust 4

在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 支持出现在 Linux 内核中,版本为 2.6.3x(?)。在此之前(甚至之后),每个平台(例如 SoC 制造商)都有自己的一组用于访问(或许还有管理)GPIO 的例程。

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