sayfa başı

1 Mart 2015 Pazar

LINUX GPIO Kontrolü

Bilindiği üzere işlemcilerin dış çevre birimleri kontrol etmesi yada onlar ile haberleşmesi için GPIO (General Purpose Input/Output) kullanılır. GPIO giriş (input) ya da çıkış (output) olarak ayarlanabilir. Çıkış(output) olarak ayarladığımız GPIO üzerinden dışarıya 1(HIGH) ya da 0(LOW) verisini verir iken giriş(input) olarak ayarladığımız GPIO üzerinden dışarıdan 1(HIGH) ya da 0(LOW) verisini alırız. Genellikle GPIO gömülü Linux sistemlerinde kernel modülünde yönetilir fakat kullanıcı seviyesinden (user space) kontrolü de mümkündür. Yazılacak ufak bir kod ile boşta olan GPIO ele alıp istediğimiz gibi kullanabiliriz. Kullanıcı seviyesinden (user space) yazılacak kod yardımı ile belirlediğimiz GPIO aşağıdaki resimde bulunan örnek kullanımlar ile devremizde kullanabiliriz.

Örnek GPIO bağlantıları
Standart Linux kernel GPIO erişimine izin vermek için özel bir interface içerir. Kernel özelliklerinize(kernel menuconfig) bakarak bu özelliğin aktif olup olmadığını anlayabilirsiniz.
Eğer bu özellik sisteminizde kapalı ise  Device Drivers  > GPIO Support yapıp kernel yeniden derlemeniz gerekmektedir.
Yok hayır benim sistemimde bu özellik açık diyorsanız eğer sisteminizde aşağıdaki dizini görebilirsiniz.
/syst/class/gpio..
Kullanıcı seviysinde ele aldığımız GPIO lar hepsi bu dizinde bulunacaktır. 
$ls /sys/class/gpio/ komutu ile bu dizin altında dosyası açılmış (ele alınmış) GPIO görebilirsiniz.

Konsoldan GPIO Yönetimi
İlk olarak linux konsolunu kullanarak bir GPIO ele alma, yönlendirme, yazma ve okuma işlemlerini yapacağız. Bu yapacağımız işlemleri yazacağınız bir script ile de yapabilirsiniz. Zaten neyi ne amaçla yaptığımızı gördükten sonra nasıl kullanılacağı çok da sorun olmaz. İster bir script yazar hatta bu script sistem açılışında otomatik olarak da çağırarak sisteminizde açılışta yapmak istediğiniz işi yapmış olursunuz.

Komut satırından GPIO yönetmek için ilk olarak yapmamız gereken kullanacağımız GPIO ele almaktır.(Ben ele almak diyorum ama rezerve etmek de denilebilir.) GPIO ele almadan önce $ls /sys/class/gpio/ çıktısına bir bakalım. (Adım adım ilerleyip detayları kaçırmayalım). Benim sistemimde bu komut çağırdığımda aldığım çıktı şu şekilde:
export  gpiochip0@ unexport
export ve unexport bu konu için önemli dosyalarımız. Bu dosyalara kısaca bakalım. Bir GPIO ele almak için export dosyası kullanılır. Bu dosyaya yazacağımız GPIO numarası sonucunda sistem o GPIO bizim kullanımımıza ayırır. unexport ise bu işlemin tam tersini yaparak kullanım için ayırdığımız GPIO sisteme geri verir. Kısacası özgür bırakır. Bir örnek ile devam etmek için 11 nolu GPIO kullanım için ele alalım.(rezerve edelim)
  1. $cd /sys/class/gpio/              ilk olarak o dizine gidelim
  2. $echo 11 >> export              11 nolu GPIO ele alalım
Bu komutlardan sonra $ls /sys/class/gpio/ tekrar koştuğumuzda şu şekilde bir çıktı almamız gerekir.
export  gpio11@ gpiochip0@ unexport

Şimdi oluşturduğumuz yeni GPIO dizinine giderek GPIO özelliklerini yükleyelim.

$cd gpio11/ ile GPIO dizinine gittikten sonra bu dizinde $ls komutunu koşalım. Burada kullanacağımız dosyaları görürüz. 

ilk olarak GPIO kullanım yönünü belirtelim. Çıkış(output) ya da gişir(input) olarak GPIO yönlendirelim.

Çıkış olarak yönlendirmek için:
 echo "out" > /sys/class/gpio/gpio11/direction

Giriş olarak yönlendirmek için:
echo "in" > /sys/class/gpio/gpio11/direction

Var olan yönlendirmeyi okumak için
 cat /sys/class/gpio/gpio11/direction

Çıkış olarak yönlendirdiğimiz GPIO HIGH(1) ya da LOW(0) konumuna almak için value dosyası kullanılır. Bu dosyaya yazacağımız 1 yada 0 değerine göre ilgili GPIO çıkışı değişir.

GPIO HIGH(1):
echo 1 >>  /sys/class/gpio/gpio11/value 

GPIO LOW(0)
echo 0 >>  /sys/class/gpio/gpio11/value

Giriş olarak yönlendirdiğimiz GPIO dan veri okumak için:
cat /sys/class/gpio/gpio11/value

Ayrıca çıkış olarak yönlendirdiğimiz GPIO o anki çıkış durumunu öğrenmek için de bu komut kullanılabilir.

Yukarıda açıklanan komutlar ile bir GPIO konsol komutları ile istenildiği gibi kontrol edilebilir. Bu yazının sonuna gelmeden ufak bir bilgiyi daha aktarayım. Hem bizim hem de sistemin ele aldığı tüm GPIO görmek gerekebilir. Hem bu sayede ele almak istediğimiz bir GPIO daha önceden rezerve edilip edilmediğini görebiliriz. Bunun için ilk olarak kernel ayarlarımızın bunu destekliyor olması lazım.


 Kernel configuration > Kernel hacking > Debug FS

Kernel ayarlarına bakıp, eğer bu özellik açık değil ise açıp kernel yeniden derlemeniz gerekmektedir.Bu adımdan sonra diğer adımlara geçebilirsiniz. İlk yapmamız gereken debugfs mount etmemiz olacak. (mount işlemini hangi dizin altına yaptığınıza dikkat edin)
mount -t debugfs none /sys/kernel/debug

Kullanılan tüm GPIO özellikleri ile birlikte görmek için koşmamız gereken son komut:
cat /sys/kernel/debug/gpio


Peki buraya kadar her şey iyi hoş da ben bu işlemleri C ile yazdığım bir uygulama ile kendi projemde nasıl yaparım diyenler için bir sonraki yazımda bunu ele alacağım.

Herkese iyi çalışmalar

Hiç yorum yok:

Yorum Gönder

Son Ütücü