Bu uygulamada bir character device oluşturarak, yazdığımız
komutlar sayesinde klavyedeki LED’leri kapatıp açarak LED’in durumunun loga
kaydedilmesini sağlayacağız.
1. Uygulama için öncelikle bir metin düzenleyici
açarak aşağıdaki kodları yazıp klavyeled.c
ismiyle kaydediyoruz.
#include
<linux/module.h>
#include
<linux/kernel.h>
#include
<linux/init.h>
#include
<linux/tty.h>
#include
<linux/kd.h>
#include
<linux/vt.h>
#include
<linux/console_struct.h>
#define NAME
"klavyeled"
#define
BUFFERSIZE 128
#define RESTORE
0xFF
struct tty_driver
*my_driver;
unsigned int
state = 0x00;
extern int
fg_console;
static void
isiklar(char key);
char
buffer[BUFFERSIZE];
static ssize_t
dev_yaz(struct file *filp, const char *buff, size_t len, loff_t * off){
if(len > BUFFERSIZE){return -EFAULT;}
copy_from_user(buffer, buff, len);
isiklar(buffer[0]);
return BUFFERSIZE;
}
static ssize_t
dev_oku(struct file *fp, char *buf, size_t len, loff_t * off){
static int finished=0; if(finished)
{finished=0;return 0;} finished=1;
copy_to_user(buf, buffer, sizeof(buffer));
return sizeof(buffer);
}
static int major;
static struct
file_operations fops = {
.read = dev_oku,
.write = dev_yaz,
//.open = dev_ac,
//.release = dev_kapat
};
static void
isiklar(char key){
memset(buffer, '\0', BUFFERSIZE);
switch(key){
case 'C':
state = state & 0xFB;
state = state | 0x04;
strcpy(buffer, "Caps Lock
isigi acildi.\n");
break;
case 'c':
state = state & 0xFB;
strcpy(buffer, "Caps Lock
isigi kapatildl.\n");
break;
case 'N':
state = state & 0xFD;
state = state | 0x02;
strcpy(buffer, "Num Lock
isigi acildi.\n");
break;
case 'n':
state = state & 0xFD;
strcpy(buffer, "Num Lock
isigi kapatildi.\n");
break;
case 'S':
state = state & 0xFE;
state = state | 0x01;
strcpy(buffer, "Scroll
Lock isigi acildi.\n");
break;
case 's':
state = state & 0xFE;
strcpy(buffer, "Scroll
Lock isigi kapatildi.\n");
break;
default:
strcpy(buffer, "Caps lock
=> 'C' acik 'c' kapali\nNum lock => 'N' acik 'n' kapali\nScroll lock
=> 'S' acik 's' kapali\n");
break;
}
((my_driver->ops)->ioctl)
(vc_cons[fg_console].d->port.tty, KDSETLED, state);
}
static int __init
mdl_init(void){
major = register_chrdev(0, NAME,
&fops);
if(major < 0){
printk(KERN_ALERT "Character
device olusturulamadı! Hata kodu: %d\n", major);
return major;
}
my_driver =
vc_cons[fg_console].d->port.tty->driver;
printk(KERN_INFO "Character device
olusturuldu. Major = %d\n", major);
printk(KERN_ALERT "mknod /dev/%s c %d
0\n", NAME, major);
strcpy(buffer, "Caps lock => 'C'
acik 'c' kapali\nNum lock => 'N' acik 'n' kapali\nScroll lock => 'S' acik
's' kapali\n");
return 0;
}
void
mdl_exit(void){
printk(KERN_ALERT "Removing
module\n");
((my_driver->ops)->ioctl)
(vc_cons[fg_console].d->port.tty, KDSETLED, RESTORE);
}
module_init(mdl_init);
module_exit(mdl_exit);
/*
0000 0CNS
---------------------
caps on
1111 1011
& 0xFB //off
| 0x04
---------------------
num on
1111 1101
% 0xFD //off
| 0x02
---------------------
scroll on
1111 1110
& 0xFE //off
| 0x01
*/
2. Kodların derlenmesini sağlayacak olan Makefile adında yeni bir dosya
oluşturup aşağıdaki kodları yazarak kaydediyoruz.
Oluşturduğumuz dosyaların aynı klasörde
olmasına dikkat edelim.
3. Komut terminalini açarak $make komutu ile kodların derlenmesini sağlıyoruz.
4. $sudo
insmod klavyeled.ko komutu ile modülün eklenmesini sağlıyoruz.
5. $dmesg
komutu ile kernel tarafında oluşturulan iletileri kontrol ediyoruz. Eğer
character device başarılı bir şekilde oluşturulmuşsa en altta yazan komutu
başına sudo ekleyerek yazıyoruz. $sudo
mknod /dev/klavyeled c 245 0 Böylece
/dev (Linux hiyerarşisinde donanım dosyalarının
bulunduğu klasör) klasörünün içine klavyeled adında bir device
oluşturulmuş olur.
6. $cat
/dev/klavyeled komutu ile oluşturulan device’ın nasıl kullanılacağını
görüntüleyebiliriz.
7. $sudo su
komutu ile root olarak giriş yapıyoruz. $cd
/dev komutu ile device’ların bulunduğu klasöre gidiyoruz.
8.
Bundan sonra LED’leri yakıp söndürecek olan
komutları yazabiliriz.
Örnek : $echo N>klavyeled komutu NumLock LED’ini açar. $cat klavyeled komutu ile yapılan
işlemi kontrol edebiliriz.
9. Modülü kaldırmak için rmmod klavyeled komutunu, device dosyasını kaldırmak için ise
rm /dev/klavyeled komutunu
kullanabiliriz.
Grup Arkadaşlarım
Merve Akıncı (Grup Lideri)
Selin Aksoy
Hüsnü Taş
Ahmet Furkan Arvas
Semra Alomeroviç
Merve Deveci





Hiç yorum yok:
Yorum Gönder