内核2.6.12驱动dev下面找不到设备文件节点!!
注册一个字符驱动cdev!内核为2.6.12
注册好之后,在dev下找不到设备文件节点,在/proc/device可以看到设备文件!因为,我不想采用手动mknod方法,使用了在类(class)里面添加入口设备。不知道是不是和mdev有关!还是怎么回事!我在这个论坛里面也见到这样的问题!都是在2.6.13之前的内核里面驱动出现这种问题!但是,都没有一个结果!大家最后都是不了了之.还是选择采用了手动的mknod方式!
/*
* filename : "async"
*
*
* author : "kang"
*
*
* date : 2009-04-02
*
*/
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/config.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/fcntl.h>
#include <linux/cdev.h>
#include <linux/device.h>
#include <linux/err.h>
static int major_id;
static struct file_async {
int arry;
struct fasync_struct fa;
struct cdev cdev;
};
struct file_async *buff;
struct class_simple *my_class;
static int async_open(struct inode *inode,struct file *file)
{ return 0;
}
static int async_close(struct inode *inode,struct file *file)
{ return 0;
}
static int async_write(struct file * file, const char __user * userbuf,size_t count, loff_t * off)
{
return count;
}
static int async_read(struct file * file, char __user * userbuf, size_t count, loff_t * off)
{
return count;
}
static int async_fasync(int fd,struct file *file,int mode)
{return 0;
}
static struct file_operations async_test = {
.owner = THIS_MODULE,
.open = async_open,
.release = async_close,
.write = async_write,
.read = async_read,
.fasync = async_fasync,
};
static void steup_module(void)
{ int err,dev_id=MKDEV(major_id,0);
cdev_init(&buff->cdev,&async_test);
buff->cdev.owner= THIS_MODULE;
buff->cdev.ops =&async_test;
err=cdev_add(&buff->cdev,dev_id,1);
if(err)
printk("the system add fail!!\n");
}
static int __init init_async(void)
{int ret;
dev_t dev_id=MKDEV(major_id,0);
if(dev_id)
ret=register_chrdev_region(dev_id,1,"async");
else
{ ret=alloc_chrdev_region(&dev_id,0,1,"async");
major_id=MAJOR(dev_id);
}
if(ret<0)
{ printk("the system alloc registe fail!!,ret=%d\n",ret);
return ret;
}
buff=kmalloc(sizeof(struct file_async),GFP_KERNEL);
if(!buff)
{ printk("kmalloc merry fail!!\n");
ret=-ENOMEM;
unregister_chrdev_region(dev_id,1);
return ret;
}
memset(buff,0,sizeof(struct file_async));
steup_module( );
printk("add drivers scuss!!\n");
my_class=class_simple_create(THIS_MODULE,"class_async"); 此处创建简单的类!
if(IS_ERR(my_class))
{ printk("create the class in fail!!\n");
return PTR_ERR(my_class);
}
printk("create the class in scuss!!\n");
class_simple_device_add(my_class,dev_id,NULL,"test_async" ); 此处添加类入口设务,这样应该在/dev下面看到test_async在那里(设备文件节点)!
return 0;
}
static void __exit exit_async(void)
{ cdev_del(&buff->cdev);
kfree(buff);
unregister_chrdev_region(MKDEV(major_id,0),1);
class_simple_device_remove(MKDEV(major_id,0));
class_simple_destroy(my_class);
}
module_init(init_async);
module_exit(exit_async);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("KANG");
MODULE_DESCRIPTION("TEST_ASYNC");
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
注册了还要mknod的才行
我是想mknod呀!但是,不想用手动的方式去mknod一个文件设备节点呀!所以才用到class_simple接口嘛!利用class_simle_create()建个类,再这个类下面添加一个节点class_simple_device_add()!
因为好多资料上面说这样做就没有必要用手动mknod了!我主要的目是不要用手动mknod节点呀!
dreamice :
可能是我上面没有表达清楚吧!!
我猜测~ 不一定正确~
class的目录下有一个dev名字的文件,cat这个文件可以看到设备号
然后udev等工具通过这个文件实现字符设备的挂载
但是并不是说注册了class就会自动注册字符设备
cdev_add只是在kobject_map中占了一个位置,而实际访问这个位置是要由mknod建立一个字符设备来完成的
udev也只是实现了mknod的智能化管理而已吧~ 如果使用udev等工具的话注册class之后就不用自己挂载字符设备了
不过,我同样的驱动我放在2.6.24内核里面就可以!在dev下面看到了文件设备节点!!!
我觉得2.6.12不支持udev吧,只支持devfs!!不知道这样说对不对!从2.6.13它没有devfs了,用udev取代了它!
我用的2.6.19是没问题的,可以创建节点
2.6.15以前内核没有udev自动装载所需要的uevent功能。