User Tools

Site Tools


Sidebar

Go Back

Refresh

You are not allowed to add pages

Direct Link

library:rk3568:dtsguide

This is an old revision of the document!


DTS简述

1. DTS文件

rk3568-firefly-aioj.dts
  |- rk3568-firefly-aioj.dtsi
       |- rk3568-firefly-core.dtsi
            |- rk3568.dtsi
                 |- rk3568-dram-default-timing.dtsi
       |- rk356x-firefly-demo.dtsi
       |- rk3568-linux.dtsi

2. node节点

{}包围起来的结构称之为节点,dts中最开头的/ {},称为根节点。

节点的标准结构是xxx@yyy{属性1;属性2;…},其中:

xxx:节点名
yyy(可选):节点的地址(寄存器地址或其他地址)
例:
i2c1:i2c@021a0000
rtc:pcf8523@68

2.1 一般属性

2.1.1 reg

reg的格式通常为<address length>
例:reg = <0x021a0000 0x4000>; 0x021a0000是寄存器基地址,0x4000是长度。
address 和length的个数是可变的,由父节点的属性#address-cells 和#size-cells 决定,
比如节点i2c@021a0000的父节点是aips-bus@02000000,其#address-cells 和#size-cells均为1,所以下面的i2c节点的reg属性就有一个address 和length,
而i2c节点本身#address-cells 和#size-cells 分别为1和0,所以其下的rtc: pcf8523@68 的reg属性就只有一个0x68(i2c地址)了

i2c1: i2c@021a0000 {
  #address-cells = <1>;
  #size-cells = <0>;
  compatible = "fsl,imx6q-i2c", "fsl,imx21-i2c";
  reg = <0x021a0000 0x4000>;
  interrupts = <0 36 IRQ_TYPE_LEVEL_HIGH>;
  clocks = <&clks IMX6QDL_CLK_I2C1>;
  status = "disabled";
};

配置node可以根据compatible,在kernel/Documentation/devicetree/bindings中查到说明,
或在 kernel/drivers/tty/serial/ 早到驱动代码。例如:

v2m_serial0: uart@090000 {
  compatible = "arm,pl011", "arm,primecell";
  reg = <0x090000 0x1000>;
  interrupts = <5>;
  clocks = <&v2m_clk24mhz>, <&v2m_clk24mhz>;
  clock-names = "uartclk", "apb_pclk";
};

&i2c1 {
  pinctrl-names = "default";
  pinctrl-0 = <&pinctrl_hummingboard_i2c1>;

  rtc: pcf8523@68 {
      compatible = "nxp,pcf8523";
      reg = <0x68>;
};

2.1.2 compatible

如果一个节点是设备节点,那么它一定要有compatible(兼容性),因为这将作为驱动和设备(设备节点)的匹配依据,
compatible(兼容性)的值可以有不止一个字符串以满足不同的需求。
而根节点的compatible也是非常重要的,因为系统启动后,将根据根节点的compatible来判断cpu信息,并由此进行初始化。

2.1.3 pinctrl-names

pinctrl-names:定义设备不同的工作状态,一般包括下面几个:
default、init、sleep、idle
其中,sleep、idle用于系统的电源管理,以达到控制系统功耗的目的。

pinctrl-0:定义了一个phandles的列表,每个phandle指向一个pinctrl的节点。
该配置项定义了该设备的一种工作状态,其对应于pinctrl-names中首个工作状态。

下面举例说明一下:

deviceA {
  pinctrl-names = “defalut”, “idle”;
  pinctrl-0 = <&state_0_node_a>;
  pinctrl-1 = <&state_1_node_a &state_1_node_b>;
};

deviceA节点,定义了“default”,“idle”两种工作状态,随后依次定义了pinctrl-0和pinctrl-1两个pins列表,分别对应于两个状态。

2.1.4 属性的编写说明

2.1.4.1 参考SDK中第的属性说明

#<path to sdk>  
cd kernel
cd Documentation/devicetree/bindings/
grep "arm,pl011" -rn *

2.1.4.2 在代码中获取属性编写格式

#<path to sdk>
cd kernel/drivers/tty/serial/
grep "arm,pl011" -rn *

2.2 节点之间的联系

  • 节点与节点之间的关联,通常通过“标号引用”和“包含”来实现
    1. 标号引用,就是在节点名称前加上标号,这样设备树的其他位置就能够通过&符号来调用/访问该节点
    2. 包含则是最基本的方式,比如我们要在i2c1接口添加一个i2c外设,那么就必须要在i2c1下面添加一个节点
  • 标号引用常常还作为节点的重写方式
  • 如果一个节点是属性节点(即仅仅是作为属性被其他节点调用),可定义在任意位置

属性节点定义在哪里其实无所谓,重要的是调用的位置,比如lcd屏幕的时序,
其实我们完全可以把它定义在任何地方,然后在lcd节点下用&来调用它。
这有点类似于函数:在哪定义不重要,重要的是在哪调用。

library/rk3568/dtsguide.1667233421.txt.gz · Last modified: 2022/11/01 00:23 by lhaosen