Linux: problème de synchronisation d'exportation gpio

Créé le 27 mars 2014  ·  9Commentaires  ·  Source: raspberrypi/linux

Si les trois commandes suivantes sont exécutées individuellement à partir de la ligne de commande sur le Raspberry Pi à l'aide de Raspbian (2014-01-07-wheezy-raspbian.zip), elles s'exécutent avec succès :

pi<strong i="6">@raspberrypi</strong> ~ $ echo 23 > /sys/class/gpio/unexport
pi<strong i="7">@raspberrypi</strong> ~ $ echo 23 > /sys/class/gpio/export
pi<strong i="8">@raspberrypi</strong> ~ $ echo out > /sys/class/gpio/gpio23/direction 
pi<strong i="9">@raspberrypi</strong> ~ $ 

Cependant, s'ils sont exécutés ensemble sur la même ligne, il y a une erreur d'autorisation refusée :

pi<strong i="13">@raspberrypi</strong> ~ $ echo 23 > /sys/class/gpio/unexport; echo 23 > /sys/class/gpio/export; echo out > /sys/class/gpio/gpio23/direction
-bash: /sys/class/gpio/gpio23/direction: Permission denied
pi<strong i="14">@raspberrypi</strong> ~ $ 

L'erreur d'autorisation refusée se produit car "echo out > /sys/class/gpio/gpio23/direction" est en cours d'exécution avant que les bits de groupe et d'autorisation pour "/sys/class/gpio/gpio23/direction" aient été définis sur les valeurs appropriées . Les bits de groupe et d'autorisation sont "root" et "-rw-r--r--", mais ils devraient être "gpio" et "-rwxrwx---".

Ce problème de synchronisation peut être vu dans la séquence de commandes ci-dessous qui exporte gpio 23 et répertorie le contenu de "/sys/class/gpio/gpio23/" deux fois. La sortie de la première commande ls est assez différente de la sortie de la deuxième commande ls. Le groupe et les autorisations pour tous les fichiers ont changé.

pi<strong i="19">@raspberrypi</strong> ~ $ echo 23 > /sys/class/gpio/unexport; echo 23 > /sys/class/gpio/export; ls -l /sys/class/gpio/gpio23/; ls -l /sys/class/gpio/gpio23/
total 0
-rw-r--r-- 1 root root 4096 Mar 27 21:51 active_low
-rw-r--r-- 1 root root 4096 Mar 27 21:51 direction
-rw-r--r-- 1 root root 4096 Mar 27 21:51 edge
drwxr-xr-x 2 root root    0 Mar 27 21:51 power
lrwxrwxrwx 1 root root    0 Mar 27 21:51 subsystem -> ../../../../class/gpio
-rw-r--r-- 1 root root 4096 Mar 27 21:51 uevent
-rw-r--r-- 1 root root 4096 Mar 27 21:51 value
total 0
-rwxrwx--- 1 root gpio 4096 Mar 27 21:51 active_low
-rwxrwx--- 1 root gpio 4096 Mar 27 21:51 direction
-rwxrwx--- 1 root gpio 4096 Mar 27 21:51 edge
drwxrwx--- 2 root gpio    0 Mar 27 21:51 power
lrwxrwxrwx 1 root gpio    0 Mar 27 21:51 subsystem -> ../../../../class/gpio
-rwxrwx--- 1 root gpio 4096 Mar 27 21:51 uevent
-rwxrwx--- 1 root gpio 4096 Mar 27 21:51 value

Est-ce un problème qui doit être abordé?

Commentaire le plus utile

C'est un problème très ennuyeux qui nécessite des solutions de contournement laides. Il n'aurait pas dû être fermé.

Tous les 9 commentaires

Je viens d'éditer le post ci-dessus. Initialement, aucune des occurrences de "echo 23 > /sys/class/gpio/unexport" n'était là. La désexportation n'est nécessaire que pour remettre le gpio dans son état initial non exporté.

Je reçois:

pi<strong i="6">@raspberrypi</strong>:~ $ ls -l /sys/class/gpio/
total 0
--w------- 1 root root 4096 Mar 27 17:41 export
lrwxrwxrwx 1 root root    0 Mar 27 17:41 gpiochip0 -> ../../devices/virtual/gpio/gpiochip0
--w------- 1 root root 4096 Mar 27 17:41 unexport
pi<strong i="7">@raspberrypi</strong>:~ $ echo 23 > /sys/class/gpio/unexport
-bash: /sys/class/gpio/unexport: Permission denied

c'est ce à quoi je m'attendrais. Seul root a l'autorisation d'accéder à /sys/class/gpio/unexport, donc lorsque pi essaie de le faire, l'autorisation est correctement refusée.

Si j'exécute d'abord "sudo su", la commande fonctionne comme prévu.

C'est ce que j'avais l'habitude d'obtenir sur les anciennes versions ou Raspbian, mais le 2014-01-07-wheezy-raspbian j'obtiens :

pi<strong i="7">@raspberrypi</strong> ~ $ ls -l /sys/class/gpio/
total 0
-rwxrwx--- 1 root gpio 4096 Mar 28 16:58 export
lrwxrwxrwx 1 root gpio    0 Jan  1  1970 gpiochip0 -> ../../devices/virtual/gpio/gpiochip0
-rwxrwx--- 1 root gpio 4096 Mar 28 17:01 unexport
pi<strong i="8">@raspberrypi</strong> ~ $ echo 23 > /sys/class/gpio/export 
pi<strong i="9">@raspberrypi</strong> ~ $ 

Tout fonctionne bien et il n'y a pas d'erreurs. Tout le monde dans le groupe gpio a la permission d'accéder à /sys/class/gpio/export et pi est membre du groupe gpio.

pi<strong i="13">@raspberrypi</strong> ~ $ groups pi
pi : pi adm dialout cdrom sudo audio video plugdev games users netdev input spi gpio

uname affiche ce qui suit :

pi<strong i="17">@raspberrypi</strong> ~ $ uname -a
Linux raspberrypi 3.10.34+ #661 PREEMPT Thu Mar 27 00:36:02 GMT 2014 armv6l GNU/Linux

Le comportement a changé car nous utilisons des trucs udev des gens de piface. Vous avez raison de devoir attendre qu'udev modifie les autorisations sur l'appareil créé. C'est une question d'espace utilisateur, donc pas vraiment pour ce référentiel, mais je ne suis pas vraiment sûr qu'il y ait un moyen de l'améliorer.

Est-ce que ça marche?

echo 23 > /sys/class/gpio/unexport; echo 23 > /sys/class/gpio/export; sleep 1; echo out > /sys/class/gpio/gpio23/direction

@asb Ok, merci pour l'info. Je pense que je vais changer le code dans onoff pour qu'il attende que les autorisations changent. L'avantage est que les applications utilisant onoff peuvent alors éviter les problèmes de superutilisateur.

@popcornmix oui, ça marche, merci.

Je peux voir la valeur de l'extension du processus d'autorisation GPIO dans l'espace utilisateur, mais cette implémentation
a corrompu la sémantique de l'opération d'exportation GPIO du noyau. L'écriture dans /sys/class/gpio/export
doit attendre que le processus de l'espace utilisateur signale qu'il a terminé son travail avant que l'écriture ne revienne.

Solutions de contournement qui indiquent que les utilisateurs doivent attendre un certain temps pour que les métadonnées sysfs se règlent après un
L'opération d'exportation est très moche car il n'y a pas de période d'attente correcte. Une stratégie de contournement qui
recherche des changements dans les métadonnées (par exemple, groupe défini sur gpio) sont inadéquats car le but de la
le processus d'autorisation de l'espace utilisateur est flexible - il peut décider que root est le bon groupe et aucun changement
se produit.

Le changement sémantique de l'opération d'exportation GPIO du noyau est un obstacle au code portable, non seulement
entre Raspberry Pi et d'autres plateformes matérielles, mais aussi entre différents Linux
distributions sur Raspberry Pi.

D'accord. Il est de la responsabilité du noyau de fournir une implémentation sysfs fonctionnelle, et l'implémentation de Raspbian est clairement cassée de manière laide. Je ne vois pas comment ce problème a pu être marqué comme clos.

C'est un problème très ennuyeux qui nécessite des solutions de contournement laides. Il n'aurait pas dû être fermé.

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

mohmedelwany picture mohmedelwany  ·  5Commentaires

kucharskim picture kucharskim  ·  7Commentaires

KevinStartup picture KevinStartup  ·  6Commentaires

unkissedfrog picture unkissedfrog  ·  9Commentaires

XECDesign picture XECDesign  ·  6Commentaires