//包含了很多装载模块需要的符号和函数的定义
//用于指定初始化函数和清除函数
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <linux/device.h>
#include <linux/cdev.h>
struct class *char_dvr_class;
unsigned int major = 0;
unsigned int minor = 0;
dev_t devno;
struct cdev test_cdev;
int test_open(struct inode *node, struct file *filp)
{
printk("open device\n");
return 0;
}
int test_close(struct inode *node, struct file *filp)
{
printk("close device\n");
return 0;
}
struct file_operations test_fops=
{
.open = test_open,
.release = test_close,
};//定义文件操作的结构体
static int __init test_init(void) //内核初始化函数
{
struct device *dev;
if(major)
{
devno = MKDEV(major,minor);
register_chrdev_region(devno, 1, "test new driver");
}
else
{
alloc_chrdev_region(&devno, minor, 1, "test alloc diver");
}
cdev_init(&test_cdev, &test_fops);
test_cdev.owner = THIS_MODULE;
cdev_add(&test_cdev, devno, 1);
//----------------------------------------------------------自动创建节点部分
char_dvr_class = class_create(THIS_MODULE,"test auto create dev node");
if(IS_ERR(char_dvr_class))
{
printk("class_create err");
device_destroy(char_dvr_class, devno);
}
else
{
dev = device_create(char_dvr_class, NULL, devno, NULL, "char_drv0");
if(IS_ERR(dev))
{
printk("device create failed");
device_destroy(char_dvr_class, devno);
}
//if(ret < 0)
//{
// printk("register err");
//}
printk("<0>""char_dvr init!\n"); //打印函数,和prinft类似
return 0;
}
static void __exit test_exit(void)//内核清除函数
{
cdev_del(&test_cdev);
unregister_chrdev_region(devno, 1);
device_destroy(char_dvr_class, devno);
class_destroy(char_dvr_class);
//unregister_chrdev(major, "test_driver");
printk("<0>""char_dvr good bye!\n");
}
module_init(test_init); //指定初始化函数
module_exit(test_exit); //指定清除函数
MODULE_LICENSE("GPL"); //指定代码使用的许可证
MODULE_AUTHOR("xiao bai"); //指定作者
//用于指定初始化函数和清除函数
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <linux/device.h>
#include <linux/cdev.h>
struct class *char_dvr_class;
unsigned int major = 0;
unsigned int minor = 0;
dev_t devno;
struct cdev test_cdev;
int test_open(struct inode *node, struct file *filp)
{
printk("open device\n");
return 0;
}
int test_close(struct inode *node, struct file *filp)
{
printk("close device\n");
return 0;
}
struct file_operations test_fops=
{
.open = test_open,
.release = test_close,
};//定义文件操作的结构体
static int __init test_init(void) //内核初始化函数
{
struct device *dev;
if(major)
{
devno = MKDEV(major,minor);
register_chrdev_region(devno, 1, "test new driver");
}
else
{
alloc_chrdev_region(&devno, minor, 1, "test alloc diver");
}
cdev_init(&test_cdev, &test_fops);
test_cdev.owner = THIS_MODULE;
cdev_add(&test_cdev, devno, 1);
//----------------------------------------------------------自动创建节点部分
char_dvr_class = class_create(THIS_MODULE,"test auto create dev node");
if(IS_ERR(char_dvr_class))
{
printk("class_create err");
device_destroy(char_dvr_class, devno);
}
else
{
dev = device_create(char_dvr_class, NULL, devno, NULL, "char_drv0");
if(IS_ERR(dev))
{
printk("device create failed");
device_destroy(char_dvr_class, devno);
}
}
//------------------------------------------------------------自动创建节点部分
//int ret = register_chrdev(major, "test_driver", &test_fops);//if(ret < 0)
//{
// printk("register err");
//}
printk("<0>""char_dvr init!\n"); //打印函数,和prinft类似
return 0;
}
static void __exit test_exit(void)//内核清除函数
{
cdev_del(&test_cdev);
unregister_chrdev_region(devno, 1);
device_destroy(char_dvr_class, devno);
class_destroy(char_dvr_class);
//unregister_chrdev(major, "test_driver");
printk("<0>""char_dvr good bye!\n");
}
module_init(test_init); //指定初始化函数
module_exit(test_exit); //指定清除函数
MODULE_LICENSE("GPL"); //指定代码使用的许可证
MODULE_AUTHOR("xiao bai"); //指定作者
MODULE_VERSION("v0.1"); //指定代码修订号
insmod 后 可以看到 /dev下有 char_dvr0
cat /pro/device |grep test
可以看到设备号.
在/sys/dev/char/目录下可以看到设备号
在/sys/class/可以看到对应的目录(est auto create dev node)和设备节点(char_drv0)