web-dev-qa-db-ja.com

非ルートとしてGPIO(/ sys / class / gpio)にアクセスします

/sys/class/gpioは、デフォルトではrootとしてのみアクセスできます。ですから、新しいグループgpio/sys/class/gpioの下のファイルとディレクトリを使用できるのが好きです。これを実現するために、/etc/rc.localに次の行を追加しました(私はDebianを使用しています)。

Sudo chown root:gpio /sys/class/gpio/unexport /sys/class/gpio/export
Sudo chmod 220 /sys/class/gpio/unexport /sys/class/gpio/export

したがって、これにより、すべてのgpioグループメンバーに書き込み権限が付与されます。そのため、exportおよびunexportピンを正常に固定できるようになりました。

問題は、export(例:/sys/class/gpio/gpio17)の後に特定のピンファイルが再びroot:rootによって所有されているため、それらが読み取り/書き込みできないことです。

デフォルトでroot:gpioとして作成されるように変更するにはどうすればよいですか?つまり、ピンをエクスポートするたびに手動でそれを行うことができます。しかし、それは少し不快です。

[〜#〜]更新[〜#〜]

Larsksの回答によると、不足しているルールファイルを作成しました。今では部分的に機能します:

-rwxrwx---  1 root gpio 4096 Jun 19 16:48 export
lrwxrwxrwx  1 root gpio    0 Jun 19 16:51 gpio17 -> ../../devices/soc/3f200000.gpio/gpio/gpio17
lrwxrwxrwx  1 root gpio    0 Jun 19 16:45 gpiochip0 -> ../../devices/soc/3f200000.gpio/gpio/gpiochip0
-rwxrwx---  1 root gpio 4096 Jun 19 16:45 unexport

しかし、./gpio17/の場合はまだroot:rootを取得します。

-rw-r--r-- 1 root root 4096 Jun 19 16:52 active_low
lrwxrwxrwx 1 root root    0 Jun 19 16:52 device -> ../../../3f200000.gpio
-rw-r--r-- 1 root root 4096 Jun 19 16:52 direction
-rw-r--r-- 1 root root 4096 Jun 19 16:52 Edge
drwxr-xr-x 2 root root    0 Jun 19 16:52 power
lrwxrwxrwx 1 root root    0 Jun 19 16:52 subsystem -> ../../../../../class/gpio
-rw-r--r-- 1 root root 4096 Jun 19 16:52 uevent
-rw-r--r-- 1 root root 4096 Jun 19 16:52 value

UPDATE 2

さて、私は問題を解決しました。 RaspbianInstaller上にRaspbianをインストールしたため、raspi-configツールを使用したことはありません。これは問題のようです。 /sys/device/virtual/gpio/フォルダーも欠落していたためです。

私はここでこのガイドに従いました: http://www.element14.com/community/message/139528/l/re-piface-digital-2--setup-and-use#139528

その後、アクセス許可は正しくなりました(ピンフォルダーとそのファイルvaluedirection、...でも)。

13
TiMESPLiNTER

これは、カーネルが新しいデバイスをインスタンス化するときに実行するアクションを定義できるudevルールを使用して実行できます。 Raspberry Piデバイスの Raspbian ディストリビューションの現在のバージョンでは、/etc/udev/rules.d/99-com.rulesに次のものが含まれています。

SUBSYSTEM=="gpio*", PROGRAM="/bin/sh -c 'chown -R root:gpio /sys/class/gpio && chmod -R 770 /sys/class/gpio; chown -R root:gpio /sys/devices/virtual/gpio && chmod -R 770 /sys/devices/virtual/gpio'"

これにより、/sys/class/gpioの下のエントリをgpioグループのメンバーが常に利用できるようになります。

# ls -lL /sys/class/gpio/
total 0
-rwxrwx--- 1 root gpio 4096 May  6 23:36 export
drwxrwx--- 2 root gpio    0 Jan  1  1970 gpiochip0
-rwxrwx--- 1 root gpio 4096 May  6 23:37 unexport
# echo 11 > /sys/class/gpio/export 
# ls -lL /sys/class/gpio/
total 0
-rwxrwx--- 1 root gpio 4096 May  6 23:37 export
drwxrwx--- 2 root gpio    0 May  6 23:37 gpio11
drwxrwx--- 2 root gpio    0 Jan  1  1970 gpiochip0
-rwxrwx--- 1 root gpio 4096 May  6 23:37 unexport

更新

パーミッションは個々のピンに対しても正しいです:

# ls -Ll /sys/class/gpio/gpio11/
total 0
-rwxrwx--- 1 root gpio 4096 May  6 23:37 active_low
drwxr-xr-x 3 root root    0 May  6 23:36 device
-rwxrwx--- 1 root gpio 4096 May  6 23:37 direction
-rwxrwx--- 1 root gpio 4096 May  6 23:37 Edge
drwxrwx--- 2 root gpio    0 May  6 23:37 subsystem
-rwxrwx--- 1 root gpio 4096 May  6 23:37 uevent
-rwxrwx--- 1 root gpio 4096 May  6 23:37 value
9
larsks

4.xカーネルのより一般的なルールは次のとおりです

SUBSYSTEM=="gpio*", PROGRAM="/bin/sh -c 'find -L /sys/class/gpio/ -maxdepth 2 -exec chown root:gpio {} \; -exec chmod 770 {} \; || true'"

パスにシンボリックリンクがある場合、最初の回答のルールはエクスポートされたgpioのchownに失敗します

[〜#〜] upd [〜#〜] sysfsを介してGPIOをエクスポートする場合、必要なアクセス権を取得する前に、udevルールが起動して完了するのを待つ必要があることに注意してください。私のために働いたのは、GPIOファイルにアクセスしようとする前に約100msスリープすることでした。

10
Roman Savrulin

@ roman-savrulinによる回答を拡張して、より単純なバージョンを示します。

REMOVEイベントでルールを実行する必要はなく、ADDイベントのみを実行します。 udev環境は新しいGPIOピンのファイルを含むsysfsディレクトリの正確なパスを提供するため、「find」を実行する必要もありません。 'chgrp'を使用して所有グループのみを変更し、 'chmod'のシンボリックモードを使用してグループ書き込み許可ビットのみを追加することもできます。

ピンのファイルを開こうとする前に、ルール処理の完了を待つ必要がありますが、必要な最小数のファイルにのみ触れる単純なルールを使用すると、プロセスはより迅速に完了するはずです。

SUBSYSTEM=="gpio*", ACTION=="add", PROGRAM="/bin/sh -c 'chgrp -R gpio /sys/${DEVPATH} && chmod -R g+w /sys/${DEVPATH}'"
0