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處理。
    
        
        

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