Untitled

mail@pastecode.io avatar
unknown
plain_text
2 years ago
2.7 kB
1
Indexable
Never
#include <linux/module.h>
#include<linux/fs.h>
#include<linux/cdev.h>
#include<linux/device.h>
#include<asm/uaccess.h>

#define NAZWA "mojeznaki"

static ssize_t moje_open(struct file *f, char __user *u, size_t size, loff_t* pos){
        return 0;
}
static ssize_t moje_release(struct file *f, char __user *u, size_t size, loff_t* pos){

        return 0;

}
static ssize_t moje_read(struct file *f, char __user *u, size_t size, loff_t* pos){

        return 0;

}
static ssize_t moje_write(struct file *f, char __user *u, size_t size, loff_t* pos){

        return 0;
}
static struct file_operations moje_op =
{
        .owner = THIS_MODULE,
        .open = moje_open,
        .release = moje_release,
        .read = moje_read,
        .write = moje_write,
};

static dev_t numer_urzadzenia = 0;
static struct cdev moje_cdev;
static struct class *moje_klasa;
static struct device *moje_urzadzenie;

static int __init znakowe_init(void)
{
        if(alloc_chrdev_region(&numer_urzadzenia,0,1,NAZWA)<0) {
                pr_alert("Blad przydzialu zakresu numerow!\n");
                return -1;
        }
        moje_klasa = class_create(THIS_MODULE,NAZWA);
        if(IS_ERR(moje_klasa)) {
                pr_alert("Blad tworzenia klasy: %ld!\n",PTR_ERR(moje_klasa));
                unregister_chrdev_region(numer_urzadzenia,1);
                return -1;
}

        cdev_init(&moje_cdev,&moje_op);
        moje_cdev.owner = THIS_MODULE;
        if(cdev_add(&moje_cdev,numer_urzadzenia,1)) {
                pr_alert("Nie moge dodac cdev!\n");
                class_destroy(moje_klasa);
                unregister_chrdev_region(numer_urzadzenia,1);
                return -1;
        }
        moje_urzadzenie = device_create(moje_klasa, NULL,
        numer_urzadzenia, NULL, NAZWA);
        if(IS_ERR(moje_urzadzenie)) {
pr_alert("Blad tworzenia urzadzenia: %ld!\n",
                PTR_ERR(moje_urzadzenie));
                cdev_del(&moje_cdev);
                class_destroy(moje_klasa);
                unregister_chrdev_region(numer_urzadzenia,1);
                return -1;
        }
        return 0;
}

static void __exit znakowe_exit(void)
{
        if(moje_urzadzenie)
device_destroy(moje_klasa,numer_urzadzenia);
        cdev_del(&moje_cdev);
        if(moje_klasa)
                class_destroy(moje_klasa);
        if(numer_urzadzenia>=0)
                unregister_chrdev_region(numer_urzadzenia,1);
}


module_init(znakowe_init);
module_exit(znakowe_exit);
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("Ten modulik nic nie robi.");
MODULE_VERSION("0.001");