在书LDD3中 ,如果一个驱动程序想要控制CPU的引脚,它应该调用request_region()
函数来声明端口的使用情况。
然而,当我想在Raspberry Pi上实现一个简单的驱动程序模块时,我发现在这个例子中,端口的请求是由gpio_request()
函数实现的。
为什么当我们需要使用gpio_request()
而不是request_region()
? 而这两个函数有什么区别呢?
顺便说一句:我一页一页searchLDD3 ,但是我找不到关于GPIO
任何线索……为什么没有任何GPIO
介绍? 是因为2.6内核版本吗?
在书LDD3中,如果一个驱动程序想要控制CPU的引脚,它应该调用request_region()函数来声明端口的使用情况。
首先,“港口”一词含糊不清,需要上下文。 端口可以指物理连接器(例如USB端口)或逻辑连接(例如TCP端口)。
你对request_region()的理解是有缺陷的。 该例程用于管理I / O地址空间。 你的问题被标记为使用ARM处理器的raspberry-p1
,并且没有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() 。 它也可能需要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。