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)
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.
- 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>
{
mam problem, otrzymuje błąd error: implicit declaration of function alloc_ch_dev ... w funkcji init.
OdpowiedzUsuń