<kernel v5.15>
DTB – 라즈베리파이 4b
사용한 디바이스 트리 파일은 다음과 같고, 괄호안의 번호 순서대로 보여준다.
- bcm2711-rpi-4-b.dts (6~7)
- bcm2711.dtsi (2)
- bcm283x.dtsi (1)
- bcm2711-rpi.dtsi (4)
- bcm2835-rpi.dtsi (3)
- bcm283x-rpi-usb-peripheral.dtsi (5)
- bcm2711.dtsi (2)
(1) bcm283x.dtsi
arch/arm/boot/dts/bcm283x.dtsi
#include <dt-bindings/pinctrl/bcm2835.h> #include <dt-bindings/clock/bcm2835.h> #include <dt-bindings/clock/bcm2835-aux.h> #include <dt-bindings/gpio/gpio.h> #include <dt-bindings/interrupt-controller/irq.h> #include <dt-bindings/soc/bcm2835-pm.h> /* firmware-provided startup stubs live here, where the secondary CPUs are * spinning. */ /memreserve/ 0x00000000 0x00001000; /* This include file covers the common peripherals and configuration between * bcm2835 and bcm2836 implementations, leaving the CPU configuration to * bcm2835.dtsi and bcm2836.dtsi. */ / { compatible = "brcm,bcm2835"; model = "BCM2835"; #address-cells = <1>; #size-cells = <1>; aliases { serial0 = &uart0; serial1 = &uart1; }; chosen { stdout-path = "serial0:115200n8"; }; rmem: reserved-memory { #address-cells = <1>; #size-cells = <1>; ranges; cma: linux,cma { compatible = "shared-dma-pool"; size = <0x4000000>; /* 64MB */ reusable; linux,cma-default; }; }; thermal-zones { cpu_thermal: cpu-thermal { polling-delay-passive = <0>; polling-delay = <1000>; trips { cpu-crit { temperature = <90000>; hysteresis = <0>; type = "critical"; }; }; cooling-maps { }; }; }; soc { compatible = "simple-bus"; #address-cells = <1>; #size-cells = <1>; system_timer: timer@7e003000 { compatible = "brcm,bcm2835-system-timer"; reg = <0x7e003000 0x1000>; interrupts = <1 0>, <1 1>, <1 2>, <1 3>; /* This could be a reference to BCM2835_CLOCK_TIMER, * but we don't have the driver using the common clock * support yet. */ clock-frequency = <1000000>; }; txp: txp@7e004000 { compatible = "brcm,bcm2835-txp"; reg = <0x7e004000 0x20>; interrupts = <1 11>; }; clocks: cprman@7e101000 { compatible = "brcm,bcm2835-cprman"; #clock-cells = <1>; reg = <0x7e101000 0x2000>; /* CPRMAN derives almost everything from the * platform's oscillator. However, the DSI * pixel clocks come from the DSI analog PHY. */ clocks = <&clk_osc>, <&dsi0 0>, <&dsi0 1>, <&dsi0 2>, <&dsi1 0>, <&dsi1 1>, <&dsi1 2>; }; mailbox: mailbox@7e00b880 { compatible = "brcm,bcm2835-mbox"; reg = <0x7e00b880 0x40>; interrupts = <0 1>; #mbox-cells = <0>; }; gpio: gpio@7e200000 { compatible = "brcm,bcm2835-gpio"; reg = <0x7e200000 0xb4>; /* * The GPIO IP block is designed for 3 banks of GPIOs. * Each bank has a GPIO interrupt for itself. * There is an overall "any bank" interrupt. * In order, these are GIC interrupts 17, 18, 19, 20. * Since the BCM2835 only has 2 banks, the 2nd bank * interrupt output appears to be mirrored onto the * 3rd bank's interrupt signal. * So, a bank0 interrupt shows up on 17, 20, and * a bank1 interrupt shows up on 18, 19, 20! */ interrupts = <2 17>, <2 18>, <2 19>, <2 20>; gpio-controller; #gpio-cells = <2>; interrupt-controller; #interrupt-cells = <2>; /* Defines common pin muxing groups * * While each pin can have its mux selected * for various functions individually, some * groups only make sense to switch to a * particular function together. */ dpi_gpio0: dpi_gpio0 { brcm,pins = <0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27>; brcm,function = <BCM2835_FSEL_ALT2>; }; emmc_gpio22: emmc_gpio22 { brcm,pins = <22 23 24 25 26 27>; brcm,function = <BCM2835_FSEL_ALT3>; }; emmc_gpio34: emmc_gpio34 { brcm,pins = <34 35 36 37 38 39>; brcm,function = <BCM2835_FSEL_ALT3>; brcm,pull = <BCM2835_PUD_OFF BCM2835_PUD_UP BCM2835_PUD_UP BCM2835_PUD_UP BCM2835_PUD_UP BCM2835_PUD_UP>; }; emmc_gpio48: emmc_gpio48 { brcm,pins = <48 49 50 51 52 53>; brcm,function = <BCM2835_FSEL_ALT3>; }; gpclk0_gpio4: gpclk0_gpio4 { brcm,pins = <4>; brcm,function = <BCM2835_FSEL_ALT0>; }; gpclk1_gpio5: gpclk1_gpio5 { brcm,pins = <5>; brcm,function = <BCM2835_FSEL_ALT0>; }; gpclk1_gpio42: gpclk1_gpio42 { brcm,pins = <42>; brcm,function = <BCM2835_FSEL_ALT0>; }; gpclk1_gpio44: gpclk1_gpio44 { brcm,pins = <44>; brcm,function = <BCM2835_FSEL_ALT0>; }; gpclk2_gpio6: gpclk2_gpio6 { brcm,pins = <6>; brcm,function = <BCM2835_FSEL_ALT0>; }; gpclk2_gpio43: gpclk2_gpio43 { brcm,pins = <43>; brcm,function = <BCM2835_FSEL_ALT0>; brcm,pull = <BCM2835_PUD_OFF>; }; i2c0_gpio0: i2c0_gpio0 { brcm,pins = <0 1>; brcm,function = <BCM2835_FSEL_ALT0>; }; i2c0_gpio28: i2c0_gpio28 { brcm,pins = <28 29>; brcm,function = <BCM2835_FSEL_ALT0>; }; i2c0_gpio44: i2c0_gpio44 { brcm,pins = <44 45>; brcm,function = <BCM2835_FSEL_ALT1>; }; i2c1_gpio2: i2c1_gpio2 { brcm,pins = <2 3>; brcm,function = <BCM2835_FSEL_ALT0>; }; i2c1_gpio44: i2c1_gpio44 { brcm,pins = <44 45>; brcm,function = <BCM2835_FSEL_ALT2>; }; jtag_gpio22: jtag_gpio22 { brcm,pins = <22 23 24 25 26 27>; brcm,function = <BCM2835_FSEL_ALT4>; }; pcm_gpio18: pcm_gpio18 { brcm,pins = <18 19 20 21>; brcm,function = <BCM2835_FSEL_ALT0>; }; pcm_gpio28: pcm_gpio28 { brcm,pins = <28 29 30 31>; brcm,function = <BCM2835_FSEL_ALT2>; }; sdhost_gpio48: sdhost_gpio48 { brcm,pins = <48 49 50 51 52 53>; brcm,function = <BCM2835_FSEL_ALT0>; }; spi0_gpio7: spi0_gpio7 { brcm,pins = <7 8 9 10 11>; brcm,function = <BCM2835_FSEL_ALT0>; }; spi0_gpio35: spi0_gpio35 { brcm,pins = <35 36 37 38 39>; brcm,function = <BCM2835_FSEL_ALT0>; }; spi1_gpio16: spi1_gpio16 { brcm,pins = <16 17 18 19 20 21>; brcm,function = <BCM2835_FSEL_ALT4>; }; spi2_gpio40: spi2_gpio40 { brcm,pins = <40 41 42 43 44 45>; brcm,function = <BCM2835_FSEL_ALT4>; }; uart0_gpio14: uart0_gpio14 { brcm,pins = <14 15>; brcm,function = <BCM2835_FSEL_ALT0>; }; /* Separate from the uart0_gpio14 group * because it conflicts with spi1_gpio16, and * people often run uart0 on the two pins * without flow control. */ uart0_ctsrts_gpio16: uart0_ctsrts_gpio16 { brcm,pins = <16 17>; brcm,function = <BCM2835_FSEL_ALT3>; }; uart0_ctsrts_gpio30: uart0_ctsrts_gpio30 { brcm,pins = <30 31>; brcm,function = <BCM2835_FSEL_ALT3>; brcm,pull = <BCM2835_PUD_UP BCM2835_PUD_OFF>; }; uart0_gpio32: uart0_gpio32 { brcm,pins = <32 33>; brcm,function = <BCM2835_FSEL_ALT3>; brcm,pull = <BCM2835_PUD_OFF BCM2835_PUD_UP>; }; uart0_gpio36: uart0_gpio36 { brcm,pins = <36 37>; brcm,function = <BCM2835_FSEL_ALT2>; }; uart0_ctsrts_gpio38: uart0_ctsrts_gpio38 { brcm,pins = <38 39>; brcm,function = <BCM2835_FSEL_ALT2>; }; uart1_gpio14: uart1_gpio14 { brcm,pins = <14 15>; brcm,function = <BCM2835_FSEL_ALT5>; }; uart1_ctsrts_gpio16: uart1_ctsrts_gpio16 { brcm,pins = <16 17>; brcm,function = <BCM2835_FSEL_ALT5>; }; uart1_gpio32: uart1_gpio32 { brcm,pins = <32 33>; brcm,function = <BCM2835_FSEL_ALT5>; }; uart1_ctsrts_gpio30: uart1_ctsrts_gpio30 { brcm,pins = <30 31>; brcm,function = <BCM2835_FSEL_ALT5>; }; uart1_gpio40: uart1_gpio40 { brcm,pins = <40 41>; brcm,function = <BCM2835_FSEL_ALT5>; }; uart1_ctsrts_gpio42: uart1_ctsrts_gpio42 { brcm,pins = <42 43>; brcm,function = <BCM2835_FSEL_ALT5>; }; }; uart0: serial@7e201000 { compatible = "arm,pl011", "arm,primecell"; reg = <0x7e201000 0x200>; interrupts = <2 25>; clocks = <&clocks BCM2835_CLOCK_UART>, <&clocks BCM2835_CLOCK_VPU>; clock-names = "uartclk", "apb_pclk"; arm,primecell-periphid = <0x00241011>; }; sdhost: mmc@7e202000 { compatible = "brcm,bcm2835-sdhost"; reg = <0x7e202000 0x100>; interrupts = <2 24>; clocks = <&clocks BCM2835_CLOCK_VPU>; status = "disabled"; }; i2s: i2s@7e203000 { compatible = "brcm,bcm2835-i2s"; reg = <0x7e203000 0x24>; clocks = <&clocks BCM2835_CLOCK_PCM>; status = "disabled"; }; spi: spi@7e204000 { compatible = "brcm,bcm2835-spi"; reg = <0x7e204000 0x200>; interrupts = <2 22>; clocks = <&clocks BCM2835_CLOCK_VPU>; #address-cells = <1>; #size-cells = <0>; status = "disabled"; }; i2c0: i2c@7e205000 { compatible = "brcm,bcm2835-i2c"; reg = <0x7e205000 0x200>; interrupts = <2 21>; clocks = <&clocks BCM2835_CLOCK_VPU>; #address-cells = <1>; #size-cells = <0>; status = "disabled"; }; dpi: dpi@7e208000 { compatible = "brcm,bcm2835-dpi"; reg = <0x7e208000 0x8c>; clocks = <&clocks BCM2835_CLOCK_VPU>, <&clocks BCM2835_CLOCK_DPI>; clock-names = "core", "pixel"; #address-cells = <1>; #size-cells = <0>; status = "disabled"; }; dsi0: dsi@7e209000 { compatible = "brcm,bcm2835-dsi0"; reg = <0x7e209000 0x78>; interrupts = <2 4>; #address-cells = <1>; #size-cells = <0>; #clock-cells = <1>; clocks = <&clocks BCM2835_PLLA_DSI0>, <&clocks BCM2835_CLOCK_DSI0E>, <&clocks BCM2835_CLOCK_DSI0P>; clock-names = "phy", "escape", "pixel"; clock-output-names = "dsi0_byte", "dsi0_ddr2", "dsi0_ddr"; status = "disabled"; }; aux: aux@7e215000 { compatible = "brcm,bcm2835-aux"; #clock-cells = <1>; reg = <0x7e215000 0x8>; clocks = <&clocks BCM2835_CLOCK_VPU>; }; uart1: serial@7e215040 { compatible = "brcm,bcm2835-aux-uart"; reg = <0x7e215040 0x40>; interrupts = <1 29>; clocks = <&aux BCM2835_AUX_CLOCK_UART>; status = "disabled"; }; spi1: spi@7e215080 { compatible = "brcm,bcm2835-aux-spi"; reg = <0x7e215080 0x40>; interrupts = <1 29>; clocks = <&aux BCM2835_AUX_CLOCK_SPI1>; #address-cells = <1>; #size-cells = <0>; status = "disabled"; }; spi2: spi@7e2150c0 { compatible = "brcm,bcm2835-aux-spi"; reg = <0x7e2150c0 0x40>; interrupts = <1 29>; clocks = <&aux BCM2835_AUX_CLOCK_SPI2>; #address-cells = <1>; #size-cells = <0>; status = "disabled"; }; pwm: pwm@7e20c000 { compatible = "brcm,bcm2835-pwm"; reg = <0x7e20c000 0x28>; clocks = <&clocks BCM2835_CLOCK_PWM>; assigned-clocks = <&clocks BCM2835_CLOCK_PWM>; assigned-clock-rates = <10000000>; #pwm-cells = <2>; status = "disabled"; }; sdhci: mmc@7e300000 { compatible = "brcm,bcm2835-sdhci"; reg = <0x7e300000 0x100>; interrupts = <2 30>; clocks = <&clocks BCM2835_CLOCK_EMMC>; status = "disabled"; }; hvs@7e400000 { compatible = "brcm,bcm2835-hvs"; reg = <0x7e400000 0x6000>; interrupts = <2 1>; }; dsi1: dsi@7e700000 { compatible = "brcm,bcm2835-dsi1"; reg = <0x7e700000 0x8c>; interrupts = <2 12>; #address-cells = <1>; #size-cells = <0>; #clock-cells = <1>; clocks = <&clocks BCM2835_PLLD_DSI1>, <&clocks BCM2835_CLOCK_DSI1E>, <&clocks BCM2835_CLOCK_DSI1P>; clock-names = "phy", "escape", "pixel"; clock-output-names = "dsi1_byte", "dsi1_ddr2", "dsi1_ddr"; status = "disabled"; }; i2c1: i2c@7e804000 { compatible = "brcm,bcm2835-i2c"; reg = <0x7e804000 0x1000>; interrupts = <2 21>; clocks = <&clocks BCM2835_CLOCK_VPU>; #address-cells = <1>; #size-cells = <0>; status = "disabled"; }; usb: usb@7e980000 { compatible = "brcm,bcm2835-usb"; reg = <0x7e980000 0x10000>; interrupts = <1 9>; #address-cells = <1>; #size-cells = <0>; clocks = <&clk_usb>; clock-names = "otg"; phys = <&usbphy>; phy-names = "usb2-phy"; }; }; clocks { /* The oscillator is the root of the clock tree. */ clk_osc: clk-osc { compatible = "fixed-clock"; #clock-cells = <0>; clock-output-names = "osc"; clock-frequency = <19200000>; }; clk_usb: clk-usb { compatible = "fixed-clock"; #clock-cells = <0>; clock-output-names = "otg"; clock-frequency = <480000000>; }; }; usbphy: phy { compatible = "usb-nop-xceiv"; #phy-cells = <0>; }; };
(2) bcm2711.dtsi
arch/arm/boot/dts/bcm2711.dtsi
// SPDX-License-Identifier: GPL-2.0 #include "bcm283x.dtsi" #include <dt-bindings/interrupt-controller/arm-gic.h> #include <dt-bindings/soc/bcm2835-pm.h> / { compatible = "brcm,bcm2711"; #address-cells = <2>; #size-cells = <1>; interrupt-parent = <&gicv2>; vc4: gpu { compatible = "brcm,bcm2711-vc5"; status = "disabled"; }; clk_27MHz: clk-27M { #clock-cells = <0>; compatible = "fixed-clock"; clock-frequency = <27000000>; clock-output-names = "27MHz-clock"; }; clk_108MHz: clk-108M { #clock-cells = <0>; compatible = "fixed-clock"; clock-frequency = <108000000>; clock-output-names = "108MHz-clock"; }; soc { /* * Defined ranges: * Common BCM283x peripherals * BCM2711-specific peripherals * ARM-local peripherals */ ranges = <0x7e000000 0x0 0xfe000000 0x01800000>, <0x7c000000 0x0 0xfc000000 0x02000000>, <0x40000000 0x0 0xff800000 0x00800000>; /* Emulate a contiguous 30-bit address range for DMA */ dma-ranges = <0xc0000000 0x0 0x00000000 0x40000000>; /* * This node is the provider for the enable-method for * bringing up secondary cores. */ local_intc: local_intc@40000000 { compatible = "brcm,bcm2836-l1-intc"; reg = <0x40000000 0x100>; }; gicv2: interrupt-controller@40041000 { interrupt-controller; #interrupt-cells = <3>; compatible = "arm,gic-400"; reg = <0x40041000 0x1000>, <0x40042000 0x2000>, <0x40044000 0x2000>, <0x40046000 0x2000>; interrupts = <GIC_PPI 9 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_HIGH)>; }; avs_monitor: avs-monitor@7d5d2000 { compatible = "brcm,bcm2711-avs-monitor", "syscon", "simple-mfd"; reg = <0x7d5d2000 0xf00>; thermal: thermal { compatible = "brcm,bcm2711-thermal"; #thermal-sensor-cells = <0>; }; }; dma: dma@7e007000 { compatible = "brcm,bcm2835-dma"; reg = <0x7e007000 0xb00>; interrupts = <GIC_SPI 80 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 81 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 82 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 83 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 84 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 85 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 86 IRQ_TYPE_LEVEL_HIGH>, /* DMA lite 7 - 10 */ <GIC_SPI 87 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 87 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 88 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 88 IRQ_TYPE_LEVEL_HIGH>; interrupt-names = "dma0", "dma1", "dma2", "dma3", "dma4", "dma5", "dma6", "dma7", "dma8", "dma9", "dma10"; #dma-cells = <1>; brcm,dma-channel-mask = <0x07f5>; }; pm: watchdog@7e100000 { compatible = "brcm,bcm2835-pm", "brcm,bcm2835-pm-wdt"; #power-domain-cells = <1>; #reset-cells = <1>; reg = <0x7e100000 0x114>, <0x7e00a000 0x24>, <0x7ec11000 0x20>; clocks = <&clocks BCM2835_CLOCK_V3D>, <&clocks BCM2835_CLOCK_PERI_IMAGE>, <&clocks BCM2835_CLOCK_H264>, <&clocks BCM2835_CLOCK_ISP>; clock-names = "v3d", "peri_image", "h264", "isp"; system-power-controller; }; rng@7e104000 { compatible = "brcm,bcm2711-rng200"; reg = <0x7e104000 0x28>; }; uart2: serial@7e201400 { compatible = "arm,pl011", "arm,primecell"; reg = <0x7e201400 0x200>; interrupts = <GIC_SPI 121 IRQ_TYPE_LEVEL_HIGH>; clocks = <&clocks BCM2835_CLOCK_UART>, <&clocks BCM2835_CLOCK_VPU>; clock-names = "uartclk", "apb_pclk"; arm,primecell-periphid = <0x00241011>; status = "disabled"; }; uart3: serial@7e201600 { compatible = "arm,pl011", "arm,primecell"; reg = <0x7e201600 0x200>; interrupts = <GIC_SPI 121 IRQ_TYPE_LEVEL_HIGH>; clocks = <&clocks BCM2835_CLOCK_UART>, <&clocks BCM2835_CLOCK_VPU>; clock-names = "uartclk", "apb_pclk"; arm,primecell-periphid = <0x00241011>; status = "disabled"; }; uart4: serial@7e201800 { compatible = "arm,pl011", "arm,primecell"; reg = <0x7e201800 0x200>; interrupts = <GIC_SPI 121 IRQ_TYPE_LEVEL_HIGH>; clocks = <&clocks BCM2835_CLOCK_UART>, <&clocks BCM2835_CLOCK_VPU>; clock-names = "uartclk", "apb_pclk"; arm,primecell-periphid = <0x00241011>; status = "disabled"; }; uart5: serial@7e201a00 { compatible = "arm,pl011", "arm,primecell"; reg = <0x7e201a00 0x200>; interrupts = <GIC_SPI 121 IRQ_TYPE_LEVEL_HIGH>; clocks = <&clocks BCM2835_CLOCK_UART>, <&clocks BCM2835_CLOCK_VPU>; clock-names = "uartclk", "apb_pclk"; arm,primecell-periphid = <0x00241011>; status = "disabled"; }; spi3: spi@7e204600 { compatible = "brcm,bcm2835-spi"; reg = <0x7e204600 0x0200>; interrupts = <GIC_SPI 118 IRQ_TYPE_LEVEL_HIGH>; clocks = <&clocks BCM2835_CLOCK_VPU>; #address-cells = <1>; #size-cells = <0>; status = "disabled"; }; spi4: spi@7e204800 { compatible = "brcm,bcm2835-spi"; reg = <0x7e204800 0x0200>; interrupts = <GIC_SPI 118 IRQ_TYPE_LEVEL_HIGH>; clocks = <&clocks BCM2835_CLOCK_VPU>; #address-cells = <1>; #size-cells = <0>; status = "disabled"; }; spi5: spi@7e204a00 { compatible = "brcm,bcm2835-spi"; reg = <0x7e204a00 0x0200>; interrupts = <GIC_SPI 118 IRQ_TYPE_LEVEL_HIGH>; clocks = <&clocks BCM2835_CLOCK_VPU>; #address-cells = <1>; #size-cells = <0>; status = "disabled"; }; spi6: spi@7e204c00 { compatible = "brcm,bcm2835-spi"; reg = <0x7e204c00 0x0200>; interrupts = <GIC_SPI 118 IRQ_TYPE_LEVEL_HIGH>; clocks = <&clocks BCM2835_CLOCK_VPU>; #address-cells = <1>; #size-cells = <0>; status = "disabled"; }; i2c3: i2c@7e205600 { compatible = "brcm,bcm2711-i2c", "brcm,bcm2835-i2c"; reg = <0x7e205600 0x200>; interrupts = <GIC_SPI 117 IRQ_TYPE_LEVEL_HIGH>; clocks = <&clocks BCM2835_CLOCK_VPU>; #address-cells = <1>; #size-cells = <0>; status = "disabled"; }; i2c4: i2c@7e205800 { compatible = "brcm,bcm2711-i2c", "brcm,bcm2835-i2c"; reg = <0x7e205800 0x200>; interrupts = <GIC_SPI 117 IRQ_TYPE_LEVEL_HIGH>; clocks = <&clocks BCM2835_CLOCK_VPU>; #address-cells = <1>; #size-cells = <0>; status = "disabled"; }; i2c5: i2c@7e205a00 { compatible = "brcm,bcm2711-i2c", "brcm,bcm2835-i2c"; reg = <0x7e205a00 0x200>; interrupts = <GIC_SPI 117 IRQ_TYPE_LEVEL_HIGH>; clocks = <&clocks BCM2835_CLOCK_VPU>; #address-cells = <1>; #size-cells = <0>; status = "disabled"; }; i2c6: i2c@7e205c00 { compatible = "brcm,bcm2711-i2c", "brcm,bcm2835-i2c"; reg = <0x7e205c00 0x200>; interrupts = <GIC_SPI 117 IRQ_TYPE_LEVEL_HIGH>; clocks = <&clocks BCM2835_CLOCK_VPU>; #address-cells = <1>; #size-cells = <0>; status = "disabled"; }; pixelvalve0: pixelvalve@7e206000 { compatible = "brcm,bcm2711-pixelvalve0"; reg = <0x7e206000 0x100>; interrupts = <GIC_SPI 109 IRQ_TYPE_LEVEL_HIGH>; status = "disabled"; }; pixelvalve1: pixelvalve@7e207000 { compatible = "brcm,bcm2711-pixelvalve1"; reg = <0x7e207000 0x100>; interrupts = <GIC_SPI 110 IRQ_TYPE_LEVEL_HIGH>; status = "disabled"; }; pixelvalve2: pixelvalve@7e20a000 { compatible = "brcm,bcm2711-pixelvalve2"; reg = <0x7e20a000 0x100>; interrupts = <GIC_SPI 101 IRQ_TYPE_LEVEL_HIGH>; status = "disabled"; }; pwm1: pwm@7e20c800 { compatible = "brcm,bcm2835-pwm"; reg = <0x7e20c800 0x28>; clocks = <&clocks BCM2835_CLOCK_PWM>; assigned-clocks = <&clocks BCM2835_CLOCK_PWM>; assigned-clock-rates = <10000000>; #pwm-cells = <2>; status = "disabled"; }; pixelvalve4: pixelvalve@7e216000 { compatible = "brcm,bcm2711-pixelvalve4"; reg = <0x7e216000 0x100>; interrupts = <GIC_SPI 110 IRQ_TYPE_LEVEL_HIGH>; status = "disabled"; }; hvs: hvs@7e400000 { compatible = "brcm,bcm2711-hvs"; interrupts = <GIC_SPI 97 IRQ_TYPE_LEVEL_HIGH>; }; pixelvalve3: pixelvalve@7ec12000 { compatible = "brcm,bcm2711-pixelvalve3"; reg = <0x7ec12000 0x100>; interrupts = <GIC_SPI 106 IRQ_TYPE_LEVEL_HIGH>; status = "disabled"; }; vec: vec@7ec13000 { compatible = "brcm,bcm2711-vec"; reg = <0x7ec13000 0x1000>; clocks = <&clocks BCM2835_CLOCK_VEC>; interrupts = <GIC_SPI 123 IRQ_TYPE_LEVEL_HIGH>; status = "disabled"; }; dvp: clock@7ef00000 { compatible = "brcm,brcm2711-dvp"; reg = <0x7ef00000 0x10>; clocks = <&clk_108MHz>; #clock-cells = <1>; #reset-cells = <1>; }; aon_intr: interrupt-controller@7ef00100 { compatible = "brcm,bcm2711-l2-intc", "brcm,l2-intc"; reg = <0x7ef00100 0x30>; interrupts = <GIC_SPI 96 IRQ_TYPE_LEVEL_HIGH>; interrupt-controller; #interrupt-cells = <1>; }; hdmi0: hdmi@7ef00700 { compatible = "brcm,bcm2711-hdmi0"; reg = <0x7ef00700 0x300>, <0x7ef00300 0x200>, <0x7ef00f00 0x80>, <0x7ef00f80 0x80>, <0x7ef01b00 0x200>, <0x7ef01f00 0x400>, <0x7ef00200 0x80>, <0x7ef04300 0x100>, <0x7ef20000 0x100>; reg-names = "hdmi", "dvp", "phy", "rm", "packet", "metadata", "csc", "cec", "hd"; clock-names = "hdmi", "bvb", "audio", "cec"; resets = <&dvp 0>; interrupt-parent = <&aon_intr>; interrupts = <0>, <1>, <2>, <3>, <4>, <5>; interrupt-names = "cec-tx", "cec-rx", "cec-low", "wakeup", "hpd-connected", "hpd-removed"; ddc = <&ddc0>; dmas = <&dma 10>; dma-names = "audio-rx"; status = "disabled"; }; ddc0: i2c@7ef04500 { compatible = "brcm,bcm2711-hdmi-i2c"; reg = <0x7ef04500 0x100>, <0x7ef00b00 0x300>; reg-names = "bsc", "auto-i2c"; clock-frequency = <97500>; status = "disabled"; }; hdmi1: hdmi@7ef05700 { compatible = "brcm,bcm2711-hdmi1"; reg = <0x7ef05700 0x300>, <0x7ef05300 0x200>, <0x7ef05f00 0x80>, <0x7ef05f80 0x80>, <0x7ef06b00 0x200>, <0x7ef06f00 0x400>, <0x7ef00280 0x80>, <0x7ef09300 0x100>, <0x7ef20000 0x100>; reg-names = "hdmi", "dvp", "phy", "rm", "packet", "metadata", "csc", "cec", "hd"; ddc = <&ddc1>; clock-names = "hdmi", "bvb", "audio", "cec"; resets = <&dvp 1>; interrupt-parent = <&aon_intr>; interrupts = <8>, <7>, <6>, <9>, <10>, <11>; interrupt-names = "cec-tx", "cec-rx", "cec-low", "wakeup", "hpd-connected", "hpd-removed"; dmas = <&dma 17>; dma-names = "audio-rx"; status = "disabled"; }; ddc1: i2c@7ef09500 { compatible = "brcm,bcm2711-hdmi-i2c"; reg = <0x7ef09500 0x100>, <0x7ef05b00 0x300>; reg-names = "bsc", "auto-i2c"; clock-frequency = <97500>; status = "disabled"; }; }; /* * emmc2 has different DMA constraints based on SoC revisions. It was * moved into its own bus, so as for RPi4's firmware to update them. * The firmware will find whether the emmc2bus alias is defined, and if * so, it'll edit the dma-ranges property below accordingly. */ emmc2bus: emmc2bus { compatible = "simple-bus"; #address-cells = <2>; #size-cells = <1>; ranges = <0x0 0x7e000000 0x0 0xfe000000 0x01800000>; dma-ranges = <0x0 0xc0000000 0x0 0x00000000 0x40000000>; emmc2: mmc@7e340000 { compatible = "brcm,bcm2711-emmc2"; reg = <0x0 0x7e340000 0x100>; interrupts = <GIC_SPI 126 IRQ_TYPE_LEVEL_HIGH>; clocks = <&clocks BCM2711_CLOCK_EMMC2>; status = "disabled"; }; }; arm-pmu { compatible = "arm,cortex-a72-pmu", "arm,armv8-pmuv3"; interrupts = <GIC_SPI 16 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 17 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 18 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 19 IRQ_TYPE_LEVEL_HIGH>; interrupt-affinity = <&cpu0>, <&cpu1>, <&cpu2>, <&cpu3>; }; timer { compatible = "arm,armv8-timer"; interrupts = <GIC_PPI 13 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>, <GIC_PPI 14 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>, <GIC_PPI 11 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>, <GIC_PPI 10 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>; /* This only applies to the ARMv7 stub */ arm,cpu-registers-not-fw-configured; }; cpus: cpus { #address-cells = <1>; #size-cells = <0>; enable-method = "brcm,bcm2836-smp"; // for ARM 32-bit cpu0: cpu@0 { device_type = "cpu"; compatible = "arm,cortex-a72"; reg = <0>; enable-method = "spin-table"; cpu-release-addr = <0x0 0x000000d8>; }; cpu1: cpu@1 { device_type = "cpu"; compatible = "arm,cortex-a72"; reg = <1>; enable-method = "spin-table"; cpu-release-addr = <0x0 0x000000e0>; }; cpu2: cpu@2 { device_type = "cpu"; compatible = "arm,cortex-a72"; reg = <2>; enable-method = "spin-table"; cpu-release-addr = <0x0 0x000000e8>; }; cpu3: cpu@3 { device_type = "cpu"; compatible = "arm,cortex-a72"; reg = <3>; enable-method = "spin-table"; cpu-release-addr = <0x0 0x000000f0>; }; }; scb { compatible = "simple-bus"; #address-cells = <2>; #size-cells = <1>; ranges = <0x0 0x7c000000 0x0 0xfc000000 0x03800000>, <0x6 0x00000000 0x6 0x00000000 0x40000000>; pcie0: pcie@7d500000 { compatible = "brcm,bcm2711-pcie"; reg = <0x0 0x7d500000 0x9310>; device_type = "pci"; #address-cells = <3>; #interrupt-cells = <1>; #size-cells = <2>; interrupts = <GIC_SPI 148 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 148 IRQ_TYPE_LEVEL_HIGH>; interrupt-names = "pcie", "msi"; interrupt-map-mask = <0x0 0x0 0x0 0x7>; interrupt-map = <0 0 0 1 &gicv2 GIC_SPI 143 IRQ_TYPE_LEVEL_HIGH>; msi-controller; msi-parent = <&pcie0>; ranges = <0x02000000 0x0 0xf8000000 0x6 0x00000000 0x0 0x04000000>; /* * The wrapper around the PCIe block has a bug * preventing it from accessing beyond the first 3GB of * memory. */ dma-ranges = <0x02000000 0x0 0x00000000 0x0 0x00000000 0x0 0xc0000000>; brcm,enable-ssc; }; genet: ethernet@7d580000 { compatible = "brcm,bcm2711-genet-v5"; reg = <0x0 0x7d580000 0x10000>; #address-cells = <0x1>; #size-cells = <0x1>; interrupts = <GIC_SPI 157 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 158 IRQ_TYPE_LEVEL_HIGH>; status = "disabled"; genet_mdio: mdio@e14 { compatible = "brcm,genet-mdio-v5"; reg = <0xe14 0x8>; reg-names = "mdio"; #address-cells = <0x1>; #size-cells = <0x0>; }; }; }; }; &clk_osc { clock-frequency = <54000000>; }; &clocks { compatible = "brcm,bcm2711-cprman"; }; &cpu_thermal { coefficients = <(-487) 410040>; thermal-sensors = <&thermal>; }; &dsi0 { interrupts = <GIC_SPI 100 IRQ_TYPE_LEVEL_HIGH>; }; &dsi1 { interrupts = <GIC_SPI 108 IRQ_TYPE_LEVEL_HIGH>; compatible = "brcm,bcm2711-dsi1"; }; &gpio { compatible = "brcm,bcm2711-gpio"; interrupts = <GIC_SPI 113 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 114 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 115 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 116 IRQ_TYPE_LEVEL_HIGH>; gpclk0_gpio49: gpclk0_gpio49 { pin-gpclk { pins = "gpio49"; function = "alt1"; bias-disable; }; }; gpclk1_gpio50: gpclk1_gpio50 { pin-gpclk { pins = "gpio50"; function = "alt1"; bias-disable; }; }; gpclk2_gpio51: gpclk2_gpio51 { pin-gpclk { pins = "gpio51"; function = "alt1"; bias-disable; }; }; i2c0_gpio46: i2c0_gpio46 { pin-sda { function = "alt0"; pins = "gpio46"; bias-pull-up; }; pin-scl { function = "alt0"; pins = "gpio47"; bias-disable; }; }; i2c1_gpio46: i2c1_gpio46 { pin-sda { function = "alt1"; pins = "gpio46"; bias-pull-up; }; pin-scl { function = "alt1"; pins = "gpio47"; bias-disable; }; }; i2c3_gpio2: i2c3_gpio2 { pin-sda { function = "alt5"; pins = "gpio2"; bias-pull-up; }; pin-scl { function = "alt5"; pins = "gpio3"; bias-disable; }; }; i2c3_gpio4: i2c3_gpio4 { pin-sda { function = "alt5"; pins = "gpio4"; bias-pull-up; }; pin-scl { function = "alt5"; pins = "gpio5"; bias-disable; }; }; i2c4_gpio6: i2c4_gpio6 { pin-sda { function = "alt5"; pins = "gpio6"; bias-pull-up; }; pin-scl { function = "alt5"; pins = "gpio7"; bias-disable; }; }; i2c4_gpio8: i2c4_gpio8 { pin-sda { function = "alt5"; pins = "gpio8"; bias-pull-up; }; pin-scl { function = "alt5"; pins = "gpio9"; bias-disable; }; }; i2c5_gpio10: i2c5_gpio10 { pin-sda { function = "alt5"; pins = "gpio10"; bias-pull-up; }; pin-scl { function = "alt5"; pins = "gpio11"; bias-disable; }; }; i2c5_gpio12: i2c5_gpio12 { pin-sda { function = "alt5"; pins = "gpio12"; bias-pull-up; }; pin-scl { function = "alt5"; pins = "gpio13"; bias-disable; }; }; i2c6_gpio0: i2c6_gpio0 { pin-sda { function = "alt5"; pins = "gpio0"; bias-pull-up; }; pin-scl { function = "alt5"; pins = "gpio1"; bias-disable; }; }; i2c6_gpio22: i2c6_gpio22 { pin-sda { function = "alt5"; pins = "gpio22"; bias-pull-up; }; pin-scl { function = "alt5"; pins = "gpio23"; bias-disable; }; }; i2c_slave_gpio8: i2c_slave_gpio8 { pins-i2c-slave { pins = "gpio8", "gpio9", "gpio10", "gpio11"; function = "alt3"; }; }; jtag_gpio48: jtag_gpio48 { pins-jtag { pins = "gpio48", "gpio49", "gpio50", "gpio51", "gpio52", "gpio53"; function = "alt4"; }; }; mii_gpio28: mii_gpio28 { pins-mii { pins = "gpio28", "gpio29", "gpio30", "gpio31"; function = "alt4"; }; }; mii_gpio36: mii_gpio36 { pins-mii { pins = "gpio36", "gpio37", "gpio38", "gpio39"; function = "alt5"; }; }; pcm_gpio50: pcm_gpio50 { pins-pcm { pins = "gpio50", "gpio51", "gpio52", "gpio53"; function = "alt2"; }; }; pwm0_0_gpio12: pwm0_0_gpio12 { pin-pwm { pins = "gpio12"; function = "alt0"; bias-disable; }; }; pwm0_0_gpio18: pwm0_0_gpio18 { pin-pwm { pins = "gpio18"; function = "alt5"; bias-disable; }; }; pwm1_0_gpio40: pwm1_0_gpio40 { pin-pwm { pins = "gpio40"; function = "alt0"; bias-disable; }; }; pwm0_1_gpio13: pwm0_1_gpio13 { pin-pwm { pins = "gpio13"; function = "alt0"; bias-disable; }; }; pwm0_1_gpio19: pwm0_1_gpio19 { pin-pwm { pins = "gpio19"; function = "alt5"; bias-disable; }; }; pwm1_1_gpio41: pwm1_1_gpio41 { pin-pwm { pins = "gpio41"; function = "alt0"; bias-disable; }; }; pwm0_1_gpio45: pwm0_1_gpio45 { pin-pwm { pins = "gpio45"; function = "alt0"; bias-disable; }; }; pwm0_0_gpio52: pwm0_0_gpio52 { pin-pwm { pins = "gpio52"; function = "alt1"; bias-disable; }; }; pwm0_1_gpio53: pwm0_1_gpio53 { pin-pwm { pins = "gpio53"; function = "alt1"; bias-disable; }; }; rgmii_gpio35: rgmii_gpio35 { pin-start-stop { pins = "gpio35"; function = "alt4"; }; pin-rx-ok { pins = "gpio36"; function = "alt4"; }; }; rgmii_irq_gpio34: rgmii_irq_gpio34 { pin-irq { pins = "gpio34"; function = "alt5"; }; }; rgmii_irq_gpio39: rgmii_irq_gpio39 { pin-irq { pins = "gpio39"; function = "alt4"; }; }; rgmii_mdio_gpio28: rgmii_mdio_gpio28 { pins-mdio { pins = "gpio28", "gpio29"; function = "alt5"; }; }; rgmii_mdio_gpio37: rgmii_mdio_gpio37 { pins-mdio { pins = "gpio37", "gpio38"; function = "alt4"; }; }; spi0_gpio46: spi0_gpio46 { pins-spi { pins = "gpio46", "gpio47", "gpio48", "gpio49"; function = "alt2"; }; }; spi2_gpio46: spi2_gpio46 { pins-spi { pins = "gpio46", "gpio47", "gpio48", "gpio49", "gpio50"; function = "alt5"; }; }; spi3_gpio0: spi3_gpio0 { pins-spi { pins = "gpio0", "gpio1", "gpio2", "gpio3"; function = "alt3"; }; }; spi4_gpio4: spi4_gpio4 { pins-spi { pins = "gpio4", "gpio5", "gpio6", "gpio7"; function = "alt3"; }; }; spi5_gpio12: spi5_gpio12 { pins-spi { pins = "gpio12", "gpio13", "gpio14", "gpio15"; function = "alt3"; }; }; spi6_gpio18: spi6_gpio18 { pins-spi { pins = "gpio18", "gpio19", "gpio20", "gpio21"; function = "alt3"; }; }; uart2_gpio0: uart2_gpio0 { pin-tx { pins = "gpio0"; function = "alt4"; bias-disable; }; pin-rx { pins = "gpio1"; function = "alt4"; bias-pull-up; }; }; uart2_ctsrts_gpio2: uart2_ctsrts_gpio2 { pin-cts { pins = "gpio2"; function = "alt4"; bias-pull-up; }; pin-rts { pins = "gpio3"; function = "alt4"; bias-disable; }; }; uart3_gpio4: uart3_gpio4 { pin-tx { pins = "gpio4"; function = "alt4"; bias-disable; }; pin-rx { pins = "gpio5"; function = "alt4"; bias-pull-up; }; }; uart3_ctsrts_gpio6: uart3_ctsrts_gpio6 { pin-cts { pins = "gpio6"; function = "alt4"; bias-pull-up; }; pin-rts { pins = "gpio7"; function = "alt4"; bias-disable; }; }; uart4_gpio8: uart4_gpio8 { pin-tx { pins = "gpio8"; function = "alt4"; bias-disable; }; pin-rx { pins = "gpio9"; function = "alt4"; bias-pull-up; }; }; uart4_ctsrts_gpio10: uart4_ctsrts_gpio10 { pin-cts { pins = "gpio10"; function = "alt4"; bias-pull-up; }; pin-rts { pins = "gpio11"; function = "alt4"; bias-disable; }; }; uart5_gpio12: uart5_gpio12 { pin-tx { pins = "gpio12"; function = "alt4"; bias-disable; }; pin-rx { pins = "gpio13"; function = "alt4"; bias-pull-up; }; }; uart5_ctsrts_gpio14: uart5_ctsrts_gpio14 { pin-cts { pins = "gpio14"; function = "alt4"; bias-pull-up; }; pin-rts { pins = "gpio15"; function = "alt4"; bias-disable; }; }; }; &rmem { #address-cells = <2>; }; &cma { /* * arm64 reserves the CMA by default somewhere in ZONE_DMA32, * that's not good enough for the BCM2711 as some devices can * only address the lower 1G of memory (ZONE_DMA). */ alloc-ranges = <0x0 0x00000000 0x40000000>; }; &i2c0 { compatible = "brcm,bcm2711-i2c", "brcm,bcm2835-i2c"; interrupts = <GIC_SPI 117 IRQ_TYPE_LEVEL_HIGH>; }; &i2c1 { compatible = "brcm,bcm2711-i2c", "brcm,bcm2835-i2c"; interrupts = <GIC_SPI 117 IRQ_TYPE_LEVEL_HIGH>; }; &mailbox { interrupts = <GIC_SPI 33 IRQ_TYPE_LEVEL_HIGH>; }; &sdhci { interrupts = <GIC_SPI 126 IRQ_TYPE_LEVEL_HIGH>; }; &sdhost { interrupts = <GIC_SPI 120 IRQ_TYPE_LEVEL_HIGH>; }; &spi { interrupts = <GIC_SPI 118 IRQ_TYPE_LEVEL_HIGH>; }; &spi1 { interrupts = <GIC_SPI 93 IRQ_TYPE_LEVEL_HIGH>; }; &spi2 { interrupts = <GIC_SPI 93 IRQ_TYPE_LEVEL_HIGH>; }; &system_timer { interrupts = <GIC_SPI 64 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 65 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 66 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 67 IRQ_TYPE_LEVEL_HIGH>; }; &txp { interrupts = <GIC_SPI 75 IRQ_TYPE_LEVEL_HIGH>; }; &uart0 { interrupts = <GIC_SPI 121 IRQ_TYPE_LEVEL_HIGH>; }; &uart1 { interrupts = <GIC_SPI 93 IRQ_TYPE_LEVEL_HIGH>; }; &usb { interrupts = <GIC_SPI 73 IRQ_TYPE_LEVEL_HIGH>; }; &vec { compatible = "brcm,bcm2711-vec"; interrupts = <GIC_SPI 123 IRQ_TYPE_LEVEL_HIGH>; };
(3) bcm2835-rpi.dtsi
arch/arm/boot/dts/bcm2835-rpi.dtsi
#include <dt-bindings/power/raspberrypi-power.h> / { leds { compatible = "gpio-leds"; led-act { label = "ACT"; default-state = "keep"; linux,default-trigger = "heartbeat"; }; }; soc { firmware: firmware { compatible = "raspberrypi,bcm2835-firmware", "simple-mfd"; #address-cells = <1>; #size-cells = <1>; mboxes = <&mailbox>; dma-ranges; }; power: power { compatible = "raspberrypi,bcm2835-power"; firmware = <&firmware>; #power-domain-cells = <1>; }; vchiq: mailbox@7e00b840 { compatible = "brcm,bcm2835-vchiq"; reg = <0x7e00b840 0x3c>; interrupts = <0 2>; }; }; }; &gpio { pinctrl-names = "default"; gpioout: gpioout { brcm,pins = <6>; brcm,function = <BCM2835_FSEL_GPIO_OUT>; }; alt0: alt0 { brcm,pins = <4 5 7 8 9 10 11>; brcm,function = <BCM2835_FSEL_ALT0>; }; }; &i2c0 { pinctrl-names = "default"; pinctrl-0 = <&i2c0_gpio0>; status = "okay"; clock-frequency = <100000>; }; &i2c1 { pinctrl-names = "default"; pinctrl-0 = <&i2c1_gpio2>; status = "okay"; clock-frequency = <100000>; }; &usb { power-domains = <&power RPI_POWER_DOMAIN_USB>; }; &vec { power-domains = <&power RPI_POWER_DOMAIN_VEC>; status = "okay"; }; &dsi0 { power-domains = <&power RPI_POWER_DOMAIN_DSI0>; }; &dsi1 { power-domains = <&power RPI_POWER_DOMAIN_DSI1>; };
(4) bcm2711-rpi.dtsi
arch/arm/boot/dts/bcm2711-rpi.dtsi
// SPDX-License-Identifier: GPL-2.0 #include "bcm2835-rpi.dtsi" #include <dt-bindings/reset/raspberrypi,firmware-reset.h> / { /* Will be filled by the bootloader */ memory@0 { device_type = "memory"; reg = <0 0 0>; }; aliases { emmc2bus = &emmc2bus; ethernet0 = &genet; pcie0 = &pcie0; blconfig = &blconfig; }; }; &firmware { firmware_clocks: clocks { compatible = "raspberrypi,firmware-clocks"; #clock-cells = <1>; }; expgpio: gpio { compatible = "raspberrypi,firmware-gpio"; gpio-controller; #gpio-cells = <2>; status = "okay"; }; reset: reset { compatible = "raspberrypi,firmware-reset"; #reset-cells = <1>; }; }; &hdmi0 { clocks = <&firmware_clocks 13>, <&firmware_clocks 14>, <&dvp 0>, <&clk_27MHz>; clock-names = "hdmi", "bvb", "audio", "cec"; wifi-2.4ghz-coexistence; }; &hdmi1 { clocks = <&firmware_clocks 13>, <&firmware_clocks 14>, <&dvp 1>, <&clk_27MHz>; clock-names = "hdmi", "bvb", "audio", "cec"; wifi-2.4ghz-coexistence; }; &hvs { clocks = <&firmware_clocks 4>; }; &rmem { /* * RPi4's co-processor will copy the board's bootloader configuration * into memory for the OS to consume. It'll also update this node with * its placement information. */ blconfig: nvram@0 { compatible = "raspberrypi,bootloader-config", "nvmem-rmem"; #address-cells = <1>; #size-cells = <1>; reg = <0x0 0x0 0x0>; no-map; status = "disabled"; }; }; &vchiq { interrupts = <GIC_SPI 34 IRQ_TYPE_LEVEL_HIGH>; };
(5) bcm283x-rpi-usb-peripheral.dtsi
arch/arm/boot/dts/bcm283x-rpi-usb-peripheral.dtsi
// SPDX-License-Identifier: GPL-2.0 &usb { dr_mode = "peripheral"; g-rx-fifo-size = <256>; g-np-tx-fifo-size = <32>; g-tx-fifo-size = <256 256 512 512 512 768 768>; };
(6) bcm2711-rpi-4-b.dts
arch/arm/boot/dts/bcm2711-rpi-4-b.dts
// SPDX-License-Identifier: GPL-2.0 /dts-v1/; #include "bcm2711.dtsi" #include "bcm2711-rpi.dtsi" #include "bcm283x-rpi-usb-peripheral.dtsi" / { compatible = "raspberrypi,4-model-b", "brcm,bcm2711"; model = "Raspberry Pi 4 Model B"; chosen { /* 8250 auxiliary UART instead of pl011 */ stdout-path = "serial1:115200n8"; }; leds { led-act { gpios = <&gpio 42 GPIO_ACTIVE_HIGH>; }; led-pwr { label = "PWR"; gpios = <&expgpio 2 GPIO_ACTIVE_LOW>; default-state = "keep"; linux,default-trigger = "default-on"; }; }; wifi_pwrseq: wifi-pwrseq { compatible = "mmc-pwrseq-simple"; reset-gpios = <&expgpio 1 GPIO_ACTIVE_LOW>; }; 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 = <&expgpio 4 GPIO_ACTIVE_HIGH>; states = <1800000 0x1>, <3300000 0x0>; status = "okay"; }; 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; gpio = <&expgpio 6 GPIO_ACTIVE_HIGH>; }; }; &ddc0 { status = "okay"; }; &ddc1 { status = "okay"; }; expgpio { gpio-line-names = "BT_ON", "WL_ON", "PWR_LED_OFF", "GLOBAL_RESET", "VDD_SD_IO_SEL", "CAM_GPIO", "SD_PWR_ON", ""; }; &gpio { /* * Parts taken from rpi_SCH_4b_4p0_reduced.pdf and * the official GPU firmware DT blob. * * Legend: * "FOO" = GPIO line named "FOO" on the schematic * "FOO_N" = GPIO line named "FOO" on schematic, active low */ gpio-line-names = "ID_SDA", "ID_SCL", "SDA1", "SCL1", "GPIO_GCLK", "GPIO5", "GPIO6", "SPI_CE1_N", "SPI_CE0_N", "SPI_MISO", "SPI_MOSI", "SPI_SCLK", "GPIO12", "GPIO13", /* Serial port */ "TXD1", "RXD1", "GPIO16", "GPIO17", "GPIO18", "GPIO19", "GPIO20", "GPIO21", "GPIO22", "GPIO23", "GPIO24", "GPIO25", "GPIO26", "GPIO27", "RGMII_MDIO", "RGMIO_MDC", /* Used by BT module */ "CTS0", "RTS0", "TXD0", "RXD0", /* Used by Wifi */ "SD1_CLK", "SD1_CMD", "SD1_DATA0", "SD1_DATA1", "SD1_DATA2", "SD1_DATA3", /* Shared with SPI flash */ "PWM0_MISO", "PWM1_MOSI", "STATUS_LED_G_CLK", "SPIFLASH_CE_N", "SDA0", "SCL0", "RGMII_RXCLK", "RGMII_RXCTL", "RGMII_RXD0", "RGMII_RXD1", "RGMII_RXD2", "RGMII_RXD3", "RGMII_TXCLK", "RGMII_TXCTL", "RGMII_TXD0", "RGMII_TXD1", "RGMII_TXD2", "RGMII_TXD3"; }; &hdmi0 { status = "okay"; }; &hdmi1 { status = "okay"; }; &pixelvalve0 { status = "okay"; }; &pixelvalve1 { status = "okay"; }; &pixelvalve2 { status = "okay"; }; &pixelvalve4 { status = "okay"; }; &pwm1 { pinctrl-names = "default"; pinctrl-0 = <&pwm1_0_gpio40 &pwm1_1_gpio41>; status = "okay"; }; /* SDHCI is used to control the SDIO for wireless */ &sdhci { #address-cells = <1>; #size-cells = <0>; pinctrl-names = "default"; pinctrl-0 = <&emmc_gpio34>; bus-width = <4>; non-removable; mmc-pwrseq = <&wifi_pwrseq>; status = "okay"; brcmf: wifi@1 { reg = <1>; compatible = "brcm,bcm4329-fmac"; }; }; /* EMMC2 is used to drive the SD card */ &emmc2 { vqmmc-supply = <&sd_io_1v8_reg>; vmmc-supply = <&sd_vcc_reg>; broken-cd; status = "okay"; }; &genet { phy-handle = <&phy1>; phy-mode = "rgmii-rxid"; status = "okay"; }; &genet_mdio { phy1: ethernet-phy@1 { /* No PHY interrupt */ reg = <0x1>; }; }; &pcie0 { pci@0,0 { device_type = "pci"; #address-cells = <3>; #size-cells = <2>; ranges; reg = <0 0 0 0 0>; usb@0,0 { reg = <0 0 0 0 0>; resets = <&reset RASPBERRYPI_FIRMWARE_RESET_ID_USB>; }; }; }; /* uart0 communicates with the BT module */ &uart0 { pinctrl-names = "default"; pinctrl-0 = <&uart0_ctsrts_gpio30 &uart0_gpio32>; uart-has-rtscts; status = "okay"; bluetooth { compatible = "brcm,bcm43438-bt"; max-speed = <2000000>; shutdown-gpios = <&expgpio 0 GPIO_ACTIVE_HIGH>; }; }; /* uart1 is mapped to the pin header */ &uart1 { pinctrl-names = "default"; pinctrl-0 = <&uart1_gpio14>; status = "okay"; }; &vc4 { status = "okay"; }; &vec { status = "disabled"; };
(7) bcm2711-rpi-4-b.dts
arch/arm64/boot/dts/bcm2711-rpi-4-b.dts
// SPDX-License-Identifier: GPL-2.0 #include "arm/bcm2711-rpi-4-b.dts"
통합 Script
위의 디바이스 트리들을 dtc로 컴파일하면 하나의 스크립트로 병합시킨 모습을 보여줄 수 있다.
- dtc bcm2711-rpi-4-b.dts -O dtb > a.dtsi
/dts-v1/; /memreserve/ 0x0000000000000000 0x0000000000001000; / { compatible = "raspberrypi,4-model-b", "brcm,bcm2711"; model = "Raspberry Pi 4 Model B"; #address-cells = <0x2>; #size-cells = <0x1>; interrupt-parent = <0x1>; aliases { serial0 = "/soc/serial@7e201000"; serial1 = "/soc/serial@7e215040"; emmc2bus = "/emmc2bus"; ethernet0 = "/scb/ethernet@7d580000"; pcie0 = "/scb/pcie@7d500000"; blconfig = "/reserved-memory/nvram@0"; }; chosen { stdout-path = "serial1:115200n8"; }; reserved-memory { #address-cells = <0x2>; #size-cells = <0x1>; ranges; linux,cma { compatible = "shared-dma-pool"; size = <0x4000000>; reusable; linux,cma-default; alloc-ranges = <0x0 0x0 0x40000000>; }; nvram@0 { compatible = "raspberrypi,bootloader-config", "nvmem-rmem"; #address-cells = <0x1>; #size-cells = <0x1>; reg = <0x0 0x0 0x0>; no-map; status = "disabled"; }; }; thermal-zones { cpu-thermal { polling-delay-passive = <0x0>; polling-delay = <0x3e8>; coefficients = <0xfffffe19 0x641b8>; thermal-sensors = <0x2>; trips { cpu-crit { temperature = <0x15f90>; hysteresis = <0x0>; type = "critical"; }; }; cooling-maps { }; }; }; soc { compatible = "simple-bus"; #address-cells = <0x1>; #size-cells = <0x1>; ranges = <0x7e000000 0x0 0xfe000000 0x1800000 0x7c000000 0x0 0xfc000000 0x2000000 0x40000000 0x0 0xff800000 0x800000>; dma-ranges = <0xc0000000 0x0 0x0 0x40000000>; timer@7e003000 { compatible = "brcm,bcm2835-system-timer"; reg = <0x7e003000 0x1000>; interrupts = <0x0 0x40 0x4 0x0 0x41 0x4 0x0 0x42 0x4 0x0 0x43 0x4>; clock-frequency = <0xf4240>; }; txp@7e004000 { compatible = "brcm,bcm2835-txp"; reg = <0x7e004000 0x20>; interrupts = <0x0 0x4b 0x4>; }; cprman@7e101000 { compatible = "brcm,bcm2711-cprman"; #clock-cells = <0x1>; reg = <0x7e101000 0x2000>; clocks = <0x3 0x4 0x0 0x4 0x1 0x4 0x2 0x5 0x0 0x5 0x1 0x5 0x2>; phandle = <0x6>; }; mailbox@7e00b880 { compatible = "brcm,bcm2835-mbox"; reg = <0x7e00b880 0x40>; interrupts = <0x0 0x21 0x4>; #mbox-cells = <0x0>; phandle = <0x1d>; }; gpio@7e200000 { compatible = "brcm,bcm2711-gpio"; reg = <0x7e200000 0xb4>; interrupts = <0x0 0x71 0x4 0x0 0x72 0x4 0x0 0x73 0x4 0x0 0x74 0x4>; gpio-controller; #gpio-cells = <0x2>; interrupt-controller; #interrupt-cells = <0x2>; pinctrl-names = "default"; gpio-line-names = "ID_SDA", "ID_SCL", "SDA1", "SCL1", "GPIO_GCLK", "GPIO5", "GPIO6", "SPI_CE1_N", "SPI_CE0_N", "SPI_MISO", "SPI_MOSI", "SPI_SCLK", "GPIO12", "GPIO13", "TXD1", "RXD1", "GPIO16", "GPIO17", "GPIO18", "GPIO19", "GPIO20", "GPIO21", "GPIO22", "GPIO23", "GPIO24", "GPIO25", "GPIO26", "GPIO27", "RGMII_MDIO", "RGMIO_MDC", "CTS0", "RTS0", "TXD0", "RXD0", "SD1_CLK", "SD1_CMD", "SD1_DATA0", "SD1_DATA1", "SD1_DATA2", "SD1_DATA3", "PWM0_MISO", "PWM1_MOSI", "STATUS_LED_G_CLK", "SPIFLASH_CE_N", "SDA0", "SCL0", "RGMII_RXCLK", "RGMII_RXCTL", "RGMII_RXD0", "RGMII_RXD1", "RGMII_RXD2", "RGMII_RXD3", "RGMII_TXCLK", "RGMII_TXCTL", "RGMII_TXD0", "RGMII_TXD1", "RGMII_TXD2", "RGMII_TXD3"; phandle = <0x28>; dpi_gpio0 { brcm,pins = <0x0 0x1 0x2 0x3 0x4 0x5 0x6 0x7 0x8 0x9 0xa 0xb 0xc 0xd 0xe 0xf 0x10 0x11 0x12 0x13 0x14 0x15 0x16 0x17 0x18 0x19 0x1a 0x1b>; brcm,function = <0x6>; }; emmc_gpio22 { brcm,pins = <0x16 0x17 0x18 0x19 0x1a 0x1b>; brcm,function = <0x7>; }; emmc_gpio34 { brcm,pins = <0x22 0x23 0x24 0x25 0x26 0x27>; brcm,function = <0x7>; brcm,pull = <0x0 0x2 0x2 0x2 0x2 0x2>; phandle = <0xe>; }; emmc_gpio48 { brcm,pins = <0x30 0x31 0x32 0x33 0x34 0x35>; brcm,function = <0x7>; }; gpclk0_gpio4 { brcm,pins = <0x4>; brcm,function = <0x4>; }; gpclk1_gpio5 { brcm,pins = <0x5>; brcm,function = <0x4>; }; gpclk1_gpio42 { brcm,pins = <0x2a>; brcm,function = <0x4>; }; gpclk1_gpio44 { brcm,pins = <0x2c>; brcm,function = <0x4>; }; gpclk2_gpio6 { brcm,pins = <0x6>; brcm,function = <0x4>; }; gpclk2_gpio43 { brcm,pins = <0x2b>; brcm,function = <0x4>; brcm,pull = <0x0>; }; i2c0_gpio0 { brcm,pins = <0x0 0x1>; brcm,function = <0x4>; phandle = <0xa>; }; i2c0_gpio28 { brcm,pins = <0x1c 0x1d>; brcm,function = <0x4>; }; i2c0_gpio44 { brcm,pins = <0x2c 0x2d>; brcm,function = <0x5>; }; i2c1_gpio2 { brcm,pins = <0x2 0x3>; brcm,function = <0x4>; phandle = <0x11>; }; i2c1_gpio44 { brcm,pins = <0x2c 0x2d>; brcm,function = <0x6>; }; jtag_gpio22 { brcm,pins = <0x16 0x17 0x18 0x19 0x1a 0x1b>; brcm,function = <0x3>; }; pcm_gpio18 { brcm,pins = <0x12 0x13 0x14 0x15>; brcm,function = <0x4>; }; pcm_gpio28 { brcm,pins = <0x1c 0x1d 0x1e 0x1f>; brcm,function = <0x6>; }; sdhost_gpio48 { brcm,pins = <0x30 0x31 0x32 0x33 0x34 0x35>; brcm,function = <0x4>; }; spi0_gpio7 { brcm,pins = <0x7 0x8 0x9 0xa 0xb>; brcm,function = <0x4>; }; spi0_gpio35 { brcm,pins = <0x23 0x24 0x25 0x26 0x27>; brcm,function = <0x4>; }; spi1_gpio16 { brcm,pins = <0x10 0x11 0x12 0x13 0x14 0x15>; brcm,function = <0x3>; }; spi2_gpio40 { brcm,pins = <0x28 0x29 0x2a 0x2b 0x2c 0x2d>; brcm,function = <0x3>; }; uart0_gpio14 { brcm,pins = <0xe 0xf>; brcm,function = <0x4>; }; uart0_ctsrts_gpio16 { brcm,pins = <0x10 0x11>; brcm,function = <0x7>; }; uart0_ctsrts_gpio30 { brcm,pins = <0x1e 0x1f>; brcm,function = <0x7>; brcm,pull = <0x2 0x0>; phandle = <0x7>; }; uart0_gpio32 { brcm,pins = <0x20 0x21>; brcm,function = <0x7>; brcm,pull = <0x0 0x2>; phandle = <0x8>; }; uart0_gpio36 { brcm,pins = <0x24 0x25>; brcm,function = <0x6>; }; uart0_ctsrts_gpio38 { brcm,pins = <0x26 0x27>; brcm,function = <0x6>; }; uart1_gpio14 { brcm,pins = <0xe 0xf>; brcm,function = <0x2>; phandle = <0xd>; }; uart1_ctsrts_gpio16 { brcm,pins = <0x10 0x11>; brcm,function = <0x2>; }; uart1_gpio32 { brcm,pins = <0x20 0x21>; brcm,function = <0x2>; }; uart1_ctsrts_gpio30 { brcm,pins = <0x1e 0x1f>; brcm,function = <0x2>; }; uart1_gpio40 { brcm,pins = <0x28 0x29>; brcm,function = <0x2>; }; uart1_ctsrts_gpio42 { brcm,pins = <0x2a 0x2b>; brcm,function = <0x2>; }; gpclk0_gpio49 { pin-gpclk { pins = "gpio49"; function = "alt1"; bias-disable; }; }; gpclk1_gpio50 { pin-gpclk { pins = "gpio50"; function = "alt1"; bias-disable; }; }; gpclk2_gpio51 { pin-gpclk { pins = "gpio51"; function = "alt1"; bias-disable; }; }; i2c0_gpio46 { pin-sda { function = "alt0"; pins = "gpio46"; bias-pull-up; }; pin-scl { function = "alt0"; pins = "gpio47"; bias-disable; }; }; i2c1_gpio46 { pin-sda { function = "alt1"; pins = "gpio46"; bias-pull-up; }; pin-scl { function = "alt1"; pins = "gpio47"; bias-disable; }; }; i2c3_gpio2 { pin-sda { function = "alt5"; pins = "gpio2"; bias-pull-up; }; pin-scl { function = "alt5"; pins = "gpio3"; bias-disable; }; }; i2c3_gpio4 { pin-sda { function = "alt5"; pins = "gpio4"; bias-pull-up; }; pin-scl { function = "alt5"; pins = "gpio5"; bias-disable; }; }; i2c4_gpio6 { pin-sda { function = "alt5"; pins = "gpio6"; bias-pull-up; }; pin-scl { function = "alt5"; pins = "gpio7"; bias-disable; }; }; i2c4_gpio8 { pin-sda { function = "alt5"; pins = "gpio8"; bias-pull-up; }; pin-scl { function = "alt5"; pins = "gpio9"; bias-disable; }; }; i2c5_gpio10 { pin-sda { function = "alt5"; pins = "gpio10"; bias-pull-up; }; pin-scl { function = "alt5"; pins = "gpio11"; bias-disable; }; }; i2c5_gpio12 { pin-sda { function = "alt5"; pins = "gpio12"; bias-pull-up; }; pin-scl { function = "alt5"; pins = "gpio13"; bias-disable; }; }; i2c6_gpio0 { pin-sda { function = "alt5"; pins = "gpio0"; bias-pull-up; }; pin-scl { function = "alt5"; pins = "gpio1"; bias-disable; }; }; i2c6_gpio22 { pin-sda { function = "alt5"; pins = "gpio22"; bias-pull-up; }; pin-scl { function = "alt5"; pins = "gpio23"; bias-disable; }; }; i2c_slave_gpio8 { pins-i2c-slave { pins = "gpio8", "gpio9", "gpio10", "gpio11"; function = "alt3"; }; }; jtag_gpio48 { pins-jtag { pins = "gpio48", "gpio49", "gpio50", "gpio51", "gpio52", "gpio53"; function = "alt4"; }; }; mii_gpio28 { pins-mii { pins = "gpio28", "gpio29", "gpio30", "gpio31"; function = "alt4"; }; }; mii_gpio36 { pins-mii { pins = "gpio36", "gpio37", "gpio38", "gpio39"; function = "alt5"; }; }; pcm_gpio50 { pins-pcm { pins = "gpio50", "gpio51", "gpio52", "gpio53"; function = "alt2"; }; }; pwm0_0_gpio12 { pin-pwm { pins = "gpio12"; function = "alt0"; bias-disable; }; }; pwm0_0_gpio18 { pin-pwm { pins = "gpio18"; function = "alt5"; bias-disable; }; }; pwm1_0_gpio40 { phandle = <0x14>; pin-pwm { pins = "gpio40"; function = "alt0"; bias-disable; }; }; pwm0_1_gpio13 { pin-pwm { pins = "gpio13"; function = "alt0"; bias-disable; }; }; pwm0_1_gpio19 { pin-pwm { pins = "gpio19"; function = "alt5"; bias-disable; }; }; pwm1_1_gpio41 { phandle = <0x15>; pin-pwm { pins = "gpio41"; function = "alt0"; bias-disable; }; }; pwm0_1_gpio45 { pin-pwm { pins = "gpio45"; function = "alt0"; bias-disable; }; }; pwm0_0_gpio52 { pin-pwm { pins = "gpio52"; function = "alt1"; bias-disable; }; }; pwm0_1_gpio53 { pin-pwm { pins = "gpio53"; function = "alt1"; bias-disable; }; }; rgmii_gpio35 { pin-start-stop { pins = "gpio35"; function = "alt4"; }; pin-rx-ok { pins = "gpio36"; function = "alt4"; }; }; rgmii_irq_gpio34 { pin-irq { pins = "gpio34"; function = "alt5"; }; }; rgmii_irq_gpio39 { pin-irq { pins = "gpio39"; function = "alt4"; }; }; rgmii_mdio_gpio28 { pins-mdio { pins = "gpio28", "gpio29"; function = "alt5"; }; }; rgmii_mdio_gpio37 { pins-mdio { pins = "gpio37", "gpio38"; function = "alt4"; }; }; spi0_gpio46 { pins-spi { pins = "gpio46", "gpio47", "gpio48", "gpio49"; function = "alt2"; }; }; spi2_gpio46 { pins-spi { pins = "gpio46", "gpio47", "gpio48", "gpio49", "gpio50"; function = "alt5"; }; }; spi3_gpio0 { pins-spi { pins = "gpio0", "gpio1", "gpio2", "gpio3"; function = "alt3"; }; }; spi4_gpio4 { pins-spi { pins = "gpio4", "gpio5", "gpio6", "gpio7"; function = "alt3"; }; }; spi5_gpio12 { pins-spi { pins = "gpio12", "gpio13", "gpio14", "gpio15"; function = "alt3"; }; }; spi6_gpio18 { pins-spi { pins = "gpio18", "gpio19", "gpio20", "gpio21"; function = "alt3"; }; }; uart2_gpio0 { pin-tx { pins = "gpio0"; function = "alt4"; bias-disable; }; pin-rx { pins = "gpio1"; function = "alt4"; bias-pull-up; }; }; uart2_ctsrts_gpio2 { pin-cts { pins = "gpio2"; function = "alt4"; bias-pull-up; }; pin-rts { pins = "gpio3"; function = "alt4"; bias-disable; }; }; uart3_gpio4 { pin-tx { pins = "gpio4"; function = "alt4"; bias-disable; }; pin-rx { pins = "gpio5"; function = "alt4"; bias-pull-up; }; }; uart3_ctsrts_gpio6 { pin-cts { pins = "gpio6"; function = "alt4"; bias-pull-up; }; pin-rts { pins = "gpio7"; function = "alt4"; bias-disable; }; }; uart4_gpio8 { pin-tx { pins = "gpio8"; function = "alt4"; bias-disable; }; pin-rx { pins = "gpio9"; function = "alt4"; bias-pull-up; }; }; uart4_ctsrts_gpio10 { pin-cts { pins = "gpio10"; function = "alt4"; bias-pull-up; }; pin-rts { pins = "gpio11"; function = "alt4"; bias-disable; }; }; uart5_gpio12 { pin-tx { pins = "gpio12"; function = "alt4"; bias-disable; }; pin-rx { pins = "gpio13"; function = "alt4"; bias-pull-up; }; }; uart5_ctsrts_gpio14 { pin-cts { pins = "gpio14"; function = "alt4"; bias-pull-up; }; pin-rts { pins = "gpio15"; function = "alt4"; bias-disable; }; }; gpioout { brcm,pins = <0x6>; brcm,function = <0x1>; }; alt0 { brcm,pins = <0x4 0x5 0x7 0x8 0x9 0xa 0xb>; brcm,function = <0x4>; }; }; serial@7e201000 { compatible = "arm,pl011", "arm,primecell"; reg = <0x7e201000 0x200>; interrupts = <0x0 0x79 0x4>; clocks = <0x6 0x13 0x6 0x14>; clock-names = "uartclk", "apb_pclk"; arm,primecell-periphid = <0x241011>; pinctrl-names = "default"; pinctrl-0 = <0x7 0x8>; uart-has-rtscts; status = "okay"; bluetooth { compatible = "brcm,bcm43438-bt"; max-speed = <0x1e8480>; shutdown-gpios = <0x9 0x0 0x0>; }; }; mmc@7e202000 { compatible = "brcm,bcm2835-sdhost"; reg = <0x7e202000 0x100>; interrupts = <0x0 0x78 0x4>; clocks = <0x6 0x14>; status = "disabled"; }; i2s@7e203000 { compatible = "brcm,bcm2835-i2s"; reg = <0x7e203000 0x24>; clocks = <0x6 0x1f>; status = "disabled"; }; spi@7e204000 { compatible = "brcm,bcm2835-spi"; reg = <0x7e204000 0x200>; interrupts = <0x0 0x76 0x4>; clocks = <0x6 0x14>; #address-cells = <0x1>; #size-cells = <0x0>; status = "disabled"; }; i2c@7e205000 { compatible = "brcm,bcm2711-i2c", "brcm,bcm2835-i2c"; reg = <0x7e205000 0x200>; interrupts = <0x0 0x75 0x4>; clocks = <0x6 0x14>; #address-cells = <0x1>; #size-cells = <0x0>; status = "okay"; pinctrl-names = "default"; pinctrl-0 = <0xa>; clock-frequency = <0x186a0>; }; dpi@7e208000 { compatible = "brcm,bcm2835-dpi"; reg = <0x7e208000 0x8c>; clocks = <0x6 0x14 0x6 0x2c>; clock-names = "core", "pixel"; #address-cells = <0x1>; #size-cells = <0x0>; status = "disabled"; }; dsi@7e209000 { compatible = "brcm,bcm2835-dsi0"; reg = <0x7e209000 0x78>; interrupts = <0x0 0x64 0x4>; #address-cells = <0x1>; #size-cells = <0x0>; #clock-cells = <0x1>; clocks = <0x6 0x20 0x6 0x2f 0x6 0x31>; clock-names = "phy", "escape", "pixel"; clock-output-names = "dsi0_byte", "dsi0_ddr2", "dsi0_ddr"; status = "disabled"; power-domains = <0xb 0x11>; phandle = <0x4>; }; aux@7e215000 { compatible = "brcm,bcm2835-aux"; #clock-cells = <0x1>; reg = <0x7e215000 0x8>; clocks = <0x6 0x14>; phandle = <0xc>; }; serial@7e215040 { compatible = "brcm,bcm2835-aux-uart"; reg = <0x7e215040 0x40>; interrupts = <0x0 0x5d 0x4>; clocks = <0xc 0x0>; status = "okay"; pinctrl-names = "default"; pinctrl-0 = <0xd>; }; spi@7e215080 { compatible = "brcm,bcm2835-aux-spi"; reg = <0x7e215080 0x40>; interrupts = <0x0 0x5d 0x4>; clocks = <0xc 0x1>; #address-cells = <0x1>; #size-cells = <0x0>; status = "disabled"; }; spi@7e2150c0 { compatible = "brcm,bcm2835-aux-spi"; reg = <0x7e2150c0 0x40>; interrupts = <0x0 0x5d 0x4>; clocks = <0xc 0x2>; #address-cells = <0x1>; #size-cells = <0x0>; status = "disabled"; }; pwm@7e20c000 { compatible = "brcm,bcm2835-pwm"; reg = <0x7e20c000 0x28>; clocks = <0x6 0x1e>; assigned-clocks = <0x6 0x1e>; assigned-clock-rates = <0x989680>; #pwm-cells = <0x2>; status = "disabled"; }; mmc@7e300000 { compatible = "brcm,bcm2835-sdhci"; reg = <0x7e300000 0x100>; interrupts = <0x0 0x7e 0x4>; clocks = <0x6 0x1c>; status = "okay"; #address-cells = <0x1>; #size-cells = <0x0>; pinctrl-names = "default"; pinctrl-0 = <0xe>; bus-width = <0x4>; non-removable; mmc-pwrseq = <0xf>; wifi@1 { reg = <0x1>; compatible = "brcm,bcm4329-fmac"; }; }; hvs@7e400000 { compatible = "brcm,bcm2711-hvs"; reg = <0x7e400000 0x6000>; interrupts = <0x0 0x61 0x4>; clocks = <0x10 0x4>; }; dsi@7e700000 { compatible = "brcm,bcm2711-dsi1"; reg = <0x7e700000 0x8c>; interrupts = <0x0 0x6c 0x4>; #address-cells = <0x1>; #size-cells = <0x0>; #clock-cells = <0x1>; clocks = <0x6 0x23 0x6 0x30 0x6 0x32>; clock-names = "phy", "escape", "pixel"; clock-output-names = "dsi1_byte", "dsi1_ddr2", "dsi1_ddr"; status = "disabled"; power-domains = <0xb 0x12>; phandle = <0x5>; }; i2c@7e804000 { compatible = "brcm,bcm2711-i2c", "brcm,bcm2835-i2c"; reg = <0x7e804000 0x1000>; interrupts = <0x0 0x75 0x4>; clocks = <0x6 0x14>; #address-cells = <0x1>; #size-cells = <0x0>; status = "okay"; pinctrl-names = "default"; pinctrl-0 = <0x11>; clock-frequency = <0x186a0>; }; usb@7e980000 { compatible = "brcm,bcm2835-usb"; reg = <0x7e980000 0x10000>; interrupts = <0x0 0x49 0x4>; #address-cells = <0x1>; #size-cells = <0x0>; clocks = <0x12>; clock-names = "otg"; phys = <0x13>; phy-names = "usb2-phy"; power-domains = <0xb 0x6>; dr_mode = "peripheral"; g-rx-fifo-size = <0x100>; g-np-tx-fifo-size = <0x20>; g-tx-fifo-size = <0x100 0x100 0x200 0x200 0x200 0x300 0x300>; }; local_intc@40000000 { compatible = "brcm,bcm2836-l1-intc"; reg = <0x40000000 0x100>; }; interrupt-controller@40041000 { interrupt-controller; #interrupt-cells = <0x3>; compatible = "arm,gic-400"; reg = <0x40041000 0x1000 0x40042000 0x2000 0x40044000 0x2000 0x40046000 0x2000>; interrupts = <0x1 0x9 0xf04>; phandle = <0x1>; }; avs-monitor@7d5d2000 { compatible = "brcm,bcm2711-avs-monitor", "syscon", "simple-mfd"; reg = <0x7d5d2000 0xf00>; thermal { compatible = "brcm,bcm2711-thermal"; #thermal-sensor-cells = <0x0>; phandle = <0x2>; }; }; dma@7e007000 { compatible = "brcm,bcm2835-dma"; reg = <0x7e007000 0xb00>; interrupts = <0x0 0x50 0x4 0x0 0x51 0x4 0x0 0x52 0x4 0x0 0x53 0x4 0x0 0x54 0x4 0x0 0x55 0x4 0x0 0x56 0x4 0x0 0x57 0x4 0x0 0x57 0x4 0x0 0x58 0x4 0x0 0x58 0x4>; interrupt-names = "dma0", "dma1", "dma2", "dma3", "dma4", "dma5", "dma6", "dma7", "dma8", "dma9", "dma10"; #dma-cells = <0x1>; brcm,dma-channel-mask = <0x7f5>; phandle = <0x1a>; }; watchdog@7e100000 { compatible = "brcm,bcm2835-pm", "brcm,bcm2835-pm-wdt"; #power-domain-cells = <0x1>; #reset-cells = <0x1>; reg = <0x7e100000 0x114 0x7e00a000 0x24 0x7ec11000 0x20>; clocks = <0x6 0x15 0x6 0x1d 0x6 0x17 0x6 0x16>; clock-names = "v3d", "peri_image", "h264", "isp"; system-power-controller; }; rng@7e104000 { compatible = "brcm,bcm2711-rng200"; reg = <0x7e104000 0x28>; }; serial@7e201400 { compatible = "arm,pl011", "arm,primecell"; reg = <0x7e201400 0x200>; interrupts = <0x0 0x79 0x4>; clocks = <0x6 0x13 0x6 0x14>; clock-names = "uartclk", "apb_pclk"; arm,primecell-periphid = <0x241011>; status = "disabled"; }; serial@7e201600 { compatible = "arm,pl011", "arm,primecell"; reg = <0x7e201600 0x200>; interrupts = <0x0 0x79 0x4>; clocks = <0x6 0x13 0x6 0x14>; clock-names = "uartclk", "apb_pclk"; arm,primecell-periphid = <0x241011>; status = "disabled"; }; serial@7e201800 { compatible = "arm,pl011", "arm,primecell"; reg = <0x7e201800 0x200>; interrupts = <0x0 0x79 0x4>; clocks = <0x6 0x13 0x6 0x14>; clock-names = "uartclk", "apb_pclk"; arm,primecell-periphid = <0x241011>; status = "disabled"; }; serial@7e201a00 { compatible = "arm,pl011", "arm,primecell"; reg = <0x7e201a00 0x200>; interrupts = <0x0 0x79 0x4>; clocks = <0x6 0x13 0x6 0x14>; clock-names = "uartclk", "apb_pclk"; arm,primecell-periphid = <0x241011>; status = "disabled"; }; spi@7e204600 { compatible = "brcm,bcm2835-spi"; reg = <0x7e204600 0x200>; interrupts = <0x0 0x76 0x4>; clocks = <0x6 0x14>; #address-cells = <0x1>; #size-cells = <0x0>; status = "disabled"; }; spi@7e204800 { compatible = "brcm,bcm2835-spi"; reg = <0x7e204800 0x200>; interrupts = <0x0 0x76 0x4>; clocks = <0x6 0x14>; #address-cells = <0x1>; #size-cells = <0x0>; status = "disabled"; }; spi@7e204a00 { compatible = "brcm,bcm2835-spi"; reg = <0x7e204a00 0x200>; interrupts = <0x0 0x76 0x4>; clocks = <0x6 0x14>; #address-cells = <0x1>; #size-cells = <0x0>; status = "disabled"; }; spi@7e204c00 { compatible = "brcm,bcm2835-spi"; reg = <0x7e204c00 0x200>; interrupts = <0x0 0x76 0x4>; clocks = <0x6 0x14>; #address-cells = <0x1>; #size-cells = <0x0>; status = "disabled"; }; i2c@7e205600 { compatible = "brcm,bcm2711-i2c", "brcm,bcm2835-i2c"; reg = <0x7e205600 0x200>; interrupts = <0x0 0x75 0x4>; clocks = <0x6 0x14>; #address-cells = <0x1>; #size-cells = <0x0>; status = "disabled"; }; i2c@7e205800 { compatible = "brcm,bcm2711-i2c", "brcm,bcm2835-i2c"; reg = <0x7e205800 0x200>; interrupts = <0x0 0x75 0x4>; clocks = <0x6 0x14>; #address-cells = <0x1>; #size-cells = <0x0>; status = "disabled"; }; i2c@7e205a00 { compatible = "brcm,bcm2711-i2c", "brcm,bcm2835-i2c"; reg = <0x7e205a00 0x200>; interrupts = <0x0 0x75 0x4>; clocks = <0x6 0x14>; #address-cells = <0x1>; #size-cells = <0x0>; status = "disabled"; }; i2c@7e205c00 { compatible = "brcm,bcm2711-i2c", "brcm,bcm2835-i2c"; reg = <0x7e205c00 0x200>; interrupts = <0x0 0x75 0x4>; clocks = <0x6 0x14>; #address-cells = <0x1>; #size-cells = <0x0>; status = "disabled"; }; pixelvalve@7e206000 { compatible = "brcm,bcm2711-pixelvalve0"; reg = <0x7e206000 0x100>; interrupts = <0x0 0x6d 0x4>; status = "okay"; }; pixelvalve@7e207000 { compatible = "brcm,bcm2711-pixelvalve1"; reg = <0x7e207000 0x100>; interrupts = <0x0 0x6e 0x4>; status = "okay"; }; pixelvalve@7e20a000 { compatible = "brcm,bcm2711-pixelvalve2"; reg = <0x7e20a000 0x100>; interrupts = <0x0 0x65 0x4>; status = "okay"; }; pwm@7e20c800 { compatible = "brcm,bcm2835-pwm"; reg = <0x7e20c800 0x28>; clocks = <0x6 0x1e>; assigned-clocks = <0x6 0x1e>; assigned-clock-rates = <0x989680>; #pwm-cells = <0x2>; status = "okay"; pinctrl-names = "default"; pinctrl-0 = <0x14 0x15>; }; pixelvalve@7e216000 { compatible = "brcm,bcm2711-pixelvalve4"; reg = <0x7e216000 0x100>; interrupts = <0x0 0x6e 0x4>; status = "okay"; }; pixelvalve@7ec12000 { compatible = "brcm,bcm2711-pixelvalve3"; reg = <0x7ec12000 0x100>; interrupts = <0x0 0x6a 0x4>; status = "disabled"; }; vec@7ec13000 { compatible = "brcm,bcm2711-vec"; reg = <0x7ec13000 0x1000>; clocks = <0x6 0x18>; interrupts = <0x0 0x7b 0x4>; status = "disabled"; power-domains = <0xb 0x7>; }; clock@7ef00000 { compatible = "brcm,brcm2711-dvp"; reg = <0x7ef00000 0x10>; clocks = <0x16>; #clock-cells = <0x1>; #reset-cells = <0x1>; phandle = <0x17>; }; interrupt-controller@7ef00100 { compatible = "brcm,bcm2711-l2-intc", "brcm,l2-intc"; reg = <0x7ef00100 0x30>; interrupts = <0x0 0x60 0x4>; interrupt-controller; #interrupt-cells = <0x1>; phandle = <0x18>; }; hdmi@7ef00700 { compatible = "brcm,bcm2711-hdmi0"; reg = <0x7ef00700 0x300 0x7ef00300 0x200 0x7ef00f00 0x80 0x7ef00f80 0x80 0x7ef01b00 0x200 0x7ef01f00 0x400 0x7ef00200 0x80 0x7ef04300 0x100 0x7ef20000 0x100>; reg-names = "hdmi", "dvp", "phy", "rm", "packet", "metadata", "csc", "cec", "hd"; clock-names = "hdmi", "bvb", "audio", "cec"; resets = <0x17 0x0>; interrupt-parent = <0x18>; interrupts = <0x0 0x1 0x2 0x3 0x4 0x5>; interrupt-names = "cec-tx", "cec-rx", "cec-low", "wakeup", "hpd-connected", "hpd-removed"; ddc = <0x19>; dmas = <0x1a 0xa>; dma-names = "audio-rx"; status = "okay"; clocks = <0x10 0xd 0x10 0xe 0x17 0x0 0x1b>; wifi-2.4ghz-coexistence; }; i2c@7ef04500 { compatible = "brcm,bcm2711-hdmi-i2c"; reg = <0x7ef04500 0x100 0x7ef00b00 0x300>; reg-names = "bsc", "auto-i2c"; clock-frequency = <0x17cdc>; status = "okay"; phandle = <0x19>; }; hdmi@7ef05700 { compatible = "brcm,bcm2711-hdmi1"; reg = <0x7ef05700 0x300 0x7ef05300 0x200 0x7ef05f00 0x80 0x7ef05f80 0x80 0x7ef06b00 0x200 0x7ef06f00 0x400 0x7ef00280 0x80 0x7ef09300 0x100 0x7ef20000 0x100>; reg-names = "hdmi", "dvp", "phy", "rm", "packet", "metadata", "csc", "cec", "hd"; ddc = <0x1c>; clock-names = "hdmi", "bvb", "audio", "cec"; resets = <0x17 0x1>; interrupt-parent = <0x18>; interrupts = <0x8 0x7 0x6 0x9 0xa 0xb>; interrupt-names = "cec-tx", "cec-rx", "cec-low", "wakeup", "hpd-connected", "hpd-removed"; dmas = <0x1a 0x11>; dma-names = "audio-rx"; status = "okay"; clocks = <0x10 0xd 0x10 0xe 0x17 0x1 0x1b>; wifi-2.4ghz-coexistence; }; i2c@7ef09500 { compatible = "brcm,bcm2711-hdmi-i2c"; reg = <0x7ef09500 0x100 0x7ef05b00 0x300>; reg-names = "bsc", "auto-i2c"; clock-frequency = <0x17cdc>; status = "okay"; phandle = <0x1c>; }; firmware { compatible = "raspberrypi,bcm2835-firmware", "simple-mfd"; #address-cells = <0x1>; #size-cells = <0x1>; mboxes = <0x1d>; dma-ranges; phandle = <0x1e>; clocks { compatible = "raspberrypi,firmware-clocks"; #clock-cells = <0x1>; phandle = <0x10>; }; gpio { compatible = "raspberrypi,firmware-gpio"; gpio-controller; #gpio-cells = <0x2>; status = "okay"; gpio-line-names = "BT_ON", "WL_ON", "PWR_LED_OFF", "GLOBAL_RESET", "VDD_SD_IO_SEL", "CAM_GPIO", "SD_PWR_ON", ""; phandle = <0x9>; }; reset { compatible = "raspberrypi,firmware-reset"; #reset-cells = <0x1>; phandle = <0x26>; }; }; power { compatible = "raspberrypi,bcm2835-power"; firmware = <0x1e>; #power-domain-cells = <0x1>; phandle = <0xb>; }; mailbox@7e00b840 { compatible = "brcm,bcm2835-vchiq"; reg = <0x7e00b840 0x3c>; interrupts = <0x0 0x22 0x4>; }; }; clocks { clk-osc { compatible = "fixed-clock"; #clock-cells = <0x0>; clock-output-names = "osc"; clock-frequency = <0x337f980>; phandle = <0x3>; }; clk-usb { compatible = "fixed-clock"; #clock-cells = <0x0>; clock-output-names = "otg"; clock-frequency = <0x1c9c3800>; phandle = <0x12>; }; }; phy { compatible = "usb-nop-xceiv"; #phy-cells = <0x0>; phandle = <0x13>; }; gpu { compatible = "brcm,bcm2711-vc5"; status = "okay"; }; clk-27M { #clock-cells = <0x0>; compatible = "fixed-clock"; clock-frequency = <0x19bfcc0>; clock-output-names = "27MHz-clock"; phandle = <0x1b>; }; clk-108M { #clock-cells = <0x0>; compatible = "fixed-clock"; clock-frequency = <0x66ff300>; clock-output-names = "108MHz-clock"; phandle = <0x16>; }; emmc2bus { compatible = "simple-bus"; #address-cells = <0x2>; #size-cells = <0x1>; ranges = <0x0 0x7e000000 0x0 0xfe000000 0x1800000>; dma-ranges = <0x0 0xc0000000 0x0 0x0 0x40000000>; mmc@7e340000 { compatible = "brcm,bcm2711-emmc2"; reg = <0x0 0x7e340000 0x100>; interrupts = <0x0 0x7e 0x4>; clocks = <0x6 0x33>; status = "okay"; vqmmc-supply = <0x1f>; vmmc-supply = <0x20>; broken-cd; }; }; arm-pmu { compatible = "arm,cortex-a72-pmu", "arm,armv8-pmuv3"; interrupts = <0x0 0x10 0x4 0x0 0x11 0x4 0x0 0x12 0x4 0x0 0x13 0x4>; interrupt-affinity = <0x21 0x22 0x23 0x24>; }; timer { compatible = "arm,armv8-timer"; interrupts = <0x1 0xd 0xf08 0x1 0xe 0xf08 0x1 0xb 0xf08 0x1 0xa 0xf08>; arm,cpu-registers-not-fw-configured; }; cpus { #address-cells = <0x1>; #size-cells = <0x0>; enable-method = "brcm,bcm2836-smp"; cpu@0 { device_type = "cpu"; compatible = "arm,cortex-a72"; reg = <0x0>; enable-method = "spin-table"; cpu-release-addr = <0x0 0xd8>; phandle = <0x21>; }; cpu@1 { device_type = "cpu"; compatible = "arm,cortex-a72"; reg = <0x1>; enable-method = "spin-table"; cpu-release-addr = <0x0 0xe0>; phandle = <0x22>; }; cpu@2 { device_type = "cpu"; compatible = "arm,cortex-a72"; reg = <0x2>; enable-method = "spin-table"; cpu-release-addr = <0x0 0xe8>; phandle = <0x23>; }; cpu@3 { device_type = "cpu"; compatible = "arm,cortex-a72"; reg = <0x3>; enable-method = "spin-table"; cpu-release-addr = <0x0 0xf0>; phandle = <0x24>; }; }; scb { compatible = "simple-bus"; #address-cells = <0x2>; #size-cells = <0x1>; ranges = <0x0 0x7c000000 0x0 0xfc000000 0x3800000 0x6 0x0 0x6 0x0 0x40000000>; pcie@7d500000 { compatible = "brcm,bcm2711-pcie"; reg = <0x0 0x7d500000 0x9310>; device_type = "pci"; #address-cells = <0x3>; #interrupt-cells = <0x1>; #size-cells = <0x2>; interrupts = <0x0 0x94 0x4 0x0 0x94 0x4>; interrupt-names = "pcie", "msi"; interrupt-map-mask = <0x0 0x0 0x0 0x7>; interrupt-map = <0x0 0x0 0x0 0x1 0x1 0x0 0x8f 0x4>; msi-controller; msi-parent = <0x25>; ranges = <0x2000000 0x0 0xf8000000 0x6 0x0 0x0 0x4000000>; dma-ranges = <0x2000000 0x0 0x0 0x0 0x0 0x0 0xc0000000>; brcm,enable-ssc; phandle = <0x25>; pci@0,0 { device_type = "pci"; #address-cells = <0x3>; #size-cells = <0x2>; ranges; reg = <0x0 0x0 0x0 0x0 0x0>; usb@0,0 { reg = <0x0 0x0 0x0 0x0 0x0>; resets = <0x26 0x0>; }; }; }; ethernet@7d580000 { compatible = "brcm,bcm2711-genet-v5"; reg = <0x0 0x7d580000 0x10000>; #address-cells = <0x1>; #size-cells = <0x1>; interrupts = <0x0 0x9d 0x4 0x0 0x9e 0x4>; status = "okay"; phy-handle = <0x27>; phy-mode = "rgmii-rxid"; mdio@e14 { compatible = "brcm,genet-mdio-v5"; reg = <0xe14 0x8>; reg-names = "mdio"; #address-cells = <0x1>; #size-cells = <0x0>; ethernet-phy@1 { reg = <0x1>; phandle = <0x27>; }; }; }; }; leds { compatible = "gpio-leds"; led-act { label = "ACT"; default-state = "keep"; linux,default-trigger = "heartbeat"; gpios = <0x28 0x2a 0x0>; }; led-pwr { label = "PWR"; gpios = <0x9 0x2 0x1>; default-state = "keep"; linux,default-trigger = "default-on"; }; }; memory@0 { device_type = "memory"; reg = <0x0 0x0 0x0>; }; wifi-pwrseq { compatible = "mmc-pwrseq-simple"; reset-gpios = <0x9 0x1 0x1>; phandle = <0xf>; }; sd_io_1v8_reg { compatible = "regulator-gpio"; regulator-name = "vdd-sd-io"; regulator-min-microvolt = <0x1b7740>; regulator-max-microvolt = <0x325aa0>; regulator-boot-on; regulator-always-on; regulator-settling-time-us = <0x1388>; gpios = <0x9 0x4 0x0>; states = <0x1b7740 0x1 0x325aa0 0x0>; status = "okay"; phandle = <0x1f>; }; sd_vcc_reg { compatible = "regulator-fixed"; regulator-name = "vcc-sd"; regulator-min-microvolt = <0x325aa0>; regulator-max-microvolt = <0x325aa0>; regulator-boot-on; enable-active-high; gpio = <0x9 0x6 0x0>; phandle = <0x20>; }; };
참고
-
- DTB – 구조 | 문c
- DTB (fdt API) | 문c
- DTB (of API) | 문c