问题引出和概述
示例代码如下:
#include <asm/io.h>
CCM_CCGR1 = ioremap(0x20C406C, 4);
IOMUXC_SNVS_SW_MUX_CTL_PAD_SNVS_TAMPER3 = ioremap(0x2290014, 4);
GPIO5_GDIR = ioremap(0x020AC000 + 0x4, 4);
GPIO5_DR = ioremap(0x020AC000 + 0, 4);
这段示例代码来自于博文 https://blog.youkuaiyun.com/wenhao_ir/article/details/144973219
注意:ioremap()使用时,要包含相应的头文件,在IMX6ULL开发时使用的ioremap
函数要包含的头文件是#include <asm/io.h>
这些代码显然就是把寄存器的物理地址映射到Linux的虚拟地址中,在前面的博文
IMX6ULL开发板基础实验:Framebuffer驱动程序的简单应用实例代码详细分析中,用到了函数mmap
,也是把地址映射到虚拟地址,不同的是mmap
映射的是设备的内存,而这里咱们需要映射的是CPU的物理地址。
对于函数mmap
的讲解详见我的另一篇博文
嵌入式Linux开发中的内存映射函数mmap详解?什么叫内存映射?什么叫对设备的显式和隐式读写操作?什么叫程序的虚拟内存?
ioremap()
函数详解
下面对ioremap()函数
进行详细解释:
以上面的第1行代码为例进行解释:
CCM_CCGR1 = ioremap