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