Skip to content

Day04 - Device Tree Exploration on Raspberry Pi

Lab 1 — Inspect Device Tree Files

List available Device Tree files.

ls /boot/firmware

Output:

 bcm2710-rpi-2-b.dtb        bcm2711-rpi-cm4-io.dtb       bootcode.bin   fixup_x.dat        start4cd.elf
 bcm2710-rpi-3-b.dtb        bcm2711-rpi-cm4s.dtb         cmdline.txt    initramfs_2712     start4db.elf
 bcm2710-rpi-3-b-plus.dtb   bcm2712d0-rpi-5-b.dtb        config.txt     initramfs8         start4.elf
 bcm2710-rpi-cm0.dtb        bcm2712-d-rpi-5-b.dtb        fixup4cd.dat   issue.txt          start4x.elf
 bcm2710-rpi-cm3.dtb        bcm2712-rpi-500.dtb          fixup4.dat     kernel_2712.img    start_cd.elf
 bcm2710-rpi-zero-2.dtb     bcm2712-rpi-5-b.dtb          fixup4db.dat   kernel8.img        start_db.elf
 bcm2710-rpi-zero-2-w.dtb   bcm2712-rpi-cm5-cm4io.dtb    fixup4x.dat    LICENCE.broadcom   start.elf
 bcm2711-rpi-400.dtb        bcm2712-rpi-cm5-cm5io.dtb    fixup_cd.dat   meta-data          start_x.elf
 bcm2711-rpi-4-b.dtb        bcm2712-rpi-cm5l-cm4io.dtb   fixup.dat      network-config    'System Volume Information'
 bcm2711-rpi-cm4.dtb        bcm2712-rpi-cm5l-cm5io.dtb   fixup_db.dat   overlays           user-data

You will see many .dtb files.

bcm2711-rpi-4-b.dtb
bcm2712-rpi-5-b.dtb
bcm2712-rpi-500.dtb

These files correspond to different Raspberry Pi boards.


Lab 2 — Check Current Board Model

The current board model can be read from the device tree.

cat /proc/device-tree/model

Example output:

Raspberry Pi 5 Model B Rev 1.1

Lab 3 — Inspect Device Tree Nodes

List top-level nodes:

ls /proc/device-tree

Example output:

cpus
memory
soc
chosen

These represent hardware components detected by the kernel.


Lab 4 — Explore SoC Devices

List devices inside the SoC node.

ls /proc/device-tree/soc@107c000000

Output:

'#address-cells'        gpiomem@7d504100   intc@7d508400                   name                       rng@7d208000
 avs-monitor@7d542000   gpiomem@7d508500   intc@7d517ac0                   nvmem                      rpi_rtc
 axiperf@7c012800       gpiomem@7d510700   interrupt-controller@7c502000   phandle                    serial@7d001000
 clock@7c700000         gpiomem@7d517c00   interrupt-controller@7cd00000   pinctrl@7d504100           serial@7d50c000
 compatible             hdmi@7ef00700      interrupt-controller@7d510600   pinctrl@7d510700          '#size-cells'
 fb                     hdmi@7ef05700      interrupt-controller@7d517000   pixelvalve@7c410000        sound
 firmware               i2c@7d005600       interrupt-controller@7fff9000   pixelvalve@7c411000        spi@7d004000
 fixedregulator_3v3     i2c@7d508200       mailbox@7c013880                power                      timer@7c003000
 fixedregulator_5v0     i2c@7d508280       mmc@fff000                      ranges                     watchdog@7d200000
 gpio@7d508500          intc@7d503000      mop@7c500000                    reset-controller@119500
 gpio@7d517c00          intc@7d508380      moplet@7c501000                 reset-controller@1504318

Example entries:

gpio
serial
spi
i2c

Each directory represents a peripheral device.


Lab 5 — Check Driver Compatibility

Inspect the compatible string for a device.

UART:

cat /proc/device-tree/soc@107c000000/serial@7d50c000/compatible

Output:

brcm,bcm7271-uart

The kernel uses this string to match the correct driver.


Lab 6 — Decompile Device Tree

Install the device tree compiler:

sudo apt install device-tree-compiler

Convert DTB to DTS:

dtc -I dtb -O dts -o rpi5.dts /boot/firmware/bcm2712-rpi-5-b.dtb

This produces a readable Device Tree source file.

You can inspect the hardware configuration of the board.

Device Tree Source Code in Raspberry PI 5

// SPDX-License-Identifier: (GPL-2.0 OR MIT)
/dts-v1/;

#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/clock/rp1.h>
#include <dt-bindings/interrupt-controller/irq.h>
#include <dt-bindings/mfd/rp1.h>
#include <dt-bindings/pwm/pwm.h>
#include <dt-bindings/reset/raspberrypi,firmware-reset.h>

#include "bcm2712-ds.dtsi"

/ {
    compatible = "raspberrypi,5-model-b", "brcm,bcm2712";
    model = "Raspberry Pi 5";

    /* Will be filled by the bootloader */
    memory@0 {
        device_type = "memory";
#ifndef FIRMWARE_UPDATED
        reg = <0 0 0x28000000>;
#else
        reg = <0 0 0 0x28000000>;
#endif
    };

    leds: leds {
        compatible = "gpio-leds";

        led_pwr: led-pwr {
            label = "PWR";
            gpios = <&rp1_gpio 44 GPIO_ACTIVE_LOW>;
            default-state = "off";
            linux,default-trigger = "none";
        };

        led_act: led-act {
            label = "ACT";
            gpios = <&gio_aon 9 GPIO_ACTIVE_LOW>;
            default-state = "off";
            linux,default-trigger = "mmc0";
        };
    };

    sd_io_1v8_reg: sd-io-1v8-reg {
        compatible = "regulator-gpio";
        regulator-name = "vdd-sd-io";
        regulator-min-microvolt = <1800000>;
        regulator-max-microvolt = <3300000>;
        regulator-boot-on;
        regulator-always-on;
        regulator-settling-time-us = <5000>;
        gpios = <&gio_aon 3 GPIO_ACTIVE_HIGH>;
        states = <1800000 1>,
             <3300000 0>;
    };

    sd_vcc_reg: sd-vcc-reg {
        compatible = "regulator-fixed";
        regulator-name = "vcc-sd";
        regulator-min-microvolt = <3300000>;
        regulator-max-microvolt = <3300000>;
        regulator-boot-on;
        enable-active-high;
        gpios = <&gio_aon 4 GPIO_ACTIVE_HIGH>;
    };

    wl_on_reg: wl-on-reg {
        compatible = "regulator-fixed";
        regulator-name = "wl-on-regulator";
        regulator-min-microvolt = <3300000>;
        regulator-max-microvolt = <3300000>;
        pinctrl-0 = <&wl_on_pins>;
        pinctrl-names = "default";

        gpio = <&gio 28 GPIO_ACTIVE_HIGH>;

        startup-delay-us = <150000>;
        enable-active-high;
    };

    cam1_clk: cam1_clk {
        compatible = "fixed-clock";
        #clock-cells = <0>;
        status = "disabled";
    };

    cam0_clk: cam0_clk {
        compatible = "fixed-clock";
        #clock-cells = <0>;
        status = "disabled";
    };

    cam0_reg: cam0_reg {
        compatible = "regulator-fixed";
        regulator-name = "cam0_reg";
        enable-active-high;
        gpio = <&rp1_gpio 34 0>;  // CD0_IO0_MICCLK, to MIPI 0 connector
    };

    cam1_reg: cam1_reg {
        compatible = "regulator-fixed";
        regulator-name = "cam1_reg";
        enable-active-high;
        gpio = <&rp1_gpio 46 0>;  // CD1_IO0_MICCLK, to MIPI 1 connector
    };

    cam_dummy_reg: cam_dummy_reg {
        compatible = "regulator-fixed";
        regulator-name = "cam-dummy-reg";
    };

    dummy: dummy {
        // A target for unwanted overlay fragments
    };


    // A few extra labels to keep overlays happy

    i2c0if: i2c0if {};
    i2c0mux: i2c0mux {};
};

rp1_target: &pcie2 {
    aspm-no-l0s;
    status = "okay";
};

// The system SPI for the bootloader EEPROM
&spi10 { status = "okay"; };

#include "rp1.dtsi"

&rp1 {
    // PCIe address space layout:
    // 00_00000000-00_00xxxxxx = RP1 peripherals
    // 10_00000000-1x_xxxxxxxx = up to 64GB system RAM

    // outbound access aimed at PCIe 0_00xxxxxx -> RP1 c0_40xxxxxx
    // This is the RP1 peripheral space
    ranges = <0xc0 0x40000000
          0x02000000 0x00 0x00000000
          0x00 0x00410000>;

    dma-ranges =
    // inbound RP1 1x_xxxxxxxx -> PCIe 1x_xxxxxxxx
             <0x10 0x00000000
              0x43000000 0x10 0x00000000
              0x10 0x00000000>,

    // inbound RP1 c0_40xxxxxx -> PCIe 00_00xxxxxx
    // This allows the RP1 DMA controller to address RP1 hardware
             <0xc0 0x40000000
              0x02000000 0x0 0x00000000
              0x0 0x00410000>,

    // inbound RP1 0x_xxxxxxxx -> PCIe 1x_xxxxxxxx
             <0x00 0x00000000
              0x02000000 0x10 0x00000000
              0x10 0x00000000>;
};

// Expose RP1 nodes as system nodes with labels

&rp1_dma  {
    status = "okay";
};

&rp1_eth {
    status = "okay";
    phy-handle = <&phy1>;
    phy-reset-gpios = <&rp1_gpio 32 GPIO_ACTIVE_LOW>;
    phy-reset-duration = <5>;

    phy1: ethernet-phy@1 {
        reg = <0x1>;
        brcm,powerdown-enable;
        eee-broken-1000t;
        eee-broken-100tx;
    };
};

/* The Debug UART, on Rpi5 it's on JST-SH 1.0mm 3-pin connector
 * labeled "UART", i.e. the interface with the system console.
 */
&uart10 {
    status = "okay";
};

gpio: &rp1_gpio {
    status = "okay";
};

aux: &dummy {};

&rp1_usb0 {
    pinctrl-0 = <&usb_vbus_pins>;
    pinctrl-names = "default";
    status = "okay";
};

&rp1_usb1 {
    status = "okay";
};

#include "bcm2712-rpi.dtsi"

i2c_csi_dsi0: &i2c6 { // Note: This is for MIPI0 connector only
    pinctrl-0 = <&rp1_i2c6_38_39>;
    pinctrl-names = "default";
    clock-frequency = <100000>;
    symlink = "i2c-6";
};

i2c_csi_dsi1: &i2c4 { // Note: This is for MIPI1 connector only
    pinctrl-0 = <&rp1_i2c4_40_41>;
    pinctrl-names = "default";
    clock-frequency = <100000>;
    symlink = "i2c-4";
};

i2c_csi_dsi: &i2c_csi_dsi1 { }; // An alias for compatibility

csi0: &rp1_csi0 { };
csi1: &rp1_csi1 { };
dsi0: &rp1_dsi0 { };
dsi1: &rp1_dsi1 { };
dpi: &rp1_dpi { };
vec: &rp1_vec { };
dpi_gpio0:              &rp1_dpi_24bit_gpio0        { };
dpi_gpio1:              &rp1_dpi_24bit_gpio2        { };
dpi_18bit_cpadhi_gpio0: &rp1_dpi_18bit_cpadhi_gpio0 { };
dpi_18bit_cpadhi_gpio2: &rp1_dpi_18bit_cpadhi_gpio2 { };
dpi_18bit_gpio0:        &rp1_dpi_18bit_gpio0        { };
dpi_18bit_gpio2:        &rp1_dpi_18bit_gpio2        { };
dpi_16bit_cpadhi_gpio0: &rp1_dpi_16bit_cpadhi_gpio0 { };
dpi_16bit_cpadhi_gpio2: &rp1_dpi_16bit_cpadhi_gpio2 { };
dpi_16bit_gpio0:        &rp1_dpi_16bit_gpio0        { };
dpi_16bit_gpio2:        &rp1_dpi_16bit_gpio2        { };

/* Add the IOMMUs for some RP1 bus masters */

&csi0 {
    iommus = <&iommu5>;
};

&csi1 {
    iommus = <&iommu5>;
};

&dsi0 {
    iommus = <&iommu5>;
};

&dsi1 {
    iommus = <&iommu5>;
};

&dpi {
    iommus = <&iommu5>;
};

&vec {
    iommus = <&iommu5>;
};

&ddc0 {
    status = "disabled";
};

&ddc1 {
    status = "disabled";
};

&hdmi0 {
    clocks = <&firmware_clocks 13>, <&firmware_clocks 14>, <&dvp 0>, <&clk_27MHz>;
    clock-names = "hdmi", "bvb", "audio", "cec";
    status = "disabled";
};

&hdmi1 {
    clocks = <&firmware_clocks 13>, <&firmware_clocks 14>, <&dvp 1>, <&clk_27MHz>;
    clock-names = "hdmi", "bvb", "audio", "cec";
    status = "disabled";
};

&hvs {
    clocks = <&firmware_clocks 4>, <&firmware_clocks 16>;
    clock-names = "core", "disp";
};

&mop {
    status = "disabled";
};

&moplet {
    status = "disabled";
};

&pixelvalve0 {
    status = "disabled";
};

&pixelvalve1 {
    status = "disabled";
};

&disp_intr {
    status = "disabled";
};

/* SDIO1 is used to drive the SD card */
&sdio1 {
    pinctrl-0 = <&emmc_sd_pulls>, <&emmc_aon_cd_pins>;
    pinctrl-names = "default";
    vqmmc-supply = <&sd_io_1v8_reg>;
    vmmc-supply = <&sd_vcc_reg>;
    bus-width = <4>;
    sd-uhs-sdr50;
    sd-uhs-ddr50;
    sd-uhs-sdr104;
    supports-cqe = <1>;
    cd-gpios = <&gio_aon 5 GPIO_ACTIVE_LOW>;
    //no-1-8-v;
    status = "okay";
};

&pinctrl_aon {
    emmc_aon_cd_pins: emmc_aon_cd_pins {
        function = "sd_card_g";
        pins = "aon_gpio5";
        bias-pull-up;
    };

    /* Slight hack - only one PWM pin (status LED) is usable */
    aon_pwm_1pin: aon_pwm_1pin {
        function = "aon_pwm";
        pins = "aon_gpio9";
    };
};

&pinctrl {
    pwr_button_pins: pwr_button_pins {
        function = "gpio";
        pins = "gpio20";
        bias-pull-up;
    };

    wl_on_pins: wl_on_pins {
        function = "gpio";
        pins = "gpio28";
    };

    bt_shutdown_pins: bt_shutdown_pins {
        function = "gpio";
        pins = "gpio29";
    };

    emmc_sd_pulls: emmc_sd_pulls {
        pins = "emmc_cmd", "emmc_dat0", "emmc_dat1", "emmc_dat2", "emmc_dat3";
        bias-pull-up;
    };
};

/* uarta communicates with the BT module */
&uarta {
    uart-has-rtscts;
    auto-flow-control;
    status = "okay";
    clock-frequency = <96000000>;
    pinctrl-0 = <&uarta_24_pins &bt_shutdown_pins>;
    pinctrl-names = "default";

    bluetooth: bluetooth {
        compatible = "brcm,bcm43438-bt";
        max-speed = <3000000>;
        shutdown-gpios = <&gio 29 GPIO_ACTIVE_HIGH>;
        local-bd-address = [ 00 00 00 00 00 00 ];
    };
};

&i2c10 {
    clock-frequency = <400000>;
    pinctrl-0 = <&i2c3_m4_agpio0_pins>;
    pinctrl-names = "default";
};

/ {
    fan: cooling_fan {
        status = "disabled";
        compatible = "pwm-fan";
        #cooling-cells = <2>;
        cooling-min-state = <0>;
        cooling-max-state = <3>;
        cooling-levels = <0 75 125 175 250>;
        pwms = <&rp1_pwm1 3 41566 PWM_POLARITY_INVERTED>;
        rpm-regmap = <&rp1_pwm1>;
        rpm-offset = <0x3c>;
    };

    pwr_button {
        compatible = "gpio-keys";

        pinctrl-names = "default";
        pinctrl-0 = <&pwr_button_pins>;
        status = "okay";

        pwr_key: pwr {
            label = "pwr_button";
            // linux,code = <205>; // KEY_SUSPEND
            linux,code = <116>; // KEY_POWER
            gpios = <&gio 20 GPIO_ACTIVE_LOW>;
            debounce-interval = <50>; // ms
        };
    };
};

&usb {
    power-domains = <&power RPI_POWER_DOMAIN_USB>;
};

/* SDIO2 drives the WLAN interface */
&sdio2 {
    pinctrl-0 = <&sdio2_30_pins>;
    pinctrl-names = "default";
    bus-width = <4>;
    vmmc-supply = <&wl_on_reg>;
    sd-uhs-ddr50;
    non-removable;
    status = "okay";
    #address-cells = <1>;
    #size-cells = <0>;

    wifi: wifi@1 {
        reg = <1>;
        compatible = "brcm,bcm4329-fmac";
        local-mac-address = [00 00 00 00 00 00];
    };
};

&pinctrl {
    spi10_gpio2: spi10_gpio2 {
        function = "vc_spi0";
        pins = "gpio2", "gpio3", "gpio4";
        bias-disable;
    };

    spi10_cs_gpio1: spi10_cs_gpio1 {
        function = "gpio";
        pins = "gpio1";
        bias-pull-up;
    };
};

spi10_pins: &spi10_gpio2 {};
spi10_cs_pins: &spi10_cs_gpio1 {};

&spi10 {
    pinctrl-names = "default";
    cs-gpios = <&gio 1 1>;
    pinctrl-0 = <&spi10_pins &spi10_cs_pins>;

    spidev10: spidev@0 {
        compatible = "spidev";
        reg = <0>;  /* CE0 */
        #address-cells = <1>;
        #size-cells = <0>;
        spi-max-frequency = <20000000>;
        status = "okay";
    };
};

// =============================================
// Board specific stuff here

&gio_aon {
    // Don't use GIO_AON as an interrupt controller because it will
    // clash with the firmware monitoring the PMIC interrupt via the VPU.

    /delete-property/ interrupt-controller;
    /delete-property/ #interrupt-cells;
};

&main_aon_irq {
    // Don't use the MAIN_AON_IRQ interrupt controller because it will
    // clash with the firmware monitoring the PMIC interrupt via the VPU.

    status = "disabled";
};

&rp1_pwm1 {
    status = "disabled";
    pinctrl-0 = <&rp1_pwm1_gpio45>;
    pinctrl-names = "default";
};

&thermal_trips {
    cpu_tepid: cpu-tepid {
        temperature = <50000>;
        hysteresis = <5000>;
        type = "active";
    };

    cpu_warm: cpu-warm {
        temperature = <60000>;
        hysteresis = <5000>;
        type = "active";
    };

    cpu_hot: cpu-hot {
        temperature = <67500>;
        hysteresis = <5000>;
        type = "active";
    };

    cpu_vhot: cpu-vhot {
        temperature = <75000>;
        hysteresis = <5000>;
        type = "active";
    };
};

&cooling_maps {
    tepid {
        trip = <&cpu_tepid>;
        cooling-device = <&fan 1 1>;
    };

    warm {
        trip = <&cpu_warm>;
        cooling-device = <&fan 2 2>;
    };

    hot {
        trip = <&cpu_hot>;
        cooling-device = <&fan 3 3>;
    };

    vhot {
        trip = <&cpu_vhot>;
        cooling-device = <&fan 4 4>;
    };

    melt {
        trip = <&cpu_crit>;
        cooling-device = <&fan 4 4>;
    };
};

&gio {
    // The GPIOs above 35 are not used on Pi 5, so shrink the upper bank
    // to reduce the clutter in gpioinfo/pinctrl
    brcm,gpio-bank-widths = <32 4>;

    gpio-line-names =
        "-", // GPIO_000
        "2712_BOOT_CS_N", // GPIO_001
        "2712_BOOT_MISO", // GPIO_002
        "2712_BOOT_MOSI", // GPIO_003
        "2712_BOOT_SCLK", // GPIO_004
        "-", // GPIO_005
        "-", // GPIO_006
        "-", // GPIO_007
        "-", // GPIO_008
        "-", // GPIO_009
        "-", // GPIO_010
        "-", // GPIO_011
        "-", // GPIO_012
        "-", // GPIO_013
        "PCIE_SDA", // GPIO_014
        "PCIE_SCL", // GPIO_015
        "-", // GPIO_016
        "-", // GPIO_017
        "-", // GPIO_018
        "-", // GPIO_019
        "PWR_GPIO", // GPIO_020
        "2712_G21_FS", // GPIO_021
        "-", // GPIO_022
        "-", // GPIO_023
        "BT_RTS", // GPIO_024
        "BT_CTS", // GPIO_025
        "BT_TXD", // GPIO_026
        "BT_RXD", // GPIO_027
        "WL_ON", // GPIO_028
        "BT_ON", // GPIO_029
        "WIFI_SDIO_CLK", // GPIO_030
        "WIFI_SDIO_CMD", // GPIO_031
        "WIFI_SDIO_D0", // GPIO_032
        "WIFI_SDIO_D1", // GPIO_033
        "WIFI_SDIO_D2", // GPIO_034
        "WIFI_SDIO_D3"; // GPIO_035
};

&gio_aon {
    gpio-line-names =
        "RP1_SDA", // AON_GPIO_00
        "RP1_SCL", // AON_GPIO_01
        "RP1_RUN", // AON_GPIO_02
        "SD_IOVDD_SEL", // AON_GPIO_03
        "SD_PWR_ON", // AON_GPIO_04
        "SD_CDET_N", // AON_GPIO_05
        "SD_FLG_N", // AON_GPIO_06
        "-", // AON_GPIO_07
        "2712_WAKE", // AON_GPIO_08
        "2712_STAT_LED", // AON_GPIO_09
        "-", // AON_GPIO_10
        "-", // AON_GPIO_11
        "PMIC_INT", // AON_GPIO_12
        "UART_TX_FS", // AON_GPIO_13
        "UART_RX_FS", // AON_GPIO_14
        "-", // AON_GPIO_15
        "-", // AON_GPIO_16

        // Pad bank0 out to 32 entries
        "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",

        "HDMI0_SCL", // AON_SGPIO_00
        "HDMI0_SDA", // AON_SGPIO_01
        "HDMI1_SCL", // AON_SGPIO_02
        "HDMI1_SDA", // AON_SGPIO_03
        "PMIC_SCL", // AON_SGPIO_04
        "PMIC_SDA"; // AON_SGPIO_05

    rp1_run_hog {
        gpio-hog;
        gpios = <2 GPIO_ACTIVE_HIGH>;
        output-high;
        line-name = "RP1 RUN pin";
    };
};

&rp1_gpio {
    gpio-line-names =
        "ID_SDA", // GPIO0
        "ID_SCL", // GPIO1
        "GPIO2", // GPIO2
        "GPIO3", // GPIO3
        "GPIO4", // GPIO4
        "GPIO5", // GPIO5
        "GPIO6", // GPIO6
        "GPIO7", // GPIO7
        "GPIO8", // GPIO8
        "GPIO9", // GPIO9
        "GPIO10", // GPIO10
        "GPIO11", // GPIO11
        "GPIO12", // GPIO12
        "GPIO13", // GPIO13
        "GPIO14", // GPIO14
        "GPIO15", // GPIO15
        "GPIO16", // GPIO16
        "GPIO17", // GPIO17
        "GPIO18", // GPIO18
        "GPIO19", // GPIO19
        "GPIO20", // GPIO20
        "GPIO21", // GPIO21
        "GPIO22", // GPIO22
        "GPIO23", // GPIO23
        "GPIO24", // GPIO24
        "GPIO25", // GPIO25
        "GPIO26", // GPIO26
        "GPIO27", // GPIO27

        "PCIE_RP1_WAKE", // GPIO28
        "FAN_TACH", // GPIO29
        "HOST_SDA", // GPIO30
        "HOST_SCL", // GPIO31
        "ETH_RST_N", // GPIO32
        "-", // GPIO33

        "CD0_IO0_MICCLK", // GPIO34
        "CD0_IO0_MICDAT0", // GPIO35
        "RP1_PCIE_CLKREQ_N", // GPIO36
        "-", // GPIO37
        "CD0_SDA", // GPIO38
        "CD0_SCL", // GPIO39
        "CD1_SDA", // GPIO40
        "CD1_SCL", // GPIO41
        "USB_VBUS_EN", // GPIO42
        "USB_OC_N", // GPIO43
        "RP1_STAT_LED", // GPIO44
        "FAN_PWM", // GPIO45
        "CD1_IO0_MICCLK", // GPIO46
        "2712_WAKE", // GPIO47
        "CD1_IO1_MICDAT1", // GPIO48
        "EN_MAX_USB_CUR", // GPIO49
        "-", // GPIO50
        "-", // GPIO51
        "-", // GPIO52
        "-"; // GPIO53

    usb_vbus_pins: usb_vbus_pins {
        function = "vbus1";
        pins = "gpio42", "gpio43";
    };
};

/ {
    __overrides__ {
        sd_cqe = <&sdio1>, "supports-cqe:0";
    };
};

&hvs {
    clocks = <&firmware_clocks 4>, <&firmware_clocks 16>;
    clock-names = "core", "disp";
};

&hdmi0 {
    clocks = <&firmware_clocks 13>, <&firmware_clocks 14>, <&dvp 0>, <&clk_27MHz>;
    clock-names = "hdmi", "bvb", "audio", "cec";
};

&hdmi1 {
    clocks = <&firmware_clocks 13>, <&firmware_clocks 14>, <&dvp 1>, <&clk_27MHz>;
    clock-names = "hdmi", "bvb", "audio", "cec";
};

&pcie1 {
    brcm,clkreq-mode = "safe";
};

&pcie2 {
    status = "okay";
};

What You Learned

  • Device Tree describes hardware for the Linux kernel
  • .dtb files are loaded during boot
  • The kernel exposes the parsed tree in /proc/device-tree
  • Drivers match hardware using the compatible string