设备树下Led驱动实验-读设备树中设备节点的新方法

发布时间:2024年01月19日

一.? 简介

前面已经完成 从设备树文件读取 Led设备节点信息,Led的 IO初始化工作,最终实现Led灯的打开与关闭。

其中,从设备树文件读取 Led设备节点的属性 reg值,具体读取 (IMX6ULL芯片上)寄存器的地址。然后将读取的寄存器的物理地址转换为虚拟地址,这部分代码的实现,可以通过直接内存映射来实现,具体直接调用 of_iomap()函数即可完成。

二.? 读取设备树中设备节点信息的新方法

1. 直接内存映射

of_iomap() 函数用于直接内存映射。

注意: of_iomap()函数获取的 reg属性!!!

前面我们会通过 ioremap() 函数,来完成物理地址到虚拟地址的映射,采用设备树以后,就可以直接通过 of_iomap() 函数来获取内存地址所对应的虚拟地址, 而不需要使用 ioremap() 函数了。

当然了,你也可以使用 ioremap 函数来完成物理地址到虚拟地址的内存映射,只是在采用设备树以后,大部分的驱动都使用 of_iomap 函数了。

of_iomap() 函数本质上也是将 reg 属性中地址信息转换为虚拟地址,如果 reg 属性有多段的话,可以通过 index 参数指定要完成内存映射的是哪一段。

of_iomap 函数原型如下:
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.?

文章来源:https://blog.csdn.net/wojiaxiaohuang2014/article/details/135676551
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。