Contoh dari elinux menggunakan IO yang dipetakan dengan memori . Kernel juga mengekspor antarmuka ruang pengguna melalui /sys/class/gpio
, 1 yang juga didokumentasikan pada elinux . Bekerja di C Anda akan menggunakan level rendah read()
/ write()
bukannya echo
, jelas. Jangan gunakan fungsi berbasis aliran level tinggi.
Beberapa programmer menjadi sedikit kesal ketika disuruh menggunakan antarmuka file untuk hal-hal yang mereka yakini harus dilakukan dengan panggilan sistem. Ini murni masalah gaya - semuanya sama persis . Tidak ada "overhead I / O tambahan", dll., Mengakses file dalam hal ini karena ini bukan file nyata, ini adalah antarmuka kernel. Persis seperti ABI sistem lain yang pernah Anda gunakan, hanya berbeda. Penggunaan /proc
dan /sys
node telah lama disukai oleh para pengembang kernel, tetapi saya masih melihat orang-orang bertekad untuk menggunakan panggilan sistem di mana mereka dapat - misalnya sysfs()
, terlepas dari kenyataan yang man 2 sysfs
mengatakan dengan jelas:
Pemanggilan sistem turunan System-V ini sudah usang; jangan gunakan itu. Pada sistem dengan / proc, informasi yang sama dapat diperoleh melalui / proc / filesystems; gunakan antarmuka itu sebagai gantinya.
Itu adalah halaman manual C library yang memberitahu Anda untuk menggunakan /proc
antarmuka . Jika itu tidak cukup baik untuk meyakinkan Anda, tidak ada yang. /sys
adalah hal yang sama. Intinya adalah: hanya karena Anda menggunakan file node bukannya beberapa API khusus C tidak berarti Anda tidak melakukan pemrograman nyata, atau kinerja yang akan menderita, dll. Beberapa orang mungkin mengatakan itu sebenarnya fitur yang bagus . Ini juga metode yang direkomendasikan oleh orang-orang yang menulis kernel OS.
Pengantar cepat untuk antarmuka GPIO dapat ditemukan di [kernel-src]/Documentation/ABI/testing/sysfs-gpio
:
GPIOs are only made available to userspace by an explicit
"export" operation. If a given GPIO is not claimed for use by
kernel code, it may be exported by userspace (and unexported later).
Kernel code may export it for complete or partial access.
GPIOs are identified as they are inside the kernel, using integers in
the range 0..INT_MAX. See Documentation/gpio.txt for more information.
/sys/class/gpio
/export ... asks the kernel to export a GPIO to userspace
/unexport ... to return a GPIO to the kernel
/gpioN ... for each exported GPIO #N
/value ... always readable, writes fail for input GPIOs
/direction ... r/w as: in, out (default low); write: high, low
/edge ... r/w as: none, falling, rising, both
/gpiochipN ... for each gpiochip; #N is its first GPIO
/base ... (r/o) same as N
/label ... (r/o) descriptive, not necessarily unique
/ngpio ... (r/o) number of GPIOs; numbered N to N + (ngpio - 1)
Tampaknya ada berbagai tutorial dan online seperti itu selain yang elinux. Saya hanya menggunakan I2C, kalau tidak saya akan memberikan jawaban yang lebih langsung.
Jika Anda tertarik untuk menulis kode ruang kernel mengakses GPIO, Anda dapat melihatnya di sini , meskipun saya pikir itu benar-benar hanya berguna jika Anda ingin menulis driver untuk perangkat tertentu dan membuat API ruang pengguna Anda sendiri.
1. Karena mem-memetakan IO juga harus menggunakan baca / tulis, saya tidak yakin apakah satu metode memberikan keuntungan yang signifikan di atas yang lain di sini. Menggunakan /sys
antarmuka tentu akan lebih portabel, jika Anda mencari kode yang akan berjalan pada hal-hal selain pi raspberry.