ubuntu之坑(十五)——设备树

0.参考资料

[1]Linux:设备树学习篇(1)
[2]初学LINUX(4):Linux的设备树
[3]Linux 设备树 DTS 与 DTSI 入门指南
[4]详解Linux设备树源码DTS格式
[5]camera驱动开发 之 DTS

1.什么是设备树

  设备树是一种数据结构,它通过特有的语法格式描述片上片外的设备信息。由BootLoader传递给kernel,kernel进行解析后形成和驱动程序关联的dev结构供驱动代码使用。
  描述设备树的文件叫做 DTS(DeviceTree Source),这个 DTS 文件采用树形结构描述板级设备,也就是开发板上的设备信息,比如CPU 数量、 内存基地址、IIC 接口上接了哪些设备、SPI 接口上接了哪些设备等等。
  树的主干就是系统总线,IIC 控制器、GPIO 控制器、SPI 控制器等都是接到系统主线上的分支。IIC 控制器有分为 IIC1 和 IIC2 两种,其中 IIC1 上接了 FT5206 和 AT24C02这两个 IIC 设备,IIC2 上只接了 MPU6050 这个设备。DTS 文件的主要功能就是按照图所示的结构来描述板子上的设备信息。

2.为什么要使用设备树来替代传统的总线设备驱动模型

  传统的总线设备驱动是将设备信息描述在C代码中,当需要修改驱动相关的硬件信息时,就得修改具体的代码文件,再全编译内核。整个操作繁琐且不利于代码的维护和移植。
  设备树的方式将驱动和设备完全分离开。将驱动程序设计成硬件无关的类型,一切设备资源(比如memory,interrupt,clk,pinctrl)在设备树文件中定义。内核来适配驱动和设备信息。将有效的设备信息通过参数传递给驱动的probe函数,再进行具体硬件的初始化。这样当硬件出现变更时(各公司基于芯片公版单独设计PCB等情况),只需要去修改对应的设备树文件,而完全不用去更改驱动代码。驱动的通用性也会大大提供。这样多个系列芯片只需要共用同一套驱动代码,差分设备树文件就可以。

3.DTS、DTB 和 DTC

  设备树的代码文件是dts文件和dtsi文件。

  • dts 是设备树源码文件:
  • dtsi文件类似include头文件,可以被dts文件包含;
  • dtb是将 dts编译以后得到的二进制文件。
       dts文件会被dtc(设备树编译器)编译为dtb(device tree block)的二进制文件。该文件会被烧写到内存的特定地址(由BootLoader指定,原则上随意,只要不覆盖了boot和kernel的内容就好)。再由BootLoader将地址通过参数传递给kernel。kernel根据dtb文件的特定格式解析出有效的设备信息,从而传递给驱动代码。
      dtc 工具源码在 Linux 内核的 scripts/dtc 目录下:
    在这里插入图片描述
      DTC 工具依赖于 dtc.c、flattree.c、fstree.c 等文件,最终编译出 DTC 这个主机文件。如果要编译 DTS 文件的话只需要进入到 Linux 源码根目录下,然后执行如下命令:make all 或者 make dtbs。

4. DTS 语法

4.1 .dtsi 头文件

  和 C 语言一样,设备树也支持头文件,设备树的头文件扩展名为.dtsi。与此同时,.dts 文件也可以引用 C 语言中的.h 文件,甚至也可以引用.dts 文件。
  一般.dtsi 文件用于描述 SOC 的内部外设信息,比如 CPU 架构、主频、外设寄存器地址范围,比如 UART、IIC 等等。

4.2 设备节点

  设备树是采用树形结构来描述板子上的设备信息的文件,每个设备都是一个节点,叫做设 备节点,每个节点都通过一些属性信息来描述节点信息,属性就是键—值对。
  设备树的基本单元是节点,由根节点(/)和其子节点(name@addr)组成,子节点也可以有子节点,形成一个树状结构。

/include/ "spear3xx.dtsi"

/ {
   
   
	ahb {
   
   
		#address-cells = <1>;
		#size-cells = <1>;
		compatible = "simple-bus";
		ranges = <0x60000000 0x60000000 0x50000000
			  0xd0000000 0xd0000000 0x30000000>;

		pinmux@99000000 {
   
   
			compatible = "st,spear300-pinmux";
			reg = <0x99000000 0x1000>;
		};

		clcd@60000000 {
   
   
			compatible = "arm,pl110", "arm,primecell";
			reg = <0x60000000 0x1000>;
			interrupts = <30>;
			status = "disabled";
		};

		fsmc: flash@94000000 {
   
   
			compatible = "st,spear600-fsmc-nand";
			
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值