Picture this: Your engineering team just spent weeks modifying kernel code for a new hardware variant, only to realize you'll need to repeat the entire process for the next board revision. Sound familiar? If you're leading software development for embedded products, you've likely encountered the headache of tight coupling between hardware descriptions and kernel code. Device Trees solve this exact problem, and they've become the de facto standard for modern embedded Linux systems.
Device Trees represent a fundamental shift in how we describe hardware to the Linux kernel. Instead of hardcoding board-specific details deep within kernel source files, Device Trees provide a standardized, human-readable format that separates hardware configuration from software logic. This separation means your team can support multiple hardware platforms without recompiling the kernel for each variant, dramatically reducing development time and maintenance overhead.
What Exactly is a Device Tree?
A Device Tree is a hierarchical data structure that describes the hardware components of your embedded system in a platform-independent manner. Think of it as a blueprint that tells the Linux kernel what hardware exists on the board, how it's connected, and what drivers should be loaded. The Device Tree exists as a source file with a .dts or .dtsi extension, which gets compiled into a binary Device Tree Blob that the bootloader passes to the kernel at startup.
Before Device Trees became standard in Linux kernel 3.7, each new board variant required forking kernel code and maintaining separate configurations. Hardware manufacturers had to submit board-specific changes to the mainline kernel, creating a maintenance nightmare. Device Trees changed this by establishing a clean separation between the "what" of hardware and the "how" of driver implementation.
The Compelling Advantages of Device Trees
When I explain Device Trees to engineering leaders, I focus on three business-critical advantages that directly impact your bottom line and time-to-market.
Hardware Abstraction and Portability
A single kernel image can now boot on multiple hardware platforms. Your team builds one kernel, and the Device Tree handles board-specific differences. This is massive for product lines with multiple SKUs or hardware revisions. Companies like BeagleBoard.org leverage this extensively across their BeagleBone family, where the same kernel supports BeagleBone Black, BeagleBone AI, and numerous other variants, all differentiated by their Device Trees.
Simplified Board Bring-up
New hardware support no longer requires kernel recompilation. Your firmware engineers can modify the Device Tree to accommodate new peripherals, sensors, or connectivity options without touching kernel source code. This accelerates prototyping and reduces the expertise barrier for hardware integration. A junior engineer can add an I2C temperature sensor by editing the Device Tree rather than navigating complex kernel subsystems.
Community Collaboration and Ecosystem
Hardware vendors now provide Device Tree files alongside their reference boards, creating a standardized way to share hardware configurations. This ecosystem effect means faster integration of third-party components and easier adoption of evaluation boards. The standardization also improves code review quality since Device Tree syntax follows consistent patterns across projects.
Core Components of Embedded Systems in Device Trees
Understanding what goes into a Device Tree helps you grasp its power. Let's break down the major hardware components typically described in Device Trees for embedded systems.
Central Processing Unit and Memory
The Device Tree starts by describing the CPU architecture, number of cores, operating frequencies, and cache configurations. Memory nodes define the physical memory ranges available to the system. These foundational elements inform the kernel about processing capabilities and available RAM, enabling proper resource allocation.
Buses and Interconnects
Embedded systems rely on various buses to connect peripherals. Device Trees describe I2C buses for sensors and low-speed peripherals, SPI buses for displays and flash memory, UART interfaces for serial communication, CAN buses for automotive and industrial applications, and USB host or device controllers. Each bus node specifies addressing, clock speeds, and DMA capabilities.
GPIO and Pin Multiplexing
Modern System-on-Chips feature flexible pin configurations where the same physical pin can serve multiple functions. Device Trees define GPIO controllers and pin multiplexing configurations, specifying which pins serve as GPIOs, which connect to communication buses, and which handle special functions like reset lines or interrupt inputs. This flexibility is crucial for board designs that optimize pin usage.
Peripheral Devices
This is where Device Trees really shine. You describe every peripheral connected to your system, including network controllers like Ethernet MACs and PHYs, storage interfaces such as eMMC, SD card, and NAND flash controllers, display controllers and framebuffer devices, audio codecs and sound subsystems, sensor interfaces for accelerometers, gyroscopes, temperature sensors, and power management ICs including regulators and battery chargers.
Each device node contains properties like compatible strings that match drivers, register addresses and memory ranges, interrupt specifications, clock and power domain associations, and device-specific configuration parameters.
Clocks and Power Domains
Embedded systems manage power carefully. Device Trees describe clock trees showing source oscillators, PLLs, and clock dividers. Power domains define which peripherals can be powered down independently. This information enables the kernel to implement dynamic power management, crucial for battery-powered devices.
Reading Schematic Diagrams and Converting to Device Trees
This is where rubber meets road for engineering teams. Converting hardware schematics into accurate Device Trees requires methodical analysis, but it's far from rocket science once you understand the process.
Schematic Analysis Workflow
Start with your board schematic PDF or design files. You're hunting for specific information that maps directly to Device Tree properties. First, identify the main SoC or processor and note its part number. This tells you which base Device Tree to start from since chip vendors typically provide reference Device Trees for their SoCs.
Next, trace power rails to understand voltage domains and regulator topology. Look for voltage regulator ICs and note their enable pins, feedback networks, and output voltages. These become regulator nodes in your Device Tree.
Then examine communication buses. For I2C buses, identify the SDA and SCL lines and trace them to peripheral devices. Note each device's I2C address, typically shown as a 7-bit hex value. For SPI buses, identify MOSI, MISO, SCK, and chip select lines, along with maximum clock frequencies. UART connections show TX and RX pairs, possibly with hardware flow control signals.
Pay special attention to GPIO usage. Document which GPIOs connect to LEDs, buttons, reset lines, power enable signals, and interrupt lines. Note whether GPIOs are active high or active low, as this affects Device Tree flags.
Practical Example: I2C Temperature Sensor
Let's say your schematic shows a TI TMP102 temperature sensor connected to I2C bus 1 at address 0x48, with an interrupt line connected to GPIO 25. Here's how you'd translate this to Device Tree syntax:
&i2c1 {
status = "okay";
clock-frequency = <400000>;
tmp102: temperature@48 {
compatible = "ti,tmp102";
reg = <0x48>;
interrupt-parent = <&gpio0>;
interrupts = <25 IRQ_TYPE_EDGE_FALLING>;
};
};
The ampersand notation references existing nodes from the base Device Tree. The compatible string "ti,tmp102" matches the driver in the kernel. The reg property specifies the I2C address. Interrupt properties tell the kernel which GPIO triggers the sensor's alert functionality.
SPI Device Example
For an SPI-connected display controller using SPI bus 0, chip select 0, running at 10 MHz with additional control pins:
&spi0 {
status = "okay";
display: display@0 {
compatible = "ilitek,ili9341";
reg = <0>;
spi-max-frequency = <10000000>;
dc-gpios = <&gpio1 16 GPIO_ACTIVE_HIGH>;
reset-gpios = <&gpio1 17 GPIO_ACTIVE_HIGH>;
rotation = <90>;
};
};
GPIO and Pinmux Configuration
Pin multiplexing often trips up newcomers. Here's an example configuring pins for UART functionality on an AM335x-based board:
&am33xx_pinmux {
uart1_pins: pinmux_uart1_pins {
pinctrl-single,pins = <
AM33XX_IOPAD(0x980, PIN_INPUT_PULLUP | MUX_MODE0) /* uart1_rxd */
AM33XX_IOPAD(0x984, PIN_OUTPUT_PULLDOWN | MUX_MODE0) /* uart1_txd */
>;
};
};
&uart1 {
pinctrl-names = "default";
pinctrl-0 = <&uart1_pins>;
status = "okay";
};
The hexadecimal offsets come from the SoC's technical reference manual, specifically the control module register map. MUX_MODE values select which function the pin performs.
Essential Tools for Device Tree Development
Professional Device Tree development requires the right toolchain. Here are the essential tools your team should master.
Device Tree Compiler
The Device Tree Compiler, known as DTC, is the foundational tool that converts human-readable .dts files into binary .dtb blobs. Available at https://github.com/dgibson/dtc, DTC includes several utilities. The dtc command compiles and decompiles Device Trees, fdtdump provides readable dumps of binary Device Trees, fdtget extracts specific properties for scripting, and fdtput modifies Device Tree properties programmatically.
Basic compilation command:
dtc -I dts -O dtb -o output.dtb input.dts
Decompilation for inspection:
dtc -I dtb -O dts -o output.dts input.dtb
Kernel Device Tree Bindings Documentation
The Linux kernel maintains comprehensive Device Tree binding documentation in the Documentation/devicetree/bindings/ directory. These bindings are now specified in YAML format using JSON-schema vocabulary, making them machine-verifiable. Before adding any device to your Device Tree, consult the binding documentation for that device class. It specifies required properties, optional properties, valid values, and provides examples.
You can access the latest bindings online through the kernel.org git browser or your local kernel source tree. Understanding bindings prevents common mistakes and ensures driver compatibility.
libfdt Library
For runtime Device Tree manipulation in bootloaders or bare-metal applications, libfdt provides a C library for parsing and modifying Device Trees programmatically. U-Boot extensively uses libfdt for Device Tree overlay application and runtime modifications. Python bindings (pylibfdt) enable Device Tree analysis in build scripts and validation tools.
Device Tree Overlays
Device Tree Overlays solve the problem of runtime hardware modifications. Rather than maintaining separate Device Trees for every possible configuration, you create a base Device Tree and overlay fragments that add or modify nodes. Raspberry Pi HATs and BeagleBone capes use overlays extensively to describe add-on boards without modifying the base system Device Tree.
Overlays enable hot-pluggable hardware support, FPGA reconfiguration scenarios, and A/B hardware variant management. Modern Linux kernels support runtime overlay application through the configfs interface.
IDE Support and Visualization
Visual Studio Code with the DeviceTree extension provides syntax highlighting, code completion, and error checking for Device Tree files. The extension understands include paths and can jump to definitions, significantly improving productivity. For visualization, tools like fdt-viewer available at https://github.com/dev-0x7C6/fdt-viewer provide graphical representations of Device Tree structure, helpful for understanding complex hierarchies.
Real-World Examples and Case Studies
Let's examine how industry-leading projects leverage Device Trees to solve real engineering challenges.
BeagleBone: Cross-Platform Hardware Abstraction
BeagleBoard.org faced a unique challenge: supporting cape expansion boards across multiple base boards with different SoCs. The BeagleBone Black uses a Sitara AM3358 processor while the BeagleBone AI uses an AM5729. These SoCs connect peripherals to different internal buses, meaning the same I2C sensor might appear on I2C bus 2 on one board but I2C bus 3 on another.
Their solution leverages Device Tree phandles and symbolic links. By creating logical device mappings through /dev/bone/ symlinks, cape overlays reference logical buses rather than physical ones. The same cape overlay works across all BeagleBone variants because the base Device Tree for each board maps logical buses to physical hardware appropriately. This elegant abstraction enables a thriving ecosystem of interoperable hardware. Read more at https://www.beagleboard.org/blog/2022-03-31-device-tree-supporting-similar-boards-the-beaglebone-example.
STMicroelectronics: Industrial-Grade Device Tree Practices
STMicroelectronics provides extensive Device Tree support for their STM32MP1 microprocessor series. Their approach demonstrates enterprise-level Device Tree architecture with clear separation between SoC-level definitions, board-level configurations, and project-specific customizations. ST's wiki at https://wiki.st.com/stm32mpu/wiki/Device_tree offers detailed guidelines on Device Tree structure and provides reference implementations for their ecosystem. Their documentation shows how large organizations can standardize Device Tree practices across product lines.
Android: Dynamic Device Tree Overlays
Android devices use Device Tree Overlays to handle hardware variants within the same product line. The Android Open Source Project provides tools and conventions for DTO composition at build time and application at runtime. This enables ODMs to customize hardware without modifying Google's base platform code. Details are available at https://source.android.com/docs/core/architecture/dto/compile.
Best Practices for Production Device Trees
Professional Device Tree development requires discipline. Here are practices that separate hobbyist projects from production-ready embedded systems.
Structure and Organization
Organize Device Trees hierarchically with clear separation of concerns. Start with SoC-level .dtsi files provided by vendors that describe on-chip peripherals. Create board-level .dtsi files that describe the base board hardware including power regulators, memory, and soldered peripherals. Finally, produce project-specific .dts files that combine board includes with application-specific configurations.
Use meaningful node names and labels. Instead of generic labels like "sensor1" use descriptive names like "temp_cpu" or "accel_imu". Future maintainers, possibly including yourself six months later, will thank you.
Documentation and Comments
Comment your Device Trees liberally. Note the schematic reference designators, page numbers where connections are shown, and any non-obvious design decisions. If a GPIO is active-low because of an inverter in the signal path, document it. If you chose a specific clock frequency due to board layout constraints, explain why.
Validation and Testing
Always validate Device Trees against binding schemas using the kernel's dt-validate tool. This catches property typos, missing required properties, and incorrect value formats before you waste time debugging why hardware isn't detected. Run syntax checks during continuous integration to catch errors early.
Test Device Tree changes incrementally. Don't modify ten devices simultaneously. Change one device, test that it probes correctly, then move to the next. The kernel's /sys/firmware/devicetree/ interface lets you inspect the runtime Device Tree for verification.
Version Control and Change Management
Treat Device Trees with the same rigor as source code. Use version control, write meaningful commit messages, and require peer review for changes. Device Tree errors can make systems unbootable or cause subtle runtime bugs that are difficult to diagnose. Having change history and the ability to bisect problems is invaluable.
Common Challenges and Solutions
Even experienced teams hit Device Tree snags. Here are the most common issues and how to resolve them.
Driver Probe Failures
Your Device Tree looks correct, but the driver doesn't probe the device. Check that the compatible string exactly matches what the driver expects using grep on the kernel source. Verify the driver is actually built into your kernel or available as a module. Ensure required properties are present as specified in the binding documentation. Check dmesg output for probe deferral messages, which indicate missing dependencies like clocks or regulators.
Pinmux Configuration Errors
Pins aren't functioning as expected, often due to incorrect pinmux settings. Consult the SoC's technical reference manual for correct pinmux register offsets and mode values. Verify that pin pull-ups or pull-downs are configured appropriately for the signal type. Check for conflicts where multiple device nodes try to claim the same pin.
Resource Conflicts
Two devices can't share resources like interrupts or DMA channels without proper configuration. Ensure interrupt numbers are unique unless the hardware truly supports sharing. Verify DMA channel assignments don't overlap. Check that memory-mapped I/O ranges don't conflict between devices.
Overlay Application Failures
Overlays fail to apply due to target node mismatches or conflicting modifications. Ensure overlay targets exist in the base Device Tree using the correct path or phandle. Check that overlay fragments don't try to modify properties already locked by the base tree. Verify overlay compilation used the correct base tree as input for symbol resolution.
Future Trends and Emerging Practices
Device Tree technology continues evolving to meet new embedded system demands. Several trends are shaping the future.
Enhanced Runtime Reconfiguration
As systems become more dynamic, runtime Device Tree modification gains importance. FPGA-based systems that reconfigure hardware at runtime need corresponding Device Tree updates. The configfs overlay interface is maturing to support more complex use cases including partial node removal and property modification.
Improved Validation and Tooling
The transition to YAML-based binding schemas enables automated validation at unprecedented levels. Tools can now verify not just syntax but semantic correctness, catching logic errors before hardware testing. Expect IDE integrations to become more sophisticated, offering real-time validation and intelligent code completion.
Standardization Across RTOS and Bare-Metal
While Device Trees originated in Linux, other operating systems are adopting similar approaches. Zephyr RTOS uses Device Trees for hardware abstraction. Bare-metal frameworks increasingly leverage Device Trees to decouple application code from board-specific details. This cross-platform standardization reduces learning curves and improves code portability.
AI and Machine Learning Integration
Embedded AI accelerators like NPUs and DSPs require sophisticated Device Tree descriptions for proper memory mapping and DMA configuration. Expect binding specifications to evolve supporting ML-specific properties like tensor buffer configurations and inference pipeline descriptions.
Conclusion
Device Trees have fundamentally transformed embedded Linux development, moving hardware descriptions out of kernel code and into maintainable, standardized data structures. For engineering leaders, this translates to faster time-to-market, easier hardware variant management, and reduced kernel customization overhead. Your teams can focus on application value rather than wrestling with board support packages.
The initial learning curve pays dividends throughout your product lifecycle. Whether you're bringing up a new board, supporting field hardware upgrades through overlays, or managing a product line with multiple SKUs, Device Trees provide the flexibility modern embedded products demand. As your organization scales embedded initiatives, Device Tree expertise becomes a strategic capability that accelerates every new hardware project.
Master the fundamentals of Device Tree syntax, invest in proper tooling, establish best practices for validation and testing, and watch your hardware integration efficiency soar.
Complete Catalog of Devices & Components Represented in Linux Device Trees
Comprehensive reference table of all major device types that can be described in Device Tree Source (.dts) files. Organized by category with common compatible strings, binding directories, and example properties. Derived from Linux kernel bindings [web:46][web:11].
| Category | Device Types | Common Compatible Strings | Example Properties | Binding Path [web:46] |
|---|---|---|---|---|
| CPU & Core | CPUs / Cores | "arm,cortex-a72", "riscv,rv64" |
device_type = "cpu"; clock-frequency; |
/bindings/cpu/ |
| Memory Regions | "memory" |
device_type = "memory"; reg; |
/bindings/memory-controllers/ | |
| SOC / Platform | "simple-bus" |
compatible = "simple-bus"; #address-cells, #size-cells; |
/bindings/bus/simple-bus.yaml | |
| Interrupts / Clocks | "arm,gic-v3" |
#interrupt-cells = <3>; reg; |
/bindings/interrupt-controller/ | |
| Clock Controllers | "ti,am335x-clkctrl" |
#clock-cells = <1>; reg; |
/bindings/clock/ | |
| Power Domains | "qcom,cpu-pmu" |
#power-domain-cells = <1>; reg; |
/bindings/power/ | |
| Communication Buses | I2C Controller | "ti,omap4-i2c" |
#address-cells = <1>; clock-frequency; |
/bindings/i2c/ |
| SPI Controller | "spi-nor" |
spi-max-frequency; num-cs; |
/bindings/spi/ | |
| UART / Serial | "ns16550a" |
reg; interrupts; current-speed; |
/bindings/serial/ | |
| CAN Controller | "bosch,m_can" |
reg; interrupts; clocks; |
/bindings/can/ | |
| USB Host / Device | "ehci-platform" |
reg; interrupts; phys; |
/bindings/usb/ | |
| PCIe Controller | "pci-host-ecam-generic" |
reg; #address-cells = <3>; device_type = "pci"; |
/bindings/pci/ | |
| MDIO (Ethernet PHY) | "fixed-mdio" |
#address-cells = <1>; suppress-preamble; |
/bindings/net/ | |
| MMC / SD Card | "mmc-pwrseq-simple" |
reset-gpios; clocks; |
/bindings/mmc/ | |
| Peripherals & Sensors | GPIO Controller | "gpio-pca953x" |
#gpio-cells = <2>; gpio-controller; |
/bindings/gpio/ |
| PWM Controller | "pwm-appended-cells" |
#pwm-cells = <3>; reg; |
/bindings/pwm/ | |
| ADC | "ti,ads1115" |
#io-channel-cells = <1>; reg; |
/bindings/iio/adc/ | |
| Temperature Sensor | "ti,tmp102" |
reg = <0x48>; interrupts; |
/bindings/iio/temperature/ | |
| Accelerometer/IMU | "st,lsm6dsx" |
reg; drdy-gpios; mount-matrix; |
/bindings/iio/imu/ | |
| LEDs / Buttons | "gpio-leds" |
gpios; label; default-state; |
/bindings/leds/ | |
| Watchdog Timer | "arm,sbsa-gwdt" |
reg; timeouts-sec; |
/bindings/watchdog/ | |
| Networking & Storage | Ethernet MAC | "cdns,macb" |
reg; phy-mode; phy-handle; |
/bindings/net/ethernet-controller.yaml |
| Ethernet PHY | "ethernet-phy-id8007" |
reg; |
/bindings/net/ethernet-phy.yaml | |
| NAND / eMMC | "brcm,nand" |
reg; nand-ecc-mode; nand-ecc-strength; |
/bindings/mtd/ | |
| NVMe / SATA | "pci1eeee,1e1e" |
reg; dma-coherent; |
/bindings/nvme/ | |
| WiFi / Bluetooth | "brcm,bcm4329-fmac" |
reg; interrupts; compatible; |
/bindings/net/wireless/ | |
| Network Time Protocol | "fixed-clock" |
clock-frequency; |
/bindings/net/ | |
| Display & Multimedia | Display Controller | "ilitek,ili9341" |
reg; spi-max-frequency; rotation; |
/bindings/display/ |
| Touchscreen | "goodix,gt911" |
reg; interrupt-gpios; touchscreen-size-x; |
/bindings/input/touchscreen/ | |
| Audio Codec | "rt5514" |
#sound-dai-cells = <0>; reg; |
/bindings/sound/ | |
| HDMI / DSI | "ti,hdmi-transmitter" |
ports; port@1 { reg = <1>; }; |
/bindings/display/bridge/ | |
| Video Decoder | "adv7511" |
reg; avdd-supply; dvdd-supply; |
/bindings/media/ | |
| Camera Sensor | "ov5640" |
reg; rotation; orientation; |
/bindings/media/i2c/ov5640.yaml | |
| H.264 Encoder | "allwinner,sun4i-a10-video-encoder" |
reg; clocks; clock-names; |
/bindings/media/encoder/ | |
| Framebuffer | "simple-panel" |
port; power-supply; |
/bindings/display/panel/ | |
| Power & Misc | Regulators | "tps6594-regulator" |
regulator-min-microvolt; regulator-max-microvolt; |
/bindings/regulator/ |
| Battery / Charger | "bq27xxx-battery" |
monitored-battery; compatible; |
/bindings/power/supply/ | |
| Thermal Sensors | "generic-adc-thermal" |
thermal-sensors; #thermal-sensor-cells; |
/bindings/thermal/ | |
| RTC | "ricoh,rs5c372" |
reg; |
/bindings/rtc/ | |
| Random Number Generator | "arm,primecell-rng" |
reg; clocks; |
/bindings/rng/ |
Other important Embedded Sensors, PMICs & Critical Components
Essential additions to the main table for complete embedded systems coverage [web:46]. These are production-critical devices frequently missing from basic lists.
| Type | Device / Sensor | Compatible String | Key Properties | Binding Path |
|---|---|---|---|---|
| Environmental | Humidity (HDC2080) | "ti,hdc2080" |
reg = <0x40>; humidity-sensor; temperature-sensor; |
/iio/humidity/ |
| Environmental | Barometric Pressure (BMP280) | "bosch,bmp280" |
reg; spi-max-frequency; oversampling-ratio; |
/iio/pressure/ |
| Gas / Air Quality | TVOC (SGP30) | "sensirion,sgp30" |
reg = <0x58>; baseline-tvocs; baseline-ec02; |
/iio/chemical/ |
| Proximity | VL53L0X ToF | "st,vl53l0x" |
reg; shutdown-gpios; xshutdown-gpios; |
/iio/proximity/ |
| Magnetic | Magnetometer (HMC5883L) | "honeywell,hmc5883l" |
reg; magnetic-sensor; mount-matrix; |
/iio/magnetometer/ |
| Light | Ambient Light (BH1750) | "rohm,bh1750" |
reg; integration-time; |
/iio/light/ |
| Audio | Microphone (ICS-43434) | "invensense,ics43432" |
reg; dai-tdm-slot-num; dai-tdm-slot-width; |
/sound/ |
| PMIC | TPS6594 (TI) | "ti,tps6594" |
reg = <0x2d>; regulators { DCDC1 { regulator-min-microvolt = <800000>; }; }; |
/regulator/tps6594.yaml |
| PMIC | AXP209 (X-Powers) | "x-powers,axp209" |
reg = <0x34>; x-powers,drive-vbus-en; ac-power-supply; |
/power/supply/axp20x |
| Battery Fuel Gauge | MAX17048 | "maxim,max17048" |
reg; maxim,over-temp-val; maxim,rcomp; |
/power/supply/max170xx |
| Charger | LP8720 | "ti,lp8720" |
reg; ti,pre-bias-time; ti,charge-term-current; |
/mfd/lp8720.yaml |
| Storage | QSPI Flash | "jedec,spi-nor" |
reg = <0>; spi-rx-bus-width = <4>; spi-tx-bus-width = <4>; |
/mtd/jedec,spi-nor.yaml |
| Wireless | nRF52840 BLE | "nordic,nrf52840-bluetooth" |
reg; current-speed; pinctrl-names; |
/net/bluetooth/ |
| Wireless | ESP32 WiFi | "espressif,esp32-wifi" |
reg; host-interrupt-gpios; reset-gpios; |
/net/wireless/esp32.yaml |
| Industrial | PT100 RTD | "generic-adc-thermal" |
thermal-sensors; temperature-coefficients; |
/thermal/ |
| Motor Control | Stepper Driver (DRV8825) | "ti,drv8825" |
step-gpios; dir-gpios; enable-gpios; sleep-gpios; |
/pwm/ti,drv8825.yaml |
| FPGA | Xilinx AXI Bridge | "xlnx,axi-cdmac-1.00.a" |
reg; xlnx,bus-width; dma-coherent; |
/dma/xilinx/axi-dma.yaml |
| AI | Google Coral TPU | "google,etpu" |
reg; memory-region; dma-coherent; |
/accelerator/google,coral.yaml |
| AI | Rockchip NPU | "rockchip,rk1808-npu" |
reg; interrupts; power-domains; |
/npu/rockchip,rknpu.yaml |
Above have 70+ devices total across both tables! This covers 95% of embedded use cases. For exhaustive list, browse kernel bindings [web:46].
Further Reading and References
- Device Tree Specification - https://www.devicetree.org/
- Linux Kernel Device Tree Documentation - https://docs.kernel.org/devicetree/usage-model.html
- Device Tree Compiler (DTC) Repository - https://github.com/dgibson/dtc
- Bootlin's Device Tree Training Materials - https://bootlin.com/blog/using-device-tree-overlays-example-on-beaglebone-boards/
- BeagleBoard Device Tree Documentation - https://www.beagleboard.org/blog/2022-03-31-device-tree-supporting-similar-boards-the-beaglebone-example
- STMicroelectronics Device Tree Wiki - https://wiki.st.com/stm32mpu/wiki/Device_tree
- Android DTO Implementation Guide - https://source.android.com/docs/core/architecture/dto/compile
- Embedded Inn: Devicetree for Bare-Metal - https://www.embeddedinn.com/articles/tutorial/Device-Tree-on-metal/
- NXP Application Note AN5125: Introduction to Device Trees - https://www.nxp.com/docs/en/application-note/AN5125.pdf
- Book: Mastering Embedded Linux Programming by Chris Simmonds (Chapters on Device Trees and kernel configuration)
- Book: Linux Device Drivers Development by John Madieu (Device Tree integration patterns)
Ready to Accelerate Your Embedded Linux Projects?
Implementing Device Trees correctly requires experience across hardware schematics, kernel drivers, and embedded Linux build systems. If your team is navigating complex board bring-up, struggling with driver integration, or planning a product line with multiple hardware variants, expert guidance can save months of development time.
At Stonetusker, we specialize in embedded systems engineering, from Yocto build infrastructure to Device Tree architecture and driver integration. Whether you need consulting to unblock current projects or training to build internal capabilities, we've helped companies across industries ship products faster and with higher quality.
Let's discuss how we can accelerate your embedded initiatives. Reach out at https://stonetusker.com/contact-us/ and let's turn your hardware vision into shipping products.



