Linux 设备驱动开发 —— 设备树在platform设备驱动中的使用

本文介绍了设备树在Linux设备驱动开发中的作用,详细讲解了设备树的基础概念,包括数据格式、设备描述、compatible属性、编址信息等。设备树中的每个节点代表一个设备,compatible属性用于设备与驱动的匹配。在platform设备驱动中,设备树通过节点的compatible属性替代了platform_device的name属性进行匹配。通过设备树,内核能够自动将设备信息转换为platform_device格式,简化了设备与驱动的关联过程。
摘要由CSDN通过智能技术生成

         关与设备树的概念,我们在Exynos4412 内核移植(六)—— 设备树解析 里面已经学习过,下面看一下设备树在设备驱动开发中起到的作用

         Device Tree是一种描述硬件的数据结构,设备树源(Device Tree Source)文件(以.dts结尾)就是用来描述目标板硬件信息的。Device Tree由一系列被命名的结点(node)和属性(property)组成,而结点本身可包含子结点。所谓属性,其实就是成对出现的name和value。在Device Tree中,可描述的信息包括(原先这些信息大多被hard code到kernel中)。


一、设备树基础概念

1、基本数据格式

      device tree是一个简单的节点和属性树,属性是键值对,节点可以包含属性和子节点。下面是一个.dts格式的简单设备树。

/ {
    node1 {
        a-string-property = "A string";
        a-string-list-property = "first string", "second string";
        a-byte-data-property = [0x01 0x23 0x34 0x56];
        child-node1 {
            first-child-property;
            second-child-property = <1>;
            a-string-property = "Hello, world";
        };
        child-node2 {
        };
    };
    node2 {
        an-empty-property;
        a-cell-property = <1 2 3 4>; /* each number (cell) is a uint32 */
        child-node1 {
        };
    };
};

      该树并未描述任何东西,也不具备任何实际意义,但它却揭示了节点和属性的结构。即:

a -- 一个的根节点:'/',两个子节点:node1和node2;node1的子节点:child-node1和child-node2,一些属性分散在树之间。

b -- 属性是一些简单的键值对(key-value pairs):value可以为空也可以包含任意的字节流。而数据类型并没有编码成数据结构,有一些基本数据表示可以在device tree源文件中表示。

c -- 文本字符串(null 终止)用双引号来表示:string-property = "a string"

d -- “Cells”是由尖括号分隔的32位无符号整数:cell-property = <0xbeef 123 0xabcd1234>

e -- 二进制数据是用方括号分隔:binary-property = [0x01 0x23 0x45 0x67];

f -- 不同格式的数据可以用逗号连接在一起:mixed-property = "a string", [0x01 0x23 0x45 0x67], <0x12345678>;

g -- 逗号也可以用来创建字符串列表:string-list = "red fish", "blue fish";


二、设备在device tree 中的描述

        系统中的每个设备由device tree的一个节点来表示

1、节点命名

     花些时间谈谈命名习惯是值得的。每个节点都必须有一个<name>[@<unit-address>]格式的名称。<name>是一个简单的ascii字符串,最长为31个字符,总的来说,节点命名是根据它代表什么设备。比如说,一个代表3com以太网适配器的节点应该命名为ethernet,而不是3com509。

    如果节点描述的设备有地址的话,就应该加上unit-address,unit-address通常是用来访问设备的主地址,并在节点的reg属性中被列出。后面我们将谈到reg属性。


2、设备

      接下来将为设备树添加设备节点:

/ {
	compatible = "acme,coyotes-revenge";

	cpus {
		cpu@0 {
			compatible = "arm,cortex-a9";
		};
		cpu@1 {
            		compatible = "arm,cortex-a9";
        	};
    	};

	serial@101F0000 {
		compatible = "arm,pl011";
	};

	serial@101F2000 {
		compatible = "arm,pl011";
	};

	gpio@101F3000 {
		compatible = "arm,pl061";
	};

	interrupt-controller@10140000 {
		compatible = "arm,pl190";
	};

	spi@10115000 {
		compatible = "arm,pl022";
	};
	
	external-bus {
		ethernet@0,0 {
			compatible = "smc,smc91c111";
		};
	
		i2c@1,0 {
			compatible = "acme,a1234-i2c-bus";
			rtc@58 {
				compatible = "maxim,ds1338";
			};
        	};

		flash@2,0 {
			compatible = "samsung,k8f1315ebm", "cfi-flash";
       		 };
   	 };
};

        在上面的设备树中,系统中的设备节点已经添加进来,树的层次结构反映了设备如何连到系统中。外部总线上的设备

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值