- 论坛徽章:
- 0
|
注册一个字符驱动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"); |
|