/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
その後、アクセス許可は正しくなりました(ピンフォルダーとそのファイルvalue
、direction
、...でも)。
これは、カーネルが新しいデバイスをインスタンス化するときに実行するアクションを定義できる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
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スリープすることでした。
@ 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}'"