未分类 2026年5月12日 7 分钟

设备树3-设备树节点的展开3

本章主要讲解内核对设备树的处理 head.s主要工作内容 平台设备信息处理过程 设备树中的这行信息用来板级信息识别,声明…

本章主要讲解内核对设备树的处理

head.s主要工作内容

平台设备信息处理过程

设备树中的这行信息用来板级信息识别,声明开发板需要声明样子的内核

设备树中运行时配置信息的处理

设备树展开为节点文件

a. 在DTB文件中, 
   每一个节点都以TAG(FDT_BEGIN_NODE, 0x00000001)开始, 节点内部可以嵌套其他节点,
   每一个属性都以TAG(FDT_PROP, 0x00000003)开始

b. 每一个节点都转换为一个device_node结构体:
        struct device_node {
            const char *name;  // 来自节点中的name属性, 如果没有该属性, 则设为"NULL"
            const char *type;  // 来自节点中的device_type属性, 如果没有该属性, 则设为"NULL"
            phandle phandle;
            const char *full_name;  // 节点的名字, node-name[@unit-address]
            struct fwnode_handle fwnode;

            struct  property *properties;  // 节点的属性
            struct  property *deadprops;    /* removed properties */
            struct  device_node *parent;   // 节点的父亲
            struct  device_node *child;    // 节点的孩子(子节点)
            struct  device_node *sibling;  // 节点的兄弟(同级节点)
        #if defined(CONFIG_OF_KOBJ)
            struct  kobject kobj;
        #endif
            unsigned long _flags;
            void    *data;
        #if defined(CONFIG_SPARC)
            const char *path_component_name;
            unsigned int unique_id;
            struct of_irq_controller *irq_trans;
        #endif
        };

c. device_node结构体中有properties, 用来表示该节点的属性
   每一个属性对应一个property结构体:
        struct property {
            char    *name;    // 属性名字, 指向dtb文件中的字符串
            int length;       // 属性值的长度
            void    *value;   // 属性值, 指向dtb文件中value所在位置, 数据仍以big endian存储
            struct property *next;
        #if defined(CONFIG_OF_DYNAMIC) || defined(CONFIG_SPARC)
            unsigned long _flags;
        #endif
        #if defined(CONFIG_OF_PROMTREE)
            unsigned int unique_id;
        #endif
        #if defined(CONFIG_OF_KOBJ)
            struct bin_attribute attr;
        #endif
        };
上一篇 设备树3-设备树节点展开2

设备树DTB格式 设备树文件是大端模式,大小端存储方式只会对数字又影响,对于字符串是没有影响的

下一篇 设备树5-device_node节点如何展开为platform_device

本章主要描述device_node节点如何转换为platform_device节点