Tout d’abord, je vous souhaite à tous une excellente année 2018 !
Dans l’article Projet spi-tools, je présentais un petit outil permettant de configurer les paramètres d’une liaison SPI depuis la ligne de commande du shell, en s’appuyant sur l’interface spidev. Depuis quelques temps, l’une des options de cet outil ne fonctionnait plus correctement. En effet, plusieurs drivers SPI du kernel réinitialisent la vitesse de communication lorsque l’on referme le descripteur de fichier /dev/spidevX.Y
.
Nous pouvons bien modifier la vitesse, mais à peine notre commande spi-config
s’achève-t-elle que le driver reconfigure la vitesse par défaut. En voici un exemple sur Raspberry Pi 3.
$ spi-config -d /dev/spidev0.0 -q /dev/spidev0.0: mode=1, lsb=0, bits=8, speed=500000, spiready=0 $ spi-config -d /dev/spidev0.0 -s 200000 $ spi-config -d /dev/spidev0.0 -q /dev/spidev0.0: mode=1, lsb=0, bits=8, speed=500000, spiready=0 $
La vitesse configurée à 200000 bits/seconde par notre commande est revenue immédiatement à 500000 bits/seconde.
Une solution est d’utiliser une nouvelle option : -w
ou --wait
. Ainsi la commande spi-config
reste bloquée avec le descripteur ouvert, jusqu’à réception d’un signal qui la tue.
Il suffit de la passer en arrière-plan (en la faisant suivre d’un &
) et éventuellement de récupérer son PID, disponible dans la variable spéciale $!
du shell, pour pouvoir la tuer une fois la communication terminée.
$ spi-config -d /dev/spidev0.0 -q /dev/spidev0.0: mode=1, lsb=0, bits=8, speed=500000, spiready=0 $ spi-config -d /dev/spidev0.0 -s 200000 -w & [1] 7324 $ PID=$! $
Le port reste configuré avec la vitesse désirée. La preuve :
$ spi-config -d /dev/spidev0.0 -q /dev/spidev0.0: mode=1, lsb=0, bits=8, speed=200000, spiready=0 $
Quand nous n’avons plus besoin du port SPI on peut le libérer ainsi :
$ kill $PID [1]+ Terminated spi-config -d /dev/spidev0.0 -s 200000 -w $
La vitesse reprend alors sa valeur par défaut :
$ spi-config -d /dev/spidev0.0 -q /dev/spidev0.0: mode=1, lsb=0, bits=8, speed=500000, spiready=0 $
Le projet spi-tools qui regroupe spi-config
et spi-pipe
est accessible sur mon dépôt Github.
Bonjour M. Blaess,
Merci pour vos bons vœux et permettez moi de vous adresser les miens en retour avec, de plus, mes remerciements pour ce blog bourré d’articles passionnants 😉
Une question de néophyte, certainement candide, me vient à l’esprit.
Pourquoi ne pas utiliser l’interface « normale » et standard de Linux en créant un fichier *.lock dans le répertoire /var/lock et comportant le PID ?
Sauf erreur de ma part, la variable PID n’est pas exportée et ne sera donc connue que du shell en cours.
Si, pour une raison quelconque, je dois ouvrir un autre shell, il me faudra faire un ps -axf pour retrouver le PID de spi-config.
Cordialement
Sylvain
Bonsoir,
C’est une bonne idée, mais il peut y avoir plusieurs bus SPI, donc cela nécessite d’intégrer dans le nom du fichier de lock l’identité (ex. 0.0) du périphérique spidev concerné. C’est un peu plus compliqué.