代码之家  ›  专栏  ›  技术社区  ›  ggaaooppeenngg

GPIO如何映射到内存中?

  •  6
  • ggaaooppeenngg  · 技术社区  · 9 年前

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

    2 回复  |  直到 9 年前
        1
  •  5
  •   sawdust    9 年前

    我没有找到像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输出设置为高,而在另一寄存器中则有一位设置为低。

    还有其他司机吗?

    对pinctrl(引脚控制)驱动器是比GPIO更低的层(即更接近硬件)。它是处理管脚复用的pinctrl层(即,管脚是用于外围功能还是用作GPIO)。
    SoC(例如。 drivers/pinctrl/pinctrl-bcm2835.c )是你能找到的地方 devm_ioremap_resources() (反过来调用 devm_request_mem_region() devm_ioremap() )用于GPIO寄存器块。

    我可以通过R&W到/sys/class/gpio/*?

    对这个 系统文件系统 提供了用于访问未分配给外围设备的那个些引脚的接口。

    附录
    这个 系统文件系统 GPIO接口功能有限。
    显然,有用户空间库可以访问其他引脚属性(例如,启用上拉或下拉电阻器),这些属性通常在 钳夹 驾驶员通常,此类库直接通过 /开发/内存 psuedo文件。认识到这些技术不安全,可能会干扰其他设备驱动程序。

        2
  •  0
  •   techraf    9 年前

    这个响应可能不是“四平八稳”的,因为它只为复盆子Pi 2提供GPIO基址,而不是how。

    尽管如此,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