Introduction To Device Trees PDF
Introduction To Device Trees PDF
Contents
hardware based on parsable information about the hardware rather than hard-coded initialization functions (for example,
hard-coded IP addresses).
With device trees, the kernel itself no longer needs specific code for each version of hardware. Instead, the code is located in
a separate binary: the device tree blob. This enables us to target different hardware with the same kernel image by simply
changing the much simpler, and much smaller, device tree binary.
The device tree can be passed to the kernel either through appending it to the kernel image or through the bootloader. The
machine type is now defined in the device tree itself. The bootloader can dynamically add some information (for example,
clock frequencies) to the device tree and then passes a pointer to the tree, located in system memory, through r2 (for ARM®
architecture) or r3 (for Power Architecture®). The kernel then unflattens and parses the device tree.
#size-cells - <2>;
#address-cells = <1>;
CPUs
#size-cells = <0>; Node Name
Unit Address
device_type = "cpu";
CPU @ 0 Property Value
reg = <0x0>; Property Name
next-level-cache = <&L2>;
phandle
memory device_type = "memory";
ethernet @ 0xfe001000
Further in the tree, we see a node named cpus define one CPU with a unit address of 0. This corresponds to the node’s reg
property and indicates that a single CPU is available.
Further in the tree, the node named Ethernet has a unit-address value of FE001000.
This example is intended as a simple example of portions of a device tree. The following sections delve into more advanced
examples, as well as specifics of the syntax used to define nodes in the tree.
3 Syntax
A device tree is simply a tree structure of nodes and properties. Properties are key-value pairs and may contain both
properties and child nodes. The following sections review the basic syntax of the device tree nodes, as well as parent/child
node relationships.
3.2 Properties
A node may contain multiple properties arranged in name = value format. The name consists of a string, while value can be
an array of strings, bytes, numbers, or phandles, or a mixture of types. For example, value can be:
• compatible = "fsl,mpc8610-msi", "fsl,mpic-msi";
• reg = <0 0 0x8000000>;
• interrupt-parent = <&mpic>;
NOTE
Numbers are always 32-bit big-endian in device trees. At times, multiple 32-bit big-
endian numbers are used to represent a larger value (for example, 64-bit).
3.3 Phandle
A phandle (pointer handle) is a 32-bit value associated with a node that is used to uniquely identify that node so that the node
can be reference from a property in another node. More simply put, it is a property in one node that contains a pointer to
another node. A phandle is created either by the device tree compiler or U-Boot for each label.
In the following example, <&label> is converted to the phandle for the labeled node by the DTC.
name@address {
<key> = <&label>;
};
label: name@adresss {
}
It is most commonly used for interrupts. In Listing 1 on page 7, interrupt-parent is assigned a phandle to the node with
the label mpic.
3.4 Aliases
The aliases node is an index of other nodes. The properties of the node are paths within the device tree, not phandles.
aliases {
ethernet0 = &enet0;
ethernet1 = &enet1;
ethernet2 = &enet2;
serial0 = &serial0;
serial1 = &serial1;
pci0 = &pci0;
};
Each addressable device has a reg property, which lists the address ranges used by the device through one or more 32-bit
integers, called cells. Both address and length are variable in size, so the #address-cells and #size-cells properties in the
parent node define the number of cells in each field.
CPU nodes represent a simple case of addressing. Each CPU is assigned a unique ID, and there is no size associated with
CPU IDs.
cpus {
#address-cells = <1>;
#size-cells = <0>;
cpu0: PowerPC,e6500@0 {
device_type = "cpu";
reg = <0 1>;
next-level-cache = <&L2>;
};
cpu1: PowerPC,e65000@2 {
device_type = "cpu";
reg = <2 3>;
next-level-cache = <&L2>;
};
cpu2: PowerPC,e6500@4 {
device_type = "cpu";
reg = <4 5>;
next-level-cache = <&L2>;
};
Memory mapped devices are assigned a range of addresses, rather than a single address value as found in CPU nodes. #size-
cells of the parent indicates how large (in 32-bit quantities) the length field of each child is. #address-cells indicates how
many 32-bit address cells are used per child, as well.
{
#address-cells = <0x1>;
#size-cells = <0x1>;
compatible = "fsl,p1022-immr", "simple-bus";
i2c@3100 {
reg = <0x3100 0x100>;
};
}
In the above example, we see two cells in the reg property of the I2C child node. The first cell corresponds to the base
address of 0x3100. The second cell is the size. So, the register map of this particular I2C controller is from 0x3100 to 0x31ff.
Memory mapped devices may also include a ranges property in order to translate a range of addresses from parent to child
devices.
The root node describes the CPU’s address space. Child nodes of the root use the CPU’s address domain and do not need
explicit mapping. However, nodes that are not direct children of the root node do not use the CPU’s address domain. The
device tree must specify how to translate addresses from one domain to another. Through the ranges property, such
translation is performed and a non-direct mapped child may obtain a memory mapped address.
/ {
#address-cells = <0x2>;
#size-cells = <0x2>;
soc@fffe00000 {
ranges = <0x0 0xf 0xffe00000 0x100000>;
#address-cells = <0x1>;
#size-cells = <0x1>;
compatible = "fsl,p1022-immr", "simple-bus";
i2c@3100 {
#address-cells = <0x1>;
#size-cells = <0x0>;
cell-index = <0x1>;
compatible = "fsl-i2c";
reg = <0x3100 0x100>;
codec@1a {
compatible = "wlf,wm8776";
reg = <0x1a>;
};
};
The ranges property defines a range of addresses for the child devices in this format: <bus-address parent-bus-address
size>
• bus-address — bus base address, using #address-size of this bus node
• parent-bus-address — base address in the parent’s address space, using #address-size of the parent node
• size — size of mapping, using #address-size of this node
Note that an empty ranges property indicates that the translation from parent to child address space is an identity mapping
only, meaning that the parent bus address space is the same as the child bus address space. The absence of a ranges property
is not the same as an empty ranges property. The absence of a ranges property means that translation is not possible (for
example, with CPU nodes).
In the above example, the SoC has a range defined that maps to:
• Bus address = 0x0 (using the #address-size of the SoC node)
• Parent address = 0x0F_FFE0_0000
NOTE
Numbers are represented as 32-bit, big-endian in the device tree. However, because
the #address-size of the parent node is set to 2, we concatenate two cells into a 64-
bit address of 0x0000_000F_FFE0_0000.
In this example, the SoC node is defined at this address. This corresponds to the CCSR base address (or the internal
register map base address) on the QorIQ P1022 device.
• Size = 0x100000 (using #address-size of the child node)
These essentially map address 0x0 of children to 0xF_FFE0_0000, which is the base address of the SoC. So, for example, the
I2C controller defined is at address 0x3100, which corresponds to an offset of 0x3100 from the base, or an absolute SoC
address of 0xF_FFE0_3100.
Finally, there are devices that are not memory mapped on the processor bus. They may have indirect addresses that are not
directly accessible by the CPU. Instead, the parent device’s driver would be responsible for bus accesses.
i2c@3000 {
gpio3: gpio@21 {
compatible = "nxp,pca9555";
reg = <0x21>;
#gpio-cells = <2>;
gpio-controller;
polarity = <0x00>;
};
For example, the above I2C controller taken from PSC9131rdb.dts shows an I2C device assigned an address, 0x21, but no
length or range associated with it.
PCI address space is completely separate from the CPU address space, and address translation is handled slightly differently.
This is still performed using the range, #address-cells, and #size-cells properties.
pci1: pcie@ffe09000 {
reg = <0 0xffe09000 0 0x1000>;
ranges = <0x2000000 0x0 0xa0000000 0 0xa0000000 0x0 0x20000000
0x1000000 0x0 0x00000000 0 0xffc10000 0x0 0x10000>;
PCI child addresses use three cells labeled phys.hi, phys.mid, and phys.low. The first of these, phys.hi, encodes information
about the space. Most interesting may be the space coding, which indicates configuration space, I/O space, or 32-/64-bit
memory space.
The PCI child address is followed by CPU address space and size. The size of these are determined by the parent’s definition
of #address-cells and #size-cells.
In the above example, we have two address spaces defined:
• A 32-bit memory region beginning at PCI address 0xa0000000, mapped to CPU address 0xa000000, with size =
0x20000000
• An I/O region beginning at PCI address 0x0, mapped to CPU address 0xffc10000, with size = 0x10000
4.1 Partitions
Many times, flash partitions are described in the device tree (see TABLE 1). This would, for example, correspond to a
partition on an mtd device seen by the kernel. However, partitions typically are not based on a hardware description and are
instead an arbitrary partitioning by the device tree author and should be discouraged.
5 Interrupts
Interrupts differ from addresses translations and do not follow the nature structure of the tree. Instead, interrupt signals can
originate from and terminate anywhere in the machine. Interrupt signals are expressed as links between nodes, instead of
naturally in tree form. Interrupt connections can be described using the following properties:
• interrupt-controller
• #interrupt-cells
• interrupt-parent
• interrupts
The interrupt-controller property is an empty property, declaring a node as a device that receives interrupt signals.
The #interrupt-cells property is a property of the interrupt controller node. It is used to define how many cells are in an
interrupt specifier for the interrupt controller.
The interrupt-parent property is a property of a device node containing a phandle to the interrupt controller to which it is
attached. Nodes without an interrupt-parent property can inherit the property from their parent node.
Finally, the interrupts property is a property of a device node containing a list of interrupt specifiers; one for each interrupt
output signal.
The following two nodes show interrupts connections on a QorIQ P1010 device.
In Listing 1 on page 7, the interrupt controller is defined as pic, which is at address offset 0x40000. The label mpic was
added to the interrupt controller node to assign a phandle to the interrupt-parent property in the root node.
For the MPIC, the interrupt property has either two or four values. The first cell always specifies the index of the xIVPR
register of that interrupt. The first 16 are external interrupts; the remaining are internal interrupts. Therefore, internal
interrupts have a value 16 larger than documented in the reference manuals. #interrupt-cells in the pic node, above, is
defined as four, indicating each interrupt specifier has four cells. From the above example, the interrupt number was 42. 42 -
16 = 26, which, according to the P1010 reference manual, corresponds to the DUART interrupt.
The second value represents level sense. For MPIC, level sense is defined as follows:
• 0 = low-to-high edge sensitive type enabled
• 1 = active-low level sensitive type enabled
• 2 = active-high level sensitive type enabled
• 3 = high-to-low edge sensitive type enabled
If there is a third and fourth value, they represent interrupt-type and type-info. For MPIC, interrupt-type is defined as
follows:
• 0 = normal
• 1 = error interrupt
• 2 = MPIC inter-processor interrupt
• 3 = MPIC timer interrupt
In the case of an error interrupt, type-info is the error interrupt number. type-info would also be valid for IPIs and timers.
The complete description of MPIC bindings can be found in Documentation/devicetree/bindings/powerpc/fsl/mpic.txt.
NOTE
In Listing 1 on page 7, device_type is deprecated and should not be used. Also, using
#cell-index is discouraged. If used, the binding needs to be specific about what it
corresponds to in the programming model, and alternatively, a more specific named
property should be considered.
For the ARM GIC, the bindings are similar but different. The first cell defines the interrupt type:
• 0 = SPI interrupts
• 1 = PPI interrupts
The second cell contains the interrupt number. SPI interrupts number 0-987, while PPI interrupts number 0-15.
The third cell represents level sense:
• 1 = low-to-high edge sensitive
• 2 = high-to-low edge sensitive
• 4 = active-high level sensitive
• 8 = active-low level-sensitive
i2c@3000 {
#address-cells = <1>;
#size-cells = <0>;
cell-index = <0>;
compatible = "fsl-i2c";
reg = <0x3000 0x100>;
dtt@48 {
compatible = "national,lm75";
reg = <0x48>;
};
rtc@68 {
compatible = "dallas,ds1337";
reg = <0x68>;
};
};
Using the syntax described above, we can make the following observations about this example node:
• The I2C controller is located at offset 0x3000 from its parent.
• The driver for the I2C controller is fsl-i2c.
• The first child is named dtt, at offset 0x48 from its parent; the driver is national lm75.
• The second child is named rtc, at offset 0x68 from its parent; the driver is Dallas ds1337.
• The interrupt parent is the mpic, and interrupt number 0x43 is used. Because this is OpenPIC, an offset of 16 is added
to the interrupt number for internal interrupts. 43 - 16 = 27, so this is actually SoC interrupt 0x27.
bsc9131rdb.dts
/include/ "bsc9131si.dtsi
/{
model = "fsl, bsc9131.rdb";
compatible = "fsl, bsc9131rdb";
bsc9131si.dtsi
definition of BSC9131 silicon
cpu@0 {
device_type = "cpu";
compatible = "fsl, e500v2";
bsc9131rdb.dtb
00000060 00 00 00 03 00 00 00 0f 00 00 00 1b 66 73 6c 2c |............fsl,|
00000070 31 33 31 62 73 63 39 31 33 31 72 64 62 00 00 00 |bsc9131rdb......|
00000080 00 00 00 0f 00 00 00 21 66 73 6c 2c 62 73 63 39 |.......!fsl,bsc9|
00000090 72 64 62 00 00 00 00 00 01 61 6c 69 61 00 00 03 |131rdb......alia|
/include/ "pq3-i2c-0.dtsi“
/include/ "pq3-i2c-1.dtsi“
/include/ "pq3-duart-0.dtsi“
/include/ "pq3-espi-0.dtsi“
spi@7000 {
fsl,espi-num-chipselects = <4>;
};
-I <input format>
-O <output format>
-b <boot CPU>
set the physical boot cpu
The input format could be .dts, .dtb, or .fs (.fs would read from the current file systems /proc/device-tree). The output format
could be .dts, .dtb, or .asm. There are many other options, to pad bytes and so on (-R, -S, -P). As an example, to compile the
above mentioned bsc9131rdb.dts file: dtc –I dts –O dtb bsc9131rdb.dts > bsc9131rdb.dtb
The DTC can also be used to reverse compile DTBs and make them human-readable again: dtc –I dtb –O dts
bsc9131rdb.dtb > bsc9131rdb_output.dts
9 U-Boot
U-Boot updates the flattened device tree (FDT) with platform-specific information, such as the information derived from the
reset configuration word (RCW), environment variables, and hardware configuration. The most common areas that U-Boot
touches are related to frequency, MAC addresses, LIODNs (Peripheral MMU settings), and memory size — although the
actual fix-ups are board specific and are not documented in any place other than the U-Boot code. Within U-Boot, the main
function where this all occurs is ft_board_setup().
U-Boot itself does not use the device tree on current Freescale platforms, although it has several commands that allow you to
view and manipulate the FDT itself:
• bootm has FDT-related subcommands:
• bootm fdt — relocates the flattened device tree
• bootm go — performs fix-up actions and boots the operating system
• fdt manipulates the FDT:
• fdt addr <addr> [<length>] — sets the FDT location to <addr>
• fdt boardsetup — performs board-specific setup
• fdt move <fdt> <newaddr> <length> — copies the FDT to <addr> and makes it active
• fdt resize — resizes the FDT to size + padding to 4 K address
• fdt print <path> [<prop>] — recursive print starting at <path>
• fdt set <path> <prop> [<val>] — sets <property> [to <val>]
• fdt mknode <path> <node> — creates a new node after <path>
• fdt rm <path> [<prop>] — deletes the node or <property>
• fdt header — displays header information
• fdt chosen [<start> <end>] — adds/updates the /chosen branch in the tree
• <start>/<end> — initrd the start/end address
10 Linux
[root@p4080ds]# cd /proc/device-tree
[root@p4080ds]# find
.
./name
[...]
./model
./fsl,dpaa/ethernet@0/fsl,qman-channel
[...]
./soc@ffe000000/fman@500000/ethernet@f0000/phy-connection-type
[...]
./soc@ffe000000/dma@100300/dma-channel@100/interrupts
[...]
./chosen/linux,initrd-start
You may also use the dtc tool to compile the /proc/device-tree into a DTS file:
spi@6000 {
rfphy0: ad9361_phy@0{
compatible = "fsl,espi-ad_phy","ad9361";
reg = <0>;
spi-max-frequency = <20000000>;
spi-cpha;
band_group1 = <1 7>;
band_group2 = <41>;
reset: reset {
label = "reset";
gpios = <&gpio1 2 1>;
};
pa_en: pa_en {
#num-val = <1>;
label = "pa_en";
gpios = <&gpio 18 1>;
};
lna_en: lna_en {
#num-val = <1>;
label = "lna_en";
gpios = <&gpio 17 1>;
};
};
);
From the bindings in the node, we can see that the hardware is compatible with fsl, espi-ad_phy, and ad9361. This
compatible property is used by the kernel to identify the hardware and match a driver that is registered in the kernel.
Looking through the source, we can see that espi-ad_phy is aliased to ad9361_phy (in file drivers/of/base.c). Further
searching finds the driver for ad9361_phy is located in drivers/rf/phy/ad9361.c.
The driver name is registered with the kernel as ad9361_phy, which is why this particular driver is used.
Probe is defined as ad_phy_probe, which indicates the function used to parse the device tree. We can examine this function
to see exactly where and how the properties in the device tree node for this RF module are used.
As another example, we can look at the T1040 device tree from the QorIQ SDK 1.6. The following is from t1040rdb.dts:
ucc@2200{
compatible = "fsl,ucc_hdlc";
rx-clock-name = "brg2";
tx-clock-name = "brg2";
fsl,rx-sync-clock = "none";
fsl,tx-sync-clock = "none";
fsl,tx-timeslot = <0xfffffffe>;
fsl,rx-timeslot = <0xfffffffe>;
fsl,tdm-framer-type = "e1";
fsl,tdm-mode = "normal";
fsl,tdm-id = <1>;
fsl,siram-entry-id = <2>;
In this example, the hardware is compatible with fsl,ucc_hdlc. We see that the driver for the hardware is located at
drivers/net/wan/fsl_ucc.hdlc.c
In this case, probe is defined as ucc_hdlc_probe, which indicates the function used to parse the device tree.
11 Examples
On Power Architecture®, for example, device trees are located in arch/powerpc/boot/dts. On ARM® architecture, device trees
are for now located in arch/arm/boot/dts.
The following sections are commented examples of DTS and DTSI files for two different Freescale products — P2020 and
LS1021A-TWR.
NOTE
For brevity, only certain sections are outlined below.
11.1.1 P2020rdb.dts
This table shows the P2020rdb.dts file, which describes the P2020 board.
Table 1. P2020rdb.dts
DTS file Comments
/include/ "fsl/p2020si-pre.dtsi" Include file fsl/p2020si-pre.dtsi
/{ Root node is identified with a forward slash
model = "fsl,P2020RDB"; Defines the manufacturer (fsl) and model number
(P2020RDB) of the device
ranges = <0x2000000 0x0 0xa0000000 0 0xa0000000 0x0 PCI child addresses use three cells (phys.hi, phys.mid, and
0x20000000 phys.low)
phys.hi = 0x2000000, which is a field defined in bindings for
things such as prefetchable, configuration space, memory
space, and so on. In this case, it maps to a 32-bit memory
space.
PCI address = 0x0_a0000000
Translated to space 0x0_a0000000 from root node (using
address-size from root space)
Size of window = 0x20000000
0x1000000 0x0 0x00000000 0 0xffc10000 0x0 0x10000>; phys.hi = 0x2000000, which is a field defined in bindings for
things such as prefetchable, configuration space, memory
space, and so on. In this case, it maps to the I/O space.
PCI address = 0x0_00000000
Translated to space 0x0_ffc10000 from root node (using
address-size from root space)
Size of window = 0x10000
pcie@0 { Child PCIe at offset 0x0 from parent (0xffe09000 from root)
ranges = <0x2000000 0x0 0xa0000000 PCIe (in p2020rdb-post.si) is defined with three <u32>
address cells for the child, size = 2 <u32>
phys.hi=0x2000000 = 32-bit memory space
PCI address = 0x0_a0000000
Translated to space 0x2000000 (phys.hi), 0x0 (phys.mid),
0xa0000000 (phys.low)
Size of window = 0x20000000
0x2000000 0x0 0xa0000000
0x0 0x20000000
0x1000000 0x0 0x0 phys.hi=0x1000000 = I/O space
PCI address = 0x0_00000000
Translated to space 0x1000000 (phys.hi), 0x0 (phys.mid), 0x0
(phys.low)
Size of window = 0x100000
0x1000000 0x0 0x0
0x0 0x100000>;
};
};
/include/ "fsl/p2020si-post.dtsi" Include file fsl/p2020si-post.dtsi
11.1.2 P2020si-pre.dtsi
This table provides a device tree included in the p2020si-pre.dtsi file, which also includes the e500vs_power_isa.dtsi file.
Table 2. P2020si-pre.dtsi
DTS file Comments
/dts-v1/; Indication that this DTS file conforms with DTS version 1
/include/ "e500v2_power_isa.dtsi" Include file e500v2_power_isa.dtsi
/{ Root node is identified with a forward slash
compatible = "fsl,P2020"; Can be used by a program for device driver selection (for
example, by an operating system to select platform-specific
code)
#address-cells = <2>; Defines the number of <u32> cells used to encode address
by children as 2
#size-cells = <2>; Root node defines size as two <u32>
interrupt-parent = <&mpic>; Interrupts are directed to MPIC
aliases { Each property of the aliases node defines an index of other
nodes
serial0 = &serial0;
serial1 = &serial1;
ethernet0 = &enet0;
ethernet1 = &enet1;
ethernet2 = &enet2;
pci0 = &pci0;
pci1 = &pci1;
pci2 = &pci2;
};
cpus { CPU node
#address-cells = <1>; Defines the number of <u32> cells used to encode the
address field in child nodes reg property
#size-cells = <0>; Defines the number of <u32> cells used to encode the size
field in a child node’s reg property. Because this is 0, children
are not expected to have a size field in the reg property.
PowerPC,P2020@0 { Node is a labeled PowerPC, P2020
device_type = "cpu"; Indicates this is a CPU node
reg = <0x0>; Indicates CPU 0
next-level-cache = <&L2>; Pointer to the next level of cache
};
PowerPC,P2020@1 { Node is a labeled PowerPC, P2020
device_type = "cpu"; Indicates this is a CPU node
reg = <0x1>; Indicates CPU 1
next-level-cache = <&L2>; Pointer to the next level of cache
};
11.1.3 P2020si-post.dtsi
The post DTSI file contains definitions for the peripherals on the SoC, such as local bus and PCI. Many of these are
referenced to as phandles in the main p2020rdb.dts file. This file, in turn, includes many other DTSI files defining the
specific peripherals. Many uses would not need to touch these files because they are SoC specific.
As an example, here is the local bus controller definition from the post.dtsi file:
&lbc {
#address-cells = <2>;
#size-cells = <1>;
compatible = "fsl,p2020-elbc", "fsl,elbc", "simple-bus";
interrupts = <19 2 0 0>;
};
This is a typical node that defines children to have two address cells and one size cell. The LBC hardware is compatible with
"fsl, p2020-elbc", "fsl, elbc", and "simple-bus". Interrupt is defined at #19 and set to active-high level sensitive. &lbc is a
label to the node path.
ls1021a-twr.dts
#include "ls1021a.dtsi
ls1021a.dtsi
#include "skeleton64.dtsi"
#include <dt-bindings/interrupt-controller/arm-gic.h
skeleton64.dtsi
arm-gic.h
11.2.1 ls1021a-twr.dts
This table shows the ls1021a-twr.dts file, which describes the LS1021A-TWR board.
Table 3. ls1021a-twr.dts
DTS file Comments
/dts-v1/; Indicates that this DTS file conforms with DTS version 1
#include "ls1021a.dtsi" Include file ls1021a.dts
/{ Root node is identified with a forward slash
model = "LS1021A TWR Board"; Defines the model number of the device
aliases { Each property of the aliases node defines an index of other
nodes
enet2_rgmii_phy = &rgmii_phy1;
enet0_sgmii_phy = &sgmii_phy2;
enet1_sgmii_phy = &sgmii_phy0;
};
clocks { Clocks node;
sys_mclk: clock { Definition of phandle sys_mclk
11.2.2 ls1021a.dtsi
The following sections use information from the ls1021a.dtsi file, which describes the LS1021A SoC hardware and is
included by the tower board device tree. Two additional files are included from within this one, neither of which are
commented upon from within this document.
Table 4. ls1021a.dtsi
DTS file Comments
#include "skeleton64.dtsi"
#include <dt-bindings/interrupt-controller/arm-gic.h> Include file arm-gic.h, for interrupt controller definition
/{ Root node is identified with a forward slash
compatible = "fsl,ls1021a"; Can be used by a program for device driver selection (for
example, by an operating system to select platform specific
code)
interrupt-parent = <&gic>; Interrupt controller points to phandle GIC (defined in arm-
gic.h)
#address-cells = <2>; Defines the number of <u32> cells used to encode address
by children as 2
#size-cells = <2>; Defines the number of <u32> cells used to encode size by
children as 2
aliases { Each property of the aliases node defines an index of other
nodes
serial0 = &lpuart0;
serial1 = &lpuart1;
serial2 = &lpuart2;
serial3 = &lpuart3;
serial4 = &lpuart4;
serial5 = &lpuart5;
ethernet0 = &enet0;
ethernet1 = &enet1;
ethernet2 = &enet2;
sysclk = &sysclk;
12 Revision history
This table provides a revision history for this application note.
Table 5. Document revision history
Rev. Date Description
number
0 09/2015 Initial public release