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

时间:2015-06-29 16:58:26

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

LDD3 一书中,如果一个驱动程序想要控制CPU的引脚,则应调用Json::Value obj; obj["test"] = 5; obj["testsd"] = 655; string c = obj.asString(); 函数来声明端口的使用。

但是,当我想在我的Raspberry Pi上实现一个简单的驱动程序模块时,我在this example中找到了端口请求由request_region()函数实现。

为什么以及何时需要使用gpio_request()代替gpio_request()?而且,这两个功能的不同之处在于什么。

BTW:我逐页搜索了 LDD3 ,但我找不到关于request_region()的任何线索......为什么没有GPIO的任何介绍?是因为2.6内核版本吗?

1 个答案:

答案 0 :(得分:3)

  

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

首先,“端口”一词含糊不清,需要上下文。端口可以​​指物理连接器(例如USB端口)或逻辑连接(例如TCP端口)。

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

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

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

请注意,在设备驱动程序中使用 request_mem_region() gpio_request()并不相互排斥。例如,USB控制器的驱动程序 request_mem_region()其控制寄存器的存储器地址。对于控制USB连接器电源的引脚,可能还需要 gpio_request()(假设控制器外部的逻辑控制电源的方式)。

  

为什么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。