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
- 1 Kit Raspberry Pi 5 + son alimentation officielle 27W
- 1 hat de 52Pi pour connecter une carte PCIe x1
- 1 carte PCIe AudioScience ASI8821 (avec 8 tuners FM/DAB+)
- 1 carte mémoire micro SD
Le montage
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.
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 👌.