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