U-boot fdt

U-boot下的fdt命令,可以查看U-boot环境下设备树信息、查看修改设备树的属性。

=> fdt
fdt - flattened device tree utility commands

Usage:
fdt addr [-c]  <addr> [<length>]   - Set the [control] fdt location to <addr>
fdt apply <addr>                    - Apply overlay to the DT
fdt move   <fdt> <newaddr> <length> - Copy the fdt to <addr> and make it active
fdt resize [<extrasize>]            - Resize fdt to size + padding to 4k addr + some optional <extrasize> if needed
fdt print  <path> [<prop>]          - Recursive print starting at <path>
fdt list   <path> [<prop>]          - Print one level starting at <path>
fdt get value <var> <path> <prop>   - Get <property> and store in <var>
fdt get name <var> <path> <index>   - Get name of node <index> and store in <var>
fdt get addr <var> <path> <prop>    - Get start address of <property> and store in <var>
fdt get size <var> <path> [<prop>]  - Get size of [<property>] or num nodes and store in <var>
fdt set    <path> <prop> [<val>]    - Set <property> [to <val>]
fdt mknode <path> <node>            - Create a new node after <path>
fdt rm     <path> [<prop>]          - Delete the node or <property>
fdt header                          - Display header info
fdt bootcpu <id>                    - Set boot cpuid
fdt memory <addr> <size>            - Add/Update memory node
fdt rsvmem print                    - Show current mem reserves
fdt rsvmem add <addr> <size>        - Add a mem reserve
fdt rsvmem delete <index>           - Delete a mem reserves
fdt chosen [<start> <end>]          - Add/update the /chosen branch in the tree
                                        <start>/<end> - initrd start/end addr
NOTE: Dereference aliases by omitting the leading '/', e.g. fdt print ethernet0.

使用fdt list命令,可以查看设备树的一级节点(node)

=> fdt list
/ {
        compatible = "radxa,rock-5b", "rockchip,rk3588";
        #address-cells = <0x00000002>;
        #size-cells = <0x00000002>;
        model = "Radxa ROCK 5B";
        fit-images {
        };
        aliases {
        };
        firmware {
        };
        psci {
        };
        xin24m {
        };
        sram@10f000 {
        };
        syscon@fd58c000 {
        };
        syscon@fd5ac000 {
        };
        syscon@fd5b0000 {
        };
        syscon@fd5bc000 {
        };
        syscon@fd5c4000 {
        };
        syscon@fd5c8000 {
        };
        syscon@fd5d0000 {
        };
        syscon@fd5f0000 {
        };
        clock-controller@fd7c0000 {
        };
        pcie@fe190000 {
        };
        spi@fe2b0000 {
        };
        mmc@fe2c0000 {
        };
        mmc@fe2e0000 {
        };
        decompress@fea80000 {
        };
        spi@feb20000 {
        };
        serial@feb50000 {
        };
        saradc@fec10000 {
        };
        otp@fecc0000 {
        };
        phy@fed80000 {
        };
        pinctrl {
        };
        syscon@fd5b8000 {
        };
        syscon@fd5c0000 {
        };
        crypto@fe370000 {
        };
        rng@fe378000 {
        };
        chosen {
        };
        secure-otp@fe3a0000 {
        };
        vcc12v-dcin {
        };
        vcc5v0-sys {
        };
        led-sys {
        };
        adc-keys {
        };
        vcc3v3-pcie30 {
        };
        vcc3v3-pcie2x1l2-regulator {
        };
};

如果想查看某个节点的具体信息,可以通过路径指定:

=> fdt list /pcie@fe190000
pcie@fe190000 {
        compatible = "rockchip,rk3588-pcie", "snps,dw-pcie";
        #address-cells = <0x00000003>;
        #size-cells = <0x00000002>;
        bus-range = <0x00000040 0x0000004f>;
        clocks = <0x1000000b 0x00000152 0x1000000b 0x00000157 0x1000000b 0x0000014d 0x1000000b 0x0000015d 0x1000000b 0x00000162 0x1000000b 0x00000182>;
        device_type = "pci";
        interrupts = <0x00000000 0x000000fd 0x00000004 0x00000000 0x000000fc 0x00000004 0x00000000 0x000000fb 0x00000004 0x00000000 0x000000fa 0x00000004 0x00000000 0x000000f9 0x00000004>;
        interrupt-names = "sys", "pmc", "msg", "legacy", "err";
        #interrupt-cells = <0x00000001>;
        interrupt-map-mask = <0x00000000 0x00000000 0x00000000 0x00000007>;
        interrupt-map = * 0x00000000eb9fa1dc [0x00000060];
        linux,pci-domain = <0x00000004>;
        num-ib-windows = <0x00000008>;
        num-ob-windows = <0x00000008>;
        num-viewport = <0x00000004>;
        max-link-speed = <0x00000002>;
        msi-map = <0x00004000 0x10000000 0x00004000 0x00001000>;
        num-lanes = <0x00000001>;
        phys = <0x10000021 0x00000002>;
        phy-names = "pcie-phy";
        power-domains = <0x1000000c 0x00000020>;
        ranges = * 0x00000000eb9fa304 [0x00000054];
        reg = <0x0000000a 0x41000000 0x00000000 0x00400000 0x00000000 0xfe190000 0x00000000 0x00010000 0x00000000 0xf4000000 0x00000000 0x00100000>;
        reg-names = "pcie-dbi", "pcie-apb", "pcie-config";
        resets = <0x1000000b 0x00000211 0x1000000b 0x00000220>;
        reset-names = "pcie", "periph";
        rockchip,pipe-grf = <0x10000014>;
        u-boot,dm-pre-reloc;
        pinctrl-names = "default";
        pinctrl-0 = <0x10000022 0x10000023>;
        reset-gpios = <0x10000024 0x00000008 0x00000000>;
        vpcie3v3-supply = <0x10000025>;
        status = "okay";
};