需求:
在开发过程中,我们经常需要读取CPU中某个寄存器的地址,比如说读取某一个GPIO的输出状态。如读取GPIO1_IO01
的值(以i.MX6为例),那么就是要读取寄存器0x0209c000
中bit1的值。
- 在Kernel中可以使用
ioremap_nocache()
将该地址映射出来,然后去读取。 - 在用户程序中,可以使用
mmap()
去读取。下面我们将使用mmap()
函数读取该寄存器的值,并写一个专门的应用程序regctl
来读写任意寄存器的值。
/dev/mem节点
/dev/mem
是一个字符设备,应用程序可以通过mmap()
可以将物理地址映射到用户空间的虚拟地址上,在用户空间完成对设备寄存器的操作。
关于这个设备节点的详细解释可以参照下面两篇文章,写得非常好!
http://man7.org/linux/man-pages/man4/mem.4.html
http://blog.csdn.net/skyflying2012/article/details/47611399
在开发过程中如果想要获取对/dev/mem
的绝对访问权限,要在Kernel中将CONFIG_STRICT_DEVMEM
打开。
mmap()函数
关于mmap()
的用法可以在ubuntu平台下执行#man mmap
命令就可以查看这个函数的用法。
regctl应用程序
1 |
|