Mes passions, le boulots, mes coups de gueule...




Problème avec WiringPi lors de la mise-à-jour du kernel en version 4.9.x

Categorie : Domotique, Geek, Informatique, Linux, Raspberry Pi · par 15 Avr 2017

Introduction

Lors de la mise à jour de mon Raspberry Pi avec la commande rpi-update, toutes les interactions avec le GPIO utilisant WiringPi on cessé de fonctionner.

Clairement, il ne m’était plus possible de contrôler ma chaudière ni mes prises électriques.

Symptômes

Lors de la mise à jours, je suis passé du kernel 4.4.50 au 4.9.22 .

À partir de là, toutes les commandes utilisant WiringPi retournaient une erreur comme ceci :

$ /usr/local/bin/gpio -g write 17 0
Unable to determine hardware version. I see: Hardware    : BCM2835
,
 - expecting BCM2708 or BCM2709.
If this is a genuine Raspberry Pi then please report this
to projects@drogon.net. If this is not a Raspberry Pi then you
are on your own as wiringPi is designed to support the
Raspberry Pi ONLY.

Il y a tout un tas d’exemples sur les forums qui remontent les mêmes symptômes comme celui-ci : https://github.com/firsttris/mfrc522-rpi/issues/1

Ceci peut être du à 2 choses :

  • WiringPi, distribué avec apt, est resté calé en version 2.32
  • Vous avez installé manuellement WiringPi et ne l’avez pas mis-à-jour

Le site de l’éditeur propose actuellement la version 2.36 qui est spécifiquement compatible avec le kernel à partir de sa version 4.8.x .

Vérifier la version de WiringPi

On peut vérifier la version de WiringPi avec cette commande :

$ gpio -v
gpio version: 2.32
Copyright (c) 2012-2015 Gordon Henderson
This is free software with ABSOLUTELY NO WARRANTY.
For details type: gpio -warranty

Raspberry Pi Details:
 Type: Pi 3, Revision: 02, Memory: 1024MB, Maker: Sony 
 * Device tree is enabled.
 * This Raspberry Pi supports user-level GPIO access.
 -> See the man-page for more details
 -> ie. export WIRINGPI_GPIOMEM=1

Vérifier la version du kernel

On peut vérifier la version du kernel avec la commande : uname -a

Ce qui devrait nous donner quelque chose comme ceci :

$ uname -a
Linux raspberrypi 4.9.22-v7+ #987 SMP Fri Apr 14 23:23:05 BST 2017 armv7l GNU/Linux

Ici, c’est bien la version 4.9.x du kernel qui est incompatible avec WiringPi 2.32 .

Résolution

Deux solutions s’offrent à nous :

  1. Revenir à un kernel précédent (4.4.x) compatible avec WiringPi 2.32
  2. Mettre à jour WiringPi à la main vers la version 2.44 compatible avec le kernel 4.9.x

Solution 1 : Revenir à un kernel précédent

Une première solution consiste à downgrader le kernel dans la dernière version avant 4.9.x, c-à-d la version 4.4.50 .

On se rend sur ce site, on sélectionne la version du kernel désirée (ici : 4.4.50) et on clique sur le bouton avec les chiffres au bout de la ligne.

Sur la page qui s’ouvre, on sélectionne le numéro du commit :

Puis, on utilise cette commande en y ajoutant le commit trouvé à l’étape précédente :

$ sudo rpi-update 52241088c1da59a359110d39c1875cda56496764
 *** Raspberry Pi firmware updater by Hexxeh, enhanced by AndrewS and Dom
 *** Performing self-update
 *** Relaunching after update
 *** Raspberry Pi firmware updater by Hexxeh, enhanced by AndrewS and Dom
This update bumps to rpi-4.4.y linux tree
Be aware there could be compatibility issues with some drivers
Discussion here:
https://www.raspberrypi.org/forums/viewtopic.php?f=29&t=144087
##############################################################
 *** Downloading specific firmware revision (this will take a few minutes)
 % Total % Received % Xferd Average Speed Time Time Time Current
 Dload Upload Total Spent Left Speed
100 168 0 168 0 0 366 0 --:--:-- --:--:-- --:--:-- 367
100 52.3M 0 52.3M 0 0 2192k 0 --:--:-- 0:00:24 --:--:-- 2346k
 *** Updating firmware
 *** Updating kernel modules
 *** depmod 4.4.50-v7+
 *** depmod 4.4.50+
 *** Updating VideoCore libraries
 *** Using HardFP libraries
 *** Updating SDK
 *** Running ldconfig
 *** Storing current firmware revision
 *** Deleting downloaded files
 *** Syncing changes to disk
 *** If no errors appeared, your firmware was successfully updated to 52241088c1da59a359110d39c1875cda56496764
 *** A reboot is needed to activate the new firmware

Pour approfondir cette manœuvre je vous renvois vers l’excellente page de Framboise314 :
http://www.framboise314.fr/installer-une-version-anterieure-du-noyau-sur-raspberry-pi/

Une fois que c’est terminé, on redémarre le RPi et tout devrait rentrer dans l’ordre.

Solution 2 : Mise à jour de WiringPi à la main

Depuis un paquetage standard

Si vous ne voulez pas attendre la mise à jour du dépôt apt ou si votre version de WiringPi a été installée à la main et pas encore mise-à-jour, la seule solution est d’effectuer les opérations ci-dessous.

On va suivre les instructions de cette page en anglais que je vais vous résumer ci-dessous :

On commence par vérifier la version de WiringPi :

$ gpio -v

Si vous êtes sur cette page, c’est que vous rencontrez un bug et que WiringPi est déjà installé. La prochaine étape consiste à déterminer si WiringPi est installé via un paquetage standard ou depuis la source (apt). Si vous l’avez installé à partir de la source, vous savez ce que vous faites – continuer – mais s’il est installé en tant que paquet, vous devez d’abord supprimer le paquet. Pour ce faire, on va utiliser ces commandes :

$ sudo apt-get purge wiringpi
$ hash -r

Si vous n’avez pas installé GIT, vous pouvez l’installer avec :

$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install git-core

Pour obtenir WiringPi en utilisant GIT :

$ cd
$ git clone git://git.drogon.net/wiringPi

Si vous avez déjà utilisé l’opération de clone une première fois, alors :

$ cd ~/wiringPi
$ git pull origin

Vous trouverez une version mise à jour puis vous pouvez relancer le script de construction ci-dessous.

Pour compiler / installer, il existe un nouveau script simplifié :

$ cd ~/wiringPi
$ ./build

Le nouveau script de compilation compile et installe tout pour vous – il utilise la commande sudo à un point, afin que vous puissiez inspecter le script avant de l’exécuter.

Ce qui donne ceci :

$ ./build
wiringPi Build script
=====================


WiringPi Library
[UnInstall]
[Compile] wiringPi.c
[Compile] wiringShift.c
[Compile] wiringSerial.c
[Compile] piHiPri.c
[Compile] piThread.c
[Compile] wiringPiSPI.c
[Compile] wiringPiI2C.c
[Compile] softPwm.c
[Compile] softTone.c
[Compile] mcp23008.c
[Compile] mcp23016.c
wiringPi.c:1247:21: warning: ‘digitalRead8Dummy’ defined but not used [-Wunused-function]
 static unsigned int digitalRead8Dummy        (UNU struct wiringPiNodeStruct *node, UNU int UNU pin)            { return 0 ; }
                     ^
wiringPi.c:1248:21: warning: ‘digitalWrite8Dummy’ defined but not used [-Wunused-function]
 static         void digitalWrite8Dummy       (UNU struct wiringPiNodeStruct *node, UNU int pin, UNU int value) { return ; }
                     ^
[Compile] mcp23017.c
[Compile] mcp23s08.c
[Compile] mcp23s17.c
[Compile] sr595.c
[Compile] pcf8574.c
[Compile] pcf8591.c
[Compile] mcp3002.c
[Compile] mcp3004.c
[Compile] mcp4802.c
[Compile] mcp3422.c
[Compile] max31855.c
[Compile] max5322.c
[Compile] ads1115.c
[Compile] sn3218.c
[Compile] bmp180.c
[Compile] htu21d.c
[Compile] ds18b20.c
[Compile] rht03.c
[Compile] drcSerial.c
[Compile] drcNet.c
[Compile] pseudoPins.c
[Compile] wpiExtensions.c
[Link (Dynamic)]
[Install Headers]
[Install Dynamic Lib]

WiringPi Devices Library
[UnInstall]
[Compile] ds1302.c
[Compile] maxdetect.c
[Compile] gertboard.c
[Compile] piNes.c
[Compile] piFace.c
[Compile] lcd128x64.c
[Compile] lcd.c
[Compile] scrollPhat.c
[Compile] piGlow.c
[Link (Dynamic)]
[Install Headers]
[Install Dynamic Lib]

GPIO Utility
[Compile] gpio.c
[Compile] readall.c
[Compile] pins.c
[Link]
[Install]

All Done.

NOTE: To compile programs with wiringPi, you need to add:
    -lwiringPi
  to your compile line(s) To use the Gertboard, MaxDetect, etc.
  code (the devLib), you need to also add:
    -lwiringPiDev
  to your compile line(s).

Mise-à-jour du kernel après celle de WiringPi

Si vous aviez décidé de downgrader le kernel en 4.4.50 comme expliqué plus haut, vous pouvez maintenant le mettre à jour dans sa dernière version (4.9.x) sans crainte :

$ sudo rpi-update
 *** Raspberry Pi firmware updater by Hexxeh, enhanced by AndrewS and Dom
 *** Performing self-update
 *** Relaunching after update
 *** Raspberry Pi firmware updater by Hexxeh, enhanced by AndrewS and Dom
#############################################################
WARNING: This update bumps to rpi-4.9.y linux tree
Be aware there could be compatibility issues with some drivers
Discussion here:
https://www.raspberrypi.org/forums/viewtopic.php?f=29&t=167934
##############################################################
Would you like to proceed? (y/N)
 *** Downloading specific firmware revision (this will take a few minutes)
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   168    0   168    0     0    376      0 --:--:-- --:--:-- --:--:--   376
100 53.8M  100 53.8M    0     0  2304k      0  0:00:23  0:00:23 --:--:-- 3754k
 *** Updating firmware
 *** Updating kernel modules
 *** depmod 4.9.22+
 *** depmod 4.9.22-v7+
 *** Updating VideoCore libraries
 *** Using HardFP libraries
 *** Updating SDK
 *** Running ldconfig
 *** Storing current firmware revision
 *** Deleting downloaded files
 *** Syncing changes to disk
 *** If no errors appeared, your firmware was successfully updated to 0fc97389df97e239a6e09cb544f2789a3e1e9eb8
 *** A reboot is needed to activate the new firmware

Laisser un commentaire