misc_register 的用法

misc_register 的用法:


通常要註冊一個 char device 都是用 register_chrdev。這會註冊 major / minor number,即便可能只需要1個 minor number,往往卻佔住 major number 底下的所有 minor number,
所以 Linux 2.0 有了 miscellaneous character drivers 的誕生,misc driver 使用 major number 10 ,然後使用者如果需要這樣的"小驅動程式",便可以指明 minor number 即可。


使用 misc device 必須 include ,裡面包含了許多的官方的 minor number ,您可以挑選您適合的 minor number ,裡面也包含了兩個 API ,misc_register() / misc_deregister() 。
一般您只要填好 struct miscdevice 的內容,再使用 misc_register() 進行註冊,或者使用 misc_deregister() 進行移除即可。




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 *devnode;
};
 minor:就是您要註冊的minor number。
name:device的name。
fops:file operations。
其他的就不用理會了。



下面為範例:

#include 
#include 
#include 
#include 
MODULE_LICENSE("GPL");

#define DEV_BUFSIZE 1024

static int dev_open(struct inode*, struct file*);
static int dev_release(struct inode*, struct file*);
static ssize_t dev_read(struct file*, char __user*, size_t, loff_t*);
static ssize_t dev_write(struct file*, const char __user *, size_t, loff_t*);
static void __exit exit_modules(void);

static struct file_operations dev_fops = {
    .owner = THIS_MODULE,
    .open = dev_open,
    .release = dev_release,
    .read = dev_read,
    .write = dev_write,
};

static struct miscdevice brook_miscdev = {
    .minor      = 11,
    .name       = "brook_dev",
    .fops       = &dev_fops,
};

static int
dev_open(struct inode *inode, struct file *filp)
{
    printk("%s():\n", __FUNCTION__);
    return 0;
}

static int
dev_release(struct inode *inode, struct file *filp)
{
    printk("%s():\n", __FUNCTION__);
    return 0;
}

static ssize_t
dev_read(struct file *filp, char __user *buf, size_t count, loff_t *pos)
{
    printk("%s():\n", __FUNCTION__);
    *pos = 0;
    return 0;
}

static ssize_t
dev_write(struct file *filp, const char __user *buf,
        size_t count, loff_t *pos)
{
    printk("%s():\n", __FUNCTION__);
    return count;
}

static int __init init_modules(void)
{
    int ret;

    ret = misc_register(&brook_miscdev);
    if (ret != 0) {
        printk("cannot register miscdev on minor=11 (err=%d)\n",ret);
    }

    return 0;
}

static void __exit exit_modules(void)
{
    misc_deregister(&brook_miscdev);
}

module_init(init_modules);
module_exit(exit_modules);



insmod 後,可以用:cat /proc/misc 看到 brook_miscdev 的 minor number 。
然後在 make node,就可以 open file 了。





留言

這個網誌中的熱門文章

NMEA標準格式 -- GPS

網路 Transformer 的用途

cut,sed,awk 字串處理