在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.
首先,“端口”一词含糊不清,需要背景.端口可以指物理连接器(例如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()(假设控制器外部的逻辑是如何控制电源的).
why there is no any introductions to GPIO? Is it because of the 2.6 kernel version?
在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.