文档: linux-digilent-digilent-v4.0
文档来源 https://github.com/wenfengliaoshuzhai/linux-digilent
///////////////////////////////////////////////////////////////////////////////////////////////////////////
好博客
http://www.cnblogs.com/tureno/articles/6399782.html
///////////////////////////////////////////////////////////////////////////////////////////////////////////


/dts-v1/;

#include
#include

#include "s3c6410.dtsi"
//“/”表示根节点
/ {

//model =是根节点下边的属性
//
model属性我们是用来描述产品型号的,类型为字符串,
//推荐的格式为“manufacturer,model-number”(非强制的)。
//根节点的model属性描述的是板子的型号或者芯片平台的型号

    model = "SAMSUNG SMDK6410 board based on S3C6410";

//“compatible”属性是用来匹配驱动的,此处应该不是匹配驱动,而是进行配置芯片的。
//
compatible属性决定软件如何匹配硬件对硬件进行初始化
 
//samsung是代表厂商,
"samsung,s3c6410"是被兼容的
    compatible = "samsung,mini6410", "samsung,s3c6410";

    memory {
//0x50000000  为address, #address-cells = 代表 0x50000000  为32位     
//0x8000000为size 
#size-cells = 代表0x8000000为32位数
        reg = ;
    };

//chosen节点也位于根节点下,该节点用来给内核传递参数(不代表实际硬件)
    chosen {
        bootargs = "console=ttySAC0,115200n8 earlyprintk rootwait root=/dev/mmcblk0p1";
    };

    clocks {
//compatible实现了原先内核版本3.x之前,platform_device中.name的功能
        compatible = "simple-bus";

//规范规定一个32位的长度为一个cell。"#address-cells"属性用来表示总线地址需要几个cell表示,该属性本身是u32类型的

        #address-cells = ;
//"#size-cells"属性用来表示子总线地址空间的长度(地址范围)需要几个cell表示,属性本身的类型也是u32
        #size-cells = ;

        fin_pll: oscillator@0 {
            compatible = "fixed-clock";
            reg = ;
            clock-frequency = ;
            clock-output-names = "fin_pll";
            #clock-cells = ;
        };

        xusbxti: oscillator@1 {
            compatible = "fixed-clock";
            reg = ;
            clock-output-names = "xusbxti";
            clock-frequency = ;
            #clock-cells = ;
        };
    };

    srom-cs1@18000000 {
        compatible = "simple-bus";
        #address-cells = ;
        #size-cells = ;
        reg = ;
        ranges;

        ethernet@18000000 {
//SMSC公司的lan9115以太网芯片
//“compatible”属性是用来匹配驱动的
            compatible = "smsc,lan9115";
            reg = ;
            interrupt-parent = ;
            interrupts = ;
            phy-mode = "mii";
            reg-io-width = ;
            smsc,force-internal-phy;
        };
    };
};

&sdhci0 {
    pinctrl-names = "default";
    pinctrl-0 = , , , ;
    bus-width = ;

//'status'属性用来表示节点的状态的,其实就是硬件的状态  "'okay'表示硬件正常工作
    status = "okay";
};

&uart0 {
    pinctrl-names = "default";
    pinctrl-0 = , ;
    status = "okay";
};

&uart1 {
    pinctrl-names = "default";
    pinctrl-0 = ;
    status = "okay";
};

&uart2 {
    pinctrl-names = "default";
    pinctrl-0 = ;
    status = "okay";
};

&uart3 {
    pinctrl-names = "default";
    pinctrl-0 = ;
    status = "okay";
};
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

设备树将这些共同部分提炼保存在.dtsi文件中,供不同的dts共同使用

///文件里有#include "s3c6410.dtsi"

#include "s3c64xx.dtsi"

/ {
    compatible = "samsung,s3c6410";

//aliases node用来定义别名,类似C++中引用
    aliases {
        i2c1 = &i2c1;
    };
};

&vic0 {
    valid-mask = ;
    valid-wakeup-mask = ;
};

&vic1 {
    valid-mask = ;
    valid-wakeup-mask = ;
};

&soc {
    clocks: clock-controller@7e00f000 {
        compatible = "samsung,s3c6410-clock";
        reg = ;
        #clock-cells = ;
    };

//
//struct platform_device s3c_device_i2c1 = {   .name           = "s3c2410-i2c",
///struct platform_device s3c_device_i2c3 = {   .name           = "s3c2440-i2c",
//compatible = "samsung,s3c2440-i2c";这句后面s3c2440-i2c是指定了具体的设备驱动名字了。


    i2c1: i2c@7f00f000 {
        compatible = "samsung,s3c2440-i2c";
        reg = ;
        interrupt-parent = ;
        interrupts = ;
        clock-names = "i2c";
        clocks = ;

////'status'属性用来表示节点的状态的,其实就是硬件的状态  “disabled”表示硬件当前不可用
        status = "disabled";
        #address-cells = ;
        #size-cells = ;
    };
};
//////////////////////////////////////////////////////////////////////////////////////////////////////////



//文件里有#include "s3c64xx.dtsi"


#include "skeleton.dtsi"
#include

/ {
    aliases {
        i2c0 = &i2c0;
        pinctrl0 = &pinctrl0;
        serial0 = &uart0;
        serial1 = &uart1;
        serial2 = &uart2;
        serial3 = &uart3;
    };


父节点的# address-cells和#size-cells决定了子节点的address和size的长度;Reg的组织形式为reg = <address1 size1 [address2 size2] [address3 size3] ... >
#address-cells = ;
基地址、片选号等绝对起始地址(address1 )所占字长(32位)
#size-cells = ; 
长度(地址长度值,也就是size1所占字长)所占字长(32位)
 reg = ;
0x50000000  为address, #address-cells = 代表 0x50000000  为32位      0x8000000为size 
#size-cells = 代表0x8000000为32位数
 

    cpus {
//#address-cells 设置为 1。这意味着子节点的 reg 值是一个单一的 uint32
        #address-cells = ;

// #size-cells 为 0 是因为只为每个 cpu 分配一个单独的地址
        #size-cells = ;

        cpu@0 {
//"device_type"属性用来表示设备类型
            device_type = "cpu";
//使用于arm1176jzf-s CPU,  "arm,arm1176"这个芯片是被兼容的
            compatible = "arm,arm1176jzf-s", "arm,arm1176";
            reg = ;
        };
    };

    soc: soc {
        compatible = "simple-bus";
        #address-cells = ;
        #size-cells = ;
        ranges;
//中断控制器节点用interrupt-controller属性表示自己是中断控制器,这个属性的类型是空,不用设置值,
//只要存在这个节点就表示该节点是中断控制器

        vic0: interrupt-controller@71200000 {
            compatible = "arm,pl192-vic";
            interrupt-controller;
            reg = ;

//#interrupt-cells属性的类型是u32,
//假如一个中断源需要2个u32表示(一个表示中断号,另一个表示中断类型),那么#interrupt-cells就设置成2
//
#interrupt-cells属性,用来表示该中断控制器直接管理下的interrupt domain用几个u32表示一个中断源(interrupt specifier)
            #interrupt-cells = ;
        };

        vic1: interrupt-controller@71300000 {
            compatible = "arm,pl192-vic";
            interrupt-controller;
            reg = ;
            #interrupt-cells = ;
        };

        sdhci0: sdhci@7c200000 {
            compatible = "samsung,s3c6410-sdhci";
            reg = ;

//用interrupt-parent属性指向他的中断父设备
//
他的中断父设备可能是中断控制器,也可能是interrupt nexus节点(如果最底层是中断产生设备,且需要映射)
            interrupt-parent = ;
            interrupts = ;
            clock-names = "hsmmc", "mmc_busclk.0", "mmc_busclk.2";
            clocks = , ,
                    ;
            status = "disabled";
        };

        sdhci1: sdhci@7c300000 {
            compatible = "samsung,s3c6410-sdhci";
            reg = ;
            interrupt-parent = ;
            interrupts = ;
            clock-names = "hsmmc", "mmc_busclk.0", "mmc_busclk.2";
            clocks = , ,
                    ;
            status = "disabled";
        };

        sdhci2: sdhci@7c400000 {
            compatible = "samsung,s3c6410-sdhci";
            reg = ;
            interrupt-parent = ;
            interrupts = ;
            clock-names = "hsmmc", "mmc_busclk.0", "mmc_busclk.2";
            clocks = , ,
                    ;
            status = "disabled";
        };

        watchdog: watchdog@7e004000 {
            compatible = "samsung,s3c2410-wdt";
            reg = ;
            interrupt-parent = ;
            interrupts = ;
            clock-names = "watchdog";
            clocks = ;
            status = "disabled";
        };

//
//struct platform_device s3c_device_i2c0 = {    .name        = "s3c2410-i2c",.resource    = s3c_i2c0_resource,
//static struct resource s3c_i2c0_resource[] = {    [0] = DEFINE_RES_MEM(S3C_PA_IIC, SZ_4K),
 //  [1] = DEFINE_RES_IRQ(IRQ_IIC),};
//
//#define S3C_PA_IIC        S3C64XX_PA_IIC0
///struct platform_device s3c_device_i2c3 = {   .name           = "s3c2440-i2c",
//compatible = "samsung,s3c2440-i2c";这句后面s3c2440-i2c是指定了具体的设备驱动名字了。

        i2c0: i2c@7f004000 {
            compatible = "samsung,s3c2440-i2c";

//0x1000 = 4096 也就是4K
//
//#define S3C64XX_PA_IIC0        (0x7F004000)
//#define S3C64XX_PA_IIC1        (0x7F00F000)

            reg = ;


////#define IRQ_IIC            S3C64XX_IRQ_VIC1(18)
            interrupt-parent = ;               //中断父节点是vic1中断控制器
            interrupts = <18>;

            clock-names = "i2c";
            clocks = ;
            status = "disabled";
//#address-cells 设置为 1。这意味着子节点的 reg 值是一个单一的 uint32
            #address-cells = ;

            #size-cells = ;//??????
        };

        uart0: serial@7f005000 {
            compatible = "samsung,s3c6400-uart";
            reg = ;
            interrupt-parent = ;
            interrupts = ;
            clock-names = "uart", "clk_uart_baud2",
                    "clk_uart_baud3";
            clocks = , ,
                    ;
            status = "disabled";
        };

        uart1: serial@7f005400 {
            compatible = "samsung,s3c6400-uart";
            reg = ;
            interrupt-parent = ;
            interrupts = ;
            clock-names = "uart", "clk_uart_baud2",
                    "clk_uart_baud3";
            clocks = , ,
                    ;
            status = "disabled";
        };

        uart2: serial@7f005800 {
            compatible = "samsung,s3c6400-uart";
            reg = ;
            interrupt-parent = ;
            interrupts = ;
            clock-names = "uart", "clk_uart_baud2",
                    "clk_uart_baud3";
            clocks = , ,
                    ;
            status = "disabled";
        };

        uart3: serial@7f005c00 {
            compatible = "samsung,s3c6400-uart";
            reg = ;
            interrupt-parent = ;
            interrupts = ;
            clock-names = "uart", "clk_uart_baud2",
                    "clk_uart_baud3";
            clocks = , ,
                    ;
            status = "disabled";
        };

        pwm: pwm@7f006000 {
            compatible = "samsung,s3c6400-pwm";
            reg = ;
            interrupt-parent = ;
            interrupts = , , , , ;
            clock-names = "timers";
            clocks = ;
            samsung,pwm-outputs = , ;
            #pwm-cells = ;
        };

        pinctrl0: pinctrl@7f008000 {
            compatible = "samsung,s3c64xx-pinctrl";
            reg = ;
            interrupt-parent = ;
            interrupts = ;

            pctrl_int_map: pinctrl-interrupt-map {
                interrupt-map = ,
                        ,
                        ,
                        ;
                #address-cells = ;
                #size-cells = ;
                #interrupt-cells = ;
            };

            wakeup-interrupt-controller {
                compatible = "samsung,s3c64xx-wakeup-eint";
                interrupts = , , , ;
                interrupt-parent = ;
            };
        };
    };
};
//内核里有几处出现在末尾include的情况了。呵呵
#include "s3c64xx-pinctrl.dtsi"
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////



参考:http://blog.csdn.net/loongembedded/article/details/51453499








12-09 22:47
查看更多