[CM4]: Activer la fonction alternative 4 des GPIO#18 à #21 pour SPI1.0

Bonjour,

J’ai développé une carte avec une CM4. Sur cette carte j’utilise deux bus SPI;

  • spi0 (cs0) qui est géré par un driver personnalisé (la gestion par le spidev de ce bus SPI est désactivée par un dtbo ajouté aux overlays).
  • spi1 (cs0) qui est géré par spidev normalement à travers le device /dev/spidev1.0 (open, read, write & close).

Le /boot/config.txt est le suivant:

    # For more options and information see
    # https://www.raspberrypi.com/documentation/computers/config_txt.html
    # Some settings may impact device functionality. See link above for details

    # Common Options
    # Additional overlays and parameters are documented /boot/overlays/README
    # =======================================================================
    # Uncomment some or all of these to enable the optional hardware interfaces
    #dtparam=i2c_vc=on,spi=on,audio=off
    dtparam=i2c=on,spi=on,audio=off

    # Disable onboard Bluetooth on Pi 3B, 3B+, 3A+, 4B and Zero W, restoring UART0/ttyAMA0 over GPIOs 14 & 15
    dtoverlay=disable-bt

    # Enabled SPI0 for the STM32 with one chip select on GPIO8
    dtoverlay=disable-spidev-spi0
    dtoverlay=spi0-1cs,cs0_pin=8

    # Enabled SPI1 for the IM52 with one chip select on GPIO18(CS0)
    dtoverlay=spi1-1cs,cs0_pin=18

    # Uncomment this to enable rtc PCF85063
    dtoverlay=i2c-rtc,pcf85063a,i2c_csi_dsi,addr=0x51

    # Set STM(gpio2) = 0, STMBOOT(gpio3) = 0,  STMRST_n(gpio24) = 1
    gpio=2,3=op,dh
    gpio=24=op,dl

    # Uncomment this to enable I/O STM32F103T6
    enable_uart=1
    #dtoverlay=uart1

    # Uncomment this to enable USART3 for the SMI Protocols
    dtoverlay=uart3,ctsrts

    # Boot Options
    # ============
    # Run in 64-bit mode
    arm_64bit=1

    # Conditional Filters
    # ===================
    [pi4]
    # Run as fast as firmware / board allows
    arm_boost=1

    # Disable compensation for displays with overscan
    disable_overscan=1

Device tree qui désactive la gestion du bus SPI0 par spidev (disable-spidev-spi0.dts)

    /dts-v1/;
    /plugin/;

    / {
        compatible = "brcm,bcm2835";

        fragment@0 {
            target = <&spidev0>;

            __overlay__ {
                status = "disabled";
            };
        };
    };

Le problème (enfin):
Lorsque je met sous tension la carte et que le CM4 a complètement démarré;
Les GPIOs #8 à #11 sont attribuées correctement au bus SPI0:

    GPIO 8: level=1 fsel=1 func=OUTPUT pull=UP
    GPIO 9: level=1 fsel=4 alt=0 func=SPI0_MISO pull=DOWN
    GPIO 10: level=1 fsel=4 alt=0 func=SPI0_MOSI pull=DOWN
    GPIO 11: level=0 fsel=4 alt=0 func=SPI0_SCLK pull=DOWN

Mais les GPIOs #18 à #21 attribuées au bus SPI1.0 ne le sont qu’à moitiée !!:

    GPIO 18: level=1 fsel=1 func=OUTPUT pull=DOWN
    GPIO 19: level=0 fsel=3 alt=4 func=SPI1_MISO pull=DOWN
    GPIO 20: level=0 fsel=3 alt=4 func=SPI1_MOSI pull=DOWN
    GPIO 21: level=1 fsel=1 func=OUTPUT pull=DOWN **<-------------- devrait être SPI1_SCLK !!**
  1. Le device spi1 est correctement créer (/dev/spidev1.0).
  2. Les messages vclog ne montrent pas d’erreur de chargement.
  3. J’ai désactivé le bus SPI0 pour vérifier s’il n’y avait pas une inter-action entre les deux bus SPI.
  4. Si je « set » la GPIO #21 à la fonction alternative 4 manuellement, la communication avec le device sur le bus SPI1 foncionne correctement. Mais dès que je redémarre la carte, je perd de nouveau la fonctionnalité de SPI1 sur la GPIO#21.
    raspi-gpio set 21 a4

Si vous avez de nouvelles pistes à explorer, je vous en remercie d’avance car je sèche complètement sur le sujet.

Linux uc52 5.15.92-rt61-v8+ #1 SMP PREEMPT_RT Fri Apr 28 16:26:24 CEST 2023 aarch64 GNU/Linux

Lijh

Problème résolut.

Cela ne venait pas d’un problème de config, mais de mon driver sur SPI0 qui malencontreusement modifiait les GPIO normalement attribués à la fonction SPI1.

Pour éviter ce problème entre drivers et programmes, j’ai créé un répertoire dans /etc/ qui contient une liste de fichiers définissant leur numéro de GPIO.

board_gpio/
├── bno_int
├── bno_rst_n
├── eth_rst_n
├── README
├── rts_de
├── spi0_irq_n
├── spi1_cs0_n
├── spi1_cs1_n
├── spi1_sync_n
├── stm
├── stmboot
├── stm_irq_n
└── stm_rst_n

Merci à ceux qui ont pris la peine de me lire :smiley:

Lijh

Bonjour,

Félicitations, en tout cas.

Bonne bidouilles.
A+