- 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);
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.
W ten sposób stworzyliśmy szablon pod sterownik dla urządzenia znakowego.
Brak komentarzy:
Prześlij komentarz