From 2d8b061d0f442d8a8853025460a836e3482cc09b Mon Sep 17 00:00:00 2001 From: lonkaars Date: Thu, 18 Apr 2024 16:11:30 +0200 Subject: add character device to the system --- 1/config.h | 5 +++++ 1/main.c | 38 ++++++++++++++++++++++++++++++++------ 2 files changed, 37 insertions(+), 6 deletions(-) create mode 100644 1/config.h (limited to '1') diff --git a/1/config.h b/1/config.h new file mode 100644 index 0000000..1d15f75 --- /dev/null +++ b/1/config.h @@ -0,0 +1,5 @@ +#pragma once + +#define NODE_MAJOR 500 +#define NODE_MINOR 0 + diff --git a/1/main.c b/1/main.c index 88ae0d0..66ceac4 100644 --- a/1/main.c +++ b/1/main.c @@ -1,26 +1,52 @@ +#include #include #include #include "fopdrv.h" +#include "config.h" -MODULE_LICENSE("MIT"); - +struct cdev *cdev; struct file_operations fops = { - .read = fop_read, - .write = fop_write, - .open = fop_open, - .release = fop_release, + .read = fop_read, + .write = fop_write, + .open = fop_open, + .release = fop_release, }; static int mod_init(void) { + int err; + cdev = cdev_alloc(); + dev_t node = MKDEV(NODE_MAJOR, NODE_MINOR); + + if (!cdev) { + err = ENOMEM; + goto free_cdev; + } + + cdev->ops = &fops; + + err = cdev_add(cdev, node, 1); + if (err < 0) { + printk(KERN_ERR "cdev_add failed w/ error code %d\n", err); + goto free_cdev; + } + printk("%s\n", __PRETTY_FUNCTION__); return 0; + +free_cdev: + cdev_del(cdev); + + printk("%s: %d\n", __PRETTY_FUNCTION__, err); + return err; } static void mod_exit(void) { + cdev_del(cdev); printk("%s\n", __PRETTY_FUNCTION__); } module_init(mod_init); module_exit(mod_exit); +MODULE_LICENSE("MIT"); -- cgit v1.2.3