/sys/firmware/devicetree/base里面是以目录结构呈现设备树,base是设备树根节点
/sys/firmware/fdt 原始dtb文件
/proc/device-tree -> /sys/firmware/devicetree/base 链接 文件 指向设备树
内核中设备树信息
linux-xlnx\Documentation\devicetree\bindings
设备树加载之后,内核会自动把设备树节点转换成 platform_device这种格式,同时把名字放到of_node这个地方。
/sys/devices/platform //系统中所有的platform_device设备,有来自设备树的,也有来自.c文件注册的。而对于来自设备树的platform_device,可以进入/sys/devices/platform/<设备名>/of_node查看它的设备树属性 ,有of_node节点说明来自于设备树的platform_device,此处的of_node ->链接指向/sys/firmware/devicetree/base子目录
DTS编码规范:
[label:] node-name[@unit-address] {
[properties definitions]
[child nodes]
};
{
memory_1: memory@30000000 {
device_type = "memory";
reg = <0x30000000 0x1000000>;
child_node {};
}
}
broken-cd 表示没有热插拔探测引脚,使用轮询检测
cd-gpios 使用gpio管脚作为热插拔探测引脚
non-removable 表示不能进行热插拔,设备一直连接(比如eMMC)
上面三个选项用于指定热插拔探测选项,如果三个选项都没有指定,则使用主机自带的热插拔引脚sdcd
bus-width 数据总线位宽,默认值是<1>,也可以是<4>,<8>
wp-gpios 使用gpio管脚作为写保护引脚
max-frequency 表示mmc总线最大操作频率
cd-inverted 表示cd引脚是active high
wp-inverted 表示wp引脚是active high
no-1-8-v 该选项存在的话,表示该总线控制器不支持1.8v设备卡
(即使该控制器硬件支持1.8v设备卡)
cap-power-off-card 关闭该卡电源很安全
cap-sdio-irq 使能SDIO总线 IRQ
full-pwr-cycle 支持设备卡的整个电源周期
cap-sd-highspeed 支持SD high-speed时序
cap-mmc-highspeed 支持MMC high-speed时序
sd-uhs-sdr12 支持SD UHS SDR12 speed
sd-uhs-sdr25 支持SD UHS SDR25 speed
sd-uhs-sdr50 支持SD UHS SDR50 speed
sd-uhs-sdr104 支持SD UHS SDR104 speed
sd-uhs-ddr12 支持SD UHS DDR12 speed
mmc-ddr-1_8v 支持eMMC high-speed DDR(1.8v)
mmc-ddr-1_2v 支持eMMC high-speed DDR(1.2v)
mmc-hs200-1_8v 支持eMMC HS200 mode
mmc-hs200-1_2v 支持eMMC HS200 mode
mmc-hs400-1_8v 支持eMMC HS400 mode
mmc-hs400-1_2v 支持eMMC HS400 mode
keep-power-in-suspend 表示待机时不掉电
enable-sdio-wakeup SDIO中断发生时允许唤醒主机系统
mmc-pwrseq 指定电源上电顺序
dsr 表示卡的DSR寄存器的值[从0x00 … 0xffff]
vmmc-supply 指向regulator设备树节点
mmc控制器存在子节点时,必须指定下面两个选项
#address-cells 值必须是1
#size-cells 值必须是0
MMC子节点属性
reg 该值必须是0~7,其中0表示SD卡,1~7表示SDIO设备
比如SDIO接口的WIFI芯片
第一个图描述mmc控制器的不变属性,比如mmc控制器的寄存器地址,中断,dma通道,一般定义在.dtsi文件中
第二个图描述mmc控制器的可变属性及其子节点属性,比如mmc控制器的引脚复用情况,总线位宽,一般定义在.dts文件中
注意:一般在公用的.dtsi文件中,添加不变属性(比如reg属性,中断,dma通道),在具体板卡的 .dts文件中添加可变属性(比如GPIO使用情况,引脚复用情况),以及子结点信息,这样使得.dtsi文件和.dts文件解耦
status 表示使能该总线控制器,enable或者disable
clock-frequency 设置i2c总线频率,一般为400KHZ或者100KHZ
i2c控制器节点存在子节点时,该控制器节点必须指定下面两个选项
#address-cells 值必须是1
#size-cells 值必须是0
由于I2C子节点属性比较简单,因此不进行任何讲解
上面有两个图,都是用来定义i2c控制器节点属性
第一个描述i2c控制器的不变属性,比如i2c控制器的寄存器地址,中断,一般定义在.dtsi文件中
第二个描述子节点属性,一般定义在.dts文件中
status 表示使能该总线控制器,enable或者disable
cs-gpios 使用gpio管脚作为片选信号
num-cs 表示片选信号数量,包括原生片选信号和gpio片选信号
比如:cs-gpios = <0> <0> <&gpio1 18 GPIO_ACTIVE_LOW>
num-cs = <3>
上述spi控制器片选信号的映射关系如下图所示
spi控制器节点存在子节点时,该控制器节点必须指定下面两个选项
#address-cells 值必须是1
#size-cells 值必须是0
SPI子节点属性
spi-max-frequency 设置spi总线频率
spi-cs-high 表示spi子设备片选信号为高电平
spi-tx-bus-width 设置spi控制器输出总线位宽,默认为1(仅有一根数据线作为MOSI),QSPI(QUAD)总线位宽为4,spi-tx-bus-width = <4>
spi-rx-bus-width 设置spi控制器输入总线位宽,默认为1(仅有一根数据线作为MISO),QSPI(QUAD)总线位宽为4,spi-rx-bus-width = <4>
&ecspi3 {
fsl,spi-num-chipselects = <1>; /*一个片选信号*/
cs-gpios = <&gpio1 20 GPIO_ACTIVE_LOW>; /*软件片选引脚,低电平有效*/
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_ecspi3>;
status = "okay";
/*对应的spi子节点*/
spidev0: icm20608@0 { /*@后面的0表示spi芯片接到哪个硬件片选上,本实验硬件上接到了0,但使用的是软件片选*/
reg = <0>; /*required*/
compatible = "alientek,icm20608";
spi-max-frequency = <8000000>; /*SPI时钟频率8MHZ*/
};
};
spi0: spi@e0006000 {
compatible = "xlnx,zynq-spi-r1p6";
reg = <0xe0006000 0x1000>;
status = "disabled";
interrupt-parent = <&intc>;
interrupts = <0 26 4>;
clocks = <&clkc 25>, <&clkc 34>;
clock-names = "ref_clk", "pclk";
#address-cells = <1>;
#size-cells = <0>;
};
spi1: spi@e0007000 {
compatible = "xlnx,zynq-spi-r1p6";
reg = <0xe0007000 0x1000>;
status = "disabled";
interrupt-parent = <&intc>;
interrupts = <0 49 4>;
clocks = <&clkc 26>, <&clkc 35>;
clock-names = "ref_clk", "pclk";
#address-cells = <1>;
#size-cells = <0>;
};
&spi1 {
status = "okay";
num-cs = <4>;
xxx@0 {
compatible = "yyy";
reg = <0x0>;
spi-max-frequency = <50000000>;
spi-cpol;
spi-cpha;
spi-cs-high;
};
};
GPIO模拟SPI
253 zed_oled {
254 compatible = "dglnt,pmodoled-gpio";
255 /* GPIO Pins */
256 vbat-gpio = <&gpiops 55 0>;
257 vdd-gpio = <&gpiops 56 0>;
258 res-gpio = <&gpiops 57 0>;
259 dc-gpio = <&gpiops 58 0>;
260 /* SPI-GPIOs */
261 spi-bus-num = <2>;
262 spi-speed-hz = <4000000>;
263 spi-sclk-gpio = <&gpiops 59 0>;
264 spi-sdin-gpio = <&gpiops 60 0>;
265 };
interrupt-parent = <&intc>;
interrupts = <0 29 1>,//time slot 1 = low-to-high edge triggered 2 = high-to-low edge triggered 4 = active high 8 = active low
<0 31 1>,//req_rx
<0 34 1>,//broc
<0 35 1>,//attn
<0 36 1>;//srio
base address
spi: spi@7e204000 {
compatible = "brcm,bcm2835-spi";
reg = <0x7e204000 0x1000>;
interrupts = <2 22>;
clocks = <&clk_spi>;
#address-cells = <1>;
#size-cells = <0>;
status = "disabled";
};
芯片datasheet The base address of this SPI0 interface is 0x7E204000.
interrupts = <2 22>
中断号在芯片datasheet ARM peripherals interrupts table.
QSPI
48 &qspi {
49 status = "okay";
50 is-dual = <0>;
51 num-cs = <1>;
52 xlnx,fb-clk = <0x1>;
53 xlnx,qspi-mode = <0x0>;
54 flash@0 {
55 compatible = "n25q128";
56 reg = <0x0>;
57 spi-tx-bus-width = <1>;
58 spi-rx-bus-width = <4>;
59 spi-max-frequency = <50000000>;
60 #address-cells = <1>;
61 #size-cells = <1>;
62 partition@qspi-boot {
63 label = "qspi-boot";
64 reg = <0x0 0x080000>;
65 };
66 partition@qspi-bootenv {
67 label = "qspi-bootenv";
68 reg = <0x080000 0x020000>;
69 };
70 partition@qspi-bitstream {
71 label = "qspi-bitstream";
72 reg = <0x0A0000 0x460000>;
73 };
74 partition@qspi-kernel {
75 label = "qspi-kernel";
76 reg = <0x500000 0x480000>;
77 };
78 partition@qspi-devicetree {
79 label = "qspi-devicetree";
80 reg = <0x980000 0x010000>;
81 };
82 partition@qspi-rootfs {
83 label = "qspi-rootfs";
84 reg = <0x990000 0x600000>;
85 };
86 partition@qspi-data {
87 label = "data";
88 reg = <0xF90000 0x070000>;
89 };
90 };
91 };
Z-turn# cat /proc/mtd
dev: size erasesize name
mtd0: 00080000 00001000 "qspi-boot"
mtd1: 00020000 00001000 "qspi-bootenv"
mtd2: 00460000 00001000 "qspi-bitstream"
mtd3: 00480000 00001000 "qspi-kernel"
mtd4: 00010000 00001000 "qspi-devicetree"
mtd5: 00600000 00001000 "qspi-rootfs"
mtd6: 00070000 00001000 "data"
PCI总线上的设备可以通过枚举查询设备,所以不需要设备树
x86上的设备一般是挂到pcie总线上的,设备可以通过pcie的枚举机制枚举到。