• 【小技巧】从 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
    

    作为使用者,可以使用该方法去获取和使用系统提供的设备,所以你看完具体定义后,就可以对照原理图上找到具体引脚进行连接和测试了。

  • 相关阅读:
    无重复字符的最长子串
    有效的括号
    最长公共前缀
    罗马数字转整数
    Android解析JSON数据异步加载新闻图片
    回文数
    Java从Json获得数据的四种方式
    JavaMD5加密工具类
    div模仿select效果二:带搜索框
    BG雪碧图制作要求
  • 原文地址:https://www.cnblogs.com/juwan/p/14355257.html
Copyright © 2020-2023  润新知