分享

misc_register()...misc_unregister()

 zhouxitaa 2012-04-12

/include/linux/miscdevice.h

 

 

#ifndef _LINUX_MISCDEVICE_H

#define _LINUX_MISCDEVICE_H

#include <linux/module.h>

#include <linux/major.h>

 

#define PSMOUSE_MINOR  1

#define MS_BUSMOUSE_MINOR 2

#define ATIXL_BUSMOUSE_MINOR 3

/*#define AMIGAMOUSE_MINOR 4  FIXME OBSOLETE */

#define ATARIMOUSE_MINOR 5

#define SUN_MOUSE_MINOR 6

#define APOLLO_MOUSE_MINOR 7

#define PC110PAD_MINOR 9

/*#define ADB_MOUSE_MINOR 10   FIXME OBSOLETE */

#define WATCHDOG_MINOR            130  /* Watchdog timer     */

#define TEMP_MINOR        131  /* Temperature Sensor */

#define RTC_MINOR 135

#define EFI_RTC_MINOR           136  /* EFI Time services */

#define SUN_OPENPROM_MINOR 139

#define DMAPI_MINOR             140  /* DMAPI */

#define NVRAM_MINOR 144

#define SGI_MMTIMER        153

#define STORE_QUEUE_MINOR       155

#define I2O_MINOR 166

#define MICROCODE_MINOR           184

#define MWAVE_MINOR     219         /* ACP/Mwave Modem */

#define MPT_MINOR   220

#define MISC_DYNAMIC_MINOR 255

 

#define TUN_MINOR        200

#define    HPET_MINOR           228

#define KVM_MINOR            232

 

struct device;

 

struct miscdevice  {

       int minor;

       const char *name;

       const struct file_operations *fops;

       struct list_head list;

       struct device *parent;

       struct device *this_device;

};

 

extern int misc_register(struct miscdevice * misc);

extern int misc_deregister(struct miscdevice *misc);

 

#define MODULE_ALIAS_MISCDEV(minor)                        \

       MODULE_ALIAS("char-major-" __stringify(MISC_MAJOR)  \

       "-" __stringify(minor))

#endif

 

 

 

 

 

 

 

 

int misc_register(struct miscdevice * misc)

{

       struct miscdevice *c;

       dev_t dev;

       int err = 0;

 

       INIT_LIST_HEAD(&misc->list);               //初始化 成员list.

 

       mutex_lock(&misc_mtx);                     //互斥体上锁, 内核同步.

       list_for_each_entry(c, &misc_list, list) {             //&misc_list misc 这类字符设备的//

链表头, 从而用 list_for_each_entry()

可以遍历 &misc_list 中的每个 struct

miscdevice

    结构体.

              if (c->minor == misc->minor) {            //次设备号有没有注册过?

                     mutex_unlock(&misc_mtx);

                     return -EBUSY;

              }

       }

 

       if (misc->minor == MISC_DYNAMIC_MINOR) { //是否为动态分配次设备号

              int i = DYNAMIC_MINORS;

              while (--i >= 0)

                     if ( (misc_minors[i>>3] & (1 << (i&7))) == 0)

                            break;

              if (i<0) {

                     mutex_unlock(&misc_mtx);               //互斥体上锁, 内核同步.mutex_lock(&misc_mtx)对应.

                     return -EBUSY;

              }

              misc->minor = i;

       }

 

       if (misc->minor < DYNAMIC_MINORS)

              misc_minors[misc->minor >> 3] |= 1 << (misc->minor & 7);

       dev = MKDEV(MISC_MAJOR, misc->minor);       //主设备号10 与生成的次设备号

生成一个dev_t;

 

    misc->this_device = device_create(misc_class, misc->parent, dev, NULL,  //生成设备节点

                                     "%s", misc->name);                       //   /sys/class/misc/

 

       if (IS_ERR(misc->this_device)) {                              

              err = PTR_ERR(misc->this_device);

              goto out;

       }

 

       /*

        * Add it to the front, so that later devices can "override"

        * earlier defaults

        */

list_add(&misc->list, &misc_list);               //把申请到的misc 设备加到

 &misc_list 链表头中.

 out:

       mutex_unlock(&misc_mtx);

       return err;

}

 

 

 

 

int misc_deregister(struct miscdevice *misc)

{

       int i = misc->minor;

 

       if (list_empty(&misc->list))

              return -EINVAL;

 

       mutex_lock(&misc_mtx);

       list_del(&misc->list);

       device_destroy(misc_class, MKDEV(MISC_MAJOR, misc->minor));

       if (i < DYNAMIC_MINORS && i>0) {

              misc_minors[i>>3] &= ~(1 << (misc->minor & 7));

       }

       mutex_unlock(&misc_mtx);

       return 0;

}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多