6

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

4

2 回答 2

5

我没有发现像 request_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 更底层(即更靠近硬件)的驱动程序。它是处理引脚复用的 pinctrl 层(即,引脚是用于外围功能还是用作 GPIO)。
SoC 的 pinctrl 驱动程序(例如drivers/pinctrl/pinctrl-bcm2835.c)是您可以找到用于 GPIO 寄存器块的devm_ioremap_resources()(依次调用devm_request_mem_region()devm_ioremap() )的地方。

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

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

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

于 2015-07-25T10:15:13.317 回答
0

这个响应可能不是“四面楚歌”,因为它只是为 Raspberry Pi 2 提供了一个 GPIO 基地址,而不是如何。

尽管如此,Raspberry Pi 2 上的 Raspbian OS 提供了一个位于0x3f20,0000.

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

下面的链接显示了一个粗略的 ARMv7 组装示例,该示例使用上述基地址通过mmmap调用来闪烁 Raspberry Pi 2 上的 ACT LED。

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

于 2016-04-11T20:38:17.750 回答