From 264966f6b03ee8ac995ced64f350e14f148603a7 Mon Sep 17 00:00:00 2001 From: twoneis Date: Thu, 27 Mar 2025 13:04:49 +0100 Subject: [PATCH] init device --- code/lkm.c | 42 ++++++++++++++++++++++++++++++++++++------ 1 file changed, 36 insertions(+), 6 deletions(-) diff --git a/code/lkm.c b/code/lkm.c index 1567a0326..f63539906 100644 --- a/code/lkm.c +++ b/code/lkm.c @@ -5,6 +5,11 @@ #include #define DEVICE_NAME "lkm" +#define CLASS_NAME "lkmclass" + +static int lkm_major; +static struct class *lkm_class; +static struct device *lkm_device; static int lkm_init(void); static void lkm_exit(void); @@ -23,41 +28,66 @@ static int lkm_init(void) { int ret; - printk(KERN_INFO "lkm: init: start"); + printk(KERN_INFO "lkm: init: start\n"); ret = register_chrdev(0, DEVICE_NAME, &lkm_fops); if (ret < 0) { - printk(KERN_ERR "lkm: init: register chrdev failed"); + printk(KERN_ERR "lkm: init: register chrdev failed\n"); return ret; } + lkm_major = ret; + lkm_class = class_create(CLASS_NAME); + + if (IS_ERR(lkm_class)) { + ret = PTR_ERR(lkm_device); + printk(KERN_ERR "lkm: init: create class failed\n"); + unregister_chrdev(lkm_major, CLASS_NAME); + return ret; + } + + lkm_device = device_create(lkm_class, 0, MKDEV(lkm_major, 0), 0, + DEVICE_NAME); + if (IS_ERR(lkm_device)) { + ret = PTR_ERR(lkm_device); + printk(KERN_ERR, "lkm: init: create device failed\n"); + class_unregister(lkm_class); + class_destroy(lkm_class); + unregister_chrdev(lkm_major, CLASS_NAME); + return ret; + } + + printk(KERN_INFO "lkm: device driver created\n"); + + printk(KERN_INFO "lkm: init: done\n"); + return 0; } static void lkm_exit(void) { - printk(KERN_INFO "lkm: exit: start"); + printk(KERN_INFO "lkm: exit: start\n"); } int lkm_open(struct inode *inode, struct file *fp) { - printk(KERN_INFO "lkm: open: start"); + printk(KERN_INFO "lkm: open: start\n"); return 0; } int lkm_release(struct inode *inode, struct file *fp) { - printk(KERN_INFO "lkm: release: start"); + printk(KERN_INFO "lkm: release: start\n"); return 0; } long lkm_ioctl(struct file *fp, unsigned num, long unsigned int param) { - printk(KERN_INFO "lkm: release: start"); + printk(KERN_INFO "lkm: release: start\n"); return 0; }