Chinaunix首页 | 论坛 | 博客
  • 博客访问: 130694
  • 博文数量: 30
  • 博客积分: 141
  • 博客等级: 入伍新兵
  • 技术积分: 175
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-10 10:00
文章分类

全部博文(30)

文章存档

2021年(1)

2018年(2)

2017年(6)

2016年(1)

2015年(5)

2014年(15)

我的朋友

分类: LINUX

2014-06-24 13:44:06

#include
#include        
#include
#include
/*  misedevice 结构:
struct miscdevice  {
    int minor; //次设备号,若为 MISC_DYNAMIC_MINOR 自动分配
    const char *name; //设备名
    struct file_operations *fops; //设备操作
    struct list_head list;
    struct device *dev;
    struct class_device *class;
    char devfs_name[64];
};
*/
/*
 使用misc_register,在加载模块时会自动创建设备文件,为主设备号为10的字符设备。
 使用misc_deregister,在卸载模块时会自动删除设备文件
*/
#define MISC_NAME "miscdriver"
static int misc_open(struct inode *inode, struct file *file)
{
 printk("misc open\n");
 return 0;
}
static const 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,
};
static int __init misc_init(void)
{
 int ret;
 ret = misc_register(&misc_dev);
 if (ret)
 {
  printk("misc_register error\n");
  return ret;
 }
 
 return 0;
}
static void __exit misc_exit(void)
{
  misc_deregister(&misc_dev);
}
module_init(misc_init);
module_exit(misc_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Decly");
 
注册杂项字符设备,该类设备使用同一个主设备号10
杂项字符设备使用的数据结构
struct miscdevice  {
    int minor;
    const char *name;
    struct file_operations *fops;
    struct list_head list;
    struct device *dev;
    struct class_device *class;
    char devfs_name[64];
};
杂项设备(misc device)
在 Linux 内核的include\linux\miscdevice.h文件,要把自己定义的misc device从设备定义在这里。其实是因为这些字符设备不符合预先确定的字符设备范畴,所有这些设备采用主设备号10 ,一起归于misc device,其实misc_register就是用主设备号10调用register_chrdev()的。也就是说,misc设备其实也就是特殊的字符设备。
misc_device是特殊的字符设备。注册驱动程序时采用misc_register函数注册,此函数中会自动创建设备节点,即设备文件。无需mknod指令创建设备文件。因为misc_register()会调用class_device_create()或者device_create()。

字符设备(char device)

使用register_chrdev(LED_MAJOR,DEVICE_NAME,&dev_fops)注册字符设备驱动程序时,如果有多个设 备使用该函数注册驱动程序,LED_MAJOR不能相同,否则几个设备都无法注册(我已验证)。如果模块使用该方式注册并且 LED_MAJOR为0(自动分配主设备号 ),使用insmod命令加载模块时会在终端显示分配的主设备号和次设备号,在/dev目录下建立该节点,比如 设备leds,如果加载该模块时分配的主设备号和次设备号为253和0,则建立节点:mknod leds c 253 0。使用register_chrdev (LED_MAJOR,DEVICE_NAME,&dev_fops)注册字符设备驱动程序时都要手动建立节点 ,否则在应用程序无法打开该设备


阅读(1582) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~