*参照元 [#t07b9271] #backlinks *説明 [#ga1ecee9] -パス: [[linux-2.6.33/fs/char_dev.c]] -FIXME: これは何? --説明 **引数 [#c55b4bfd] -unsigned int major -- -unsigned int baseminor -- -unsigned int count -- -const char *name -- -const struct file_operations *fops -- --[[linux-2.6.33/file_operations]] **返り値 [#sab63e11] -int --成功したときはデバイスのメジャー番号が返ります。 失敗したときは負のエラー番号が返ります。 --major に 0 を指定(自動的に割り当て)したとき、 成功時はデバイスのメジャー番号が返ります。 major に 0 以外を指定(明示的に割り当て)したとき、 成功時は 0 が返ります。 いずれも失敗したときは負のエラー番号が返ります。 **参考 [#v5fac2b0] *実装 [#kda7cf99] /** * __register_chrdev() - create and register a cdev occupying a range of minors * @major: major device number or 0 for dynamic allocation * @baseminor: first of the requested range of minor numbers * @count: the number of minor numbers required * @name: name of this range of devices * @fops: file operations associated with this devices * * If @major == 0 this functions will dynamically allocate a major and return * its number. * * If @major > 0 this function will attempt to reserve a device with the given * major number and will return zero on success. * * Returns a -ve errno on failure. * * The name of this device has nothing to do with the name of the device in * /dev. It only helps to keep track of the different owners of devices. If * your module name has only one type of devices it's ok to use e.g. the name * of the module here. */ int __register_chrdev(unsigned int major, unsigned int baseminor, unsigned int count, const char *name, const struct file_operations *fops) { struct char_device_struct *cd; struct cdev *cdev; int err = -ENOMEM; - --[[linux-2.6.33/char_device_struct]] - --[[linux-2.6.33/cdev]] - --[[linux-2.6.33/ENOMEM]] cd = __register_chrdev_region(major, baseminor, count, name); if (IS_ERR(cd)) return PTR_ERR(cd); - --[[linux-2.6.33/__register_chrdev_region()]] - --[[linux-2.6.33/IS_ERR()]] - --[[linux-2.6.33/PTR_ERR()]] cdev = cdev_alloc(); if (!cdev) goto out2; - --[[linux-2.6.33/cdev_alloc()]] cdev->owner = fops->owner; cdev->ops = fops; kobject_set_name(&cdev->kobj, "%s", name); - --[[linux-2.6.33/kobject_set_name()]] err = cdev_add(cdev, MKDEV(cd->major, baseminor), count); if (err) goto out; - --[[linux-2.6.33/cdev_add()]] - --[[linux-2.6.33/MKDEV()]] cd->cdev = cdev; return major ? 0 : cd->major; out: kobject_put(&cdev->kobj); - --[[linux-2.6.33/kobject_put()]] out2: kfree(__unregister_chrdev_region(cd->major, baseminor, count)); return err; - --[[linux-2.6.33/kfree()]] } *コメント [#f3d7e97f]