您的位置:首页 > 运维架构 > Linux

(6)2.4之前的字符驱动-用devfs_register自动生成设备文件(可能在2.6linux目录树下编译不了)

2017-10-10 15:49 686 查看
#include <linux/module.h>

#include <linux/kernel.h>

#include <linux/init.h>

#include <linux/fs.h>

#include <linux/irq.h>

#include <linux/delay.h>

#define MYMAJOR 200

#define MYNAME "chardev"

int mymajor ;

 devfs_handle_t devfs_handle;

static int test_chardev_open(struct inode *inode,struct file *file)

{

printk(KERN_INFO "test chardev_open\n");

return 0;

}

static int test_chardev_release(struct inode *inode,struct file *file){

printk(KERN_INFO "test chardev_release\n");

return 0;

}

static ssize_t test_chardev_read(struct file *file,char __user *buf,size_t size, loff_t *ppos)

{

printk(KERN_INFO " test read\n");

return 0;

}

static ssize_t test_chardev_write(struct file *file,

const char __user *ubuf,size_t count,loff_t * ppos){

printk(KERN_INFO " test write\n");

return 0;

}

static const struct file_operations test_fops={

.owner=THIS_MODULE,

.open=test_chardev_open,

.release=test_chardev_release,

.write=test_chardev_write,

.read=test_chardev_read,

};

static int __init chardev_init(void)

{ int ret=-1;

//int devfs_handle=0;

printk(KERN_INFO "jimmy module chardev init");

mymajor=register_chrdev(0,MYNAME,&test_fops);

if(mymajor<0)

{

printk(KERN_ERR "register_chrdev fail\n");

return -EINVAL;

}

printk(KERN_INFO "register_chrdev success...myjor=%d.\n",mymajor);

devfs_handle = devfs_register(NULL, MYNAME,DEVFS_FL_DEFAULT,mymajor, 0, S_IFCHR | S_IRUSR | S_IWUSR, &test_fops, NULL);

return 0;

}

static void __exit chardev_exit(void)

{

    

printk(KERN_INFO "jimmy module chardev exit\n");

unregister_chrdev(MYMAJOR, MYNAME);

}

module_init(chardev_init);

module_exit(chardev_exit);

// MODULE_xxx这种宏作用是用来添加模块描述信息

MODULE_LICENSE("GPL");                // 描述模块的许可证

MODULE_AUTHOR("aston");                // 描述模块的作者

MODULE_DESCRIPTION("module test");    // 描述模块的介绍信息

MODULE_ALIAS("alias xxx");            // 描述模块的别名信息
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: