《设备树 — dtb到device node的转换(三)》

1.内核中对一个设备节点的表示

struct device_node {
	const char *name;                    //节点的名字
	const char *type;                    //device_type属性的值
	phandle phandle;                     //对应该节点的phandle属性 
	const char *full_name;               //节点的名字, node-name[@unit-address]从“/”开始的,表示该node的full path 
	struct fwnode_handle fwnode;
 
	struct	property *properties;        // 节点的属性
	struct	property *deadprops;	/* removed properties 如果需要删除某些属性,kernel并非真的删除,而是挂入到deadprops的列表 */
	struct	device_node *parent;         // 节点的父亲
	struct	device_node *child;          // 节点的孩子(子节点)
	struct	device_node *sibling;        // 节点的兄弟(同级节点)
#if defined(CONFIG_OF_KOBJ)              // 在sys文件系统表示
	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
};

  从这里我们就可以看到一个设备节点的大概组织形式了。通过下面这三个组织成一个树形结构。

struct	device_node *parent;         // 节点的父亲
struct	device_node *child;          // 节点的孩子(子节点)
struct	device_node *sibling;        // 节点的兄弟(同级节点)

 

  device_node结构体中有properties, 用来表示该节点的属性

struct property {
	char	*name;                //属性名字
	int	length;                   //value的长度
	void	*value;               //属性值
	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
};

  

2.举例说明

/dts-v1/;
/memreserve/ 0x4ff00000 0x100000;
/ {
    model = "YIC System SMDKV210 based on S5PV210";
    compatible = "yic,smdkv210", "samsung,s5pv210";
 
    #address-cells = <1>;
    #size-cells = <1>;
        
    chosen {
        bootargs = "console=ttySAC2,115200n8 root=/dev/nfs nfsroot=192.168.0.101:/home/run/work/rootfs/";
    };  
 
    memory@30000000 {
        device_type = "memory";
        reg = <0x30000000 0x20000000>;
    };  
};

  下图表示上面的根节点和其里面的两个子节点。

 

   接下来向里面填充属性值

 

  首先是把根节点里的4个属性进行填充

 

 

  在添加上其它两个节点的属性后如下。

 

posted @ 2020-05-12 14:59  一个不知道干嘛的小萌新  阅读(851)  评论(0编辑  收藏  举报