Home  >  Article  >  Operation and Maintenance  >  What is Linux DTS? how to use?

What is Linux DTS? how to use?

WBOY
WBOYOriginal
2024-03-01 17:15:04723browse

Linux DTS是什么?如何使用?

Linux DTS (Device Tree Source) is a data structure that describes hardware information. It is mainly used to describe the information of each hardware device in an embedded system, including device address, interrupt, Register configuration and device driver, etc. In the Linux kernel, DTS files are usually used to describe the hardware information of onboard devices so that the operating system can correctly identify and use the hardware devices.

DTS file structure

A typical DTS file is as follows:

/dts-v1/;

#include <imx6qdl-pico.dtsi>
#include <imx6qdl-pico-m4.dtsi>

/ {
    compatible = "fsl,imx6q-pico", "fsl,imx6q";
    
    model = "Boundary Devices i.MX6 Quad SABRE Lite";
    
    memory {
        device_type = "memory";
        reg = <0x10000000 0x40000000>;
    };
    
    chosen {
        compatible = "brcm,bcm2835";
        uart_boot = <&uart1>;
    };

    aliases {
        serial0 = &uart1;
    };

    soc {
        compatible = "simple-bus";
        #address-cells = <1>;
        #size-cells = <1>;
        ranges;
        
        gpio: gpio@0209c000 {
            compatible = "fsl,imx6ul-gpio";
            reg = <0x0209c000 0x1000>;
            interrupts = <GPIOn IRQn>;
            gpio-controller;
            #gpio-cells = <2>;
        };
    
    };
    
    uart1: serial@02020000 {
        compatible = "fsl,imx6q-uart", "fsl,imx21-uart";
        reg = <0x02020000 0x40000>;
        interrupts = <78>;
        clocks = <&clks 82>;
        clock-names = "ipg", "per";
        status = "okay";
    };
    
    sound {
        compatible = "fsl,imx6-sai";
        model = "imx6-sai";
        status = "okay";
        /* SSI1 */
        ssi@021d8000 {
            compatible = "fsl,imx6-sai";
            reg = <0x021d8000 0x4000>;
            interrupts = <0 125 0>;
            clocks = <&clks 2>;
            dmas = <&sdma 9 11 0>, <&sdma 10 11 0>, <&sdma 11 11 0>;
            dma-names = "tx", "rx", "mclk";
            status = "okay";
        };
    };
};

DTS file content description

  • /dts- v1/: Specifies the version as DTS version 1, describing the version information of the DTS file.
  • #include 184cbaa65f0dd2e5fe6d736ea556f9c7: Includes other DTS files and can reuse their definitions.
  • /: The root node describes the entire device tree structure.
  • compatible: Specify device compatibility information.
  • model: Device model information.
  • memory: Describes memory information.
  • chosen: Describe some option information.
  • aliases: Define device aliases.
  • soc: Describe SoC related information.
  • gpio: Describes the GPIO controller.
  • uart1: Describes UART1 hardware information.
  • sound: Describes sound device information.

How to use Linux DTS

  1. Edit DTS files: Find the corresponding directory in the arch/arm/boot/dts/ directory in the Linux kernel source code The DTS file of the platform (such as imx6qdl-pico.dtsi), edit the DTS file based on the actual hardware information.
  2. Compile the DTS file: Execute the following command in the Linux kernel source code root directory to compile the DTS file:

    make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- dtbs
  3. Replace the device tree binary file: Replace the generated . dtb file (device tree binary file) to the boot partition of the target device.
  4. Use device tree: When the Linux kernel starts, the device tree file will be loaded to describe the hardware information to correctly identify and configure the hardware device.

Code Example

#include <linux/module.h>
#include <linux/of_device.h>
#include <linux/platform_device.h>

static int my_driver_probe(struct platform_device *pdev)
{
    struct device_node *np = pdev->dev.of_node;
    
    if (!np) {
        dev_err(&pdev->dev, "No device tree node found
");
        return -ENODEV;
    }
    
    // 解析设备树节点信息
    u32 reg;
    if (of_property_read_u32(np, "reg", &reg)) {
        dev_err(&pdev->dev, "Failed to read 'reg' property
");
        return -EINVAL;
    }
    
    dev_info(&pdev->dev, "Got 'reg' property: %u
", reg);
    
    return 0;
}

static const struct of_device_id my_driver_of_match[] = {
    { .compatible = "my_driver", },
    { },
};
MODULE_DEVICE_TABLE(of, my_driver_of_match);

static struct platform_driver my_driver = {
    .probe = my_driver_probe,
    .driver = {
        .name = "my_driver",
        .of_match_table = my_driver_of_match,
        .owner = THIS_MODULE,
    }
};

module_platform_driver(my_driver);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Author Name");
MODULE_DESCRIPTION("Sample driver using Device Tree");

The above is a simple Linux device driver example that configures hardware devices by parsing properties in device tree nodes. In the probe function, first obtain the device tree node, then read the reg attribute and output it. The compatibility information of the device tree nodes that need to be matched is declared in of_device_id so that the driver can correctly match the device.

The above is the detailed content of What is Linux DTS? how to use?. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn