linux 混雜設備 miscdevice設備介紹

混雜設備是字符設備的一種混雜設備(用miscdevice結構體表述)。miscdevice共享一個主設備號MISC_MAJOR(即10),但次設備號不一樣。 全部的miscdevice設備造成了一個鏈表,對設備訪問時內核根據次設備號查找對應的miscdevice設備。node

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;
};

一般狀況下,一個字符設備都在初始化的過程當中的步驟:this

1,經過alloc_chrdev_region()分配主/次設備號。2,使用cdev_init()和cdev_add()來以一個字符設備註冊本身。 詳細介紹見http://my.oschina.net/u/274829/blog/283702spa

而一個misc驅動,則能夠只用一個調用misc_register()來完成這全部的步驟。.net

使用流程
code

static int __init dev_init(void)
{
    int ret;
   
    ret = misc_register(&misc);  //註冊設備號
    
    return ret;
}

設備結構orm

static struct miscdevice misc = {
    .minor = MISC_DYNAMIC_MINOR,  //這裏注意,通常分配爲0,意思:讓系統自動分配,防止衝突
    .name = DEVICE_NAME,
    .fops = &dev_fops,
};

文件操做集
blog

static struct file_operations dev_fops = {
    .owner    =    THIS_MODULE,
    .ioctl    =    leds_ioctl,
};

static int sbc2440_leds_ioctl(
    struct inode *inode, 
    struct file *file, 
    unsigned int cmd, 
    unsigned long arg)
{
    switch(cmd) {
    case 0:
          ....;
          break;
    default:
        return -EINVAL;
    }
}

退出註冊get

static void __exit dev_exit(void)
{
    misc_deregister(&misc);  //退出設備
  printk (DEVICE_NAME"\tuninstalled\n");
}

詳細應用例程見ok6410-led流水燈控制文件 http://my.oschina.net/u/274829/blog/267552cmd

相關文章
相關標籤/搜索