文档来源 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