init device

This commit is contained in:
twoneis 2025-03-27 13:04:49 +01:00
parent 52b7aaadce
commit 264966f6b0

View file

@ -5,6 +5,11 @@
#include <linux/uaccess.h> #include <linux/uaccess.h>
#define DEVICE_NAME "lkm" #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 int lkm_init(void);
static void lkm_exit(void); static void lkm_exit(void);
@ -23,41 +28,66 @@ static int
lkm_init(void) lkm_init(void)
{ {
int ret; int ret;
printk(KERN_INFO "lkm: init: start"); printk(KERN_INFO "lkm: init: start\n");
ret = register_chrdev(0, DEVICE_NAME, &lkm_fops); ret = register_chrdev(0, DEVICE_NAME, &lkm_fops);
if (ret < 0) { if (ret < 0) {
printk(KERN_ERR "lkm: init: register chrdev failed"); printk(KERN_ERR "lkm: init: register chrdev failed\n");
return ret; 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; return 0;
} }
static void static void
lkm_exit(void) lkm_exit(void)
{ {
printk(KERN_INFO "lkm: exit: start"); printk(KERN_INFO "lkm: exit: start\n");
} }
int int
lkm_open(struct inode *inode, struct file *fp) lkm_open(struct inode *inode, struct file *fp)
{ {
printk(KERN_INFO "lkm: open: start"); printk(KERN_INFO "lkm: open: start\n");
return 0; return 0;
} }
int int
lkm_release(struct inode *inode, struct file *fp) lkm_release(struct inode *inode, struct file *fp)
{ {
printk(KERN_INFO "lkm: release: start"); printk(KERN_INFO "lkm: release: start\n");
return 0; return 0;
} }
long long
lkm_ioctl(struct file *fp, unsigned num, long unsigned int param) 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; return 0;
} }