sobota, 31 sierpnia 2013

Programowanie sterowników pod Linux cz.3 - operacje

Naszym kolejnym krokiem będzie zdefiniowanie operacji które można wykonywać za pomocą sterownika. W tym celu posłużymy się strukturą file_operation zdefiniowaną w nagłówku <linux/fs.h>. Struktura ta składa się zestawu wskaźników na funkcje, które mamy zamiar zaimplementować. W tej części zajmiemy się implementacją 4 funkcji:

  • read()
  • write()
  • open()
  • release()

Dodajmy zatem definicje tych funkcji do kodu z poprzednich części:

static ssize_t char_read(struct file *filp, char __user *buff, size_t count, loff_t *f_pos)
{
   printk("char_read()\n");
   return 0;
}

static ssize_t char_write(struct file *filp, const char __user *buff, size_t count, loff_t *f_pos)
{
   printk("char_write()\n");
   return 0;
}

static int char_open(struct inode *inode, struct file *filp)
{
   printk("char_open()\n");
   return 0;
}

static int char_release(struct inode *inode, struct file *filp)
{
   printk("char_release()\n");
   return 0;
}

Następnie należy zdefiniować strukturę:

file_operation my_operations = 
{
   .owner = THIS_MODULE,
   .open = char_open,
   .release = char_release,
   .read = char_read,
   .write = char_write
};

W zasadzie już nieco wcześniej ponienem był wpomnieć o strukturze cdev. Jest to struktura która będzie instancją naszego urządzenia znakowego.

struct cdev my_cdev;
cdev_init(&my_cdev, &my_operations);

Powyższy kod alokuje instancję urządzenia oraz powiązuje ze zdefinowanymi operacjami. Teraz za możemy poinformować kernel o naszej strukturze za pomocą funkcji:

int cdev_add(struct cdev *cdev, dev_t num, unsigned int count);

  • cdev - struktura dla której chcemy ustawić numery num
  • num - struktra zawierająca numer major oraz minor
  • ilość urządzeń które chcemy powiązać z cdev

Dodajmy więc następujący kod:

if (cdev_add(&my_cdev, devNum, 1) < 0)
{
   printk("Problem z dodaniem cdev\n");
   return -1;
}

Pamiętajmy aby w funkcji unload() zwolnić zasoby poprzez:

cdev_del(&my_cdev);

W ten sposób stworzyliśmy szablon pod sterownik dla urządzenia znakowego.

Brak komentarzy:

Prześlij komentarz