ZYNQ

您所在的位置:网站首页 dtc反编译 ZYNQ

ZYNQ

2023-09-26 15:55| 来源: 网络整理| 查看: 265

目录 一、首先记录下来petalinux生成的设备树文件二、DTS的基本语法三、反编译DTB得到DTC 与 解析

一、首先记录下来petalinux生成的设备树文件

这个是system-top.dts内容:

/* * CAUTION: This file is automatically generated by Xilinx. * Version: * Today is: Fri Dec 27 11:18:21 2019 */ /dts-v1/; /include/ "zynq-7000.dtsi" /include/ "pcw.dtsi" / { chosen { bootargs = "earlycon"; stdout-path = "serial0:115200n8"; }; aliases { ethernet0 = &gem0; serial0 = &uart1; spi0 = &qspi; }; memory { device_type = "memory"; reg = ; }; }; #include "system-user.dtsi"

这个是system-user.dtsi 内容:

/include/ "system-conf.dtsi" / { reserved-memory { #address-cells = ; #size-cells = ; ranges; rproc_0_reserved: rproc@18000000 { no-map; reg = ; }; }; amba { elf_ddr_0: ddr@0 { compatible = "mmio-sram"; reg = ; }; }; remoteproc0: remoteproc@0 { compatible = "xlnx,zynq_remoteproc"; firmware = "firmware"; vring0 = ; vring1 = ; srams = ; }; };

这个是system-conf.dtsi内容:

/* * CAUTION: This file is automatically generated by PetaLinux SDK. * DO NOT modify this file */ / { chosen { bootargs = "console=ttyPS0,115200 earlyprintk root=/dev/mmcblk0p2 rw rootwait rootfstype=ext4 mem=256M maxcpus=1"; stdout-path = "serial0:115200n8"; }; }; &gem0 { local-mac-address = [00 0a 35 00 1e 53]; }; &qspi { #address-cells = ; #size-cells = ; flash0: flash@0 { compatible = "n25q512a","micron,m25p80"; reg = ; #address-cells = ; #size-cells = ; spi-max-frequency = ; partition@0x00000000 { label = "boot"; reg = ; }; partition@0x00500000 { label = "bootenv"; reg = ; }; partition@0x00520000 { label = "kernel"; reg = ; }; partition@0x00fa0000 { label = "spare"; reg = ; }; }; }; 二、DTS的基本语法

① “/”为root节点。在一个.dts文件中,有且仅有一个root节点;在root节点下有“node1”,“node2”子节点,称root为“node1”和“node2”的parent节点,除了root节点外,每个节点有且仅有一个parent;其中子节点node1下还存在子节点“child-nodel1”和“child-node2”。

② 上面三个dts文件里都包含了一个根节点,编译器DTC在对DTS进行编译时,会对节点进行合并操作,最终生成的dtb只有一个根节点。

③ 在节点的{}里面是描述该节点的属性(property),即设备的特性。

④ 对于相同名称的节点,dtc会根据定义的先后顺序进行合并,其相同属性,取后定义的那个。

⑤ /dts-v1/: 第一行的/dts-v1/表示设备树文件的版本没有实际的意义,设备树中的文件每条语句结束时,都会加上";",表示一条语句的完成,和C语言类似。

⑥ "memory"是板级内存的信息。

⑦ ”chosen“是板级启动参数。

⑧ aliases node用来定义别名,类似C++中引用。

⑨ #include “xxx.dtsi” 和 /include/ “xxx.dtsi” 功能相同。

三、反编译DTB得到DTC 与 解析

执行下面命令,使用DTC反编译DTB得到DTS。

dtc -I dtb -O dts -o test.dts system.dtb

得到的dts如下:

/dts-v1/; / { #address-cells = ; #size-cells = ; compatible = "xlnx,zynq-7000"; cpus { #address-cells = ; #size-cells = ; cpu@0 { compatible = "arm,cortex-a9"; device_type = "cpu"; reg = ; clocks = ; clock-latency = ; cpu0-supply = ; operating-points = ; }; cpu@1 { compatible = "arm,cortex-a9"; device_type = "cpu"; reg = ; clocks = ; }; }; fpga-full { compatible = "fpga-region"; fpga-mgr = ; #address-cells = ; #size-cells = ; ranges; }; pmu@f8891000 { compatible = "arm,cortex-a9-pmu"; interrupts = ; interrupt-parent = ; reg = ; }; fixedregulator { compatible = "regulator-fixed"; regulator-name = "VCCPINT"; regulator-min-microvolt = ; regulator-max-microvolt = ; regulator-boot-on; regulator-always-on; linux,phandle = ; phandle = ; }; amba { u-boot,dm-pre-reloc; compatible = "simple-bus"; #address-cells = ; #size-cells = ; interrupt-parent = ; ranges; adc@f8007100 { compatible = "xlnx,zynq-xadc-1.00.a"; reg = ; interrupts = ; interrupt-parent = ; clocks = ; }; can@e0008000 { compatible = "xlnx,zynq-can-1.0"; status = "disabled"; clocks = ; clock-names = "can_clk", "pclk"; reg = ; interrupts = ; interrupt-parent = ; tx-fifo-depth = ; rx-fifo-depth = ; }; can@e0009000 { compatible = "xlnx,zynq-can-1.0"; status = "disabled"; clocks = ; clock-names = "can_clk", "pclk"; reg = ; interrupts = ; interrupt-parent = ; tx-fifo-depth = ; rx-fifo-depth = ; }; gpio@e000a000 { compatible = "xlnx,zynq-gpio-1.0"; #gpio-cells = ; clocks = ; gpio-controller; interrupt-controller; #interrupt-cells = ; interrupt-parent = ; interrupts = ; reg = ; emio-gpio-width = ; gpio-mask-high = ; gpio-mask-low = ; }; i2c@e0004000 { compatible = "cdns,i2c-r1p10"; status = "disabled"; clocks = ; interrupt-parent = ; interrupts = ; reg = ; #address-cells = ; #size-cells = ; }; i2c@e0005000 { compatible = "cdns,i2c-r1p10"; status = "disabled"; clocks = ; interrupt-parent = ; interrupts = ; reg = ; #address-cells = ; #size-cells = ; }; interrupt-controller@f8f01000 { compatible = "arm,cortex-a9-gic"; #interrupt-cells = ; interrupt-controller; reg = ; num_cpus = ; num_interrupts = ; linux,phandle = ; phandle = ; }; cache-controller@f8f02000 { compatible = "arm,pl310-cache"; reg = ; interrupts = ; arm,data-latency = ; arm,tag-latency = ; cache-unified; cache-level = ; }; memory-controller@f8006000 { compatible = "xlnx,zynq-ddrc-a05"; reg = ; }; ocmc@f800c000 { compatible = "xlnx,zynq-ocmc-1.0"; interrupt-parent = ; interrupts = ; reg = ; }; serial@e0000000 { compatible = "xlnx,xuartps", "cdns,uart-r1p8"; status = "disabled"; clocks = ; clock-names = "uart_clk", "pclk"; reg = ; interrupts = ; }; serial@e0001000 { compatible = "xlnx,xuartps", "cdns,uart-r1p8"; status = "okay"; clocks = ; clock-names = "uart_clk", "pclk"; reg = ; interrupts = ; device_type = "serial"; port-number = ; }; spi@e0006000 { compatible = "xlnx,zynq-spi-r1p6"; reg = ; status = "disabled"; interrupt-parent = ; interrupts = ; clocks = ; clock-names = "ref_clk", "pclk"; #address-cells = ; #size-cells = ; }; spi@e0007000 { compatible = "xlnx,zynq-spi-r1p6"; reg = ; status = "disabled"; interrupt-parent = ; interrupts = ; clocks = ; clock-names = "ref_clk", "pclk"; #address-cells = ; #size-cells = ; }; spi@e000d000 { clock-names = "ref_clk", "pclk"; clocks = ; compatible = "xlnx,zynq-qspi-1.0"; status = "okay"; interrupt-parent = ; interrupts = ; reg = ; #address-cells = ; #size-cells = ; is-dual = ; num-cs = ; spi-rx-bus-width = ; spi-tx-bus-width = ; flash@0 { compatible = "n25q512a", "micron,m25p80"; reg = ; #address-cells = ; #size-cells = ; spi-max-frequency = ; partition@0x00000000 { label = "boot"; reg = ; }; partition@0x00500000 { label = "bootenv"; reg = ; }; partition@0x00520000 { label = "kernel"; reg = ; }; partition@0x00fa0000 { label = "spare"; reg = ; }; }; }; memory-controller@e000e000 { #address-cells = ; #size-cells = ; status = "disabled"; clock-names = "memclk", "aclk"; clocks = ; compatible = "arm,pl353-smc-r2p1"; interrupt-parent = ; interrupts = ; ranges; reg = ; flash@e1000000 { status = "disabled"; compatible = "arm,pl353-nand-r2p1"; reg = ; #address-cells = ; #size-cells = ; }; flash@e2000000 { status = "disabled"; compatible = "cfi-flash"; reg = ; #address-cells = ; #size-cells = ; }; }; ethernet@e000b000 { compatible = "cdns,zynq-gem", "cdns,gem"; reg = ; status = "okay"; interrupts = ; clocks = ; clock-names = "pclk", "hclk", "tx_clk"; #address-cells = ; #size-cells = ; phy-mode = "rgmii-id"; xlnx,ptp-enet-clock = ; local-mac-address = [00 0a 35 00 1e 53]; }; ethernet@e000c000 { compatible = "cdns,zynq-gem", "cdns,gem"; reg = ; status = "disabled"; interrupts = ; clocks = ; clock-names = "pclk", "hclk", "tx_clk"; #address-cells = ; #size-cells = ; }; sdhci@e0100000 { compatible = "arasan,sdhci-8.9a"; status = "okay"; clock-names = "clk_xin", "clk_ahb"; clocks = ; interrupt-parent = ; interrupts = ; reg = ; xlnx,has-cd = ; xlnx,has-power = ; xlnx,has-wp = ; }; sdhci@e0101000 { compatible = "arasan,sdhci-8.9a"; status = "disabled"; clock-names = "clk_xin", "clk_ahb"; clocks = ; interrupt-parent = ; interrupts = ; reg = ; }; slcr@f8000000 { #address-cells = ; #size-cells = ; compatible = "xlnx,zynq-slcr", "syscon", "simple-mfd"; reg = ; ranges; linux,phandle = ; phandle = ; clkc@100 { #clock-cells = ; compatible = "xlnx,ps7-clkc"; fclk-enable = ; clock-output-names = "armpll", "ddrpll", "iopll", "cpu_6or4x", "cpu_3or2x", "cpu_2x", "cpu_1x", "ddr2x", "ddr3x", "dci", "lqspi", "smc", "pcap", "gem0", "gem1", "fclk0", "fclk1", "fclk2", "fclk3", "can0", "can1", "sdio0", "sdio1", "uart0", "uart1", "spi0", "spi1", "dma", "usb0_aper", "usb1_aper", "gem0_aper", "gem1_aper", "sdio0_aper", "sdio1_aper", "spi0_aper", "spi1_aper", "can0_aper", "can1_aper", "i2c0_aper", "i2c1_aper", "uart0_aper", "uart1_aper", "gpio_aper", "lqspi_aper", "smc_aper", "swdt", "dbg_trc", "dbg_apb"; reg = ; ps-clk-frequency = ; linux,phandle = ; phandle = ; }; rstc@200 { compatible = "xlnx,zynq-reset"; reg = ; #reset-cells = ; syscon = ; }; pinctrl@700 { compatible = "xlnx,pinctrl-zynq"; reg = ; syscon = ; }; }; dmac@f8003000 { compatible = "arm,pl330", "arm,primecell"; reg = ; interrupt-parent = ; interrupt-names = "abort", "dma0", "dma1", "dma2", "dma3", "dma4", "dma5", "dma6", "dma7"; interrupts = ; #dma-cells = ; #dma-channels = ; #dma-requests = ; clocks = ; clock-names = "apb_pclk"; }; devcfg@f8007000 { compatible = "xlnx,zynq-devcfg-1.0"; interrupt-parent = ; interrupts = ; reg = ; clocks = ; clock-names = "ref_clk", "fclk0", "fclk1", "fclk2", "fclk3"; syscon = ; linux,phandle = ; phandle = ; }; efuse@f800d000 { compatible = "xlnx,zynq-efuse"; reg = ; }; timer@f8f00200 { compatible = "arm,cortex-a9-global-timer"; reg = ; interrupts = ; interrupt-parent = ; clocks = ; }; timer@f8001000 { interrupt-parent = ; interrupts = ; compatible = "cdns,ttc"; clocks = ; reg = ; }; timer@f8002000 { interrupt-parent = ; interrupts = ; compatible = "cdns,ttc"; clocks = ; reg = ; }; timer@f8f00600 { interrupt-parent = ; interrupts = ; compatible = "arm,cortex-a9-twd-timer"; reg = ; clocks = ; }; usb@e0002000 { compatible = "xlnx,zynq-usb-2.20a", "chipidea,usb2"; status = "okay"; clocks = ; interrupt-parent = ; interrupts = ; reg = ; phy_type = "ulpi"; }; usb@e0003000 { compatible = "xlnx,zynq-usb-2.20a", "chipidea,usb2"; status = "disabled"; clocks = ; interrupt-parent = ; interrupts = ; reg = ; phy_type = "ulpi"; }; watchdog@f8005000 { clocks = ; compatible = "cdns,wdt-r1p2"; interrupt-parent = ; interrupts = ; reg = ; timeout-sec = ; }; ddr@0 { compatible = "mmio-sram"; reg = ; linux,phandle = ; phandle = ; }; }; chosen { bootargs = "console=ttyPS0,115200 earlyprintk root=/dev/mmcblk0p2 rw rootwait rootfstype=ext4 mem=256M maxcpus=1"; stdout-path = "serial0:115200n8"; }; aliases { ethernet0 = "/amba/ethernet@e000b000"; serial0 = "/amba/serial@e0001000"; spi0 = "/amba/spi@e000d000"; }; memory { device_type = "memory"; reg = ; }; reserved-memory { #address-cells = ; #size-cells = ; ranges; rproc@18000000 { no-map; reg = ; }; }; remoteproc@0 { compatible = "xlnx,zynq_remoteproc"; firmware = "firmware"; vring0 = ; vring1 = ; srams = ; }; };

注: ① compatible 的内容为字符串数组,如: compatible = "xlnx,zynq-7000"; compatible = "arm,cortex-a9"; 表示设备型号等,linux内核根据此节点属性匹配具体的驱动程序。

② reg 的内容为16进制,如: reg = ; 可以与下面两个搭配使用。 #address-cells = ; #size-cells = ; 表示此设备可操作的地址范围。

③ interrupt-controller(中断控制器) 此属性为空,通过此属性以表明此设备具有中断相关功能。

④ amba 是arm公司提出的一个总线协议规范。

⑤ 节点名称可以是:“[@]”形式,如:adc@f8007100 或只有名称的形式,如:cpus。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3