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是一樣的,相當於讀寫同一個設備

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章