在 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内核版本吗?
答案 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。