poniedziałek, 26 sierpnia 2013

Programowanie sterowników pod Linux cz.2 - numery urządzenia

W systemie Linux urządzenia rozpoznawane są za pomocą przydzielanych im numerów zwanych major i minor.

Za pomocą polecenia ls -l /dev/ | grep "^c" wyświetlimy listę aktywtnych urządzeń znakowych wraz z ich numerami.




W nagłówku <linux/types.h> zdefiniowana jest struktura dev_t, która zawiera oba te numery. Z kolei nagłówek <linux/kdev_t.h> udostępnia nam makra służące do wykonywania operacji:
  • MAJOR(dev_t dev) - zwraca wartość major
  • MINOR(dev_t dev) - zwraca wartośc minor
  • MKDEV(int major, int minor) - wstawia wartości major i minor do struktury dev_t
Aby móc używać naszego urządzenia w systemie musimy je zarejestrować. Służy do tego funkcja

int alloc_chrdev_region(dev_t *dev, unsigned int firstminor, unsigned int cnt, char *name)

  • dev - struktura do której zostanie dobrana wartość major
  • firstminor - początkowa pozycja minor
  • cnt - ilość plików urządzeń do zarejestrowania
  • name - nazwa urządzenia
Funkcja dobiera wolną liczbę major i ustawia ją w strukturze dev, następnie rejestruje określoną przez cnt ilość urządzeń rozpoczynając od pary <major, firstminor>.

Należy także pamięć o deaktywacji sterownika i zwolnieniu zajmowanych numerów za pomocą funkcji:

unregister_chrdev_region(dev_t dev,unsigned int cnt);


Zmodyfikujmy więc kod z poprzedniej części:

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/uaccess.h>
#include <linux/cdev.h>

struct virtual_device{
   char array[100]; 
};

static dev_t devNum; // struktura na liczby major i minor

static int __init load(void)

   printk("Aktywacja sterownika\n");
   if (alloc_chrdev_region(&devNum,0,1,"MyDevice") < 0)
   {
      return -1;
   }
   printk("Sterownik aktywowany. Major: %d Minor: %d",MAJOR(devNum),MINOR(devNum));
   return 0;


static void __exit unload(void) 

   printk("Deaktywacja sterownika\n"); 
   unregister_chrdev_region(devNum,1);


module_init(load);
module_exit(unload);

Po skompilowaniu i uruchomieniu modułu powinien pojawić się komunikat podający jakie liczby uzyskało nasze urządzenie. Dodatkowo aby sprawdzić czy wszystko przebiegło jak należy używamy komendy cat /proc/devices i szukamy numeru oraz nazwy naszego urządzenia.



1 komentarz:

  1. mam problem, otrzymuje błąd error: implicit declaration of function alloc_ch_dev ... w funkcji init.

    OdpowiedzUsuń