#include <linux/module.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/errno.h>
#include <linux/cdev.h>
#include <linux/fs.h>
#include <asm/uaccess.h>
#define NAME "demo"
dev_t from;
int baseminor = 0 , count = 2;
struct mutil_dev{
struct cdev dev;
char string[64];
}dev1,dev2;
int demo_open(struct inode *inode, struct file *file)
{
//inode->cdev
//cdev -----> struct mutil_dev?--->
//container_of
struct mutil_dev *my_dev = container_of(inode->i_cdev,struct mutil_dev,dev);
file->private_data = my_dev;
printk("%s,%d\n",__func__,__LINE__);
return 0;
}
int demo_release(struct inode *inode, struct file *file)
{
printk("%s,%d\n",__func__,__LINE__);
return 0;
}
ssize_t demo_read(struct file *file, char __user *user, size_t size, loff_t *loff)
{
struct mutil_dev *read_dev = file->private_data;
if(copy_to_user(user,read_dev->string,sizeof(read_dev->string))){
printk("%s,%d\n",__func__,__LINE__);
return -EINVAL;
}
printk("%s,%d\n",__func__,__LINE__);
return size;
}
ssize_t demo_write(struct file *file, const char __user *user, size_t size, loff_t *loff)
{
printk("%s,%d\n",__func__,__LINE__);
return size;
}
struct file_operations f_ops = {
.owner = THIS_MODULE,//struct module
.open = demo_open,
.release = demo_release,
.read = demo_read,
};
void mutil_dev_config(struct mutil_dev *dev ,dev_t from , int count)
{
cdev_init(&dev->dev,&f_ops);
cdev_add(&dev->dev,from,count);
}
static int __init demo_init(void)
{
int ret;
int major = 0,minor = 0;
ret = alloc_chrdev_region(&from,baseminor,count,NAME);
if(ret){
printk("%s,%dalloc_chrdev_region\n",__func__,__LINE__);
return -EINVAL;
}
major = MAJOR(from);
minor = MINOR(from);
strcpy(dev1.string , "from dev1");
strcpy(dev2.string , "from dev2");
mutil_dev_config(&dev1,MKDEV(major ,minor),1);//250 0
mutil_dev_config(&dev2,MKDEV(major ,minor+1),1);//250 1
printk("%s,%d\n",__func__,__LINE__);
return 0;
}
static void __exit demo_exit(void)
{
cdev_del(&dev1.dev);
cdev_del(&dev2.dev);
unregister_chrdev_region(from,count);
printk("%s,%d\n",__func__,__LINE__);
}
module_init(demo_init);
module_exit(demo_exit);
MODULE_LICENSE("GPL");