自动创建节点的字符杂项设备 misc_register

杂项设备

Linux里面的misc杂项设备是主设备号为10的驱动设备
定义头文件: <linux/miscdevice.h>

结构体:
struct miscdevice  {
int minor;
const char *name;
const struct file_operations *fops;
struct list_head list;
struct device *parent;
struct device *this_device;
const char *nodename;
mode_t mode;
};


minor 是misc设备的副设备号,misc设备主要依赖minor去区分
如果设置为MISC_DYNAMIC_MINOR则表示系统自动分配未使用的minor

nodename 是在/dev下面创建的设备驱动节点

fops 是驱动主体处理函数入口指针



注册和释放
注册
int misc_register(struct miscdevice * misc);

释放
int misc_deregister(struct miscdevice *misc);

misc_device是特殊的字符设备。注册驱动程序时采用misc_register函数注册,此函数中会自动创建设备节点,即设备文件。无需mknod指令创建设备文件。因为misc_register()会调用class_device_create()或者device_create()。


*********************************************************************************************

#include<linux/module.h>

#include<linux/fs.h>

#include<miscdevice.h>
#include <linux/init.h>


#defineMISC_NAME "miscdriver"

staticint misc_open(struct inode *inode, struct file *file)
{
 printk("misc open\n");
 return 0;
}

staticconst struct file_operations misc_fops =
{
   .owner  =   THIS_MODULE,
   .open   =   misc_open,
};

static struct miscdevice misc_dev=
{
 .minor =MISC_DYNAMIC_MINOR,
 .name =MISC_NAME,
 .fops =&misc_fops,
};

staticint __init misc_init(void)
{
 int ret;
 ret =misc_register(&misc_dev);
 if (ret)
 {
  printk("misc_registererror\n");
  return ret;
 }
 
 return 0;
}

staticvoid __exit misc_exit(void)
{
  misc_deregister(&misc_dev);
}

module_init(misc_init);
module_exit(misc_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("XXX");

你可能感兴趣的:(自动创建节点的字符杂项设备 misc_register)