Linux: masalah waktu ekspor gpio

Dibuat pada 27 Mar 2014  ·  9Komentar  ·  Sumber: raspberrypi/linux

Jika tiga perintah berikut dijalankan satu per satu dari baris perintah pada Raspberry Pi menggunakan Raspbian (2014-01-07-wheezy-raspbian.zip) maka perintah tersebut berhasil dijalankan:

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

Namun, jika dieksekusi bersama pada baris yang sama, ada kesalahan izin ditolak:

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

Kesalahan izin ditolak terjadi karena "echo out > /sys/class/gpio/gpio23/direction" dieksekusi sebelum grup dan bit izin untuk "/sys/class/gpio/gpio23/direction" telah disetel ke nilai yang sesuai . Bit grup dan izin adalah "root" dan "-rw-r--r--", tetapi harus "gpio" dan "-rwxrwx---".

Masalah pengaturan waktu ini dapat dilihat pada urutan perintah di bawah ini yang mengekspor gpio 23 dan mencantumkan konten "/sys/class/gpio/gpio23/" dua kali. Output dari perintah ls pertama sangat berbeda dengan output dari perintah ls kedua. Grup dan izin untuk semua file telah berubah.

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

Apakah ini masalah yang perlu ditangani?

Komentar yang paling membantu

Ini adalah masalah yang sangat menjengkelkan yang membutuhkan solusi yang buruk. Seharusnya tidak ditutup.

Semua 9 komentar

Saya baru saja mengedit posting di atas. Awalnya tidak ada kemunculan "echo 23 > /sys/class/gpio/unexport" di sana. Unexport hanya diperlukan untuk mengembalikan gpio ke status awal tidak diekspor.

Saya mendapat:

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

yang saya harapkan. Hanya root yang memiliki izin untuk mengakses /sys/class/gpio/unexport jadi ketika pi mencoba melakukan ini, izin ditolak dengan benar.

Jika saya menjalankan "Sudo su" terlebih dahulu, maka perintahnya berfungsi seperti yang diharapkan.

Itulah yang biasa saya dapatkan di versi lama atau Raspbian, tetapi pada 01-07-2014-wheezy-raspbian saya mendapatkan:

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

Semuanya berfungsi dengan baik dan tidak ada kesalahan. Semua orang di grup gpio memiliki izin untuk mengakses /sys/class/gpio/export dan pi adalah anggota grup 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 menampilkan yang berikut:

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

Perilaku berubah saat kami menggunakan beberapa hal udev dari orang-orang piface. Anda benar bahwa Anda harus menunggu udev mengubah izin pada perangkat yang dibuat. Ini adalah hal userspace jadi tidak benar-benar untuk repo ini, tapi saya tidak begitu yakin ada cara untuk memperbaikinya.

apakah ini bekerja?

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

@asb Ok, terima kasih atas infonya. Saya pikir saya akan mengubah kode di onoff sehingga menunggu izin berubah. Keuntungannya adalah aplikasi yang menggunakan onoff kemudian dapat menghindari masalah pengguna super.

@popcornmix ya, itu berhasil, terima kasih.

Saya dapat melihat nilai dalam perpanjangan proses izin GPIO ke ruang pengguna, tetapi implementasi ini
telah merusak semantik operasi ekspor GPIO kernel. Penulisan ke /sys/class/gpio/export
harus menunggu proses ruang pengguna untuk melaporkan bahwa ia telah menyelesaikan pekerjaannya sebelum penulisan kembali.

Solusi penyelesaian yang mengatakan pengguna harus menunggu beberapa saat hingga metadata sysfs diselesaikan setelah
operasi ekspor sangat jelek karena tidak ada periode yang tepat untuk menunggu. Strategi penyelesaian yang
mencari perubahan metadata (misalnya grup diatur ke gpio) tidak memadai karena tujuan dari
proses izin ruang pengguna adalah fleksibilitas - mungkin memutuskan root adalah grup yang tepat dan tidak ada perubahan
terjadi.

Perubahan semantik ke operasi ekspor kernel GPIO merupakan hambatan untuk kode portabel, tidak hanya
antara Raspberry Pi dan platform perangkat keras lainnya, tetapi juga antara Linux yang berbeda
distribusi pada Raspberry Pi.

Sepakat. Merupakan tanggung jawab kernel untuk menyediakan implementasi sysfs yang berfungsi, dan implementasi Raspbian jelas rusak dengan cara yang buruk. Saya tidak melihat bagaimana masalah ini dapat ditandai sebagai ditutup.

Ini adalah masalah yang sangat menjengkelkan yang membutuhkan solusi yang buruk. Seharusnya tidak ditutup.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat