【问题标题】:mmap and access to GPIO config registers in an ARM processormmap 和访问 ARM 处理器中的 GPIO 配置寄存器
【发布时间】:2009-10-09 09:40:38
【问题描述】:

我正在努力从 Linux 用户空间读取(和写入)硬件寄存器。目标是配置一些 GPIO 引脚,并能够设置和读取这些引脚。

根据处理器规范(来自 Freescale 的 imx27),控制 GPIO 的寄存器组的物理地址为 0x10015000

我的假设是我可以使用这样的东西:

unsigned long *gpio;
fd = open("/dev/mem", O_RDWR);
gpio = (unsigned long *) mmap(0, getpagesize(), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0x10015000);

我现在希望能够读取数据并将数据设置到处理器中的寄存器。问题是我读哪个位置都没有关系,我总是得到 0。

例如,物理位置 0x10015220 中的寄存器包含一个寄存器,显示哪些引脚在我们作为 GPIO。这默认为 0xFFFFFFFF。阅读这个寄存器,我希望得到不同于 0 的东西:

printf("PTC_GIUS: 0x%08lX\n", gpio[0x220]);

PTC_GIUS: 0x00000000

我哪里错了?

【问题讨论】:

  • 如果 gpio 为 0x10015000 并且类型为 unsigned long *,则 gpio[0x220] 可能不会读取您认为的内容。

标签: arm mmap


【解决方案1】:

/dev/mem 上的 mmap 应该可以工作。您是否尝试过以 root 身份运行您的代码?也许某些安全措施阻止您的程序访问地址空间。还要确保您传递了正确的 GPIO 空间的物理地址。

您使用的方法在我运行 linux 的 Cortex-A8 ARM 板上运行没有问题。

如果你不能让它工作,除了为 gpio 找到或编写一个设备驱动程序之外,你无能为力(顺便说一句,编写一个不是困难。)。

幸运的是,有人已经为您做到了这一点。您的文件系统中是否存在名为/dev/gpio 的节点?如果是这样,您已经有一个驱动程序。

/dev/gpio 上进行谷歌搜索将为您提供有关如何使用它的所有详细信息。您还可以找到一个简单的 gpio 驱动程序的源代码,您可以根据需要对其进行修改。

【讨论】:

  • 是的,通常最好编写一个设备驱动程序,至少在原型设计阶段过去一次。
【解决方案2】:

此外,如果您使用的是 2009 年及以后的内核源代码,如果您希望您的内存访问不被缓存,您应该打开 /dev/mem 并设置 O_SYNC 标志。

【讨论】:

    【解决方案3】:

    如果您使用的是最新版本的 Linux 内核,它可能会阻止对 /dev/mem 设备的访问。用户模式访问该设备已被弃用且危险。它主要用于用户模式访问 X 中的视频内存。在嵌入式项目中,访问内存映射硬件(如 GPIO)会很有用。

    检查您的内核编译标志是否有CONFIG_STRICT_DEVMEM 或其他限制访问/dev/mem 的标志。它可能会错误地阻止对该内存范围的访问。

    然而,正如 Nils 所说,最好的解决方案是为 iMX27 找到一个 gpio 模块或自己编写。

    【讨论】:

    • 许多人建议使用/dev/mem 映射寄存器。如果我们应该避免在用户空间中使用/dev/mem,有哪些替代方案?
    猜你喜欢
    • 2022-11-11
    • 2014-01-06
    • 2021-03-03
    • 1970-01-01
    • 1970-01-01
    • 2020-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多