Une carte PCI Express sur un Raspberry Pi

Le Raspberry Pi 5 dispose d’une interface PCIe 2.0 ce qui permet théoriquement le branchement de cartes PCI Express. Retour d’expérience avec l’ajout du hat 52Pi et d’une carte tuner AudioScience.

Matériel à disposition

Le montage

Le kit Raspberry Pi 5 + hat 52Pi avant montage

Le hat monté sur le Raspberry Pi 5 à l’aide des 4 entretoises et avec la nappe en J sur la droite pour l’interconnexion entre les 2 modules

La carte PCIe AudioScience 8821 montée sur le kit

La carte étant beaucoup plus lourde que l’ensemble, elle a tendance a mécaniquement basculer, je me suis donc fourni en nappe d’extension PCIe afin d’améliorer ce problème.

Utilisation d’une nappe d’extension PCI Express

C’est un peu mieux. Appréciez l’isolation professionnelle entre le Pi et la carte. Ça mériterai la modélisation d’un boitier custom.

Voilà pour l’installation hardware, passons à la phase logicielle.

La partie logicielle

On commence par installer la distribution Raspberry Pi OS (basée sur Debian 12 Bookworm) sur la carte micro SD. Je ne détaille pas mais l’article de Iooner résume très bien la procédure. Rendez-vous au prompt.

On branche le tout (alim, carte micro SD) on regarde le boot 🤞. La machine démarre et on a bien le prompt. Checkons avec lspci si quelque chose est détecté :

10000:00:00.0 PCI bridge: Broadcom Inc. and subsidiaries Device 2712 (rev 21)
20000:01:00.0 PCI bridge: Texas Instruments XIO2000(A)/XIO2200A PCI Express-to-PCI Bridge (rev 03)
30000:02:00.0 Multimedia audio controller: Texas Instruments TMS320C6414 TMS320C6415 TMS320C6416
40001:00:00.0 PCI bridge: Broadcom Inc. and subsidiaries Device 2712 (rev 21)
50001:01:00.0 Ethernet controller: Device 1de4:0001

1er bon point: les lignes 2 et 3 indiquent bien la présence de la carte.

Maintenant il faut installer les drivers de la carte AudioScience. Ça n’a rien de spécifique au sujet de l’article donc je ne détaille pas. Sachez que le module noyau à compiler doit être fonctionnel et s’appelle snd_asihpi.

Le driver s’installe et il semble reconnu.

1$ lsmod|grep snd_asihpi
2snd_asihpi            180224  0
3snd_hwdep              49152  1 snd_asihpi
4snd_pcm               163840  5 snd_asihpi,snd_soc_hdmi_codec,snd_compress,snd_soc_core,snd_pcm_dmaengine
5snd                   147456  7 snd_hwdep,snd_asihpi,snd_soc_hdmi_codec,snd_timer,snd_compress,snd_soc_core,snd_pcm

oui mais la commande dmesg remonte les lignes suivantes (j’ai ajouté des commentaires de debug) :

1[  627.660250] snd_asihpi: loading out-of-tree module taints kernel.
2[  627.661230] ASIHPI driver 4.20.43
3[  627.661343] snd_asihpi 0000:02:00.0: Probe 104c:a106,175c:8800,0000 # asi_adapter_probe() dans alsa-drv/hpioctl.c
4[  627.661360] pci 0000:01:00.0: enabling device (0000 -> 0002)
5[  627.661371] snd_asihpi 0000:02:00.0: enabling device (0000 -> 0002)
6[  631.765584] hpios.c:66 failed to allocate 17964 bytes locked memory
7[  631.765595] snd_asihpi 0000:02:00.0: adapter_probe failed # asi_adapter_probe() dans alsa-drv/hpioctl.c

Et aucun fichier dans /dev/snd alors que la carte devrait être reconnue par alsa et donc il devrait y avoir quelques fichiers correspondants au périphérique.

Le constructeurs du 52Pi hat indique de modifier le fichier /boot/firmware/config.txt en y ajoutant la ligne suivante :

1dtparam=pciex1

Après un reboot rien n’y change

On peut aussi limiter la vitesse du bus PCIe avec la ligne suivante :

1dtparam=pciex1_gen=1

On reboot mais rien ne change, le dmesg indique toujours un problème adapter_probe failed.

En observant plus précisemment la ligne hpios.c:66 failed to allocate 17964 bytes locked memory, on constate qu’elle appartient à une fonction hpios_locked_mem_alloc() dont la description est Allocate an area of locked memory for bus master DMA operations. Voici un extrait du code source. Quelques recherches plus tard, j’arrive sur ce thread du forum Raspberry qui indique d’ajouter la ligne suivante dans le config.txt :

1dtoverlay=pcie-32bit-dma

J’ajoute la ligne, je reboote, et ...

1$ dmesg | grp snd_asihpi
2[    9.757202] snd_asihpi 0000:02:00.0: Adapter at index 0 is not in low latency mode
3[    9.757208] snd_asihpi 0000:02:00.0: not using interrupts
4[    9.758187] snd_asihpi 0000:02:00.0: Probe succeeded for ASI8821 HPI index 0
5[    9.765161] snd_asihpi 0000:02:00.0: 59 mixer controls found

Bingo, le driver se charge bien désormais !

Les applicatifs de la carte sont fonctionnels.

Conclusion

On peut donc brancher une "vraie" carte PCIe sur le Raspberry Pi 5. Attention à la limitation à 5W de la puissance que peut fournir le Pi. Si la carte demande plus, il faudra utiliser une alimentation externe (et passer le switch Pcie +12 select du hat sur ext).

L’architecture étant en arm64, j’ai du parfois adapter des amd64 qui étaient en dur lors de la compilation de certains modules.

Le Geerling Guy maintient une liste des cartes PCIe compatibles (ou pas) avec le Raspberry, il faudrait que j’y ajoute cette carte AudioScience testée, ainsi que peut-être une autre carte son Digigram PCX882e que je dois tester prochainement.

Enfin, merci à Yorzian et son discord pour le support technique lors de cette expérimentation 👌.

comments powered by Disqus