dts 设备树简析

vendor/brand/kernel/linaro/arch/arm64/boot/dts/product_an.dts
vendor/brand/kernel/linaro/arch/arm64/boot/dts/product_ramdisk.dts

dts、中断、gpio、sysfs、proc fs
gpio_export 、 gpio_export_link

cat /proc/interrupts
root@:/proc/irq/155 # cat /proc/interrupts
           CPU0       CPU1       CPU2       CPU3       
 29:          0          0          0          0       GIC  arch_timer
 30:     212778     237716     164114     199499       GIC  arch_timer
142:          0          0          0          0     brand  InitSSoundthrea
162:          0          0          0          0     brand  IR
166:          0          0          0          0     brand  MBX_FIQ_PM2MIPS
177:          0          0          0          0     brand  MBX_FIQ_R2toMIPS
192:        167          0          0          0     brand  serial
197:      23220          0          0          0     brand  brand_mci
199:      29968          0          0          0     brand  ehci_hcd:usb2
201:          0          0          0          0     brand  eth0
202:          0          0          0          0     brand  scaler, InitVideo Task
208:          0          0          0          0     brand  tvos
209:          0          0          0          0     brand  CECMonitor
212:      13920          0          0          0     brand  gop
226:          0          0          0          0     brand  ehci_hcd:usb1
229:        212          0          0          0     brand  ehci_hcd:usb3
231:          4          0          0          0     brand  serial
244:          0          0          0          0     brand  InitHDMIthread
245:      47397          0          0          0     brand  mali.0, mali.0, mali.0
249:          1          0          0          0     brand  tvos
IPI0:     50973      77252      63493      69686       Rescheduling interrupts
IPI1:        16         25         30         21       Function call interrupts
IPI2:         0         12         18          7       Single function call interrupts
IPI3:         0          0          0          0       CPU stop interrupts
IPI4:         0          0          0          0       Timer broadcast interrupts
Err:          0

cd /proc/irq/irq_num
root@:/proc/irq/155 # ls
affinity_hint
irq
node
smp_affinity
smp_affinity_list
spurious


cd sys/firmware/devicetree/base
root@:/sys/firmware/devicetree/base # ls
#address-cells
#size-cells
12c@1
12c@3
brand-ehci-1
brand-ehci-2
brand-ehci-3
alsa
battery
chosen
compatible
cpus
emac
fan1
fan_status
firmware
gflip
gpio
i2c@0
i2c@2
interrupt-controller@16001000
interrupt-parent
ir
jmgo_auto_focus
jmgo_gpio
lsm6ds3
mbx
memory@20200000
memory@38C00000
memory@A0000000
model
name
pmu
projector
rtc
scaler
timer
tmp75
xc


零、address-cells与size-cells:
#address-cells表示用几个cell表示地址,#size-cells表示用几个cell表示地址长度
/ {
    #address-cells = <0x2>; // 在root node下使用2个u32来代表address。
    #size-cells = <0x2>; // 在root node下使用2个u32来代表size。
    ...
    ...
    memory { // memory device
        ...
        reg = <0x90000000 00000000 0x800000 00000000>;
            // 0x90000000 00000000 是存取memory的address
            // 0x800000 00000000 是memory的size。
        ...
    };
    ...
    ...
}

一、寻址的运行:
可寻址的设备是使用以下属性将地址信息编入device tree的:
n   Reg
n   #address-cells
n   #size-cells

每个可寻址设备都会得到一个reg,它是一个元组列表:reg = <address1 length1 [address2 length2] [address3 length3] ... >。每个元组代表设备的地址范围。每个address值是一个或多个被叫做cells的32bit整数的列表。类似的,长度值可以为cells列表或为空。

由于地址或长度字段都是可变的,母节点的#address-cells和#size-cells属性就表示在每个字段中有多少个cells。也就是说想要准确的解释一个reg属性则需要有母节点的#address-cells和#size-cells值。想要了解这些是如何运行的,让我们将寻址属性添加到device tree样本,从CPUs开始。

CPU寻址
cpus {
        #address-cells = <1>;
        #size-cells = <0>;
        cpu@0 {
            compatible = "arm,cortex-a9";
            reg = <0>;
        };
        cpu@1 {
            compatible = "arm,cortex-a9";
            reg = <1>;
        };
    };
在cpus节点,#address-cells被设置成了1,#size-cells被设置成了0。这是说子reg值是单独的uint32,它用无大小字段表示地址。在此情况下,这两个cpu分配到的地址为0和1。Cpu节点的#size-cells是0因为每个cpu只分配到了一个单独的地址。
你仍然需要注意reg值班需要与节点名的值相匹配。按照惯例,如果一个节点有一个reg属性,那么这个节点名称必须包括unit-address,这是reg属性的第一个address值。

内存映射设备
与在cpu节点中单独的address值不同,内存映射设备被分配了一系列将要响应的地址。#size-cells用来表示在每个子reg元组中长度字段的大小。在以下示例中,每个address值为1 cell(32 bits),每个长度值也是1 cell,这在32 bit系统是比较典型的。64 bit设备也许会为#address-cells和#size-cells使用数值2,在device tree中获取64 bit addressing。
/ {
    #address-cells = <1>;
    #size-cells = <1>;
    ...
    serial@101f0000 {
        compatible = "arm,pl011";
        reg = <0x101f0000 0x1000 >;
    };
    serial@101f2000 {
        compatible = "arm,pl011";
        reg = <0x101f2000 0x1000 >;
    };
    gpio@101f3000 {
        compatible = "arm,pl061";
        reg = <0x101f3000 0x1000
               0x101f4000 0x0010>;
    };
    interrupt-controller@10140000 {
        compatible = "arm,pl190";
        reg = <0x10140000 0x1000 >;
    };
    spi@10115000 {
        compatible = "arm,pl022";
        reg = <0x10115000 0x1000 >;
    };
    ...
};


非内存映射设备
处理器总线的其它设备为非内存映射设备。他们有地址范围,但不能被CPU直接寻址。母设备的驱动程序将代替CPU进行间接访问。
以i2c设备为例,每个设备都分配了一个地址,但没有长度或范围与之相匹配。这与CPU地址分配很相似。
i2c@1,0 {
            compatible = "acme,a1234-i2c-bus";
            #address-cells = <1>;
            #size-cells = <0>;
            reg = <1 0 0x1000>;
            rtc@58 {
                compatible = "maxim,ds1338";
                reg = <58>;
            };
        };
        
 ■  interrupt-controller - 一个空的属性定义(就是仅仅列出了该字符串,见下面)  , 该节点作为一个接收中断信号的设备。

 ■  #interrupt-cells - 这是一个中断控制器节点的属性。它声明了该中断控制器的中断指示符中 cell 的个数(类似于 #address-cells 和 #size-cells)。

 ■  interrupt-parent - 这是一个设备节点的属性,包含一个指向该设备连接的中断控制器的 phandle。那些没有 interrupt-parent 的节点则从它们的父节点中继承该属性。

 ■  interrupts - 一个设备节点属性,包含一个中断指示符的列表,对应于该设备上的每个中断输出信号。
 
interrupts
二个cell的情况
第一个值: 该中断位于他的中断控制器的索引;
第二个值:触发的type
固定的取值如下:

        1 = low-to-high edge triggered
        2 = high-to-low edge triggered
        4 = active high level-sensitive
        8 = active low level-sensitive

三个cell的情况
第一个值:中断号
第二个值:触发的类型
第三个值:优先级,0级是最高的,7级是最低的;其中0级的中断系统当做 FIQ处理。
    
        
        

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章