前面已经完成 从设备树文件读取 Led设备节点信息,Led的 IO初始化工作,最终实现Led灯的打开与关闭。
其中,从设备树文件读取 Led设备节点的属性 reg值,具体读取 (IMX6ULL芯片上)寄存器的地址。然后将读取的寄存器的物理地址转换为虚拟地址,这部分代码的实现,可以通过直接内存映射来实现,具体直接调用 of_iomap()函数即可完成。
of_iomap() 函数用于直接内存映射。
注意: of_iomap()函数获取的 reg属性!!!
前面我们会通过 ioremap() 函数,来完成物理地址到虚拟地址的映射,采用设备树以后,就可以直接通过 of_iomap() 函数来获取内存地址所对应的虚拟地址, 而不需要使用 ioremap() 函数了。
当然了,你也可以使用 ioremap 函数来完成物理地址到虚拟地址的内存映射,只是在采用设备树以后,大部分的驱动都使用 of_iomap 函数了。
of_iomap() 函数本质上也是将 reg 属性中地址信息转换为虚拟地址,如果 reg 属性有多段的话,可以通过 index 参数指定要完成内存映射的是哪一段。
void __iomem *of_iomap(struct device_node *np, int index)
函数参数和返回值含义如下:
np:设备节点。
index:reg 属性中要完成内存映射的段,如果 reg 属性只有一段的话, index 就设置为 0。
返回值:经过内存映射后的虚拟内存首地址,如果返回 NULL,表示内存映射失败。
函数参数 index说明:地址+地址长度,算是一个 index。例如,reg属性值如下:
#address-cells = <1>;
#size-cells = <1>;
reg = < 0X020C406C 0x04 /*CCM_CCGR1_BASE */
0X020E0068 0x04 /*SW_MUX_GPIO1_IO03_BASE */
0X020E02F4 0x04 /*SW_PAD_GPIO1_IO03_BASE */
0X0209C004 0x04 /*GPIO1_GDIR_BASE */
0X0209C000 0x04>; /*GPIO1_DR_BASE */
如果 reg属性值如上所示,则 第3行的 index为 1;第4 行的 index为2;依次类推。
2.?