mmap和访问ARM处理器中的GPIO配置寄存器

时间:2009-10-09 09:40:38

标签: arm mmap

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

根据处理器的规格(飞思卡尔的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

我哪里错了?

3 个答案:

答案 0 :(得分:4)

mmap上的/dev/mem应该有效。您是否尝试过以root身份运行代码?也许某些安全性阻止您的程序访问地址空间。还要确保已通过GPIO-Space的正确物理地址。

您使用的方法适用于运行Linux的Cortex-A8 ARM板,没有问题。

如果你无法使它工作,除了为gpio寻找或编写设备驱动程序(写一个 hard btw)之外,你无能为力。

有点运气,有人已经为你做了这件事。您的文件系统中是否存在名为/dev/gpio的节点?如果是这样,你已经有了一个司机。

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

答案 1 :(得分:2)

此外,如果您使用的是2009年及以后的内核源代码,则应设置/dev/mem标志设置O_SYNC,如果您希望未缓存内存访问权限。

答案 2 :(得分:1)

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

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

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