SPI Device nicht mehr verfügbar in Kernel 4.19

Rund um die Software von Revolution Pi
Post Reply
User avatar
RR4711
Posts: 228
Joined: 22 Feb 2018, 13:28
Answers: 0

SPI Device nicht mehr verfügbar in Kernel 4.19

Post by RR4711 »

Hallo,
ich benutze den GPIO Pin 28 und die SPI an dem "CON Bus" Stecker des RevPi Connect für eigene FPGA Hardware bzw 1Wire Temperatursensoren. Seit dem Upgrade auf den neuen Kernel wird das Spi0.0 Device nicht mehr angelegt.
Ich würde gerne mal meine FPGA FW fertigprogrammieren und testen.
Meine /boot/config.txt

Code: Select all

# For more options and information see
# http://rpf.io/configtxt
# Some settings may impact device functionality. See link above for details

# uncomment if you get no picture on HDMI for a default "safe" mode
#hdmi_safe=1

# uncomment this if your display has a black border of unused pixels visible
# and your display can output without overscan
#disable_overscan=1

# uncomment the following to adjust overscan. Use positive numbers if console
# goes off screen, and negative if there is too much border
#overscan_left=16
#overscan_right=16
#overscan_top=16
#overscan_bottom=16

# uncomment to force a console size. By default it will be display's size minus
# overscan.
#framebuffer_width=1280
#framebuffer_height=720

# uncomment if hdmi display is not detected and composite is being output
hdmi_force_hotplug=1

# uncomment to force a specific HDMI mode (this will force VGA)
hdmi_group=2
hdmi_mode=82

# uncomment to force a HDMI mode rather than DVI. This can make audio work in
# DMT (computer monitor) modes
hdmi_drive=2

# uncomment to increase signal to HDMI, if you have interference, blanking, or
# no display
#config_hdmi_boost=4

# uncomment for composite PAL
#sdtv_mode=2

#uncomment to overclock the arm. 700 MHz is the default.
#arm_freq=800

# Uncomment some or all of these to enable the optional hardware interfaces
#dtparam=i2c_arm=on
#dtparam=i2s=on
dtparam=spi=on

# Uncomment this to enable the lirc-rpi module
#dtoverlay=lirc-rpi

# Additional overlays and parameters are documented /boot/overlays/README

# Enable audio (loads snd_bcm2835)
dtparam=audio=on
dtoverlay=revpi-connect
dtparam=eth0_mac_hi=0xc83ea701
dtparam=eth0_mac_lo=0x2e55
dtparam=eth1_mac_hi=0xc83ea701
dtparam=eth1_mac_lo=0x2e56

dtoverlay=w1-gpio,gpiopin=28
Mit dem alten Kernel sieht das so aus (und funktioniert):

Code: Select all

pi@sulfurpi /dev$ uname -a
Linux sulfurpi 4.9.76-rt60-v7+ #1 SMP PREEMPT RT Fri, 28 Feb 2020 15:17:03 +0100 armv7l GNU/Linux
pi@sulfurpi /dev$ ll sp*
crw-rw---- 1 root spi 153, 0 Jul 11 11:51 spidev0.0
pi@sulfurpi /dev$
Mit dem neuen Kernel:

Code: Select all

pi@sulfurpi /dev$ uname -a
Linux sulfurpi 4.19.95-rt38-v7+ #1 SMP PREEMPT RT Tue, 16 Jun 2020 13:25:43 +0200 armv7l GNU/Linux
pi@sulfurpi /dev$ ll sp*
ls: cannot access 'sp*': No such file or directory
pi@sulfurpi /dev$
Möge mich einer Erhellen was sich da geändert hat? :D

Edit: Die Onewire Sensoren gehen mit beiden Kerneln
Markus
User avatar
lukas
Expert
Posts: 186
Joined: 13 Feb 2017, 10:29
Answers: 0

Re: SPI Device nicht mehr verfügbar in Kernel 4.19

Post by lukas »

Vielleicht fehlt im DeviceTree der "spidev0" Slave unter dem "spi0" Master (yay inclusive terminology!) oder der spidev0 Slave ist vorhanden aber als "status=disabled" markiert.

Der spidev0 Slave kommt da nicht über unser "revpi-connect" Overlay rein, sondern wird im Basis-DT der Foundation für das CM3 instantiiert (bcm2710-rpi-cm3.dts Zeile 69ff). Unser Overlay setzt dann den spidev1 Slave auf "disabled" und instantiiert auf Chip Select 1 den ks8851 Ethernet Chip (revpi-connect-overlay.dts Zeile 130ff). Den spidev0 Slave fassen wir nicht an.

Was sagt denn "sudo fdtdump /sys/firmware/fdt", ist der spidev0 Slave dort unterhalb von "spi@7e204000" aufgelistet und was hat er für einen "status"? Ein fehlender status ist gleichbedeutend mit "status=okay".

Eine andere Möglichkeit wäre, dass das spidev Modul nicht geladen ist. Taucht das /dev/spidev0.0 auf, wenn du "modprobe spidev" machst? Eigentlich war das unter 4.9 auch schon ein Modul, insofern hat sich da nichts geändert.
User avatar
RR4711
Posts: 228
Joined: 22 Feb 2018, 13:28
Answers: 0

Re: SPI Device nicht mehr verfügbar in Kernel 4.19

Post by RR4711 »

lukas wrote: 11 Jul 2020, 15:20 Vielleicht fehlt im DeviceTree der "spidev0" Slave unter dem "spi0" Master (yay inclusive terminology!) oder der spidev0 Slave ist vorhanden aber als "status=disabled" markiert.
Ja das muss alles politisch korrekt sein, auch wenn keiner unter den neuen Begriffen sich irgendwas vorstellen kann :roll:
Siehe auch https://www.oshwa.org/a-resolution-to-r ... gnal-names :(
Der spidev0 Slave kommt da nicht über unser "revpi-connect" Overlay rein, sondern wird im Basis-DT der Foundation für das CM3 instantiiert (bcm2710-rpi-cm3.dts Zeile 69ff). Unser Overlay setzt dann den spidev1 Slave auf "disabled" und instantiiert auf Chip Select 1 den ks8851 Ethernet Chip (revpi-connect-overlay.dts Zeile 130ff). Den spidev0 Slave fassen wir nicht an.
Ich mach ja keinem einen Vorwurf aber "ich hab nix geändert und vorher gings noch" :mrgreen:
Mehrmals up- und downgegradet zum testen, also nur mit apt-get ohne irgendwelche Umkonfiguriererei händisch
Was sagt denn "sudo fdtdump /sys/firmware/fdt", ist der spidev0 Slave dort unterhalb von "spi@7e204000" aufgelistet und was hat er für einen "status"? Ein fehlender status ist gleichbedeutend mit "status=okay".
Sieht eigentlich nicht schlecht aus:

Code: Select all

/dts-v1/;
// magic:		0xd00dfeed
// totalsize:		0x6ed5 (28373)
// off_dt_struct:	0x48
// off_dt_strings:	0x64b4
// off_mem_rsvmap:	0x28
// version:		17
// last_comp_version:	16
// boot_cpuid_phys:	0x0
// size_dt_strings:	0xa21
// size_dt_struct:	0x646c

/memreserve/ 0 0x1000;
/ {
    memreserve = <0x3b400000 0x04c00000>;
    serial-number = "00000000a62946e3";
    compatible = "brcm,bcm2837", "brcm,bcm2836", "kunbus,revpi-connect";
    model = "Raspberry Pi Compute Module 3 Plus Rev 1.0";
    interrupt-parent = <0x00000001>;
    #address-cells = <0x00000001>;
    #size-cells = <0x00000001>;
    system {
        linux,serial = <0x00000000 0xa62946e3>;
        linux,revision = <0x00a02100>;
    };
    axi {
        vc_mem {
            reg = <0x3ec00000 0x40000000 0xc0000000>;
        };
    };
    onewire@1c {
        phandle = <0x0000007d>;
        status = "okay";
        gpios = <0x0000000d 0x0000001c 0x00000000>;
        pinctrl-0 = <0x0000007c>;
        pinctrl-names = "default";
        compatible = "w1-gpio";
    };
    aliases {
        i2c_arm = "/soc/i2c@7e804000";
        i2c = "/soc/i2c@7e804000";
        i2c_vc = "/soc/i2c@7e205000";
        serial0 = "/soc/serial@7e201000";
        serial1 = "/soc/serial@7e215040";
        audio = "/soc/audio";
        aux = "/soc/aux@7e215000";
        sound = "/soc/sound";
        soc = "/soc";
        dma = "/soc/dma@7e007000";
        intc = "/soc/interrupt-controller@7e00b200";
        watchdog = "/soc/watchdog@7e100000";
        random = "/soc/rng@7e104000";
        mailbox = "/soc/mailbox@7e00b880";
        gpio = "/soc/gpio@7e200000";
        uart0 = "/soc/serial@7e201000";
        sdhost = "/soc/mmc@7e202000";
        mmc0 = "/soc/mmc@7e202000";
        i2s = "/soc/i2s@7e203000";
        spi0 = "/soc/spi@7e204000";
        i2c0 = "/soc/i2c@7e205000";
        uart1 = "/soc/serial@7e215040";
        spi1 = "/soc/spi@7e215080";
        spi2 = "/soc/spi@7e2150c0";
        mmc = "/soc/mmc@7e300000";
        mmc1 = "/soc/mmc@7e300000";
        i2c1 = "/soc/i2c@7e804000";
        i2c2 = "/soc/i2c@7e805000";
        usb = "/soc/usb@7e980000";
        leds = "/leds";
        fb = "/soc/fb";
        thermal = "/soc/thermal@7e212000";
        axiperf = "/soc/axiperf";
    };
    chosen {
        kaslr-seed = <0x9137073f 0xf68a3616>;
        bootargs = "coherent_pool=4M bcm2708_fb.fbwidth=1920 bcm2708_fb.fbheight=1080 bcm2708_fb.fbswap=1 smsc95xx.macaddr=B8:27:EB:29:46:E3 vc_mem.mem_base=0x3ec00000 vc_mem.mem_size=0x40000000  dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait nosplash plymouth.ignore-serial-consoles consoleblank=0";
    };
    thermal-zones {
        cpu-thermal {
            polling-delay-passive = <0x00000000>;
            polling-delay = <0x000003e8>;
            thermal-sensors = <0x00000002>;
            coefficients = <0xfffffde6 0x00064960>;
            phandle = <0x0000002d>;
            cooling-maps {
            };
        };
    };
    soc {
        compatible = "simple-bus";
        #address-cells = <0x00000001>;
        #size-cells = <0x00000001>;
        ranges = <0x7e000000 0x3f000000 0x01000000 0x40000000 0x40000000 0x00001000>;
        dma-ranges = <0xc0000000 0x00000000 0x3f000000>;
        phandle = <0x0000002e>;
        txp@7e004000 {
            compatible = "brcm,bcm2835-txp";
            reg = <0x7e004000 0x00000020>;
            interrupts = <0x00000001 0x0000000b>;
            status = "disabled";
            phandle = <0x0000002f>;
        };
        dma@7e007000 {
            compatible = "brcm,bcm2835-dma";
            reg = <0x7e007000 0x00000f00>;
            interrupts = <0x00000001 0x00000010 0x00000001 0x00000011 0x00000001 0x00000012 0x00000001 0x00000013 0x00000001 0x00000014 0x00000001 0x00000015 0x00000001 0x00000016 0x00000001 0x00000017 0x00000001 0x00000018 0x00000001 0x00000019 0x00000001 0x0000001a 0x00000001 0x0000001b 0x00000001 0x0000001b 0x00000001 0x0000001b 0x00000001 0x0000001b 0x00000001 0x0000001c>;
            interrupt-names = "dma0", "dma1", "dma2", "dma3", "dma4", "dma5", "dma6", "dma7", "dma8", "dma9", "dma10", "dma11", "dma12", "dma13", "dma14", "dma-shared-all";
            #dma-cells = <0x00000001>;
            brcm,dma-channel-mask = <0x00007f35>;
            phandle = <0x00000008>;
        };
        watchdog@7e100000 {
            compatible = "brcm,bcm2835-pm", "brcm,bcm2835-pm-wdt";
            #power-domain-cells = <0x00000001>;
            #reset-cells = <0x00000001>;
            reg = <0x7e100000 0x00000114 0x7e00a000 0x00000024>;
            clocks = <0x00000003 0x00000015 0x00000003 0x0000001d 0x00000003 0x00000017 0x00000003 0x00000016>;
            clock-names = "v3d", "peri_image", "h264", "isp";
            system-power-controller;
            phandle = <0x00000025>;
        };
        cprman@7e101000 {
            compatible = "brcm,bcm2835-cprman";
            #clock-cells = <0x00000001>;
            reg = <0x7e101000 0x00002000>;
            clocks = <0x00000004 0x00000005 0x00000000 0x00000005 0x00000001 0x00000005 0x00000002 0x00000006 0x00000000 0x00000006 0x00000001 0x00000006 0x00000002>;
            firmware = <0x00000007>;
            phandle = <0x00000003>;
        };
        rng@7e104000 {
            compatible = "brcm,bcm2835-rng";
            reg = <0x7e104000 0x00000010>;
            interrupts = <0x00000002 0x0000001d>;
            phandle = <0x00000026>;
        };
        mailbox@7e00b880 {
            compatible = "brcm,bcm2835-mbox";
            reg = <0x7e00b880 0x00000040>;
            interrupts = <0x00000000 0x00000001>;
            #mbox-cells = <0x00000000>;
            phandle = <0x00000018>;
        };
        gpio@7e200000 {
            compatible = "brcm,bcm2835-gpio";
            reg = <0x7e200000 0x000000b4>;
            interrupts = <0x00000002 0x00000011 0x00000002 0x00000012>;
            gpio-controller;
            #gpio-cells = <0x00000002>;
            interrupt-controller;
            #interrupt-cells = <0x00000002>;
            pinctrl-names = "default";
            phandle = <0x0000000d>;
            w1_pins@1c {
                phandle = <0x0000007c>;
                brcm,pull = <0x00000000>;
                brcm,function = <0x00000000>;
                brcm,pins = <0x0000001c>;
            };
            rs485_pins {
                phandle = <0x00000078>;
                brcm,pull = <0x00000001 0x00000001 0x00000001 0x00000002>;
                brcm,function = <0x00000004 0x00000004 0x00000007 0x00000001>;
                brcm,pins = <0x0000000e 0x0000000f 0x00000011 0x00000029>;
            };
            conbridge_int_pins {
                brcm,pull = <0x00000000>;
                brcm,function = <0x00000000>;
                brcm,pins = <0x0000001c>;
            };
            eth2_reset_pins {
                brcm,pull = <0x00000000>;
                brcm,function = <0x00000001>;
                brcm,pins = <0x00000028>;
            };
            eth2_int_pins {
                brcm,pull = <0x00000000>;
                brcm,function = <0x00000000>;
                brcm,pins = <0x00000008>;
            };
            dpi_gpio0 {
                brcm,pins = <0x00000000 0x00000001 0x00000002 0x00000003 0x00000004 0x00000005 0x00000006 0x00000007 0x00000008 0x00000009 0x0000000a 0x0000000b 0x0000000c 0x0000000d 0x0000000e 0x0000000f 0x00000010 0x00000011 0x00000012 0x00000013 0x00000014 0x00000015 0x00000016 0x00000017 0x00000018 0x00000019 0x0000001a 0x0000001b>;
                brcm,function = <0x00000006>;
                phandle = <0x00000030>;
            };
            emmc_gpio22 {
                brcm,pins = <0x00000016 0x00000017 0x00000018 0x00000019 0x0000001a 0x0000001b>;
                brcm,function = <0x00000007>;
                phandle = <0x00000031>;
            };
            emmc_gpio34 {
                brcm,pins = <0x00000022 0x00000023 0x00000024 0x00000025 0x00000026 0x00000027>;
                brcm,function = <0x00000007>;
                brcm,pull = <0x00000000 0x00000002 0x00000002 0x00000002 0x00000002 0x00000002>;
                phandle = <0x00000032>;
            };
            emmc_gpio48 {
                brcm,pins = <0x00000030 0x00000031 0x00000032 0x00000033 0x00000034 0x00000035>;
                brcm,function = <0x00000007>;
                phandle = <0x00000017>;
            };
            gpclk0_gpio4 {
                brcm,pins = <0x00000004>;
                brcm,function = <0x00000004>;
                phandle = <0x00000033>;
            };
            gpclk1_gpio5 {
                brcm,pins = <0x00000005>;
                brcm,function = <0x00000004>;
                phandle = <0x00000034>;
            };
            gpclk1_gpio42 {
                brcm,pins = <0x0000002a>;
                brcm,function = <0x00000004>;
                phandle = <0x00000035>;
            };
            gpclk1_gpio44 {
                brcm,pins = <0x0000002c>;
                brcm,function = <0x00000004>;
                phandle = <0x00000036>;
            };
            gpclk2_gpio6 {
                brcm,pins = <0x00000006>;
                brcm,function = <0x00000004>;
                phandle = <0x00000037>;
            };
            gpclk2_gpio43 {
                brcm,pins = <0x0000002b>;
                brcm,function = <0x00000004>;
                brcm,pull = <0x00000000>;
                phandle = <0x00000038>;
            };
            i2c0_gpio0 {
                brcm,pins = <0x00000000 0x00000001>;
                brcm,function = <0x00000004>;
                phandle = <0x00000039>;
            };
            i2c0_gpio28 {
                brcm,pins = <0x0000001c 0x0000001d>;
                brcm,function = <0x00000004>;
                phandle = <0x0000003a>;
            };
            i2c0_gpio44 {
                brcm,pins = <0x0000002c 0x0000002d>;
                brcm,function = <0x00000005>;
                phandle = <0x0000003b>;
            };
            i2c1_gpio2 {
                brcm,pins = <0x00000002 0x00000003>;
                brcm,function = <0x00000004>;
                phandle = <0x0000003c>;
            };
            i2c1_gpio44 {
                brcm,pins = <0x0000002c 0x0000002d>;
                brcm,function = <0x00000006>;
                phandle = <0x0000003d>;
            };
            jtag_gpio22 {
                brcm,pins = <0x00000016 0x00000017 0x00000018 0x00000019 0x0000001a 0x0000001b>;
                brcm,function = <0x00000003>;
                phandle = <0x0000003e>;
            };
            pcm_gpio18 {
                brcm,pins = <0x00000012 0x00000013 0x00000014 0x00000015>;
                brcm,function = <0x00000004>;
                phandle = <0x0000003f>;
            };
            pcm_gpio28 {
                brcm,pins = <0x0000001c 0x0000001d 0x0000001e 0x0000001f>;
                brcm,function = <0x00000006>;
                phandle = <0x00000040>;
            };
            pwm0_gpio12 {
                brcm,pins = <0x0000000c>;
                brcm,function = <0x00000004>;
                phandle = <0x00000041>;
            };
            pwm0_gpio18 {
                brcm,pins = <0x00000012>;
                brcm,function = <0x00000002>;
                phandle = <0x00000042>;
            };
            pwm0_gpio40 {
                brcm,pins = <0x00000028>;
                brcm,function = <0x00000004>;
                phandle = <0x00000043>;
            };
            pwm1_gpio13 {
                brcm,pins = <0x0000000d>;
                brcm,function = <0x00000004>;
                phandle = <0x00000044>;
            };
            pwm1_gpio19 {
                brcm,pins = <0x00000013>;
                brcm,function = <0x00000002>;
                phandle = <0x00000045>;
            };
            pwm1_gpio41 {
                brcm,pins = <0x00000029>;
                brcm,function = <0x00000004>;
                phandle = <0x00000046>;
            };
            pwm1_gpio45 {
                brcm,pins = <0x0000002d>;
                brcm,function = <0x00000004>;
                phandle = <0x00000047>;
            };
            sdhost_gpio48 {
                brcm,pins = <0x00000030 0x00000031 0x00000032 0x00000033 0x00000034 0x00000035>;
                brcm,function = <0x00000004>;
                phandle = <0x00000009>;
            };
            spi0_gpio7 {
                brcm,pins = <0x00000007 0x00000008 0x00000009 0x0000000a 0x0000000b>;
                brcm,function = <0x00000004>;
                phandle = <0x00000048>;
            };
            spi0_gpio35 {
                brcm,pins = <0x00000023 0x00000024 0x00000025 0x00000026 0x00000027>;
                brcm,function = <0x00000004>;
                phandle = <0x00000049>;
            };
            spi1_gpio16 {
                brcm,pins = <0x00000010 0x00000011 0x00000012 0x00000013 0x00000014 0x00000015>;
                brcm,function = <0x00000003>;
                phandle = <0x0000004a>;
            };
            spi2_gpio40 {
                brcm,pins = <0x00000028 0x00000029 0x0000002a 0x0000002b 0x0000002c 0x0000002d>;
                brcm,function = <0x00000003>;
                phandle = <0x0000004b>;
            };
            uart0_gpio14 {
                brcm,pins = <0x0000000e 0x0000000f>;
                brcm,function = <0x00000004>;
                phandle = <0x0000004c>;
            };
            uart0_ctsrts_gpio16 {
                brcm,pins = <0x00000010 0x00000011>;
                brcm,function = <0x00000007>;
                phandle = <0x0000004d>;
            };
            uart0_ctsrts_gpio30 {
                brcm,pins = <0x0000001e 0x0000001f>;
                brcm,function = <0x00000007>;
                brcm,pull = <0x00000002 0x00000000>;
                phandle = <0x0000004e>;
            };
            uart0_gpio32 {
                brcm,pins = <0x00000020 0x00000021>;
                brcm,function = <0x00000007>;
                brcm,pull = <0x00000000 0x00000002>;
                phandle = <0x0000004f>;
            };
            uart0_gpio36 {
                brcm,pins = <0x00000024 0x00000025>;
                brcm,function = <0x00000006>;
                phandle = <0x00000050>;
            };
            uart0_ctsrts_gpio38 {
                brcm,pins = <0x00000026 0x00000027>;
                brcm,function = <0x00000006>;
                phandle = <0x00000051>;
            };
            uart1_gpio14 {
                brcm,pins = <0x0000000e 0x0000000f>;
                brcm,function = <0x00000002>;
                phandle = <0x00000052>;
            };
            uart1_ctsrts_gpio16 {
                brcm,pins = <0x00000010 0x00000011>;
                brcm,function = <0x00000002>;
                phandle = <0x00000053>;
            };
            uart1_gpio32 {
                brcm,pins = <0x00000020 0x00000021>;
                brcm,function = <0x00000002>;
                phandle = <0x00000054>;
            };
            uart1_ctsrts_gpio30 {
                brcm,pins = <0x0000001e 0x0000001f>;
                brcm,function = <0x00000002>;
                phandle = <0x00000055>;
            };
            uart1_gpio40 {
                brcm,pins = <0x00000028 0x00000029>;
                brcm,function = <0x00000002>;
                phandle = <0x00000056>;
            };
            uart1_ctsrts_gpio42 {
                brcm,pins = <0x0000002a 0x0000002b>;
                brcm,function = <0x00000002>;
                phandle = <0x00000057>;
            };
            i2c_slave_gpio18 {
                brcm,pins = <0x00000012 0x00000013 0x00000014 0x00000015>;
                brcm,function = <0x00000007>;
                phandle = <0x00000058>;
            };
            jtag_gpio4 {
                brcm,pins = <0x00000004 0x00000005 0x00000006 0x0000000c 0x0000000d>;
                brcm,function = <0x00000002>;
                phandle = <0x00000059>;
            };
            dpi_18bit_gpio0 {
                brcm,pins = <0x00000000 0x00000001 0x00000002 0x00000003 0x00000004 0x00000005 0x00000006 0x00000007 0x00000008 0x00000009 0x0000000a 0x0000000b 0x0000000c 0x0000000d 0x0000000e 0x0000000f 0x00000010 0x00000011 0x00000012 0x00000013 0x00000014 0x00000015>;
                brcm,function = <0x00000006>;
                phandle = <0x0000005a>;
            };
            gpioout {
                brcm,pins = <0x00000006>;
                brcm,function = <0x00000001>;
                phandle = <0x0000005b>;
            };
            alt0 {
                brcm,pins = <0x00000004 0x00000005 0x00000007 0x00000008 0x00000009 0x0000000a 0x0000000b>;
                brcm,function = <0x00000004>;
                phandle = <0x0000005c>;
            };
            spi0_pins {
                brcm,pull = <0x00000000>;
                brcm,pins = <0x00000025 0x00000026 0x00000027>;
                brcm,function = <0x00000004>;
                phandle = <0x0000000b>;
            };
            spi0_cs_pins {
                brcm,pull = <0x00000000>;
                brcm,pins = <0x00000024 0x00000023>;
                brcm,function = <0x00000001>;
                phandle = <0x0000000c>;
            };
            i2c0 {
                brcm,pins = <0x00000000 0x00000001>;
                brcm,function = <0x00000004>;
                phandle = <0x0000000e>;
            };
            i2c1 {
                brcm,pull = <0x00000000>;
                brcm,pins = <0x0000002c 0x0000002d>;
                brcm,function = <0x00000006>;
                phandle = <0x00000011>;
            };
            i2s {
                brcm,pins = <0x00000012 0x00000013 0x00000014 0x00000015>;
                brcm,function = <0x00000004>;
                phandle = <0x0000000a>;
            };
            audio_pins {
                brcm,pins;
                brcm,function;
                phandle = <0x00000019>;
            };
        };
        serial@7e201000 {
            pinctrl-0 = <0x00000078>;
            pinctrl-names = "default";
            linux,rs485-enabled-at-boot-time;
            compatible = "brcm,bcm2835-pl011", "arm,pl011", "arm,primecell";
            reg = <0x7e201000 0x00000200>;
            interrupts = <0x00000002 0x00000019>;
            clocks = <0x00000003 0x00000013 0x00000003 0x00000014>;
            clock-names = "uartclk", "apb_pclk";
            arm,primecell-periphid = <0x00241011>;
            cts-event-workaround;
            status = "okay";
            phandle = <0x0000001e>;
        };
        mmc@7e202000 {
            compatible = "brcm,bcm2835-sdhost";
            reg = <0x7e202000 0x00000100>;
            interrupts = <0x00000002 0x00000018>;
            clocks = <0x00000003 0x00000014>;
            dmas = <0x00000008 0x2000000d>;
            dma-names = "rx-tx";
            status = "okay";
            pinctrl-names = "default";
            pinctrl-0 = <0x00000009>;
            bus-width = <0x00000004>;
            brcm,overclock-50 = <0x00000000>;
            brcm,pio-limit = <0x00000001>;
            phandle = <0x00000027>;
        };
        i2s@7e203000 {
            compatible = "brcm,bcm2835-i2s";
            reg = <0x7e203000 0x00000024>;
            clocks = <0x00000003 0x0000001f>;
            dmas = <0x00000008 0x00000002 0x00000008 0x00000003>;
            dma-names = "tx", "rx";
            status = "disabled";
            #sound-dai-cells = <0x00000000>;
            pinctrl-names = "default";
            pinctrl-0 = <0x0000000a>;
            phandle = <0x00000020>;
        };
        spi@7e204000 {
            compatible = "brcm,bcm2835-spi";
            reg = <0x7e204000 0x00000200>;
            interrupts = <0x00000002 0x00000016>;
            clocks = <0x00000003 0x00000014>;
            dmas = <0x00000008 0x00000006 0x00000008 0x00000007>;
            dma-names = "tx", "rx";
            #address-cells = <0x00000001>;
            #size-cells = <0x00000000>;
            status = "okay";
            pinctrl-names = "default";
            pinctrl-0 = <0x0000000b 0x0000000c>;
            cs-gpios = <0x0000000d 0x00000024 0x00000001 0x0000000d 0x00000023 0x00000001>;
            phandle = <0x00000021>;
            ethernet@1 {
                phandle = <0x0000007b>;
                status = "okay";
                reset-gpios = <0x0000000d 0x00000028 0x00000001>;
                interrupts = <0x00000008 0x00000008>;
                #interrupt-cells = <0x00000002>;
                interrupt-parent = <0x0000000d>;
                spi-max-frequency = <0x00989680>;
                reg = <0x00000001>;
                compatible = "micrel,ks8851";
            };
            spidev@0 {
                compatible = "spidev";
                reg = <0x00000000>;
                #address-cells = <0x00000001>;
                #size-cells = <0x00000000>;
                spi-max-frequency = <0x07735940>;
                phandle = <0x0000005d>;
            };
            spidev@1 {
                status = "disabled";
                compatible = "spidev";
                reg = <0x00000001>;
                #address-cells = <0x00000001>;
                #size-cells = <0x00000000>;
                spi-max-frequency = <0x07735940>;
                phandle = <0x0000005e>;
            };
        };
        i2c@7e205000 {
            compatible = "brcm,bcm2835-i2c";
            reg = <0x7e205000 0x00000200>;
            interrupts = <0x00000002 0x00000015>;
            clocks = <0x00000003 0x00000014>;
            #address-cells = <0x00000001>;
            #size-cells = <0x00000000>;
            status = "disabled";
            pinctrl-names = "default";
            pinctrl-0 = <0x0000000e>;
            clock-frequency = <0x000186a0>;
            phandle = <0x00000022>;
        };
        pixelvalve@7e206000 {
            compatible = "brcm,bcm2835-pixelvalve0";
            reg = <0x7e206000 0x00000100>;
            interrupts = <0x00000002 0x0000000d>;
            status = "disabled";
            phandle = <0x0000005f>;
        };
        pixelvalve@7e207000 {
            compatible = "brcm,bcm2835-pixelvalve1";
            reg = <0x7e207000 0x00000100>;
            interrupts = <0x00000002 0x0000000e>;
            status = "disabled";
            phandle = <0x00000060>;
        };
        dpi@7e208000 {
            compatible = "brcm,bcm2835-dpi";
            reg = <0x7e208000 0x0000008c>;
            clocks = <0x00000003 0x00000014 0x00000003 0x0000002c>;
            clock-names = "core", "pixel";
            #address-cells = <0x00000001>;
            #size-cells = <0x00000000>;
            status = "disabled";
            phandle = <0x00000061>;
        };
        dsi@7e209000 {
            compatible = "brcm,bcm2835-dsi0";
            reg = <0x7e209000 0x00000078>;
            interrupts = <0x00000002 0x00000004>;
            #address-cells = <0x00000001>;
            #size-cells = <0x00000000>;
            #clock-cells = <0x00000001>;
            clocks = <0x00000003 0x00000020 0x00000003 0x0000002f 0x00000003 0x00000031>;
            clock-names = "phy", "escape", "pixel";
            clock-output-names = "dsi0_byte", "dsi0_ddr2", "dsi0_ddr";
            power-domains = <0x0000000f 0x00000011>;
            phandle = <0x00000005>;
        };
        aux@7e215000 {
            compatible = "brcm,bcm2835-aux";
            #clock-cells = <0x00000001>;
            reg = <0x7e215000 0x00000008>;
            clocks = <0x00000003 0x00000014>;
            phandle = <0x00000010>;
        };
        serial@7e215040 {
            compatible = "brcm,bcm2835-aux-uart";
            reg = <0x7e215040 0x00000040>;
            interrupts = <0x00000001 0x0000001d>;
            clocks = <0x00000010 0x00000000>;
            status = "disabled";
            phandle = <0x0000001f>;
        };
        spi@7e215080 {
            compatible = "brcm,bcm2835-aux-spi";
            reg = <0x7e215080 0x00000040>;
            interrupts = <0x00000001 0x0000001d>;
            clocks = <0x00000010 0x00000001>;
            #address-cells = <0x00000001>;
            #size-cells = <0x00000000>;
            status = "disabled";
            phandle = <0x00000062>;
        };
        spi@7e2150c0 {
            compatible = "brcm,bcm2835-aux-spi";
            reg = <0x7e2150c0 0x00000040>;
            interrupts = <0x00000001 0x0000001d>;
            clocks = <0x00000010 0x00000002>;
            #address-cells = <0x00000001>;
            #size-cells = <0x00000000>;
            status = "disabled";
            phandle = <0x00000063>;
        };
        pwm@7e20c000 {
            compatible = "brcm,bcm2835-pwm";
            reg = <0x7e20c000 0x00000028>;
            clocks = <0x00000003 0x0000001e>;
            assigned-clocks = <0x00000003 0x0000001e>;
            assigned-clock-rates = <0x00989680>;
            #pwm-cells = <0x00000002>;
            status = "disabled";
            phandle = <0x00000064>;
        };
        hvs@7e400000 {
            compatible = "brcm,bcm2835-hvs";
            reg = <0x7e400000 0x00006000>;
            interrupts = <0x00000002 0x00000001>;
            status = "disabled";
            phandle = <0x00000065>;
        };
        dsi@7e700000 {
            compatible = "brcm,bcm2835-dsi1";
            reg = <0x7e700000 0x0000008c>;
            interrupts = <0x00000002 0x0000000c>;
            #address-cells = <0x00000001>;
            #size-cells = <0x00000000>;
            #clock-cells = <0x00000001>;
            clocks = <0x00000003 0x00000023 0x00000003 0x00000030 0x00000003 0x00000032>;
            clock-names = "phy", "escape", "pixel";
            clock-output-names = "dsi1_byte", "dsi1_ddr2", "dsi1_ddr";
            status = "disabled";
            power-domains = <0x0000000f 0x00000012>;
            phandle = <0x00000006>;
        };
        csi@7e800000 {
            compatible = "brcm,bcm2835-unicam";
            reg = <0x7e800000 0x00000800 0x7e802000 0x00000004>;
            interrupts = <0x00000002 0x00000006>;
            clocks = <0x00000003 0x0000002d>;
            clock-names = "lp";
            #address-cells = <0x00000001>;
            #size-cells = <0x00000000>;
            #clock-cells = <0x00000001>;
            status = "disabled";
            power-domains = <0x0000000f 0x0000000c>;
            phandle = <0x00000066>;
            port {
                endpoint {
                    data-lanes = <0x00000001 0x00000002>;
                };
            };
        };
        csi@7e801000 {
            compatible = "brcm,bcm2835-unicam";
            reg = <0x7e801000 0x00000800 0x7e802004 0x00000004>;
            interrupts = <0x00000002 0x00000007>;
            clocks = <0x00000003 0x0000002e>;
            clock-names = "lp";
            #address-cells = <0x00000001>;
            #size-cells = <0x00000000>;
            #clock-cells = <0x00000001>;
            status = "disabled";
            power-domains = <0x0000000f 0x0000000d>;
            phandle = <0x00000067>;
            port {
                endpoint {
                    data-lanes = <0x00000001 0x00000002 0x00000003 0x00000004>;
                };
            };
        };
        i2c@7e804000 {
            compatible = "brcm,bcm2835-i2c";
            reg = <0x7e804000 0x00001000>;
            interrupts = <0x00000002 0x00000015>;
            clocks = <0x00000003 0x00000014>;
            #address-cells = <0x00000001>;
            #size-cells = <0x00000000>;
            status = "okay";
            pinctrl-names = "default";
            pinctrl-0 = <0x00000011>;
            clock-frequency = <0x000186a0>;
            phandle = <0x00000023>;
            crypto@60 {
                status = "okay";
                reg = <0x00000060>;
                compatible = "atmel,atecc508a";
            };
            rtc@51 {
                status = "okay";
                reg = <0x00000051>;
                compatible = "nxp,pcf2129";
            };
        };
        i2c@7e805000 {
            compatible = "brcm,bcm2835-i2c";
            reg = <0x7e805000 0x00001000>;
            interrupts = <0x00000002 0x00000015>;
            clocks = <0x00000003 0x00000014>;
            #address-cells = <0x00000001>;
            #size-cells = <0x00000000>;
            status = "disabled";
            clock-frequency = <0x000186a0>;
            phandle = <0x00000012>;
        };
        vec@7e806000 {
            compatible = "brcm,bcm2835-vec";
            reg = <0x7e806000 0x00001000>;
            clocks = <0x00000003 0x00000018>;
            interrupts = <0x00000002 0x0000001b>;
            status = "disabled";
            power-domains = <0x0000000f 0x00000007>;
            phandle = <0x00000068>;
        };
        pixelvalve@7e807000 {
            compatible = "brcm,bcm2835-pixelvalve2";
            reg = <0x7e807000 0x00000100>;
            interrupts = <0x00000002 0x0000000a>;
            status = "disabled";
            phandle = <0x00000069>;
        };
        hdmi@7e902000 {
            compatible = "brcm,bcm2835-hdmi";
            reg = <0x7e902000 0x00000600 0x7e808000 0x00000100>;
            interrupts = <0x00000002 0x00000008 0x00000002 0x00000009>;
            ddc = <0x00000012>;
            clocks = <0x00000003 0x00000010 0x00000003 0x00000019>;
            clock-names = "pixel", "hdmi";
            dmas = <0x00000008 0x00000011>;
            dma-names = "audio-rx";
            status = "disabled";
            power-domains = <0x0000000f 0x00000005>;
            hpd-gpios = <0x00000013 0x00000000 0x00000001>;
            phandle = <0x0000006a>;
        };
        usb@7e980000 {
            compatible = "brcm,bcm2708-usb";
            reg = <0x7e980000 0x00010000 0x7e006000 0x00001000>;
            interrupts = <0x00000001 0x00000009 0x00000002 0x00000000>;
            #address-cells = <0x00000001>;
            #size-cells = <0x00000000>;
            clocks = <0x00000014>;
            clock-names = "otg";
            phys = <0x00000015>;
            phy-names = "usb2-phy";
            interrupt-names = "usb", "soft";
            power-domains = <0x0000000f 0x00000006>;
            phandle = <0x0000006b>;
            hub@1 {
                #size-cells = <0x00000000>;
                #address-cells = <0x00000001>;
                reg = <0x00000001>;
                compatible = "usb424,9514";
                hub@5 {
                    #size-cells = <0x00000000>;
                    #address-cells = <0x00000001>;
                    reg = <0x00000005>;
                    compatible = "usb424,9512";
                    uart@3 {
                        reg = <0x00000003>;
                        compatible = "usb403,6001";
                    };
                    uart@2 {
                        reg = <0x00000002>;
                        compatible = "usb403,6001";
                    };
                    ethernet@1 {
                        phandle = <0x0000007a>;
                        reg = <0x00000001>;
                        compatible = "usb424,ec00";
                        local-mac-address = [c8 3e a7 01 2e 56];
                    };
                };
                ethernet@1 {
                    phandle = <0x00000079>;
                    reg = <0x00000001>;
                    compatible = "usb424,ec00";
                    local-mac-address = [c8 3e a7 01 2e 55];
                };
            };
        };
        gpu {
            compatible = "brcm,bcm2835-vc4";
            status = "disabled";
            phandle = <0x0000006c>;
        };
        interrupt-controller@7e00b200 {
            compatible = "brcm,bcm2836-armctrl-ic";
            reg = <0x7e00b200 0x00000200>;
            interrupt-controller;
            #interrupt-cells = <0x00000002>;
            interrupt-parent = <0x00000016>;
            interrupts = <0x00000008 0x00000004>;
            phandle = <0x00000001>;
        };
        thermal@7e212000 {
            compatible = "brcm,bcm2837-thermal";
            reg = <0x7e212000 0x00000008>;
            clocks = <0x00000003 0x0000001b>;
            #thermal-sensor-cells = <0x00000000>;
            status = "okay";
            phandle = <0x00000002>;
        };
        v3d@7ec00000 {
            compatible = "brcm,vc4-v3d";
            reg = <0x7ec00000 0x00001000>;
            interrupts = <0x00000001 0x0000000a>;
            power-domains = <0x0000000f 0x0000000a>;
            status = "disabled";
            phandle = <0x0000006d>;
        };
        local_intc@40000000 {
            compatible = "brcm,bcm2836-l1-intc";
            reg = <0x40000000 0x00000100>;
            interrupt-controller;
            #interrupt-cells = <0x00000002>;
            interrupt-parent = <0x00000016>;
            phandle = <0x00000016>;
        };
        mmc@7e300000 {
            compatible = "brcm,bcm2835-mmc", "brcm,bcm2835-sdhci";
            reg = <0x7e300000 0x00000100>;
            interrupts = <0x00000002 0x0000001e>;
            clocks = <0x00000003 0x0000001c>;
            dmas = <0x00000008 0x0000000b>;
            dma-names = "rx-tx";
            brcm,overclock-50 = <0x00000000>;
            status = "disabled";
            pinctrl-names = "default";
            pinctrl-0 = <0x00000017>;
            bus-width = <0x00000004>;
            phandle = <0x00000028>;
        };
        mmcnr@7e300000 {
            compatible = "brcm,bcm2835-mmc", "brcm,bcm2835-sdhci";
            reg = <0x7e300000 0x00000100>;
            interrupts = <0x00000002 0x0000001e>;
            clocks = <0x00000003 0x0000001c>;
            dmas = <0x00000008 0x0000000b>;
            dma-names = "rx-tx";
            brcm,overclock-50 = <0x00000000>;
            non-removable;
            status = "disabled";
            phandle = <0x00000029>;
        };
        firmwarekms@7e600000 {
            compatible = "raspberrypi,rpi-firmware-kms";
            reg = <0x7e600000 0x00000100>;
            interrupts = <0x00000002 0x00000010>;
            brcm,firmware = <0x00000007>;
            status = "disabled";
            phandle = <0x0000006e>;
        };
        smi@7e600000 {
            compatible = "brcm,bcm2835-smi";
            reg = <0x7e600000 0x00000100>;
            interrupts = <0x00000002 0x00000010>;
            clocks = <0x00000003 0x0000002a>;
            assigned-clocks = <0x00000003 0x0000002a>;
            assigned-clock-rates = <0x07735940>;
            dmas = <0x00000008 0x00000004>;
            dma-names = "rx-tx";
            status = "disabled";
            phandle = <0x0000006f>;
        };
        axiperf {
            compatible = "brcm,bcm2835-axiperf";
            reg = <0x7e009800 0x00000100 0x7ee08000 0x00000100>;
            firmware = <0x00000007>;
            status = "disabled";
            phandle = <0x0000002a>;
        };
        firmware {
            compatible = "raspberrypi,bcm2835-firmware", "simple-bus";
            mboxes = <0x00000018>;
            phandle = <0x00000007>;
            expgpio {
                compatible = "raspberrypi,firmware-gpio";
                gpio-controller;
                #gpio-cells = <0x00000002>;
                status = "okay";
                phandle = <0x00000013>;
            };
        };
        power {
            compatible = "raspberrypi,bcm2835-power";
            firmware = <0x00000007>;
            #power-domain-cells = <0x00000001>;
            phandle = <0x0000000f>;
        };
        mailbox@7e00b840 {
            compatible = "brcm,bcm2836-vchiq", "brcm,bcm2835-vchiq";
            reg = <0x7e00b840 0x0000003c>;
            interrupts = <0x00000000 0x00000002>;
            phandle = <0x00000070>;
        };
        gpiomem {
            compatible = "brcm,bcm2835-gpiomem";
            reg = <0x7e200000 0x00001000>;
        };
        fb {
            compatible = "brcm,bcm2708-fb";
            firmware = <0x00000007>;
            status = "okay";
            phandle = <0x00000071>;
        };
        vcsm {
            compatible = "raspberrypi,bcm2835-vcsm";
            firmware = <0x00000007>;
            status = "okay";
            phandle = <0x00000072>;
        };
        audio {
            compatible = "brcm,bcm2835-audio";
            brcm,pwm-channels = <0x00000008>;
            status = "okay";
            pinctrl-names = "default";
            pinctrl-0 = <0x00000019>;
            phandle = <0x00000024>;
        };
        sound {
            status = "disabled";
            phandle = <0x00000073>;
        };
        virtgpio {
            compatible = "brcm,bcm2835-virtgpio";
            gpio-controller;
            #gpio-cells = <0x00000002>;
            firmware = <0x00000007>;
            status = "okay";
            phandle = <0x0000002c>;
        };
    };
    clocks {
        compatible = "simple-bus";
        #address-cells = <0x00000001>;
        #size-cells = <0x00000000>;
        clock@3 {
            compatible = "fixed-clock";
            reg = <0x00000003>;
            #clock-cells = <0x00000000>;
            clock-output-names = "osc";
            clock-frequency = <0x0124f800>;
            phandle = <0x00000004>;
        };
        clock@4 {
            compatible = "fixed-clock";
            reg = <0x00000004>;
            #clock-cells = <0x00000000>;
            clock-output-names = "otg";
            clock-frequency = <0x1c9c3800>;
            phandle = <0x00000014>;
        };
    };
    phy {
        compatible = "usb-nop-xceiv";
        #phy-cells = <0x00000000>;
        phandle = <0x00000015>;
    };
    arm-pmu {
        compatible = "arm,cortex-a7-pmu";
        interrupt-parent = <0x00000016>;
        interrupts = <0x00000009 0x00000004>;
    };
    timer {
        compatible = "arm,armv7-timer";
        interrupt-parent = <0x00000016>;
        interrupts = <0x00000000 0x00000004 0x00000001 0x00000004 0x00000003 0x00000004 0x00000002 0x00000004>;
        always-on;
    };
    cpus {
        #address-cells = <0x00000001>;
        #size-cells = <0x00000000>;
        enable-method = "brcm,bcm2836-smp";
        phandle = <0x00000074>;
        cpu@0 {
            clock-frequency = <0x47868c00>;
            device_type = "cpu";
            compatible = "arm,cortex-a53";
            reg = <0x00000000>;
            enable-method = "spin-table";
            cpu-release-addr = <0x00000000 0x000000d8>;
            phandle = <0x0000001a>;
        };
        cpu@1 {
            clock-frequency = <0x47868c00>;
            device_type = "cpu";
            compatible = "arm,cortex-a53";
            reg = <0x00000001>;
            enable-method = "spin-table";
            cpu-release-addr = <0x00000000 0x000000e0>;
            phandle = <0x0000001b>;
        };
        cpu@2 {
            clock-frequency = <0x47868c00>;
            device_type = "cpu";
            compatible = "arm,cortex-a53";
            reg = <0x00000002>;
            enable-method = "spin-table";
            cpu-release-addr = <0x00000000 0x000000e8>;
            phandle = <0x0000001c>;
        };
        cpu@3 {
            clock-frequency = <0x47868c00>;
            device_type = "cpu";
            compatible = "arm,cortex-a53";
            reg = <0x00000003>;
            enable-method = "spin-table";
            cpu-release-addr = <0x00000000 0x000000f0>;
            phandle = <0x0000001d>;
        };
    };
    __overrides__ {
        i2c_arm_baudrate = [00 00 00 23 63 6c 6f 63 6b 2d 66 72 65 71 75 65 6e 63 79 3a 30 00];
        i2c_baudrate = [00 00 00 23 63 6c 6f 63 6b 2d 66 72 65 71 75 65 6e 63 79 3a 30 00];
        i2c_arm = [00 00 00 23 73 74 61 74 75 73 00];
        i2c = [00 00 00 23 73 74 61 74 75 73 00];
        i2c_vc_baudrate = [00 00 00 22 63 6c 6f 63 6b 2d 66 72 65 71 75 65 6e 63 79 3a 30 00];
        i2c_vc = [00 00 00 22 73 74 61 74 75 73 00];
        cam0-pwdn-ctrl;
        cam0-pwdn;
        cam0-led-ctrl;
        cam0-led;
        arm_freq = <0x0000001a 0x636c6f63 0x6b2d6672 0x65717565 0x6e63793a 0x30000000 0x001b636c 0x6f636b2d 0x66726571 0x75656e63 0x793a3000 0x0000001c 0x636c6f63 0x6b2d6672 0x65717565 0x6e63793a 0x30000000 0x001d636c 0x6f636b2d 0x66726571 0x75656e63 0x793a3000>;
        cache_line_size;
        uart0 = [00 00 00 1e 73 74 61 74 75 73 00];
        uart1 = [00 00 00 1f 73 74 61 74 75 73 00];
        i2s = [00 00 00 20 73 74 61 74 75 73 00];
        spi = [00 00 00 21 73 74 61 74 75 73 00];
        i2c0 = [00 00 00 22 73 74 61 74 75 73 00];
        i2c1 = [00 00 00 23 73 74 61 74 75 73 00];
        i2c2_iknowwhatimdoing = [00 00 00 12 73 74 61 74 75 73 00];
        i2c0_baudrate = [00 00 00 22 63 6c 6f 63 6b 2d 66 72 65 71 75 65 6e 63 79 3a 30 00];
        i2c1_baudrate = [00 00 00 23 63 6c 6f 63 6b 2d 66 72 65 71 75 65 6e 63 79 3a 30 00];
        i2c2_baudrate = [00 00 00 12 63 6c 6f 63 6b 2d 66 72 65 71 75 65 6e 63 79 3a 30 00];
        audio = [00 00 00 24 73 74 61 74 75 73 00];
        watchdog = [00 00 00 25 73 74 61 74 75 73 00];
        random = [00 00 00 26 73 74 61 74 75 73 00];
        sd_overclock = <0x00000027 0x6272636d 0x2c6f7665 0x72636c6f 0x636b2d35 0x303a3000>;
        sd_force_pio = <0x00000027 0x6272636d 0x2c666f72 0x63652d70 0x696f3f00>;
        sd_pio_limit = [00 00 00 27 62 72 63 6d 2c 70 69 6f 2d 6c 69 6d 69 74 3a 30 00];
        sd_debug = [00 00 00 27 62 72 63 6d 2c 64 65 62 75 67 00];
        sdio_overclock = <0x00000028 0x6272636d 0x2c6f7665 0x72636c6f 0x636b2d35 0x303a3000 0x00000029 0x6272636d 0x2c6f7665 0x72636c6f 0x636b2d35 0x303a3000>;
        axiperf = [00 00 00 2a 73 74 61 74 75 73 00];
        act_led_gpio = <0x0000002b 0x6770696f 0x733a3400>;
        act_led_activelow = <0x0000002b 0x6770696f 0x733a3800>;
        act_led_trigger = [00 00 00 2b 6c 69 6e 75 78 2c 64 65 66 61 75 6c 74 2d 74 72 69 67 67 65 72 00];
    };
    memory@0 {
        device_type = "memory";
        reg = <0x00000000 0x3b400000>;
    };
    leds {
        compatible = "gpio-leds";
        phandle = <0x00000075>;
        a3_red {
            linux,default-trigger = "a3_red";
            gpios = <0x0000000d 0x00000003 0x00000000>;
        };
        a3_green {
            linux,default-trigger = "a3_green";
            gpios = <0x0000000d 0x00000002 0x00000000>;
        };
        a2_red {
            linux,default-trigger = "a2_red";
            gpios = <0x0000000d 0x00000021 0x00000000>;
        };
        a2_green {
            linux,default-trigger = "a2_green";
            gpios = <0x0000000d 0x00000020 0x00000000>;
        };
        a1_red {
            linux,default-trigger = "a1_red";
            gpios = <0x0000000d 0x00000006 0x00000000>;
        };
        a1_green {
            linux,default-trigger = "a1_green";
            gpios = <0x0000000d 0x0000001e 0x00000000>;
        };
        power_red {
            linux,default-trigger = "power_red";
            gpios = <0x0000000d 0x00000010 0x00000000>;
        };
        act {
            status = "disabled";
            label = "led0";
            default-state = "keep";
            linux,default-trigger = "mmc0";
            gpios = <0x0000002c 0x00000000 0x00000000>;
            phandle = <0x0000002b>;
        };
    };
    fixedregulator_3v3 {
        compatible = "regulator-fixed";
        regulator-name = "3v3";
        regulator-min-microvolt = <0x00325aa0>;
        regulator-max-microvolt = <0x00325aa0>;
        regulator-always-on;
        phandle = <0x00000076>;
    };
    fixedregulator_5v0 {
        compatible = "regulator-fixed";
        regulator-name = "5v0";
        regulator-min-microvolt = <0x004c4b40>;
        regulator-max-microvolt = <0x004c4b40>;
        regulator-always-on;
        phandle = <0x00000077>;
    };
    __symbols__ {
        i2c_arm = "/soc/i2c@7e804000";
        i2c = "/soc/i2c@7e804000";
        i2c_vc = "/soc/i2c@7e205000";
        cpu_thermal = "/thermal-zones/cpu-thermal";
        soc = "/soc";
        txp = "/soc/txp@7e004000";
        dma = "/soc/dma@7e007000";
        watchdog = "/soc/watchdog@7e100000";
        clocks = "/soc/cprman@7e101000";
        random = "/soc/rng@7e104000";
        rng = "/soc/rng@7e104000";
        mailbox = "/soc/mailbox@7e00b880";
        gpio = "/soc/gpio@7e200000";
        dpi_gpio0 = "/soc/gpio@7e200000/dpi_gpio0";
        emmc_gpio22 = "/soc/gpio@7e200000/emmc_gpio22";
        emmc_gpio34 = "/soc/gpio@7e200000/emmc_gpio34";
        emmc_gpio48 = "/soc/gpio@7e200000/emmc_gpio48";
        gpclk0_gpio4 = "/soc/gpio@7e200000/gpclk0_gpio4";
        gpclk1_gpio5 = "/soc/gpio@7e200000/gpclk1_gpio5";
        gpclk1_gpio42 = "/soc/gpio@7e200000/gpclk1_gpio42";
        gpclk1_gpio44 = "/soc/gpio@7e200000/gpclk1_gpio44";
        gpclk2_gpio6 = "/soc/gpio@7e200000/gpclk2_gpio6";
        gpclk2_gpio43 = "/soc/gpio@7e200000/gpclk2_gpio43";
        i2c0_gpio0 = "/soc/gpio@7e200000/i2c0_gpio0";
        i2c0_gpio28 = "/soc/gpio@7e200000/i2c0_gpio28";
        i2c0_gpio44 = "/soc/gpio@7e200000/i2c0_gpio44";
        i2c1_gpio2 = "/soc/gpio@7e200000/i2c1_gpio2";
        i2c1_gpio44 = "/soc/gpio@7e200000/i2c1_gpio44";
        jtag_gpio22 = "/soc/gpio@7e200000/jtag_gpio22";
        pcm_gpio18 = "/soc/gpio@7e200000/pcm_gpio18";
        pcm_gpio28 = "/soc/gpio@7e200000/pcm_gpio28";
        pwm0_gpio12 = "/soc/gpio@7e200000/pwm0_gpio12";
        pwm0_gpio18 = "/soc/gpio@7e200000/pwm0_gpio18";
        pwm0_gpio40 = "/soc/gpio@7e200000/pwm0_gpio40";
        pwm1_gpio13 = "/soc/gpio@7e200000/pwm1_gpio13";
        pwm1_gpio19 = "/soc/gpio@7e200000/pwm1_gpio19";
        pwm1_gpio41 = "/soc/gpio@7e200000/pwm1_gpio41";
        pwm1_gpio45 = "/soc/gpio@7e200000/pwm1_gpio45";
        sdhost_pins = "/soc/gpio@7e200000/sdhost_gpio48";
        sdhost_gpio48 = "/soc/gpio@7e200000/sdhost_gpio48";
        spi0_gpio7 = "/soc/gpio@7e200000/spi0_gpio7";
        spi0_gpio35 = "/soc/gpio@7e200000/spi0_gpio35";
        spi1_gpio16 = "/soc/gpio@7e200000/spi1_gpio16";
        spi2_gpio40 = "/soc/gpio@7e200000/spi2_gpio40";
        uart0_gpio14 = "/soc/gpio@7e200000/uart0_gpio14";
        uart0_ctsrts_gpio16 = "/soc/gpio@7e200000/uart0_ctsrts_gpio16";
        uart0_ctsrts_gpio30 = "/soc/gpio@7e200000/uart0_ctsrts_gpio30";
        uart0_gpio32 = "/soc/gpio@7e200000/uart0_gpio32";
        uart0_gpio36 = "/soc/gpio@7e200000/uart0_gpio36";
        uart0_ctsrts_gpio38 = "/soc/gpio@7e200000/uart0_ctsrts_gpio38";
        uart1_gpio14 = "/soc/gpio@7e200000/uart1_gpio14";
        uart1_ctsrts_gpio16 = "/soc/gpio@7e200000/uart1_ctsrts_gpio16";
        uart1_gpio32 = "/soc/gpio@7e200000/uart1_gpio32";
        uart1_ctsrts_gpio30 = "/soc/gpio@7e200000/uart1_ctsrts_gpio30";
        uart1_gpio40 = "/soc/gpio@7e200000/uart1_gpio40";
        uart1_ctsrts_gpio42 = "/soc/gpio@7e200000/uart1_ctsrts_gpio42";
        i2c_slave_gpio18 = "/soc/gpio@7e200000/i2c_slave_gpio18";
        jtag_gpio4 = "/soc/gpio@7e200000/jtag_gpio4";
        dpi_18bit_gpio0 = "/soc/gpio@7e200000/dpi_18bit_gpio0";
        gpioout = "/soc/gpio@7e200000/gpioout";
        alt0 = "/soc/gpio@7e200000/alt0";
        spi0_pins = "/soc/gpio@7e200000/spi0_pins";
        spi0_cs_pins = "/soc/gpio@7e200000/spi0_cs_pins";
        i2c0_pins = "/soc/gpio@7e200000/i2c0";
        i2c1_pins = "/soc/gpio@7e200000/i2c1";
        i2s_pins = "/soc/gpio@7e200000/i2s";
        audio_pins = "/soc/gpio@7e200000/audio_pins";
        uart0 = "/soc/serial@7e201000";
        sdhost = "/soc/mmc@7e202000";
        i2s = "/soc/i2s@7e203000";
        spi0 = "/soc/spi@7e204000";
        spi = "/soc/spi@7e204000";
        spidev0 = "/soc/spi@7e204000/spidev@0";
        spidev1 = "/soc/spi@7e204000/spidev@1";
        i2c0 = "/soc/i2c@7e205000";
        pixelvalve0 = "/soc/pixelvalve@7e206000";
        pixelvalve1 = "/soc/pixelvalve@7e207000";
        dpi = "/soc/dpi@7e208000";
        dsi0 = "/soc/dsi@7e209000";
        aux = "/soc/aux@7e215000";
        uart1 = "/soc/serial@7e215040";
        spi1 = "/soc/spi@7e215080";
        spi2 = "/soc/spi@7e2150c0";
        pwm = "/soc/pwm@7e20c000";
        hvs = "/soc/hvs@7e400000";
        dsi1 = "/soc/dsi@7e700000";
        csi0 = "/soc/csi@7e800000";
        csi1 = "/soc/csi@7e801000";
        i2c1 = "/soc/i2c@7e804000";
        i2c2 = "/soc/i2c@7e805000";
        vec = "/soc/vec@7e806000";
        pixelvalve2 = "/soc/pixelvalve@7e807000";
        hdmi = "/soc/hdmi@7e902000";
        usb = "/soc/usb@7e980000";
        vc4 = "/soc/gpu";
        intc = "/soc/interrupt-controller@7e00b200";
        thermal = "/soc/thermal@7e212000";
        v3d = "/soc/v3d@7ec00000";
        local_intc = "/soc/local_intc@40000000";
        sdhci = "/soc/mmc@7e300000";
        mmc = "/soc/mmc@7e300000";
        mmcnr = "/soc/mmcnr@7e300000";
        firmwarekms = "/soc/firmwarekms@7e600000";
        smi = "/soc/smi@7e600000";
        axiperf = "/soc/axiperf";
        firmware = "/soc/firmware";
        expgpio = "/soc/firmware/expgpio";
        power = "/soc/power";
        vchiq = "/soc/mailbox@7e00b840";
        fb = "/soc/fb";
        vcsm = "/soc/vcsm";
        audio = "/soc/audio";
        sound = "/soc/sound";
        virtgpio = "/soc/virtgpio";
        clk_osc = "/clocks/clock@3";
        clk_usb = "/clocks/clock@4";
        usbphy = "/phy";
        cpus = "/cpus";
        cpu0 = "/cpus/cpu@0";
        cpu1 = "/cpus/cpu@1";
        cpu2 = "/cpus/cpu@2";
        cpu3 = "/cpus/cpu@3";
        leds = "/leds";
        act_led = "/leds/act";
        vdd_3v3_reg = "/fixedregulator_3v3";
        vdd_5v0_reg = "/fixedregulator_5v0";
    };
};
Eine andere Möglichkeit wäre, dass das spidev Modul nicht geladen ist. Taucht das /dev/spidev0.0 auf, wenn du "modprobe spidev" machst? Eigentlich war das unter 4.9 auch schon ein Modul, insofern hat sich da nichts geändert.
Ja nach

Code: Select all

sudo modprobe spidev 
taucht /dev/spidev0.0 auf. Ich bin mir aber sehr sicher, daß ich das bei alten Kernel nicht in die /etc/modules eintragen musste, sondern "das war einfach da". Dachte daß da auch die Info aus dem Devicetree bzw den Overlays kommt, daß das Modul gebraucht wird und/oder udev da im Hintergrund zaubert.

Wie ist da jetzt der "richtige" Weg das Modul dauerhaft zu laden, so daß es auch weitere Kernel Updates "übersteht". Muss gestehen bin mit dem ganzen Kernel Kram etwas eigerostet, als ich das letzte Modul geschrieben hab vor vielen Jahren hat man Devicefiles noch mit mknod zu Fuß angelegt und udev und devictree waren so fixe Ideen.... Früher hätte ich das in die "/etc/modules" eingetragen, aber ist das noch "hipp" heutzutage? ifconfig ist ja auch am aussterben ;-)

Markus
User avatar
lukas
Expert
Posts: 186
Joined: 13 Feb 2017, 10:29
Answers: 0

Re: SPI Device nicht mehr verfügbar in Kernel 4.19

Post by lukas »

RR4711 wrote: 11 Jul 2020, 21:33 Ja nach

Code: Select all

sudo modprobe spidev 
taucht /dev/spidev0.0 auf. Ich bin mir aber sehr sicher, daß ich das bei alten Kernel nicht in die /etc/modules eintragen musste, sondern "das war einfach da". Dachte daß da auch die Info aus dem Devicetree bzw den Overlays kommt, daß das Modul gebraucht wird und/oder udev da im Hintergrund zaubert.
Nach etwas Herumstöbern in der git Historie stellt sich heraus, dass Phil Elwell von der Raspberry Pi Foundation den compatible String im spidev Treiber gelöscht hat, siehe Commit 2eb5f2873837. Keine Begründung, einfach so. Im Upstream Kernel gibt's den compatible String allerdings auch nicht, siehe Issue 1054 und 3361.
RR4711 wrote: 11 Jul 2020, 21:33 Wie ist da jetzt der "richtige" Weg das Modul dauerhaft zu laden, so daß es auch weitere Kernel Updates "übersteht". Muss gestehen bin mit dem ganzen Kernel Kram etwas eigerostet, als ich das letzte Modul geschrieben hab vor vielen Jahren hat man Devicefiles noch mit mknod zu Fuß angelegt und udev und devictree waren so fixe Ideen.... Früher hätte ich das in die "/etc/modules" eingetragen, aber ist das noch "hipp" heutzutage?
Ja, das ist der richtige Weg.

Der Kernel meldet per udev, dass es ein Device mit modalias "spidev" gibt, aber weil der compatible String im spidev Treiber gelöscht wurde, lädt systemd-udevd nicht automatisch das spidev Modul. Lädt man das Modul händisch, bindet sich der spidev Treiber trotzdem an das Device, weil der Treibername identisch mit dem modalias ist.

Ich könnte in imagebakery ergänzen, dass der Eintrag in /etc/modules beim Image bauen hinzugefügt wird. Nützt halt nichts, wenn man ein vorhandenes Image mit dem 4.19 Kernel aktualisiert. Die Alternative wäre, es per postinst-Script vom raspberrypi-kernel Paket ergänzen zu lassen. Aber dann kann ich auch gleich den compatible String wieder hinzufügen. Hm...
User avatar
RR4711
Posts: 228
Joined: 22 Feb 2018, 13:28
Answers: 0

Re: SPI Device nicht mehr verfügbar in Kernel 4.19

Post by RR4711 »

lukas wrote: 12 Jul 2020, 03:04 Der Kernel meldet per udev, dass es ein Device mit modalias "spidev" gibt, aber weil der compatible String im spidev Treiber gelöscht wurde, lädt systemd-udevd nicht automatisch das spidev Modul. Lädt man das Modul händisch, bindet sich der spidev Treiber trotzdem an das Device, weil der Treibername identisch mit dem modalias ist.
Geht evtl. eine udev-rule? Wenn ja wie müsste das aussehen? Ich hab eh eine custom Rulefile im Einsatz um unsere USB TTYs der 3 Peltier Controller mit "gleichbleibenden" Namen zu versehen, unabhängig an welchem Port sie gestöpselt werden. Könnte da auch noch Ergänzungen machen.
Ich könnte in imagebakery ergänzen, dass der Eintrag in /etc/modules beim Image bauen hinzugefügt wird. Nützt halt nichts, wenn man ein vorhandenes Image mit dem 4.19 Kernel aktualisiert. Die Alternative wäre, es per postinst-Script vom raspberrypi-kernel Paket ergänzen zu lassen. Aber dann kann ich auch gleich den compatible String wieder hinzufügen. Hm...
Kannst es ja im Auge behalten wenn der Kernel nochmal "angefasst" werden muss kann man das ja evtl. beim nächsten Release im Hinterkopf behalten. (Buster?)
Ich kann jetzt erstmal damit leben.

Markus
User avatar
lukas
Expert
Posts: 186
Joined: 13 Feb 2017, 10:29
Answers: 0

Re: SPI Device nicht mehr verfügbar in Kernel 4.19

Post by lukas »

RR4711 wrote: 12 Jul 2020, 12:40 Geht evtl. eine udev-rule? Wenn ja wie müsste das aussehen? Ich hab eh eine custom Rulefile im Einsatz um unsere USB TTYs der 3 Peltier Controller mit "gleichbleibenden" Namen zu versehen, unabhängig an welchem Port sie gestöpselt werden. Könnte da auch noch Ergänzungen machen.
Müsste auch gehen, eventuell tut sowas hier den Trick:
ENV{OF_COMPATIBLE_0}=="spidev", RUN{builtin}+="kmod load spidev"

Oder auch:
ENV{MODALIAS}=="of:NspidevT<NULL>Cspidev", RUN{builtin}+="kmod load spidev"

Aber die Lösung über /etc/modules dürfte die simpelste sein.
RR4711 wrote: 12 Jul 2020, 12:40 Kannst es ja im Auge behalten wenn der Kernel nochmal "angefasst" werden muss kann man das ja evtl. beim nächsten Release im Hinterkopf behalten.
Hab den Commit auf den revpi-4.19 Branch obendrauf gepackt, damit beim nächsten Kernel Release das alte Verhalten wiederhergestellt ist.
Post Reply