首先,从设备树中获取根节点的device_node结构体,然后对每个根目录下的一级子节点调用of_platform_bus_create(),从命名上来看,这部分解析的目的是建立各个bus的platform_device结构,需要注意的是对于of_platform_bus_create(child, matches, lookup, parent, true),matchs参数是上文中提到的compatible静态数组,而lookup...
然后再设置一些参数,需要特别注意的是:对于一个struct device_node结构体,申请的内存空间是sizeof(struct device_node)+allocl,这个allocl是节点的unit_name长度(类似于chosen、memory这类子节点描述开头时的名字,并非.name成员)。 然后通过np->full_name = fn = ((char)np) + sizeof(np);将device_node的ful...
答案是:不需要转换,在platform_device中有一个成员struct device dev,这个dev中又有一个指针成员struct device_node *of_node。 linux的做法就是将这个of_node指针直接指向由设备树转换而来的device_node结构;留给驱动开发者自行处理。 例如,有这么一个struct platform_device* of_test.我们可以直接通过of_test->dev...
答案是:不需要转换,在platform_device中有一个成员struct device dev,这个dev中又有一个指针成员struct device_node *of_node,linux的做法就是将这个of_node指针直接指向由设备树转换而来的device_node结构。 例如,有这么一个struct platform_device* of_test.我们可以直接通过of_test->dev.of_node来访问设备树中的...
在上一节中讲到设备树dtb文件中的各个节点转换成device_node的过程(dtb转换成device_node ),每个设备树子节点都将转换成一个对应的device_node节点。 设备树dts文件最终在linux内核中会转化成platform_device:dts->dtb ->device_node->platform_device。
内核解析 dtb 文件,把每一个节点都转换为device_node 结构体; 对于某些 device_node 结构体,会被转换为platform_device 结构体。 1.1 dtb 中每一个节点都被转换为 device_node 结构体 根节点被保存在全局变量of_root中,从 of_root开始可以访问到任意节点。
在内核编译的过程中,设备树源文件会被编译为dtb文件,dtb文件随着系统的加载被载入内存,之后Linux内核将其每一个节点都解析为device_node结构。然后根据指定的规则,将某些device_node结构体转换为platform_device结构体。 device_node结构体的原型如下 struct device_node{const char*name;const char*type;phandle phandle...
设备树(Device Tree)由一系列被命名的结点(node)和属性(property)组成,以lubancat2为例,不妨打开本章节的配套代码 linux_driver/device_tree/rk3568-lubancat2.dts或者内核源码/arch/arm64/boot/dts/rockchip/rk3568-lubancat2.dts先睹为快。 下面的内容将围绕着设备树源码,来讲解设备树框架和基本语法。 设备树 ...
node-name:节点名字 unit-address:单元地址 label 是标号,可以省略。label 的作用是为了方便地引用 node。比如: 6.jpg 可以使用下面 2 种方法来修改 uart@fe001000 这个 node: 7.jpg 2、属性格式 简单地说, properties 就是“name=value”, value 有多种取值方式。示例: ...
解析分两个阶段,第一阶段进行校验以及启动参数的再调整;第二阶段完成设备树的解压,也就是将设备树由FDT变成EDT,创建device_node。 ##第一阶段 kernel启动日志中与设备树相关的第一条打印如下,也就是打印出当前硬件设备的模型名,"OF: fdt: Machine model: V2P-CA9" ...