init device
This commit is contained in:
parent
52b7aaadce
commit
264966f6b0
1 changed files with 36 additions and 6 deletions
42
code/lkm.c
42
code/lkm.c
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue