dts讲解

本文详细介绍了Linux设备树的结构和语法,包括节点、属性、中断、内存描述等内容,并重点讲解了GPIO的配置和使用方式,以及如何在驱动中获取GPIO信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/{                                  //根节点
    node1{                          //node1是节点名,是/的子节点
        key=value;                  //node1的属性
        ...
        node2{                      //node2是node1的子节点
            key=value;              //node2的属性
            ...
        };
    };                               //node1的描述到此为止
    node3{
        key=value;
        ...
    };
};
 
实际使用过程中:
/{                                  //根节点
    node1{                          //node1是节点名,是/的子节点
        key=value;                  //node1的属性
        ...
        node2{                      //node2是node1的子节点
            key=value;              //node2的属性
            ...
        };
    };                               //node1的描述到此为止
    node3{
        key=value;
        ...
    };
};
 
&node1{
 
};
 
 
设备树里面字符串表示
compatible = "comen,printer";
compatible = "comen,printer", "test1","test2";
 
32bit无符号整形数
test = <123>;
test = <0x123>;
test = <0x123 0x147 0x222>;
 
二进制数
test = [1a];
test = [1a 00 1b 1c];
 
节点名:
理论上节点名只要是长度不超过31个字符的ASCII字符串即可(一般按照C语言变量命令的方式就行),
此外Linux内核还约定节点名应写成形如<name>[@<unit_address>]的形式,其中name就是节点名,最长可以是31个字符长度。
unit_address一般是节点地址,用来唯一标识一个节点,下面就是典型节点名的写法:
rtc@6f {
        compatible = "rtc,rtc-isl1208";            //这个是属性    包含等号的,都可以理解为节点里面的属性
        reg = <0x6f>;                        
        interrupt-parent = <&gpio5>;            
        interrupts = <30 3>;                    
    };    
    
    
注:Linux设备数存在一些特殊节点,如:
    chosen:主要用来描述由系统指定的运行时的参数
    aliases:定义别名
    memory:描述内存。该节点里面的device_type 属性必须为 "memory"
    memory {
    device_type = "memory";
    reg = <0x10000000 0x40000000>;
    };
 
中断节点:
rtc@6f {
        compatible = "rtc,rtc-isl1208";            //这个是属性    包含等号的,都可以理解为节点里面的属性
        reg = <0x6f>;                            //寄存器
        interrupt-parent = <&gpio5>;            //中断属于哪一个中断控制器。如果没有这个,那么中断衣服改子节点的父节点
        interrupts = <30 3>;                    //30中断标识符,对应具体的中断号。    3表示边沿触发。触发类型如下。
        //int-gpios = <&gpio1 13 GPIO_ACTIVE_LOW>;    //这种方式,也可以实现中断。这种是通过gpio_to_irq进行操作
        
    };
    #define IRQF_TRIGGER_NONE    0x00000000
    #define IRQF_TRIGGER_RISING    0x00000001
    #define IRQF_TRIGGER_FALLING    0x00000002
    #define IRQF_TRIGGER_HIGH    0x00000004
    #define IRQF_TRIGGER_LOW    0x00000008
    
&ecspi3 {
    fsl,spi-num-chipselects = <1>;            //SPI片选引脚
    pinctrl-names = "default";                //这个属性,其一个注释的作用,在实际功能里面,不起左右
    pinctrl-0 = <&pinctrl_ecspi3>;            //配置SPI对应GPIO的功能,复用,上拉/下拉等
    pinctrl-1 = <&pinctrl_pwm1>;            //配置PWM对应GPIO的功能,复用,上拉/下拉等
    status = "okay";
    spi-max-frequency = <5000000>;            //SPI的速度
 
    motorenable-gpios = <&gpio4 30 0>;        //GPIO口设置
    motorpwm-id = <0>;                        //这里对应PWM1,代码里面从0开始计数,手册里面从1开始计数
//    motorpwm-gpios = <&gpio4 29 0>;            //GPIO口设置
    latch-gpios = <&gpio4 24 0>;            //GPIO口设置
    paperover-gpios = <&gpio4 25 0>;        //GPIO口设置
    storageerr-gpios = <&gpio4 26 0>;        //GPIO口设置
    printheat-gpios = <&gpio4 27 0>;        //GPIO口设置
    motorsleep-gpios = <&gpio4 31 0>;        //GPIO口设置
    strobe1-gpios = <&gpio4 23 0>;            //GPIO口设置
    strobe2-gpios = <&gpio4 28 0>;            //GPIO口设置
};    
 
上面的 &ecspi3 的&地址符号,类似C++里面引用的意思。
    
    
&weim {
    pinctrl-names = "default";
    pinctrl-0 = <&pinctrl_weim_fpga_1 &pinctrl_weim_cs0_1>;
    #address-cells = <2>;                    //表示地址用多少个32无符号位数来表示
    #size-cells = <1>;                        //表示大小空间。用1个32位无符号整数来表示
    ranges = <0 0 0x08000000 0x08000000>;    //local_address(2) parent_address(1) address_size(1)
    status = "okay";
    fsl,weim-cs-gpr = <&gpr>;
 
    comen-fpga@0,0 {
        compatible = "comen-fpga";
        reg = <0 0 0x08000000>;                //地址是0,大小是0x08000000
        #address-cells = <1>;
        #size-cells = <1>;
        bank-width = <2>;
        //                      CSxGCR1     CSxGCR2    CSxRCR1       CSxRCR2      CSxWCR1     CSxWCR2
        fsl,weim-cs-timing = <0x60123081 0x00000001 0x14015700 0x00000010 0x05640640 0x00000000>;
    };
    
};    
    
    
设备树里面正确描述gpio的方式及使用:
设备树里面描述gpio:gpios1 = <&gpio4 28 GPIO_ACTIVE_HIGH>;        //gpio4_28引脚当作普通IO口使用,硬件上面,高有效
                    gpios1 = <&gpio4 28 GPIO_ACTIVE_LOW>;        //gpio4_28引脚当作普通IO口使用,硬件上面,低有效    
                    gpios1 = <&gpio4 28 GPIO_ACTIVE_HIGH>,<&gpio4 29 GPIO_ACTIVE_HIGH>;    //两个GPIO一起描述
                    
驱动里面获取GPIO的相关信息:
    enable_gpio = of_get_named_gpio_flags(node, "gpios1", 0, &flags);    
    解释:    node-设备树节点对应的句柄
            gpios1-设备树节点GPIO对应的属性
            0-对应GPIO属性里面的第0个描述
            flags-保存对应IO口的GPIO_ACTIVE_HIGH/GPIO_ACTIVE_LOW属性
    
   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

monkey_llll

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值