字符驱动自动创建节点

来源:互联网 发布:mysql resultmap 编辑:程序博客网 时间:2024/05/17 01:00
//包含了很多装载模块需要的符号和函数的定义
//用于指定初始化函数和清除函数
#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)


0 0