【小技巧】从 linux 系统的设备树中得知当前系统的外设配置
如果你想得知系统的设备定义的一些内容,如某设备(/dev/xxxx)具体连接的引脚和使用驱动是什么,就可以从本文得知。
虽然本文是以 V831 为例,不过每个系统的定义具体内容不同,但树结点的使用是相通的,你可以具体问题具体分析。
拿简单一点的 SPI 设备结点来举例,我们可以这样查找系统路径下的内容,然后将其 cat 出来,以及对应的设备树结点配置。
首先设备树这边是这样定义 spi1 具体对应的引脚和定义设备要匹配的 spidev 驱动(compatible = "spidev";)。
spi1_pins_c: spi1@2 {
allwinner,pins = "PH0", "PH1", "PH2", "PH3";
allwinner,function = "io_disabled";
allwinner,muxsel = <7>;
allwinner,drive = <1>;
allwinner,pull = <0>;
};
spi@05011000 {
#address-cells = <1>;
#size-cells = <0>;
reg = <0x0 0x05011000 0x0 0x1000>;
interrupts = <GIC_SPI 55 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&clk_pll_periph0>, <&clk_spi1>;
clock-frequency = <200000000>;
pinctrl-names = "default", "sleep";
pinctrl-0 = <&spi1_pins_a &spi1_pins_b>;
pinctrl-1 = <&spi1_pins_c>;
spi1_cs_number = <2>;
spi1_cs_bitmap = <3>;
status = "okay";
spi_board1 {
device_type = "spi_board1";
compatible = "spidev";
spi-max-frequency = <0x5f5e100>;
reg = <0x0>;
spi-rx-bus-width = <0x1>;
spi-tx-bus-width = <0x1>;
};
};
那么就可以在 sys/firmware/devicetree/ 目录下找到它们具体的配置。
先来一次搜索 find / -name spi1@*
root@sipeed:/# find / -name spi1@*
/sys/firmware/devicetree/base/soc@03000000/pinctrl@0300b000/spi1@2
/sys/firmware/devicetree/base/soc@03000000/pinctrl@0300b000/spi1@0
/sys/firmware/devicetree/base/soc@03000000/pinctrl@0300b000/spi1@1
root@sipeed:/#
进一步可以得知 pinctrl@0300b000 的下属结点都有哪些树结点。
root@sipeed:/# ls sys/firmware/devicetree/base/soc@03000000/pinctrl@0300b000/
#gpio-cells owc0_sleep@0 spi0@0
#interrupt-cells phandle spi0@1
#size-cells pwm0@0 spi0@2
aif2@0 pwm0@1 spi1@0
aif2_sleep@0 pwm1@0 spi1@1
aif3@0 pwm1@1 spi1@2
aif3_sleep@0 pwm2@0 spi2@0
card0_boot_para@0 pwm2@1 spi2@1
card2_boot_para@0 pwm3@0 spi2@2
clocks pwm3@1 spi3@0
compatible pwm4@0 spi3@1
csi1@0 pwm4@1 spi3@2
csi1@1 pwm5@0 ts0@0
csi_mclk0@0 pwm5@1 ts0_sleep@0
csi_mclk0@1 pwm6@0 ts1@0
csi_mclk1@0 pwm6@1 ts1_sleep@0
csi_mclk1@1 pwm7@0 ts2@0
daudio0@0 pwm7@1 ts2_sleep@0
daudio0_sleep@0 pwm8@0 ts3@0
daudio1@0 pwm8@1 ts3_sleep@0
daudio1_sleep@0 pwm9@0 twi0@0
device_type pwm9@1 twi0@1
gmac@0 reg twi1@0
gmac@1 rgb8@0 twi1@1
gpio-controller rgb8@1 twi2@0
hdmi@0 scr0@0 twi2@1
hdmi@1 scr0@1 twi3@0
hdmi@2 scr0@2 twi3@1
hdmi@3 scr1@0 twi_para@0
input-debounce scr1@1 uart0@0
interrupt-controller scr1@2 uart0@1
interrupts sdc0@0 uart1@0
jtag_para@0 sdc0@1 uart1@1
linux,phandle sdc0@2 uart2@0
name sdc1@0 uart2@1
nand0@0 sdc1@1 uart3@0
nand0@1 sdc2@0 uart3@1
nand0@2 sdc2@1 uart_para@0
owc0@0 sdc2@2 vdevice@0
root@sipeed:/#
所以我们想得知 spi1 这个被具体实例化的设备到底绑定到哪些引脚,我们可以直接查询:
root@sipeed:/# cat ./sys/firmware/devicetree/base/soc@03000000/pinctrl@0300b000/
spi1@2/allwinner,pins
PH0PH1PH2PH3root@sipeed:/#
可知链接到了 PH0PH1PH2PH3 等结点,至于结点是如何对应 CLK MOSI MISO CS 可以看 spi1@0
的讯息,由于整理内容的时候觉得 cat 太丑了,就用 hexdump 了。
root@sipeed:/# hexdump -C ./sys/firmware/devicetree/base/soc@03000000/pinctrl@03
00b000/spi1@0/allwinner,pname
00000000 73 70 69 31 5f 73 63 6c 6b 00 73 70 69 31 5f 6d |spi1_sclk.spi1_m|
00000010 6f 73 69 00 73 70 69 31 5f 6d 69 73 6f 00 |osi.spi1_miso.|
0000001e
root@sipeed:/# hexdump -C ./sys/firmware/devicetree/base/soc@03000000/pinctrl@03
00b000/spi1@0/allwinner,pins
00000000 50 48 30 00 50 48 31 00 50 48 32 00 |PH0.PH1.PH2.|
0000000c
作为使用者,可以使用该方法去获取和使用系统提供的设备,所以你看完具体定义后,就可以对照原理图上找到具体引脚进行连接和测试了。