Linux: Problema de tempo de exportação GPIO

Criado em 27 mar. 2014  ·  9Comentários  ·  Fonte: raspberrypi/linux

Se os três comandos a seguir forem executados individualmente a partir da linha de comando no Raspberry Pi usando Raspbian (2014-01-07-wheezy-raspbian.zip), eles serão executados com sucesso:

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> ~ $ 

No entanto, se eles forem executados juntos na mesma linha, haverá um erro de permissão negada:

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> ~ $ 

O erro de permissão negada ocorre porque "echo out> / sys / class / gpio / gpio23 / direction" está sendo executado antes do grupo e os bits de permissão para "/ sys / class / gpio / gpio23 / direction" foram definidos com os valores apropriados . Os bits de grupo e permissão são "root" e "-rw-r - r--", mas devem ser "gpio" e "-rwxrwx ---".

Esse problema de tempo pode ser visto na seqüência de comando abaixo, que exporta gpio 23 e lista o conteúdo de "/ sys / class / gpio / gpio23 /" duas vezes. A saída do primeiro comando ls é bastante diferente da saída do segundo comando ls. O grupo e as permissões de todos os arquivos foram alterados.

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

Este é um problema que precisa ser resolvido?

Comentários muito úteis

Este é um problema muito chato que requer soluções alternativas. Não deveria ter sido fechado.

Todos 9 comentários

Acabei de editar o post acima. Inicialmente, nenhuma das ocorrências de "echo 23> / sys / class / gpio / uncport" estava lá. A não exportação é apenas necessária para fazer o gpio voltar ao seu estado inicial não exportado.

Eu recebo:

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

que é o que eu esperava. Apenas o root tem permissão para acessar / sys / class / gpio / uncport, então quando pi tenta fazer isso, ele obtém permissão negada corretamente.

Se eu executar "sudo su" primeiro, o comando funcionará conforme o esperado.

Isso é o que eu costumava obter nas versões mais antigas ou Raspbian, mas em 2014-01-07-wheezy-raspbian eu obtenho:

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> ~ $ 

Tudo funciona bem e não há erros. Todos no grupo gpio têm permissão para acessar / sys / class / gpio / export e pi é um membro do grupo 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 produz o seguinte:

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

O comportamento mudou, pois estávamos usando algumas coisas do udev do pessoal do piface. Você está certo de que precisa esperar que o udev mude as permissões no dispositivo criado. Isso é uma coisa do espaço do usuário, então não realmente para este repositório, mas não tenho certeza se há uma maneira de melhorá-lo.

Isto funciona?

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

@asb Ok, obrigado pela informação. Acho que vou mudar o código em onoff para que ele aguarde a alteração das permissões. A vantagem é que os aplicativos que usam onoff podem evitar problemas de superusuário.

@popcornmix sim, isso funciona, obrigado.

Posso ver o valor na extensão do processo de permissão GPIO no espaço do usuário, mas esta implementação
corrompeu a semântica da operação de exportação GPIO do kernel. A gravação em / sys / class / gpio / export
deve esperar o processo do espaço do usuário relatar que concluiu seu trabalho antes que a gravação retorne.

Soluções alternativas que dizem que os usuários devem esperar algum tempo para que os metadados sysfs se estabilizem após um
operação de exportação são muito feias porque não há um período correto de espera. Estratégia alternativa que
procura por mudanças nos metadados (por exemplo, grupo definido para gpio) são inadequados porque o propósito do
o processo de permissão de espaço do usuário é flexível - pode decidir que root é o grupo adequado e sem alteração
ocorre.

A mudança semântica na operação de exportação GPIO do kernel é um obstáculo ao código portátil, não apenas
entre Raspberry Pi e outras plataformas de hardware, mas também entre diferentes Linux
distribuições no Raspberry Pi.

Acordado. É responsabilidade do kernel fornecer uma implementação funcional do sysfs, e a implementação do Raspbian está claramente danificada de uma maneira feia. Não vejo como esse problema pode ter sido marcado como encerrado.

Este é um problema muito chato que requer soluções alternativas. Não deveria ter sido fechado.

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

antonellocaroli picture antonellocaroli  ·  84Comentários

rowanalex123 picture rowanalex123  ·  59Comentários

pssc picture pssc  ·  77Comentários

f18m picture f18m  ·  60Comentários

kad picture kad  ·  65Comentários