Customize your Device Tree

📘

Note

This tutorial was documented in standard Ubuntu 16.04 environment.

❗️

Device Tree Editing

We provide our generic device tree for all of our boards. While some users may need to edit the device tree, it's not recommended for most users.

NOTE: The basic devicetree built in the Xilinx SDK requires a few changes to work properly on the OcPoC. See the Appendix at the bottom of this tutorial for more information.

Prerequisites

  • Xilinx Vivado
  • Xilinx SDK
  • Your completed project which has been exported to SDK
  • Xilinx Device Tree Tool - You can change the tag to find a version which matches the rest of your software.
  • device-tree-compiler (available in Ubuntu Bash for Windows)

For the Xilinx Device Tree Tool and device-tree-compiler, you can execute the following commands from a Linux terminal:

sudo apt-get install device-tree-compiler
git clone https://github.com/Xilinx/device-tree-xlnx
cd device-tree-xlnx
git checkout xilinx-v2015.4

Preparing XSDK

  1. In XSDK select XIlinx Tools>Repositories
  2. Add a global repository
  3. Navigate to where you cloned the Xilinx/device-tree-xlnx

Creating a Device Tree

Follow these steps to create an initial device tree:

  1. Select File>New>Board Support Package
  2. Create a name for your project, e.g. device_tree_bsp_0
  3. Select device_tree in the Board Support Package OS menu
  4. Click Finish
  5. Minimize XSDK
  6. Navigate to the project folder in the operating system
  7. Run the following terminal commands to compile the device tree dile into a .dtb file (this is what the OcPoC uses on bootup):
dtc -I dts -O dtb -o devicetree.dtb system-top.dts

8: From here you can also decompose the devicetree file back into a human-readable file with the following command:

dtc -I dtb -O dts -o devicetree.dts devicetree.dtb

Customizing your Device Tree

Open the generated Device Tree, the basic layout should be:

  • details (This section doesn't have a name, but contains: address-cells, size-cells, compatible)
  • Choosen (Boot Arguments)
  • Aliases (Somewhat determines the names for device files)
  • Memory
  • CPUs
  • PMU
  • Fixed Regulator (Voltage)
  • Phy (for USB)
  • AMBA (All the peripherals that are connected to the ARM processor)
  • AMBA-PL (All the other peripherals that are on the FPGA)

Immediately, you should make sure that the last two numbers in the aliases for the Serial ports ends around serial6, the others will be reassigned when Linux starts up. If you see complications with Serial port ordering, physically moving the serial ports within AMBA-PL will change the order they are initialized.

Second, while the SPI buses are correctly initialized, if you tried to use them in Linux, you'd find that the chip-selects won't work. To fix this you need to add the SPI devices on the SPI bus.

A sample ARM SPI device should look like this:

		spi@e0006000 {
			compatible = "xlnx,zynq-spi-r1p6";
			reg = <0xe0006000 0x1000>;
			status = "okay";
			interrupt-parent = <0x3>;
			interrupts = <0x0 0x1a 0x4>;
			clocks = <0x1 0x19 0x1 0x22>;
			clock-names = "ref_clk", "pclk";
			#address-cells = <0x1>;
			#size-cells = <0x0>;
			is-decoded-cs = <0x0>;
			num-cs = <0x3>;

			device@0 {
				#address-cells = <0x1>;
				#size-cells = <0x0>;
				compatible = "spidev";
				reg = <0x0>;
				spi-max-frequency = <1000000>;
			};
			device@1 {
				#address-cells = <0x1>;
				#size-cells = <0x0>;
				compatible = "spidev";
				reg = <0x1>;
				spi-max-frequency = <1000000>;
			};
			device@2 {
				#address-cells = <0x1>;
				#size-cells = <0x0>;
				compatible = "spidev";
				reg = <0x2>;
				spi-max-frequency = <1000000>;
			};
		};
  • Add a new function module to run on the Linux OS

Modifying an existing devicetree

Before you begin you will need to make sure that you have the required script library. We did this at the top of this tutorial, but just to be sure, you can make sure you have device-tree-compiler installed with:

sudo apt-get install device-tree-compiler

Now, you can convert a '.dtb' file, such as the 'devicetree.dtb' on the OcPoC's SD card, into a '.dts' file (which can be edited) with the following command (of course, the filename here depends on your existing filename):

dtc -I dtb -O dts -f devicetree.dtb -o devicetree.dts

Now that you have the devicetree.dts file, you will be able to make your specific adjustments to the device tree. Once you are satisfied you will need to convert it back to a dtb formated file.

dtc -I dts -O dtb -f devicetree.dts -o devicetree.dtb

Want to learn more about device trees?
Xillybus provides some very good information on Zynq based device trees. See their documentation here: xillybus.com/tutorials/device-tree-zynq-1

Appendix

Here we present what the default dts for the default OcPoC build; the devicetree generated by Vivado will look slightly different. The required changes are summarized here:

❗️

Required Changes to devicetree

  • USB support is likely missing from the generated devicetree
  • SPI devices will be missing from the generated devicetree
  • Remove "333334 1000000" or "51616 F4240" from the operating-points, otherwise you may experience unusual performance problems in flight
  • We recommend using our devicetree as a jumping off point for your own devicetree modification

We recommend using this device tree as a starting point for further development.

/dts-v1/;

/ {
	#address-cells = <0x1>;
	#size-cells = <0x1>;
	compatible = "xlnx,zynq-7000";

	chosen {
		bootargs = "console=ttyPS1,115200 root=/dev/mmcblk0p2 rw rootwait rootfstype=ext4 noinitrd earlyprintk";
	};

	aliases {
		ethernet0 = "/amba/ethernet@e000b000";
		serial0 = "/amba/serial@e0001000";
		serial1 = "/amba/serial@e0000000";
		serial2 = "/amba_pl/serial@43c10000";
		serial3 = "/amba_pl/serial@43c70000";
		serial4 = "/amba_pl/serial@43c60000";
		serial5 = "/amba_pl/serial@43c30000";
		serial6 = "/amba_pl/serial@43c40000";
		spi0 = "/amba/spi@e000d000";
		spi1 = "/amba/spi@e0006000";
		spi2 = "/amba/spi@e0007000";
	};

	memory {
		device_type = "memory";
		reg = <0x0 0x20000000>;
	};
	cpus {
		#address-cells = <0x1>;
		#size-cells = <0x0>;

		cpu@0 {
			compatible = "arm,cortex-a9";
			device_type = "cpu";
			reg = <0x0>;
			clocks = <0x1 0x3>;
			clock-latency = <0x3e8>;
			cpu0-supply = <0x2>;
			operating-points = <
				/* kHz    uV */
				666667  1000000
				//333334  1000000
			>;
		};

		cpu@1 {
			compatible = "arm,cortex-a9";
			device_type = "cpu";
			reg = <0x1>;
			clocks = <0x1 0x3>;
		};
	};

	pmu {
		compatible = "arm,cortex-a9-pmu";
		interrupts = <0x0 0x5 0x4 0x0 0x6 0x4>;
		interrupt-parent = <0x3>;
		reg = <0xf8891000 0x1000 0xf8893000 0x1000>;
	};

	fixedregulator@0 {
		compatible = "regulator-fixed";
		regulator-name = "VCCPINT";
		regulator-min-microvolt = <0xf4240>;
		regulator-max-microvolt = <0xf4240>;
		regulator-boot-on;
		regulator-always-on;
		linux,phandle = <0x2>;
		phandle = <0x2>;
	};

	phy0 {
		compatible = "ulpi-phy";
		#phy-cells = <0x0>;
		reg = <0xe0002000 0x1000>;
		view-port = <0x170>;
		drv-vbus;
		linux,phandle = <0x5>;
		phandle = <0x5>;
	};

	amba {
		compatible = "simple-bus";
		#address-cells = <0x1>;
		#size-cells = <0x1>;
		interrupt-parent = <0x3>;
		ranges;

		can@e0008000 {
			compatible = "xlnx,zynq-can-1.0";
			status = "okay";
			clocks = <0x1 0x13 0x1 0x24>;
			clock-names = "can_clk", "pclk";
			reg = <0xe0008000 0x1000>;
			interrupts = <0x0 0x1c 0x4>;
			interrupt-parent = <0x3>;
			tx-fifo-depth = <0x40>;
			rx-fifo-depth = <0x40>;
		};

		zynq-can@e0009000 {
			compatible = "xlnx,zynq-can-1.0";
			status = "disabled";
			clocks = <0x1 0x14 0x1 0x25>;
			clock-names = "can_clk", "pclk";
			reg = <0xe0009000 0x1000>;
			interrupts = <0x0 0x33 0x4>;
			interrupt-parent = <0x3>;
			tx-fifo-depth = <0x40>;
			rx-fifo-depth = <0x40>;
		};

		gpio@e000a000 {
			compatible = "xlnx,zynq-gpio-1.0";
			#gpio-cells = <0x2>;
			#interrupt-cells = <0x2>;
			clocks = <0x1 0x2a>;
			gpio-controller;
			interrupt-controller;
			interrupt-parent = <0x3>;
			interrupts = <0x0 0x14 0x4>;
			reg = <0xe000a000 0x1000>;
			emio-gpio-width = <0x40>;
			gpio-mask-high = <0x0>;
			gpio-mask-low = <0x5600>;
		};

		i2c@e0004000 {
			compatible = "cdns,i2c-r1p10";
			status = "okay";
			clocks = <0x1 0x26>;
			interrupt-parent = <0x3>;
			interrupts = <0x0 0x19 0x4>;
			reg = <0xe0004000 0x1000>;
			#address-cells = <0x1>;
			#size-cells = <0x0>;
			clock-frequency = <0x61a80>;
		};

		i2c@e0005000 {
			compatible = "cdns,i2c-r1p10";
			status = "okay";
			clocks = <0x1 0x27>;
			interrupt-parent = <0x3>;
			interrupts = <0x0 0x30 0x4>;
			reg = <0xe0005000 0x1000>;
			#address-cells = <0x1>;
			#size-cells = <0x0>;
			clock-frequency = <0x61a80>;
		};

		interrupt-controller@f8f01000 {
			compatible = "arm,cortex-a9-gic";
			#interrupt-cells = <0x3>;
			interrupt-controller;
			reg = <0xf8f01000 0x1000 0xf8f00100 0x100>;
			num_cpus = <0x2>;
			num_interrupts = <0x60>;
			linux,phandle = <0x3>;
			phandle = <0x3>;
		};

		cache-controller@f8f02000 {
			compatible = "arm,pl310-cache";
			reg = <0xf8f02000 0x1000>;
			interrupts = <0x0 0x2 0x4>;
			arm,data-latency = <0x3 0x2 0x2>;
			arm,tag-latency = <0x2 0x2 0x2>;
			cache-unified;
			cache-level = <0x2>;
		};

		memory-controller@f8006000 {
			compatible = "xlnx,zynq-ddrc-a05";
			reg = <0xf8006000 0x1000>;
		};

		ocmc@f800c000 {
			compatible = "xlnx,zynq-ocmc-1.0";
			interrupt-parent = <0x3>;
			interrupts = <0x0 0x3 0x4>;
			reg = <0xf800c000 0x1000>;
		};

		serial@e0000000 {
			compatible = "xlnx,xuartps", "cdns,uart-r1p8";
			status = "okay";
			clocks = <0x1 0x17 0x1 0x28>;
			clock-names = "uart_clk", "pclk";
			reg = <0xe0000000 0x1000>;
			interrupts = <0x0 0x1b 0x4>;
			current-speed = <0x1c200>;
			device_type = "serial";
			port-number = <0x1>;
		};

		serial@e0001000 {
			compatible = "xlnx,xuartps", "cdns,uart-r1p8";
			status = "okay";
			clocks = <0x1 0x18 0x1 0x29>;
			clock-names = "uart_clk", "pclk";
			reg = <0xe0001000 0x1000>;
			interrupts = <0x0 0x32 0x4>;
			current-speed = <0x1c200>;
			device_type = "serial";
			port-number = <0x0>;
		};

		spi@e0006000 {
			compatible = "xlnx,zynq-spi-r1p6";
			reg = <0xe0006000 0x1000>;
			status = "okay";
			interrupt-parent = <0x3>;
			interrupts = <0x0 0x1a 0x4>;
			clocks = <0x1 0x19 0x1 0x22>;
			clock-names = "ref_clk", "pclk";
			#address-cells = <0x1>;
			#size-cells = <0x0>;
			is-decoded-cs = <0x0>;
			num-cs = <0x3>;

			device@0 {
				#address-cells = <0x1>;
				#size-cells = <0x0>;
				compatible = "spidev";
				reg = <0x0>;
				spi-max-frequency = <1000000>;
			};
			device@1 {
				#address-cells = <0x1>;
				#size-cells = <0x0>;
				compatible = "spidev";
				reg = <0x1>;
				spi-max-frequency = <1000000>;
			};
			device@2 {
				#address-cells = <0x1>;
				#size-cells = <0x0>;
				compatible = "spidev";
				reg = <0x2>;
				spi-max-frequency = <1000000>;
			};
		};

		spi@e0007000 {
			compatible = "xlnx,zynq-spi-r1p6";
			reg = <0xe0007000 0x1000>;
			status = "okay";
			interrupt-parent = <0x3>;
			interrupts = <0x0 0x31 0x4>;
			clocks = <0x1 0x1a 0x1 0x23>;
			clock-names = "ref_clk", "pclk";
			#address-cells = <0x1>;
			#size-cells = <0x0>;
			is-decoded-cs = <0x0>;
			num-cs = <0x1>;

			device@0 {
				#address-cells = <0x1>;
				#size-cells = <0x0>;
				compatible = "spidev";
				reg = <0x0>;
				spi-max-frequency = <1000000>;
			};
		};

		spi@e000d000 {
			clock-names = "ref_clk", "pclk";
			clocks = <0x1 0xa 0x1 0x2b>;
			compatible = "xlnx,zynq-qspi-1.0";
			status = "okay";
			interrupt-parent = <0x3>;
			interrupts = <0x0 0x13 0x4>;
			reg = <0xe000d000 0x1000>;
			#address-cells = <0x1>;
			#size-cells = <0x0>;
			is-dual = <0x0>;
			num-cs = <0x1>;
		};

		memory-controller@e000e000 {
			#address-cells = <0x1>;
			#size-cells = <0x1>;
			status = "disabled";
			clock-names = "memclk", "aclk";
			clocks = <0x1 0xb 0x1 0x2c>;
			compatible = "arm,pl353-smc-r2p1";
			interrupt-parent = <0x3>;
			interrupts = <0x0 0x12 0x4>;
			ranges;
			reg = <0xe000e000 0x1000>;

			flash@e1000000 {
				status = "disabled";
				compatible = "arm,pl353-nand-r2p1";
				reg = <0xe1000000 0x1000000>;
				#address-cells = <0x1>;
				#size-cells = <0x1>;
			};

			flash@e2000000 {
				status = "disabled";
				compatible = "cfi-flash";
				reg = <0xe2000000 0x2000000>;
				#address-cells = <0x1>;
				#size-cells = <0x1>;
			};
		};

		ethernet@e000b000 {
			compatible = "cdns,gem";
			reg = <0xe000b000 0x1000>;
			status = "okay";
			interrupts = <0x0 0x16 0x4>;
			clocks = <0x1 0x1e 0x1 0x1e 0x1 0xd>;
			clock-names = "pclk", "hclk", "tx_clk";
			#address-cells = <0x1>;
			#size-cells = <0x0>;
			local-mac-address = [00 0a 35 00 00 00];
			phy-mode = "rgmii-id";
			xlnx,ptp-enet-clock = <0x69f6bcb>;
		};

		ethernet@e000c000 {
			compatible = "cdns,gem";
			reg = <0xe000c000 0x1000>;
			status = "disabled";
			interrupts = <0x0 0x2d 0x4>;
			clocks = <0x1 0x1f 0x1 0x1f 0x1 0xe>;
			clock-names = "pclk", "hclk", "tx_clk";
			#address-cells = <0x1>;
			#size-cells = <0x0>;
		};

		sdhci@e0100000 {
			compatible = "arasan,sdhci-8.9a";
			status = "okay";
			clock-names = "clk_xin", "clk_ahb";
			clocks = <0x1 0x15 0x1 0x20>;
			interrupt-parent = <0x3>;
			interrupts = <0x0 0x18 0x4>;
			reg = <0xe0100000 0x1000>;
			xlnx,has-cd = <0x0>;
			xlnx,has-power = <0x0>;
			xlnx,has-wp = <0x0>;
		};

		sdhci@e0101000 {
			compatible = "arasan,sdhci-8.9a";
			status = "disabled";
			clock-names = "clk_xin", "clk_ahb";
			clocks = <0x1 0x16 0x1 0x21>;
			interrupt-parent = <0x3>;
			interrupts = <0x0 0x2f 0x4>;
			reg = <0xe0101000 0x1000>;
		};

		slcr@f8000000 {
			#address-cells = <0x1>;
			#size-cells = <0x1>;
			compatible = "xlnx,zynq-slcr", "syscon", "simple-bus";
			reg = <0xf8000000 0x1000>;
			ranges;
			linux,phandle = <0x4>;
			phandle = <0x4>;

			clkc@100 {
				#clock-cells = <0x1>;
				compatible = "xlnx,ps7-clkc";
				fclk-enable = <0x3>;
				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 = <0x100 0x100>;
				ps-clk-frequency = <0x1fca055>;
				linux,phandle = <0x1>;
				phandle = <0x1>;
			};

			pinctrl@700 {
				compatible = "xlnx,pinctrl-zynq";
				reg = <0x700 0x200>;
				syscon = <0x4>;

				usb0-default {
					linux,phandle = <0x6>;
					phandle = <0x6>;

					mux {
						groups = "usb0_0_grp";
						function = "usb0";
					};

					conf {
						groups = "usb0_0_grp";
						slew-rate = <0x0>;
						io-standard = <0x1>;
					};

					conf-rx {
						pins = "MIO29", "MIO31", "MIO36";
						bias-high-impedance;
					};

					conf-tx {
						pins = "MIO28", "MIO30", "MIO32", "MIO33", "MIO34", "MIO35", "MIO37", "MIO38", "MIO39";
						bias-disable;
					};
				};
			};
		};

		dmac@f8003000 {
			compatible = "arm,pl330", "arm,primecell";
			reg = <0xf8003000 0x1000>;
			interrupt-parent = <0x3>;
			interrupt-names = "abort", "dma0", "dma1", "dma2", "dma3", "dma4", "dma5", "dma6", "dma7";
			interrupts = <0x0 0xd 0x4 0x0 0xe 0x4 0x0 0xf 0x4 0x0 0x10 0x4 0x0 0x11 0x4 0x0 0x28 0x4 0x0 0x29 0x4 0x0 0x2a 0x4 0x0 0x2b 0x4>;
			#dma-cells = <0x1>;
			#dma-channels = <0x8>;
			#dma-requests = <0x4>;
			clocks = <0x1 0x1b>;
			clock-names = "apb_pclk";
		};

		devcfg@f8007000 {
			clock-names = "ref_clk", "fclk0", "fclk1", "fclk2", "fclk3";
			clocks = <0x1 0xc 0x1 0xf 0x1 0x10 0x1 0x11 0x1 0x12>;
			compatible = "xlnx,zynq-devcfg-1.0";
			interrupt-parent = <0x3>;
			interrupts = <0x0 0x8 0x4>;
			reg = <0xf8007000 0x100>;
			syscon = <0x4>;
		};

		timer@f8f00200 {
			compatible = "arm,cortex-a9-global-timer";
			reg = <0xf8f00200 0x20>;
			interrupts = <0x1 0xb 0x301>;
			interrupt-parent = <0x3>;
			clocks = <0x1 0x4>;
		};

		timer@f8001000 {
			interrupt-parent = <0x3>;
			interrupts = <0x0 0xa 0x4 0x0 0xb 0x4 0x0 0xc 0x4>;
			compatible = "cdns,ttc";
			clocks = <0x1 0x6>;
			reg = <0xf8001000 0x1000>;
		};

		timer@f8002000 {
			interrupt-parent = <0x3>;
			interrupts = <0x0 0x25 0x4 0x0 0x26 0x4 0x0 0x27 0x4>;
			compatible = "cdns,ttc";
			clocks = <0x1 0x6>;
			reg = <0xf8002000 0x1000>;
		};

		timer@f8f00600 {
			interrupt-parent = <0x3>;
			interrupts = <0x1 0xd 0x301>;
			compatible = "arm,cortex-a9-twd-timer";
			reg = <0xf8f00600 0x20>;
			clocks = <0x1 0x4>;
		};

		usb@e0002000 {
			compatible = "xlnx,zynq-usb-2.20a", "chipidea,usb2";
			status = "okay";
			clocks = <0x1 0x1c>;
			interrupt-parent = <0x3>;
			interrupts = <0x0 0x15 0x4>;
			reg = <0xe0002000 0x1000>;
			phy_type = "ulpi";
			dr_mode = "host";
			usb-phy = <0x5>;
			pinctrl-names = "default";
			pinctrl-0 = <0x6>;
		};

		usb@e0003000 {
			compatible = "xlnx,zynq-usb-2.20a", "chipidea,usb2";
			status = "disabled";
			clocks = <0x1 0x1d>;
			interrupt-parent = <0x3>;
			interrupts = <0x0 0x2c 0x4>;
			reg = <0xe0003000 0x1000>;
			phy_type = "ulpi";
		};

		watchdog@f8005000 {
			clocks = <0x1 0x2d>;
			compatible = "cdns,wdt-r1p2";
			interrupt-parent = <0x3>;
			interrupts = <0x0 0x9 0x1>;
			reg = <0xf8005000 0x1000>;
			timeout-sec = <0xa>;
		};
	};

	amba_pl {
		#address-cells = <0x1>;
		#size-cells = <0x1>;
		compatible = "simple-bus";
		ranges;

		AXI_OcPoC_PWM_Controller@43c00000 {
			compatible = "xlnx,AXI-OcPoC-PWM-Controller-1.0";
			reg = <0x43c00000 0x10000>;
			xlnx,s00-axi-addr-width = <0x7>;
			xlnx,s00-axi-data-width = <0x20>;
		};

		
		serial@43c10000 {
			clock-frequency = <0x5f5e100>;
			clock-names = "ref_clk";
			clocks = "clkc 0";
			compatible = "xlnx,xps-uart16550-2.00.a", "ns16550a";
			current-speed = <0x1c200>;
			device_type = "serial";
			port-number = <0x3>;
			reg = <0x43c10000 0x10000>;
			reg-offset = <0x1000>;
			reg-shift = <0x2>;
            interrupt-parent = <0x3>;
			interrupts = <0x0 0x22 0x4>;
			xlnx,external-xin-clk-hz = <0x17d7840>;
			xlnx,external-xin-clk-hz-d = <0x19>;
			xlnx,has-external-rclk = <0x0>;
			xlnx,has-external-xin = <0x0>;
			xlnx,is-a-16550 = <0x1>;
			xlnx,s-axi-aclk-freq-hz-d = "100.0";
			xlnx,use-modem-ports = <0x0>;
			xlnx,use-user-ports = <0x0>;
		};



		serial@43c30000 {
			clock-frequency = <0x5f5e100>;
			clock-names = "ref_clk";
			clocks = "clkc 0";
			compatible = "xlnx,xps-uart16550-2.00.a", "ns16550a";
			current-speed = <0x1c200>;
			device_type = "serial";
			port-number = <0x5>;
			reg = <0x43c30000 0x10000>;
			reg-offset = <0x1000>;
			reg-shift = <0x2>;
            interrupt-parent = <0x3>;
			interrupts = <0x0 0x38 0x4>;
			xlnx,external-xin-clk-hz = <0x17d7840>;
			xlnx,external-xin-clk-hz-d = <0x19>;
			xlnx,has-external-rclk = <0x0>;
			xlnx,has-external-xin = <0x0>;
			xlnx,is-a-16550 = <0x1>;
			xlnx,s-axi-aclk-freq-hz-d = "100.0";
			xlnx,use-modem-ports = <0x0>;
			xlnx,use-user-ports = <0x0>;
		};

		serial@43c40000 {
			clock-frequency = <0x5f5e100>;
			clock-names = "ref_clk";
			clocks = "clkc 0";
			compatible = "xlnx,xps-uart16550-2.00.a", "ns16550a";
			current-speed = <0x1c200>;
			device_type = "serial";
			port-number = <0x6>;
			reg = <0x43c40000 0x10000>;
			reg-offset = <0x1000>;
			reg-shift = <0x2>;
            interrupt-parent = <0x3>;
			interrupts = <0x0 0x24 0x4>;
			xlnx,external-xin-clk-hz = <0x17d7840>;
			xlnx,external-xin-clk-hz-d = <0x19>;
			xlnx,has-external-rclk = <0x0>;
			xlnx,has-external-xin = <0x0>;
			xlnx,is-a-16550 = <0x1>;
			xlnx,s-axi-aclk-freq-hz-d = "100.0";
			xlnx,use-modem-ports = <0x0>;
			xlnx,use-user-ports = <0x0>;
		};

		serial@43c60000 {
			clock-frequency = <0x5f5e100>;
			clock-names = "ref_clk";
			clocks = "clkc 0";
			compatible = "xlnx,xps-uart16550-2.00.a", "ns16550a";
			current-speed = <0x1c200>;
			device_type = "serial";
			port-number = <0x7>;
			reg = <0x43c60000 0x10000>;
			reg-offset = <0x1000>;
			reg-shift = <0x2>;
            interrupt-parent = <0x3>;
			interrupts = <0x0 0x34 0x4>;
			xlnx,external-xin-clk-hz = <0x17d7840>;
			xlnx,external-xin-clk-hz-d = <0x19>;
			xlnx,has-external-rclk = <0x0>;
			xlnx,has-external-xin = <0x0>;
			xlnx,is-a-16550 = <0x1>;
			xlnx,s-axi-aclk-freq-hz-d = "100.0";
			xlnx,use-modem-ports = <0x0>;
			xlnx,use-user-ports = <0x0>;
		};

		serial@43c70000 {
			clock-frequency = <0x5f5e100>;
			clock-names = "ref_clk";
			clocks = "clkc 0";
			compatible = "xlnx,xps-uart16550-2.00.a", "ns16550a";
			current-speed = <0x1c200>;
			device_type = "serial";
			port-number = <0x8>;
			reg = <0x43c70000 0x10000>;
			reg-offset = <0x1000>;
			reg-shift = <0x2>;
            interrupt-parent = <0x3>;
			interrupts = <0x0 0x35 0x4>;
			xlnx,external-xin-clk-hz = <0x17d7840>;
			xlnx,external-xin-clk-hz-d = <0x19>;
			xlnx,has-external-rclk = <0x0>;
			xlnx,has-external-xin = <0x0>;
			xlnx,is-a-16550 = <0x1>;
			xlnx,s-axi-aclk-freq-hz-d = "100.0";
			xlnx,use-modem-ports = <0x0>;
			xlnx,use-user-ports = <0x0>;
		};



		serial@43c20000 {
			clock-frequency = <0x5f5e100>;
			clock-names = "ref_clk";
			clocks = "clkc 0";
			compatible = "xlnx,xps-uart16550-2.00.a", "ns16550a";
			current-speed = <0x1c200>;
			device_type = "serial";
			port-number = <0x4>;
			reg = <0x43c20000 0x10000>;
			reg-offset = <0x1000>;
			reg-shift = <0x2>;
            interrupt-parent = <0x3>;
			interrupts = <0x0 0x23 0x4>;
			xlnx,external-xin-clk-hz = <0x17d7840>;
			xlnx,external-xin-clk-hz-d = <0x19>;
			xlnx,has-external-rclk = <0x0>;
			xlnx,has-external-xin = <0x0>;
			xlnx,is-a-16550 = <0x1>;
			xlnx,s-axi-aclk-freq-hz-d = "100.0";
			xlnx,use-modem-ports = <0x0>;
			xlnx,use-user-ports = <0x0>;
		};

		serial@43c90000 {
			clock-frequency = <0x5f5e100>;
			clock-names = "ref_clk";
			clocks = "clkc 0";
			compatible = "xlnx,xps-uart16550-2.00.a", "ns16550a";
			current-speed = <0x1c200>;
			device_type = "serial";
			port-number = <0xa>;
			reg = <0x43c90000 0x10000>;
			reg-offset = <0x1000>;
			reg-shift = <0x2>;
            interrupt-parent = <0x3>;
			interrupts = <0x0 0x37 0x4>;
			xlnx,external-xin-clk-hz = <0x17d7840>;
			xlnx,external-xin-clk-hz-d = <0x19>;
			xlnx,has-external-rclk = <0x0>;
			xlnx,has-external-xin = <0x0>;
			xlnx,is-a-16550 = <0x1>;
			xlnx,s-axi-aclk-freq-hz-d = "100.0";
			xlnx,use-modem-ports = <0x0>;
			xlnx,use-user-ports = <0x0>;
		};

		serial@43c80000 {
			clock-frequency = <0x5f5e100>;
			clock-names = "ref_clk";
			clocks = "clkc 0";
			compatible = "xlnx,xps-uart16550-2.00.a", "ns16550a";
			current-speed = <0x1c200>;
			device_type = "serial";
			port-number = <0x9>;
			reg = <0x43c80000 0x10000>;
			reg-offset = <0x1000>;
			reg-shift = <0x2>;
            interrupt-parent = <0x3>;
			interrupts = <0x0 0x36 0x4>;
			xlnx,external-xin-clk-hz = <0x17d7840>;
			xlnx,external-xin-clk-hz-d = <0x19>;
			xlnx,has-external-rclk = <0x0>;
			xlnx,has-external-xin = <0x0>;
			xlnx,is-a-16550 = <0x1>;
			xlnx,s-axi-aclk-freq-hz-d = "100.0";
			xlnx,use-modem-ports = <0x0>;
			xlnx,use-user-ports = <0x0>;
		};

		i2c@41600000 {
			#address-cells = <0x1>;
			#size-cells = <0x0>;
			compatible = "xlnx,xps-iic-2.00.a";
			reg = <0x41600000 0x10000>;
			interrupt-parent = <0x3>;
			interrupts = <0x0 0x1d 0x4>;
			xlnx,ten-bit-adr = <0x0>;
			xlnx,gpo-width = <0x1>;
		};

		i2c@41610000 {
			#address-cells = <0x1>;
			#size-cells = <0x0>;
			compatible = "xlnx,xps-iic-2.00.a";
			reg = <0x41610000 0x10000>;
			interrupt-parent = <0x3>;
			interrupts = <0x0 0x1e 0x4>;
			xlnx,ten-bit-adr = <0x0>;
			xlnx,gpo-width = <0x1>;
		};

		i2c@41620000 {
			#address-cells = <0x1>;
			#size-cells = <0x0>;
			compatible = "xlnx,xps-iic-2.00.a";
			reg = <0x41620000 0x10000>;
			interrupt-parent = <0x3>;
			interrupts = <0x0 0x1f 0x4>;
			xlnx,ten-bit-adr = <0x0>;
			xlnx,gpo-width = <0x1>;
		};

		i2c@41630000 {
			#address-cells = <0x1>;
			#size-cells = <0x0>;
			compatible = "xlnx,xps-iic-2.00.a";
			reg = <0x41630000 0x10000>;
			interrupt-parent = <0x3>;
			interrupts = <0x0 0x20 0x4>;
			xlnx,ten-bit-adr = <0x0>;
			xlnx,gpo-width = <0x1>;
		};

		xadc@43c50000 {
			compatible = "xlnx,axi-xadc-1.00.a";
			reg = <0x43c50000 0x10000>;
            interrupt-parent = <0x3>;
			interrupts = <0x0 0x21 0x4>;
			clocks = <0x1 0x0>;

			xlnx,channels {
				#address-cells = <0x1>;
				#size-cells = <0x0>;

				channel@16 {
					reg = <0x10>;
				};
			};
		};
	};
};

What’s Next

The last step to complete your OcPoC project is to generate your boot.bin file: