misc_register和register_chrdev的区别

注册杂项字符设备,该类设备使用同一个主设备号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)注册字符设备驱动程序时都要手动建立节点,否则在应用程序无法打开该设备。

 
------------------------------------------------------
#include <linux/miscdevice.h> //struct miscdevice
#include <linux/fs.h>         //struct file_operations

#define KDA_MINOR 44

static int kda_open(struct inode *inode, struct file *file)
{
    printk("%s, %d/n", __FUNCTION__, __LINE__);;
    return 0;
}

static struct file_operations kda_fops = {
    .owner = THIS_MODULE,
    .open  = kda_open,    
};

static struct miscdevice kda_dev = {
    KDA_MINOR,
    "kda",
    &kda_fops
};

static int __init hello_init(void)
{
    int err;

    printk("<1>Hello world 1./n");

    err = misc_register(&kda_dev);
    if (err) {
        printk("envctrl: Unable to get misc minor %d/n",
               kda_dev.minor);
    }


    return 0;
}

static void __exit hello_exit(void)
{
    printk(KERN_ALERT "Goodbye world 1./n");
    misc_deregister(&kda_dev);
}

module_init(hello_init);
module_exit(hello_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("zengxiaolong ");
MODULE_DESCRIPTION("A sample driver");
MODULE_SUPPORTED_DEVICE("testdevice");

注:
1. 上面的代码可以自动生成设备节点,但是该节点在/dev目录下,而不在/dev/misc目录下
2.
mkdir /dev/misc
mknod /dev/misc/kda c 10 44
ls /dev/kda
用户态程序,读写/dev/kda和/dev/misc/kda是一样的,相当于读写同一个设备

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值