GPIO如何映射到内存中?

时间:2015-07-25 03:26:47

标签: linux-device-driver mmap gpio raspberry-pi2 ioports

我最近正在浏览pi2的GPIO驱动程序,我发现用户空间pi2 GPIO lib(如python的RPi.GPIO 0.5.11)使用/dev/mem用于BCM2708(从0x20000000开始,GPIO从0x200000开始相对) mmap用户空间内存区域以处理GPIO。但是我发现linux源代码树中的drivers/gpio被设计为由/sys/class/gpio/*处理。我发现没有像request_io_region__io_remap这样的I / O端口映射。 我的问题是BCM2708的GPIO如何映射到内存中?还有其他司机吗?我可以只将R& W处理GPIO到/sys/class/gpio/*吗?

2 个答案:

答案 0 :(得分:5)

  

我发现没有像if_io_region和__io_remap那样的I / O端口映射。

ARM没有I / O端口空间。所有外设寄存器都分配给存储空间中的地址。

  

BCM2708的GPIO如何映射到内存中?

GPIO通常作为控制寄存器的外设实现,RPi的BCM2835中的GPIO遵循此惯例。这组控制寄存器可以有不同的名称;例如,Atmel将这些寄存器称为并行I / O(PIO)外设。

每个GPIO(或更准确地说,每个引脚)将由每个控制寄存器功能中的一个或多个位表示。控制寄存器功能包括引脚分配(也称为多路复用),将输出设置为高电平,将输出设置为低电平,读取引脚电平以及电平和边沿检测控制。

IOW没有一个可以读写的位与GPIO相对应。对于GPIO,特定寄存器中会有一点用于获取输入电平。另一个寄存器中有一位用于将GPIO输出设置为高电平,而另一个寄存器中的位用于将GPIO输出设置为低电平。

  

还有其他司机吗?

是。 pinctrl(引脚控制)驱动器是比GPIO更低层(即更接近HW)。它是处理引脚多路复用的pinctrl层(即引脚是用于外设功能还是用作GPIO)。
你可以找到SoC的pinctrl驱动程序(例如drivers/pinctrl/pinctrl-bcm2835.c devm_ioremap_resources()(后者又调用 devm_request_mem_region() devm_ioremap( ))用于GPIO寄存器块。

  

我可以将R& W处理GPIO到/ sys / class / gpio / *吗?

是。 sysfs 接口用于访问未分配给外设的引脚。

<强>附录
sysfs GPIO接口功能有限 显然,有用户空间库可以访问通常位于 pinctrl 驱动程序域中的其他引脚属性(例如,启用上拉或下拉电阻)。通常,此类库通过 / dev / mem 伪文件直接访问PIO硬件寄存器。要知道这些技术不安全并且可能会干扰其他设备驱动程序。

答案 1 :(得分:0)

这种反应可能不是四十四岁。&#34;因为它只提供了Raspberry Pi 2的GPIO基地址和方法。

尽管如此,Raspberry Pi 2上的Raspbian OS提供了0x3f20,0000的基址。

$ dmesg -H 
[  +0.000749] gpiomem-bcm2835 3f200000.gpiomem: Initialised: Registers at 0x3f200000

使用上述基地址(通过mmmap调用)使Raspberry Pi 2上的ACT LED闪烁的原始ARMv7程序集示例如下面的链接所示。

https://github.com/InfinitelyManic/Raspberry-Pi-2