linux设备树概要

发布时间 2024-01-01 20:13:25作者: Charles_hui

1.dtsi文件。一般命名为xxx.dtsi。i表示include ,表示被别的dts文件引用。dtsi文件跟dts文件的语法是完全相同的。
2.程序员一般不需要从零写dts文件,而是修改,改的对不对,就需要编译一下。内核中直接使用dts文件太过于低效,因此需要使用编译过后的二进制格式的dtb文件。设置好ARCH、CROSS_COMPILE、PATH这三个环境变量后,进入ubuntu上板子内核源码目录,执行如下命令即可编译得到dtb文件。

点击查看代码
make dtbs

3.内核对设备树的处理过程:
dts文件在PC上被编译为dtb文件-->uboot把dtb文件传给内核-->内核解析dtb文件,把每一个节点转化为device_node结构体-->对于某些device_node结构体,会被转化为platform_device结构体。
4.device_node结构体由dtb中的每一个节点转化而来

点击查看代码
struct device_node {
	const char *name; // 设备树中常用属性name(因为已经过时,因此在设备树常用属性中没有做介绍)
	const char *type; // 设备树常用属性type(因为已经过时,因此在设备树常用属性中没有做介绍)
	phandle phandle;
	const char *full_name;
	struct fwnode_handle fwnode;

	struct	property *properties; // 节点属性
	struct	property *deadprops;	/* removed properties */
	struct	device_node *parent; // 父亲节点
	struct	device_node *child; // 孩子节点
	struct	device_node *sibling;
	struct	kobject kobj;
	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 property {
	char	*name; // 属性的名字
	int	length; // 属性值的长度
	void	*value; // 属性的值
	struct property *next;
	unsigned long _flags;
	unsigned int unique_id;
	struct bin_attribute attr;
};

5.DTC为编译工具,它可以将.dts文件编译成.dtb文件。DTC的源码位于内核的scripts/dtc目录.

参考链接:
1.https://blog.csdn.net/weixin_39674445/article/details/118398831
2.https://blog.csdn.net/Rank_d/article/details/106289183?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~Rate-1-106289183-blog-129138552.235^v38^pc_relevant_anti_vip&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~Rate-1-106289183-blog-129138552.235^v38^pc_relevant_anti_vip&utm_relevant_index=2
3.http://www.chinaaet.com/article/3000152508