6 Şubat 2019 Çarşamba

LINUX KERNEL KATMANINDA ÇALIŞAN NEM ÖLÇER DRIVER

          LINUX KERNEL KATMANINDA ÇALIŞAN NEM ÖLÇER DRIVER

Projenin amacı :

Projemizn amacı Arduino kullanarak ortamdaki nemi ölçmek

Kullanacak olduğumuz DHT11 Nem Sensörü analog sensör yapısında olduğundan dolayı araya ek olarak Arduino bağladık. USB serial üzerinden haberleşeceğiz.

Arduino Nedir?

Arduino bir I/O kartı ve Processing/Wiring dilinin bir uygulamasını içeren geliştirme ortamından oluşan bir fiziksel programlama platformudur. 

Character Device Driver Nedir?

Character Device kullanıcı uygulamasına veri aktarır. Character Device bir bayt verisini karakter karekter akışı anında okuyarak veya yazarken  seri portlar gibi davranır. Seri haberleşmeye, video çekmeye ve ses aygıtlarına arabirim oluşturmak için gereken driverlara ortam sağlar. 

File_operations yapısı “linux/fs.h” dosyasında tanımlanmıştır ve aygıt üzerinde çeşitli işlemler yapan sürücünün tanımladığı işlevlere işaretçiler içerir. Yapının her alanı, istenen bir işlemi gerçekleştirmek için sürücü tarafından tanımlanan bazı fonksiyonların adresine karşılık gelir. Örneğin, her karakter sürücüsünün cihazdan okuyan bir işlevi tanımlaması gerekir. File_operations yapısı, bu işlemi yapan modülün fonksiyonunun adresini tutar.

İşletim sistemi device ile doğrudan iletişim kuramaz , aygıtların arka planında aygıta özel olan olaylar ile ilgilenmezler. device driver gereklidir.

Karakter aygıtları(character device) karakter akımlarını kabul eder yada dağıtırlar.Adreslenemezler ve bu aygıtlarda arama işlemi gerçekleştirilemez.Yazıcılar, ağ aygıtları, mouse bu aygıtlara örnek verilebilir. İşletim sisteminin dosya sistemi bu aygıtların hepsi ile soyut aygıtlar olarak ilgilenir. Aygıtların arka planında aygıta özel olan olaylar ile ilgilenmezler.

Proje Adımları

İlk olarak kullandığımız fonksiyonlar için gerekli olan kütüphaneleri , modül lisans ve sahipliği ekliyoruz:


Global değişkenlerimizi tanımlıyoruz; Sensörden bilgiyi alan bilgi_oku(char*); fonksiyonu bildirimini yapıyoruz:


Karakter aygıtımız için gerekli olan open, close, read ve write fonksiyonlarımızı yazıyoruz. Read fonksiyonu içerisinden bilgi_oku() fonksiyonu ile sensörden gelen veriyi buf değişkenine atıyoruz.


Daha sonra “buf” a atılan veriyi simple_read_from_buffer() fonksiyonu ile user katmanına  gönderiyoruz. **Kullanılan fonksiyonlar kernel sürümüne göre farklılık gösterebilir.**

Kernel modülümüzün çalışması için gerekli ana fonksiyonlarını struct yapısında belirtiyoruz:


Arduinoyu bilgisayara bağladığımızda arduino tarafından /dev klasöründe “ttyACM0” isimli bir device oluşturulur ve device’ın ismi bilgisayardan bilgisayara değişiklik gösterebilir. “ls -al /dev” komutu ile veya kabloyu bilgisayara taktıktan sonra “dmesg” komutu ile logdan device’ın ismine bakabiliriz. . filp_open() ile bu device’ı kernelda dosya olarak kullanabiliyoruz.

bilgi_al() fonksiyonu ile “ttyACM0” dan gelen verileri alıyoruz ve read fonksiyonunda user’a gönderiyoruz:


Modül yüklenmek için __init fonksiyonunu kullanır. alloc_chrdev_region() ile device’a major numarası atanıyor. Eğer alloc_chrdev_region() fonksiyonu negatif değer döndürür ise kernel’da hata oluşmuştur. 
Fonksiyonlardan biri negatif değer döndürür ise problem oluştuğu anlamına gelir. device_create()  /dev dizininde device oluşturulur.

cdev_add()  karakter device’ı sisteme ekliyoruz. 

/dev dizininde driver’ımızı oluşturduk.


Modül kaldırıldığında __exit() fonksiyonu çalışır. Oluşturulan device’lar ve modüller kaldırılır:

                                                   
                              
Sağdaki DHT11 nem sensörünü Arduino ‘ ya bağladık.

Sensörün GND ucunu arduino nun GND bağlantısı ile bağlıyoruz. 
Sensörün POWER ucunu arduino nun 5V luk kısmına bağlıyoruz.
Sensörün DATA ucunu arduino nun 2 nolu kısmına bağlıyoruz.( 2 olmasını sebebi arduino kodlarındaki verdigimiz port kısmında belirtiyoruz.)

ARDUİNO KODU:


 Derleme ve Çalıştırma

Makefile dosyası:

*
*
*
*
*

sensorD.c ve Makefile dosyalarımızı oluşturup aynı klasöre attıktan sonra klasör içinde sağ tıklayıp terminali açıyoruz. “sudo make” yazıp root şifremizi girerek derlemeyi başlatıyoruz. Eğer derleme başarılı olursa klasörde .ko .mod vs uzantılı başka dosyalar oluşacaktır. Ardından “sudo insmod sensorD.ko” komutu ile modülümüzü sisteme ekliyoruz. “lsmod” ile modülün eklenip eklenmediğine bakabilirsiniz:


“cat” komutu ile HumiDevice içerisinde ki veri çıktısını konsoldan okuyabiliyoruz.

Okuma işlemi sonucu ekrana yazdırılan değerler:
 (sensöre üfleyip nem değerini değiştirmeyi unutmuşuz!)



                                                                                                THE END






   

Hiç yorum yok:

Yorum Gönder